Upgrade curl to curl-7_69_0

Test: None
Change-Id: I32f36294d53083ccb27764ebc4bc8fe628f38d94
diff --git a/CHANGES b/CHANGES
index d35f541..68ebc82 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,3270 @@
 
                                   Changelog
 
+Version 7.69.0 (4 Mar 2020)
+
+Daniel Stenberg (4 Mar 2020)
+- RELEASE-NOTES: 7.69.0
+
+- THANKS: from 7.69.0
+  
+  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.
+  
+  Bug: https://curl.haxx.se/mail/lib-2020-03/0008.html
+  Reported-by: David Lopes
+  
+  Closes https://github.com/curl/curl/pull/5025
+
+Marc Hoersken (3 Mar 2020)
+- ci/tests: Make it possible to still run but ignore failing tests
+  
+  This enables the development of a solution for the failing tests by
+  running them on CI while ignoring their result for the overall status.
+  
+  Closes #4994
+
+- README.md: add Azure DevOps Pipelines build status badge
+
+- ci/tests: Move CI test result creation above environment setup
+  
+  This avoids using our test servers as proxy to the AppVeyor API.
+  
+  Closes #5022
+
+- ci/tests: Send test results to AppVeyor for status overview
+  
+  Closes #5021
+
+Daniel Stenberg (3 Mar 2020)
+- Revert "sha256: Added SecureTransport implementation"
+  
+  This reverts commit 4feb38deed33fed14ff7c370a6a9153c661dbb9c (from #4956)
+  
+  That commit broke test 1610 on macos builds without TLS.
+  
+  Closes #5027
+
+- dist: include tests/azure.pm in the tarball
+  
+  Bug: https://github.com/curl/curl/commit/ada581f2cc32f48c1629b729707ac19208435b27#commitcomment-37601589
+  Reported-by: Marcel Raad
+
+Steve Holme (3 Mar 2020)
+- configure.ac: Disable metalink if mbedTLS is specified
+  
+  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 #5013
+
+- sha256: Tidy up following recent changes
+  
+  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
+
+Jay Satiro (2 Mar 2020)
+- curl_escape.3: Add a link to curl_free
+  
+  Ref: https://github.com/curl/curl/pull/5016#issuecomment-593628582
+
+- curl_getenv.3: Fix the memory handling description
+  
+  - Tell the user to call curl_free() to free the pointer returned by
+    curl_getenv().
+  
+  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 https://github.com/curl/curl/pull/5016
+
+Daniel Stenberg (2 Mar 2020)
+- [Nick Zitzmann brought this change]
+
+  md4: use init/update/final functions in Secure Transport
+  
+  We can use CC_MD4_Init/Update/Final without having to allocate memory
+  directly.
+  
+  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
+  
+  It's unclear why it would ever return zero here, but this change fixes
+  Robert's problem and it shouldn't loop forever...
+  
+  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
+  
+  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!
+  
+  Reported-by: IvanoG on github
+  Fixes #4996
+  Closes #5002
+
+- tests: disable 962, 963 and 964 on Windows
+  
+  These tests are also doing UTF-8 SMTP.
+  
+  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
+  
+  Fixes #4988
+  Closes #4992
+
+- formdata/mime: copyright year range update
+  
+  Due to the merge/revert cycle
+
+- Revert "mime: latch last read callback status."
+  
+  This reverts commit 87869e38d7afdec3ef1bb4965711458b088e254f.
+  
+  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"
+  
+  This reverts commit b2caaa0681f329eed317ffb6ae6927f4a539f0c1.
+
+- altsvc: both h3 backends now speak h3-27
+  
+  ... also updated the HTTP3 build description for ngtcp2 accordingly.
+
+- [Patrick Monnerat brought this change]
+
+  mime: fix the binary encoder to handle large data properly
+  
+  New test 666 checks this is effective.
+  As upload buffer size is significant in this kind of tests, shorten it
+  in similar test 652.
+  
+  Fixes #4860
+  Reported-by: RuurdBeerstra on github
+
+- [Patrick Monnerat brought this change]
+
+  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.
+  
+  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.
+  
+  Fixes #4826
+  Reported-by: MrdUkk on github
+
+- [Patrick Monnerat brought this change]
+
+  mime: latch last read callback status.
+  
+  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.
+  
+  Fixes #4813
+  Reported-by: MrdUkk on github
+  Closes #4833
+
+Steve Holme (1 Mar 2020)
+- unit1651: Fixed conversion compilation warning
+  
+  371:17: warning: conversion to 'unsigned char' from 'int' may alter its
+          value [-Wconversion]
+  
+  Closes #5008
+
+- 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.
+  
+  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:
+  
+  Can't compile METALINK support without a crypto library.
+  
+  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
+  
+  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.
+
+Daniel Stenberg (1 Mar 2020)
+- build: remove all HAVE_OPENSSL_ENGINE_H defines
+  
+  ... as there's nothing in the code that actually uses the define! The
+  last reference was removed in 38203f158.
+  
+  Closes #5007
+
+Jay Satiro (29 Feb 2020)
+- [Rolf Eike Beer brought this change]
+
+  CMake: clean up and improve build procedures
+  
+  - remove check for unsupported old CMake versions
+  
+  - do not link to c-ares library twice
+  
+  - modernize custom Find modules
+  
+      - FindLibSSH2:
+          - pass version to FPHSA to show it in the output
+          - use LIBSSH2_VERSION define to extract the version number in
+            one shot. This variable exists in the header for 10 years.
+          - remove unneeded code
+  
+      - FindNGHTTP2.cmake:
+          - drop needless FPHSA argument
+          - mark found variables as advanced
+  
+      - FindNSS.cmake:
+          - show version number
+  
+      - FindCARES.cmake:
+          - drop default paths
+          - use FPHSA instead of checking things by hand
+  
+  - remove needless explict variable dereference
+  
+  - simplify count_true()
+  
+  - allow all policies up to version 3.16 to be set to NEW
+  
+  - do not rerun check for -Wstrict-aliasing=3 every time
+  
+  In contrast to every other compiler flag this has a = in it, which CMake
+  can't have in a variable name.
+  
+  - only read the interesting strings from curlver.h
+  
+  Reviewed-by: Peter Wu
+  
+  Closes https://github.com/curl/curl/pull/4975
+
+- runtests: fix output to command log
+  
+  - Record only the command of the most recently ran test in the command
+    log.
+  
+  This is a follow-up to 02988b7 from several weeks ago which fixed
+  writing to the command log, however it saved all commands for all tests
+  instead of just the most recently ran test as we would now expect.
+  
+  Fixes https://github.com/curl/curl/commit/02988b7#commitcomment-37546876
+  Closes https://github.com/curl/curl/pull/5001
+
+Steve Holme (1 Mar 2020)
+- polarssl: Additional removal
+  
+  Follow up to 6357a19f.
+  
+  Reviewed-by: Daniel Stenberg
+  Closes #5004
+
+- [Jonathan Cardoso Machado brought this change]
+
+  docs: fix typo on CURLINFO_RETRY_AFTER - alwaus -> always
+  
+  Reviewed-by: Steve Holme
+  Closes #5005
+
+- md5: Added implementation for mbedTLS
+  
+  Reviewed-by: Jay Satiro
+  Closes #4980
+
+- md5: Use pointer notation for array parameters in GnuTLS implementation
+
+- md4: Use non-deprecated functions in mbedTLS >= 2.7.0
+  
+  Closes #4983
+
+Marc Hoersken (29 Feb 2020)
+- ci/tests: Send test results to Azure DevOps for reporting
+
+Daniel Stenberg (29 Feb 2020)
+- pause: force-drain the transfer on unpause
+  
+  ... since the socket might not actually be readable anymore when for
+  example the data is already buffered in the TLS layer.
+  
+  Fixes #4966
+  Reported-by: Anders Berg
+  Closes #5000
+
+- TODO: curl --proxycommand
+  
+  Suggested-by: Kristian Mide
+  Closes #4941
+
+- smtp: overwriting 'from' leaks memory
+  
+  Detected by Coverity. CID 1418139.
+  
+  Also, make sure to return error if the new 'from' allocation fails.
+  
+  Closes #4997
+
+- CIfuzz: switch off 'dry_run' mode
+  
+  Follow-up from #4960: now make it fail if it detects problems.
+  
+  Closes #4998
+
+Marc Hoersken (28 Feb 2020)
+- ci/tests: Increase timeouts of Windows builds due to new tests
+  
+  Recently added tests increased their runtime above the limit of 60min.
+
+- ci/tests: align Azure Pipeline job names with each other
+
+- ci/tests: Add Windows builds via Azure Pipelines using Docker
+
+- tests: fix Python 3 compatibility of smbserver.py
+
+Daniel Stenberg (27 Feb 2020)
+- runtests: restore the command log
+  
+  The log file with all command lines for the invoked command lines is now
+  called logs/commands.log
+  
+  Fixes #4911
+  Closes #4989
+
+- smtp: fix memory leak on exit path
+  
+  Detected by Coverity. CID 1418139. "leaked_storage: Variable 'from'
+  going out of scope leaks the storage it points to"
+  
+  Closes #4990
+
+Steve Holme (27 Feb 2020)
+- gtls: Fixed compilation when using GnuTLS < 3.5.0
+  
+  Reverts the functionality from 41fcb4f when compiling with GnuTLS older
+  than 3.5.0.
+  
+  Reviewed-by: Daniel Stenberg
+  Closes #4984
+
+- RELEASE-NOTES: Corrected the link to issue #4892
+
+Daniel Stenberg (27 Feb 2020)
+- Curl_is_ASCII_name: handle a NULL argument
+  
+  Make the function tolerate a NULL pointer input to avoid dereferencing
+  that pointer.
+  
+  Follow-up to efce3ea5a85126d
+  Detected by OSS-Fuzz
+  Reviewed-By: Steve Holme
+  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=20907
+  Fixes #4985
+  Closes #4986
+
+- RELEASE-NOTES: synced
+
+- http2: make pausing/unpausing set/clear local stream window
+  
+  This reduces the HTTP/2 window size to 32 MB since libcurl might have to
+  buffer up to this amount of data in memory and yet we don't want it set
+  lower to potentially impact tranfer performance on high speed networks.
+  
+  Requires nghttp2 commit b3f85e2daa629
+  (https://github.com/nghttp2/nghttp2/pull/1444) to work properly, to end
+  up in the next release after 1.40.0.
+  
+  Fixes #4939
+  Closes #4940
+
+- [Anderson Toshiyuki Sasaki brought this change]
+
+  libssh: improve known hosts handling
+  
+  Previously, it was not possible to get a known hosts file entry due to
+  the lack of an API.  ssh_session_get_known_hosts_entry(), introduced in
+  libssh-0.9.0, allows libcurl to obtain such information and behave the
+  same as when compiled with libssh2.
+  
+  This also tries to avoid the usage of deprecated functions when the
+  replacements are available.  The behaviour will not change if versions
+  older than libssh-0.8.0 are used.
+  
+  Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
+  
+  Fixes #4953
+  Closes #4962
+
+Steve Holme (27 Feb 2020)
+- tests: Automatically deduce the tool name from the test case for unit tests
+  
+  It is still possible to override the executable to run during the test,
+  using the <tool> tag, but this patch removes the requirement that the
+  tag must be present for unit tests.
+  
+  It also removes the possibility of human error when existing test cases
+  are used as the basis for new tests, as recently witnessed in 81c37124.
+  
+  Reviewed-by: Daniel Stenberg
+  Closes #4976
+
+- test1323: Added the missing 'unit test' feature requirement in the test case
+
+Daniel Stenberg (26 Feb 2020)
+- cookie: remove unnecessary check for 'out != 0'
+  
+  ... as it will always be non-NULL at this point.
+  
+  Detected by Coverity: CID 1459009
+
+- http: added 417 response treatment
+  
+  When doing a request with a body + Expect: 100-continue and the server
+  responds with a 417, the same request will be retried immediately
+  without the Expect: header.
+  
+  Added test 357 to verify.
+  
+  Also added a control instruction to tell the sws test server to not read
+  the request body if Expect: is present, which the new test 357 uses.
+  
+  Reported-by: bramus on github
+  Fixes #4949
+  Closes #4964
+
+Steve Holme (26 Feb 2020)
+- smtp: Tidy up, following recent changes, to maintain the coding style
+  
+  Closes #4892
+
+- smtp: Support the SMTPUTF8 extension for the EXPN command
+  
+  Simply notify the server we support the SMTPUTF8 extension if it does.
+
+- smtp: Support the SMTPUTF8 extension in the VRFY command
+
+- smtp: Support the SMTPUTF8 extension in the RCPT TO command
+  
+  Note: The RCPT TO command isn't required to advertise to the server that
+  it contains UTF-8 characters, instead the server is told that a mail may
+  contain UTF-8 in any envelope command via the MAIL command.
+
+- smtp: Support the SMTPUTF8 extension in the MAIL command
+  
+  Support the SMTPUTF8 extension when sending mailbox information in the
+  MAIL command (FROM and AUTH parameters). Non-ASCII domain names will
+  be ACE encoded, if IDN is supported, whilst non-ASCII characters in
+  the local address part are passed to the server.
+  
+  Reported-by: ygthien on github
+  Fixes #4828
+
+- smtp: Detect server support for the UTF-8 extension as defined in RFC-6531
+
+- smtp: Support UTF-8 based host names in the VRFY command
+
+- smtp: Support UTF-8 based host names in the RCPT TO command
+
+- smtp: Support UTF-8 based host names in the MAIL command
+  
+  Non-ASCII host names will be ACE encoded if IDN is supported.
+
+- url: Make the IDN conversion functions available to others
+
+- smtp: Added UTF-8 mailbox tests to verify existing behaviour
+
+- ftpserver: Updated VRFY_smtp() so the response isn't necessary in the test case
+
+- ftpserver: Corrected the e-mail address regex in MAIL_smtp() and RCTP_smtp()
+  
+  The dot character between the host and the tld was not being escaped,
+  which meant it specified a match of 'any' character rather than an
+  explicit dot separator.
+  
+  Additionally removed the dot character from the host name as it allowed
+  the following to be specified as a valid address in our test cases:
+  
+  <bad@example......com>
+  
+  Both are typos from 98f7ca7 and 8880f84 :(
+  
+  I can't remember whether my intention was to allow sub-domains to be
+  specified in the host or not with these additional dots, but by placing
+  it outside of the host means it can only be specified once per domain
+  and by placing a + after the new grouping support for sub-domains is
+  kept.
+  
+  Closes #4912
+
+- hmac: Added a unit test for the HMAC hash generation
+  
+  Closes #4973
+
+- ntlm: Moved the HMAC MD5 function into the HMAC module as a generic function
+
+- tests: Added a unit test for MD4 digest generation
+  
+  Closes #4970
+
+- md4: Use const for the length input parameter
+  
+  This keeps the interface the same as md5 and sha256.
+
+- test1610: Fixed the link to the unit test
+  
+  Typo from 81c37124.
+
+- ntlm: Removed the dependency on the TLS libaries when using MD5
+  
+  As we have our own MD5 implementation use the MD5 wrapper to remove the
+  TLS dependency.
+  
+  Closes #4967
+
+- md5/sha256: Updated the functions to allow non-string data to be hashed
+
+- digest: Corrected the name of the local HTTP digest function
+  
+  Follow up to 2b5b37cb. Local static functions do not require the Curl
+  prefix.
+
+- tests: Added a unit test for SHA256 digest generation
+  
+  Follow up to 2b5b37c.
+  
+  Closes #4968
+
+- md4: Fixed compilation issues when using GNU TLS gcrypt
+  
+  * Don't include 'struct' in the gcrypt MD4_CTX typedef
+  * The call to gcry_md_read() should use a dereferenced ctx
+  * The call to gcry_md_close() should use a dereferenced ctx
+  
+  Additional minor whitespace issue in the USE_WIN32_CRYPTO code.
+  
+  Closes #4959
+
+Daniel Stenberg (21 Feb 2020)
+- RELEASE-NOTES: synced
+
+- http2: now require nghttp2 >= 1.12.0
+  
+  To simplify our code and since earlier versions lack important function
+  calls libcurl needs to function correctly.
+  
+  nghttp2 1.12.0 was relased on June 26, 2016.
+  
+  Closes #4961
+
+- gtls: fix the copyright year
+  
+  Follow-up from 41fcb4f609
+
+- [jethrogb brought this change]
+
+  GnuTLS: Always send client cert
+  
+  TLS servers may request a certificate from the client. This request
+  includes a list of 0 or more acceptable issuer DNs. The client may use
+  this list to determine which certificate to send. GnuTLS's default
+  behavior is to not send a client certificate if there is no
+  match. However, OpenSSL's default behavior is to send the configured
+  certificate. The `GNUTLS_FORCE_CLIENT_CERT` flag mimics OpenSSL
+  behavior.
+  
+  Authored-by: jethrogb on github
+  Fixes #1411
+  Closes #4958
+
+- [Leo Neat brought this change]
+
+  github action: add CIFuzz
+  
+  Closes #4960
+
+- cleanup: comment typos
+  
+  Spotted by 'codespell'
+  
+  Closes #4957
+
+Steve Holme (20 Feb 2020)
+- win32: USE_WIN32_CRYPTO to enable Win32 based MD4, MD5 and SHA256 functions
+  
+  Whilst lib\md4.c used this pre-processor, lib\md5.c and
+  src\tool_metalink.c did not and simply relied on the WIN32
+  pre-processor directive.
+  
+  Reviewed-by: Marcel Raad
+  Closes #4955
+
+Daniel Stenberg (19 Feb 2020)
+- connect: remove some spurious infof() calls
+  
+  As they were added primarily for debugging, they provide little use for
+  users.
+  
+  Closes #4951
+
+- HTTP-COOKIES: mention that a trailing newline is required
+  
+  ... so that we know we got the whole and not a partial line.
+  
+  Also, changed the formatting of the fields away from a table again since
+  the table format requires a github-markdown tool version that we don't
+  run on the web server atm.
+  
+  Reported-by: Sunny Bean
+  Fixes #4946
+  Closes #4947
+
+- nit: Copyright year out of date
+  
+  Follow-up to 1fc0617dcc
+
+Jay Satiro (18 Feb 2020)
+- tool_util: Improve Windows version of tvnow()
+  
+  - Change tool_util.c tvnow() for Windows to match more closely to
+    timeval.c Curl_now().
+  
+  - Create a win32 init function for the tool, since some initialization
+    is required for the tvnow() changes.
+  
+  Prior to this change the monotonic time function used by curl in Windows
+  was determined at build-time and not runtime. That was a problem because
+  when curl was built targeted for compatibility with old versions of
+  Windows (eg _WIN32_WINNT < 0x0600) it would use GetTickCount which wraps
+  every 49.7 days that Windows has been running.
+  
+  This change makes curl behave similar to libcurl's tvnow function, which
+  determines at runtime whether the OS is Vista+ and if so calls
+  QueryPerformanceCounter instead. (Note QueryPerformanceCounter is used
+  because it has higher resolution than the more obvious candidate
+  GetTickCount64). The changes to tvnow are basically a copy and paste but
+  the types in some cases are different.
+  
+  Ref: https://github.com/curl/curl/issues/3309
+  
+  Closes https://github.com/curl/curl/pull/4847
+
+Daniel Stenberg (18 Feb 2020)
+- SOCKS: fix typo in printf formatting
+  
+  Follow-up to 4a4b63daa
+  
+  Reported-by: Peter Piekarski
+  Bug: https://github.com/curl/curl/commit/4a4b63daaa01ef59b131d91e8e6e6dfe275c0f08#r37351330
+
+- CURLOPT_REDIR_PROTOCOLS.3: update the DEFAULT section
+  
+  to be in sync with the description above
+  
+  Reported-by: Joonas Kuorilehto
+  Fixes #4943
+  Closes #4945
+
+- docs/GOVERNANCE: refreshed + added "donations" and "commercial support"
+
+- altsvc: make saving the cache an atomic operation
+  
+  ... by writing the file to temp name then rename to the final when done.
+  
+  Assisted-by: Jay Satiro
+  Fixes #4936
+  Closes #4942
+
+- rename: a new file for Curl_rename()
+  
+  And make the cookie save function use it.
+
+- cookies: make saving atomic with a rename
+  
+  Saves the file as "[filename].[8 random hex digits].tmp" and renames
+  away the extension when done.
+  
+  Co-authored-by: Jay Satiro
+  Reported-by: Mike Frysinger
+  Fixes #4914
+  Closes #4926
+
+- RELEASE-NOTES: synced
+
+- socks: make the connect phase non-blocking
+  
+  Removes two entries from KNOWN_BUGS.
+  
+  Closes #4907
+
+- multi: if Curl_readwrite sets 'comeback' use expire, not loop
+  
+  Otherwise, a very fast single transfer ricks starving out other
+  concurrent transfers.
+  
+  Closes #4927
+
+- ftp: convert 'sock_accepted' to a plain boolean
+  
+  This was an array indexed with sockindex but it was only ever used for
+  the secondary socket.
+  
+  Closes #4929
+
+Jay Satiro (15 Feb 2020)
+- CURLINFO_COOKIELIST.3: Fix example
+  
+  Prior to this change the example would try to import cookies from stdin,
+  which wasn't what was intended.
+  
+  Reported-by: 3dyd@users.noreply.github.com
+  
+  Fixes https://github.com/curl/curl/issues/4930
+
+Daniel Stenberg (14 Feb 2020)
+- TODO: Paged searches on LDAP server
+  
+  Closes #4452
+
+- TODO: CURLOPT_SSL_CTX_FUNCTION for LDAPS
+  
+  Closes #4108
+
+- azure: disable brotli on the macos debug-builds
+  
+  Because of:
+  
+  brotli/decode.h:204:33: error: variable length array used [-Werror,-Wvla]
+      const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)],
+  
+  Closes #4925
+
+Steve Holme (13 Feb 2020)
+- tool_home: Fix the copyright year being out of date
+  
+  Follow up to 9dc350b6.
+
+Jay Satiro (12 Feb 2020)
+- tool_homedir: Change GetEnv() to use libcurl's curl_getenv()
+  
+  - Deduplicate GetEnv() code.
+  
+  - On Windows change ultimate call to use Windows API
+    GetEnvironmentVariable() instead of C runtime getenv().
+  
+  Prior to this change both libcurl and the tool had their own GetEnv
+  which over time diverged. Now the tool's GetEnv is a wrapper around
+  curl_getenv (libcurl API function which is itself a wrapper around
+  libcurl's GetEnv).
+  
+  Furthermore this change fixes a bug in that Windows API
+  GetEnvironmentVariable() is called instead of C runtime getenv() to get
+  the environment variable since some changes aren't always visible to the
+  latter.
+  
+  Reported-by: Christoph M. Becker
+  
+  Fixes https://github.com/curl/curl/issues/4774
+  Closes https://github.com/curl/curl/pull/4863
+
+Daniel Stenberg (12 Feb 2020)
+- strerror.h: Copyright year out of date
+  
+  Follow-up to 1c4fa67e8a8fcf6
+
+Jay Satiro (12 Feb 2020)
+- strerror: Increase STRERROR_LEN 128 -> 256
+  
+  STRERROR_LEN is the constant used throughout the library to set the size
+  of the buffer on the stack that the curl strerror functions write to.
+  
+  Prior to this change some extended length Windows error messages could
+  be truncated.
+  
+  Closes https://github.com/curl/curl/pull/4920
+
+- multi: fix outdated comment
+  
+  - Do not say that conn->data is "cleared" by multi_done().
+  
+  If the connection is in use then multi_done assigns another easy handle
+  still using the connection to conn->data, therefore in that case it is
+  not cleared.
+  
+  Closes https://github.com/curl/curl/pull/4901
+
+- easy: remove dead code
+  
+  multi is already assigned to data->multi by curl_multi_add_handle.
+  
+  Closes https://github.com/curl/curl/pull/4900
+
+Daniel Stenberg (12 Feb 2020)
+- create-dirs.d: mention the mode
+  
+  Reported-by: Dan Jacobson
+  Fixes #4766
+  Closes #4916
+
+- CURLOPT_ALTSVC_CTRL.3: fix the DEFAULT wording
+  
+  Assisted-by: Jay Satiro
+  Reported-by: Craig Andrews
+  Fixes #4909
+  Closes #4910
+
+- RELEASE-NOTES: synced
+
+Steve Holme (9 Feb 2020)
+- smtp: Simplify the MAIL command and avoid a duplication of send strings
+  
+  This avoids the duplication of strings when the optional AUTH and SIZE
+  parameters are required. It also assists with the modifications that
+  are part of #4892.
+  
+  Closes #4903
+
+Daniel Stenberg (9 Feb 2020)
+- altsvc: keep a copy of the file name to survive handle reset
+  
+  The alt-svc cache survives a call to curl_easy_reset fine, but the file
+  name to use for saving the cache was cleared. Now the alt-svc cache has
+  a copy of the file name to survive handle resets.
+  
+  Added test 1908 to verify.
+  
+  Reported-by: Craig Andrews
+  Fixes #4898
+  Closes #4902
+
+Steve Holme (9 Feb 2020)
+- url: Include the failure reason when curl_win32_idn_to_ascii() fails
+  
+  Provide the failure reason in the failf() info just as we do for the
+  libidn2 version of code.
+  
+  Closes #4899
+
+Jay Satiro (9 Feb 2020)
+- asyn-thread: remove dead code
+
+Daniel Stenberg (8 Feb 2020)
+- [Emil Engler brought this change]
+
+  github: Instructions to post "uname -a" on Unix systems in issues
+  
+  Closes #4896
+
+- [Cristian Greco brought this change]
+
+  configure.ac: fix comments about --with-quiche
+  
+  A simple s/nghttp3/quiche in some comments of --with-quiche.
+  Looks like a copy-paste error from --with-nghttp3.
+  
+  Closes #4897
+
+Steve Holme (7 Feb 2020)
+- checksrc.bat: Fix not being able to run script from the main curl directory
+  
+  If the script was ran from the main curl directory rather then the
+  projects directory then the script would simply exit without error:
+  
+  C:\url> projects\checksrc.bat
+  
+  The user would either need to change to the projects directory,
+  explicitly specify the current working directory, or perform a
+  oneline hacky workaround:
+  
+  C:\url> cd projects
+  C:\url\projects> checksrc.bat
+  
+  C:\url> checksrc.bat %cd%
+  
+  C:\url> pushd projects & checksrc.bat & popd
+  
+  Closes #4894
+
+Daniel Stenberg (7 Feb 2020)
+- [Pierre-Yves Bigourdan brought this change]
+
+  digest: Do not quote algorithm in HTTP authorisation
+  
+  RFC 7616 section 3.4 (The Authorization Header Field) states that "For
+  historical reasons, a sender MUST NOT generate the quoted string syntax
+  for the following parameters: algorithm, qop, and nc". This removes the
+  quoting for the algorithm parameter.
+  
+  Reviewed-by: Steve Holme
+  Closes #4890
+
+- ftp: remove the duplicated user/password struct fields
+  
+  Closes #4887
+
+- ftp: remove superfluous checking for crlf in user or pwd
+  
+  ... as this is already done much earlier in the URL parser.
+  
+  Also add test case 894 that verifies that pop3 with an encodedd CR in
+  the user name is rejected.
+  
+  Closes #4887
+
+Steve Holme (6 Feb 2020)
+- ntlm_wb: Use Curl_socketpair() for greater portability
+  
+  Reported-by: Daniel Stenberg
+  Closes #4886
+
+Daniel Stenberg (5 Feb 2020)
+- [Frank Gevaerts brought this change]
+
+  contributors: Also include people who contributed to curl-www
+  
+  Closes #4884
+
+- [Frank Gevaerts brought this change]
+
+  contrithanks: Use the most recent tag by default
+  
+  (similar to 5296abe)
+  
+  Closes #4883
+
+- scripts: use last set tag if none given
+  
+  Makes 'delta' and 'contributors.sh' easier to use.
+  
+  Make the delta script invoke contrithanks to get current number of
+  contributors instead of counting THANKS, for accuracy.
+  
+  Closes #4881
+
+- ftp: shrink temp buffers used for PORT
+  
+  These two stack based buffers only need to be 46 + 66 bytes instead of
+  256 + 1024.
+  
+  Closes #4880
+
+- curl: error on --alt-svc use w/o support
+  
+  Make the tool check for alt-svc support at run-time and return error
+  accordingly if not present when the option is used.
+  
+  Reported-by: Harry Sintonen
+  Closes #4878
+
+- docs/HTTP3: add --enable-alt-svc to curl's configure
+
+- RELEASE-PROCEDURE: feature win is closed post-release a few days
+  
+  We've tried to uphold this already but let's make it official by
+  publicly stating this is the way we do it.
+  
+  Closes #4877
+
+- altsvc: set h3 version at a common single spot
+  
+  ... and move the #ifdefs out of the functions. Addresses the fact they
+  were different before this change.
+  
+  Reported-by: Harry Sintonen
+  Closes #4876
+
+- [Harry Sintonen brought this change]
+
+  altsvc: improved header parser
+  
+  - Fixed the flag parsing to apply to specific alternative entry only, as
+  per RFC. The earlier code would also get totally confused by
+  multiprotocol header, parsing flags from the wrong part of the header.
+  
+  - Fixed the parser terminating on unknown protocols, instead of skipping
+  them.
+  
+  - Fixed a busyloop when protocol-id was present without an equal sign.
+  
+  Closes #4875
+
+- [Harry Sintonen brought this change]
+
+  ngtcp2: fixed to only use AF_INET6 when ENABLE_IPV6
+
+- docs/HTTP3: update the OpenSSL branch to use for ngtcp2
+  
+  Reported-by: James Fuller
+
+Steve Holme (4 Feb 2020)
+- ntlm: Pass the Curl_easy structure to the private winbind functions
+  
+  ...rather than the full conndata structure.
+
+Daniel Stenberg (4 Feb 2020)
+- RELEASE-NOTES: synced
+
+- tool_operhlp: Copyright year out of date, should be 2020
+  
+  Follow-up from 2bc373740a3
+
+- [Orgad Shaneh brought this change]
+
+  curl: avoid using strlen for testing if a string is empty
+  
+  Closes #4873
+
+Steve Holme (3 Feb 2020)
+- ntlm: Ensure the HTTP header data is not stored in the challenge/response
+
+Marcel Raad (3 Feb 2020)
+- openssl: remove redundant assignment
+  
+  Fixes a scan-build failure on Bionic.
+  
+  Closes https://github.com/curl/curl/pull/4872
+
+- travis: update non-OpenSSL Linux jobs to Bionic
+  
+  For the OpenSSL builds, test 323 [TLS-SRP to non-TLS-SRP server] is
+  failing with "curl returned 52, when expecting 35".
+  
+  Closes https://github.com/curl/curl/pull/4872
+
+Dan Fandrich (3 Feb 2020)
+- cirrus: Add some missing semicolons
+  
+  Newlines aren't preserved in this section so they're needed to separate
+  commands. The exports luckily worked anyway as a single long line, but
+  erroneously exported a variable called "export"
+  [skip ci]
+
+Daniel Gustafsson (2 Feb 2020)
+- [Pedro Monreal brought this change]
+
+  cleanup: fix typos and wording in docs and comments
+  
+  Closes #4869
+  Reviewed-by: Emil Engler and Daniel Gustafsson
+
+Steve Holme (2 Feb 2020)
+- ntlm: Move the winbind data into the NTLM data structure
+  
+  To assist with adding winbind support to the SASL NTLM authentication,
+  move the winbind specific data out of conndata into ntlmdata.
+
+Daniel Stenberg (30 Jan 2020)
+- quiche: Copyright year out of date
+  
+  Follow-up to 7fc63d72333a
+
+- altsvc: use h3-25
+  
+  Closes #4868
+
+- [Alessandro Ghedini brought this change]
+
+  quiche: update to draft-25
+  
+  Closes #4867
+
+- ngtcp2: update to git master and its draft-25 support
+  
+  Closes #4865
+
+- cookie: check __Secure- and __Host- case sensitively
+  
+  While most keywords in cookies are case insensitive, these prefixes are
+  specified explicitly to get checked "with a case-sensitive match".
+  
+  (From the 6265bis document in progress)
+  
+  Ref: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-04
+  Closes #4864
+
+- KNOWN_BUGS: Multiple methods in a single WWW-Authenticate: header
+
+- oauth2-bearer.d: works for HTTP too
+  
+  Reported-by: Mischa Salle
+  Bug: https://curl.haxx.se/mail/lib-2020-01/0070.html
+  Closes #4862
+
+- multi_done: if multiplexed, make conn->data point to another transfer
+  
+  ... since the current transfer is being killed. Setting to NULL is
+  wrong, leaving it pointing to 'data' is wrong since that handle might be
+  about to get freed.
+  
+  Fixes #4845
+  Closes #4858
+  Reported-by: dmitrmax on github
+
+- location.d: the method change is from POST to GET only
+  
+  Not from generic non-GET to GET.
+  
+  Reported-by: Andrius Merkys
+  Ref: #4859
+  Closes #4861
+
+- urlapi: guess scheme correct even with credentials given
+  
+  In the "scheme-less" parsing case, we need to strip off credentials
+  first before we guess scheme based on the host name!
+  
+  Assisted-by: Jay Satiro
+  Fixes #4856
+  Closes #4857
+
+- global_init: move the IPv6 works status bool to multi handle
+  
+  Previously it was stored in a global state which contributed to
+  curl_global_init's thread unsafety. This boolean is now instead figured
+  out in curl_multi_init() and stored in the multi handle. Less effective,
+  but thread safe.
+  
+  Closes #4851
+
+- [Jay Satiro brought this change]
+
+  README: mention that the docs is in docs/
+  
+  Reported-by: Austin Green
+  Fixes #4830
+  Closes #4853
+
+- curl.h: define CURL_WIN32 on windows
+  
+  ... so that the subsequent logic below can use a single known define to know
+  when built on Windows (as we don't define WIN32 anymore).
+  
+  Follow-up to 1adebe7886ddf20b
+  
+  Reported-by: crazydef on github
+  Assisted-by: Marcel Raad
+  Fixes #4854
+  Closes #4855
+
+- RELEASE-NOTES: synced
+
+- [Jon Rumsey brought this change]
+
+  urldata: do string enums without #ifdefs for build scripts
+  
+  ... and check for inconsistencies for OS400 at build time with the new
+  chkstrings tool.
+  
+  Closes #4822
+
+- curl: make the -# spaceship bar not wrap the line
+  
+  The fixed-point math made us lose precision and thus a too high index
+  value could be used for outputting the hashtags which could overwrite
+  the newline.
+  
+  The fix increases the precision in the sine table (*100) and the
+  associated position math.
+  
+  Reported-by: Andrew Potter
+  Fixes #4849
+  Closes #4850
+
+- global_init: assume the EINTR bit by default
+  
+  - Removed from global_init since it isn't thread-safe. The symbol will
+    still remain to not break compiles, it just won't have any effect going
+    forward.
+  
+  - make the internals NOT loop on EINTR (the opposite from previously).
+    It only risks returning from the select/poll/wait functions early, and that
+    should be risk-free.
+  
+  Closes #4840
+
+- [Peter Piekarski brought this change]
+
+  conn: do not reuse connection if SOCKS proxy credentials differ
+  
+  Closes #4835
+
+- llist: removed unused Curl_llist_move()
+  
+  (and the corresponding unit test)
+  
+  Closes #4842
+
+- conncache: removed unused Curl_conncache_bundle_size()
+
+- strcase: turn Curl_raw_tolower into static
+  
+  Only ever used from within this file.
+
+- singleuse.pl: support new API functions, fix curl_dbg_ handling
+
+- wolfssh: make it init properly via Curl_ssh_init()
+  
+  Closes #4846
+
+- [Aron Rotteveel brought this change]
+
+  form.d: fix two minor typos
+  
+  Closes #4843
+
+- openssl: make CURLINFO_CERTINFO not truncate x509v3 fields
+  
+  Avoid "reparsing" the content and instead deliver more exactly what is
+  provided in the certificate and avoid truncating the data after 512
+  bytes as done previously. This no longer removes embedded newlines.
+  
+  Fixes #4837
+  Reported-by: bnfp on github
+  Closes #4841
+
+Jay Satiro (23 Jan 2020)
+- CURLOPT_PROXY_SSL_OPTIONS.3: Sync with CURLOPT_SSL_OPTIONS.3
+  
+  - Copy CURLOPT_SSL_OPTIONS.3 description to CURLOPT_PROXY_SSL_OPTIONS.3.
+  
+  Prior to this change CURLSSLOPT_NO_PARTIALCHAIN was missing from the
+  CURLOPT_PROXY_SSL_OPTIONS description.
+
+Daniel Stenberg (22 Jan 2020)
+- mk-ca-bundle: add support for CKA_NSS_SERVER_DISTRUST_AFTER
+  
+  For now, no cert in the bundle actually sets a date there...
+  
+  Co-Authored-by: Jay Satiro
+  Reported-by: Christian Heimes
+  Fixes #4834
+  Closes #4836
+
+- RELEASE-NOTES: synced
+
+- [Pavel Volgarev brought this change]
+
+  smtp: Allow RCPT TO command to fail for some recipients
+  
+  Introduces CURLOPT_MAIL_RCPT_ALLLOWFAILS.
+  
+  Verified with the new tests 3002-3007
+  
+  Closes #4816
+
+- copyright: fix year ranges
+  
+  follow-up from dea17b519d (one of these days I'll learn to check before
+  I push)
+
+- [nao brought this change]
+
+  http: move "oauth_bearer" from connectdata to Curl_easy
+  
+  Fixes the bug where oauth_bearer gets deallocated when we re-use a
+  connection.
+  
+  Closes #4824
+
+- [Emil Engler brought this change]
+
+  curl: Let -D merge headers in one file again
+  
+  Closes #4762
+  Fixes #4753
+
+- data.d: remove "Multiple files can also be specified"
+  
+  It is superfluous and could even be misleading.
+  
+  Bug: https://curl.haxx.se/mail/archive-2020-01/0016.html
+  Reported-by: Mike Norton
+  Closes #4832
+
+Marcel Raad (20 Jan 2020)
+- CMake: support specifying the target Windows version
+  
+  Previously, it was only possible to set it to Windows Vista or XP by
+  setting the option `ENABLE_INET_PTON` to `ON` resp. `OFF`.
+  Use a new cache variable `CURL_TARGET_WINDOWS_VERSION` to be able to
+  explicitly set the target Windows version. `ENABLE_INET_PTON` is
+  ignored in this case.
+  
+  Ref: https://github.com/curl/curl/pull/1639#issuecomment-313039352
+  Ref: https://github.com/curl/curl/pull/4607#issuecomment-557541456
+  Closes https://github.com/curl/curl/pull/4815
+
+Daniel Stenberg (20 Jan 2020)
+- http.h: Copyright year out of date, should be 2020
+  
+  Follow-up to 7ff9222ced8c
+
+- [加藤郁之 brought this change]
+
+  HTTP: increase EXPECT_100_THRESHOLD to 1Mb
+  
+  Mentioned: https://curl.haxx.se/mail/lib-2020-01/0050.html
+  
+  Closes #4814
+
+- ROADMAP: thread-safe `curl_global_init()`
+  
+  I'd like to see this happen.
+
+- RELEASE-NOTES: synced
+
+- wolfssl: use the wc-prefixed symbol alternatives
+  
+  The symbols without wc_ prefix are not always provided.
+  
+  Ref: https://github.com/wolfSSL/wolfssl/issues/2744
+  
+  Closes #4827
+
+- polarssl: removed
+  
+  As detailed in DEPRECATE.md, the polarssl support is now removed after
+  having been disabled for 6 months and nobody has missed it.
+  
+  The threadlock files used by mbedtls are renamed to an 'mbedtls' prefix
+  instead of the former 'polarssl' and the common functions that
+  previously were shared between mbedtls and polarssl and contained the
+  name 'polarssl' have now all been renamed to instead say 'mbedtls'.
+  
+  Closes #4825
+
+Marcel Raad (16 Jan 2020)
+- libssh2: fix variable type
+  
+  This led to a conversion warning on 64-bit MinGW, which has 32-bit
+  `long` but 64-bit `size_t`.
+  
+  Closes https://github.com/curl/curl/pull/4823
+
+Daniel Stenberg (16 Jan 2020)
+- curl:progressbarinit: ignore column width from terminals < 20
+  
+  To avoid division by zero - or other issues.
+  
+  Reported-by: Daniel Marjamäki
+  Closes #4818
+
+- wolfssh: set the password correctly for PASSWORD auth
+
+- wolfssh: remove fprintf() calls (and uses of __func__)
+
+Marcel Raad (14 Jan 2020)
+- CMake: use check_symbol_exists also for inet_pton
+  
+  It doesn't make much sense to only check if the function can be linked
+  when it's not declared in any header and that is treated as an error.
+  With the correct target Windows version set, the function is declared
+  in ws2tcpip.h and the comment above the modified block is invalid.
+  
+  Also, move the definition of `_WIN32_WINNT` up to before all symbol
+  availability checks so that we don't have to care which ones must be
+  done after it.
+  
+  Tested with Visual Studio 2019 and current MinGW-w64.
+  
+  Closes https://github.com/curl/curl/pull/4808
+
+Jay Satiro (13 Jan 2020)
+- schannel_verify: Fix alt names manual verify for UNICODE builds
+  
+  Follow-up to 29e40a6 from two days ago, which added that feature for
+  Windows 7 and earlier. The bug only occurred in same.
+  
+  Ref: https://github.com/curl/curl/pull/4761
+
+Daniel Stenberg (13 Jan 2020)
+- HTTP-COOKIES.md: describe the cookie file format
+  
+  ... and refer to that file from from CURLOPT_COOKIEFILE.3 and
+  CURLOPT_COOKIELIST.3
+  
+  Assisted-by: Jay Satiro
+  Reported-by: bsammon on github
+  Fixes #4805
+  Closes #4806
+
+- [Tobias Hieta brought this change]
+
+  CMake: Add support for CMAKE_LTO option.
+  
+  This enables Link Time Optimization. LTO is a proven technique for
+  optimizing across compilation units.
+  
+  Closes #4799
+
+- RELEASE-NOTES: synced
+
+- ConnectionExists: respect the max_concurrent_streams limits
+  
+  A regression made the code use 'multiplexed' as a boolean instead of the
+  counter it is intended to be. This made curl try to "over-populate"
+  connections with new streams.
+  
+  This regression came with 41fcdf71a1, shipped in curl 7.65.0.
+  
+  Also, respect the CURLMOPT_MAX_CONCURRENT_STREAMS value in the same
+  check.
+  
+  Reported-by: Kunal Ekawde
+  Fixes #4779
+  Closes #4784
+
+- curl: make #0 not output the full URL
+  
+  It was not intended nor documented!
+  
+  Added test 1176 to verify.
+  
+  Reported-by: vshmuk on hackerone
+  
+  Closes #4812
+
+- wolfSSH: new SSH backend
+  
+  Adds support for SFTP (not SCP) using WolfSSH.
+  
+  Closes #4231
+
+- curl: remove 'config' field from OutStruct
+  
+  As it was just unnecessary duplicated information already stored in the
+  'per_transfer' struct and that's around mostly anyway.
+  
+  The duplicated pointer caused problems when the code flow was aborted
+  before the dupe was filled in and could cause a NULL pointer access.
+  
+  Reported-by: Brian Carpenter
+  Fixes #4807
+  Closes #4810
+
+- misc: Copyright year out of date, should be 2020
+  
+  Follow-up to recent commits
+  
+  [skip ci]
+
+Jay Satiro (11 Jan 2020)
+- [Santino Keupp brought this change]
+
+  libssh2: add support for forcing a hostkey type
+  
+  - Allow forcing the host's key type found in the known_hosts file.
+  
+  Currently, curl (with libssh2) does not take keys from your known_hosts
+  file into account when talking to a server. With this patch the
+  known_hosts file will be searched for an entry matching the hostname
+  and, if found, libssh2 will be told to claim this key type from the
+  server.
+  
+  Closes https://github.com/curl/curl/pull/4747
+
+- [Nicolas Guillier brought this change]
+
+  cmake: Improve libssh2 check on Windows
+  
+  - Add "libssh2" name to FindLibSSH2 library search.
+  
+  On Windows systems, libSSH2 CMake installation may name the library
+  "LibSSH2".
+  
+  Prior to this change cmake only checked for name "ssh2". On Linux that
+  works fine because it will prepend the "lib", but it doesn't do that on
+  Windows.
+  
+  Closes https://github.com/curl/curl/pull/4804
+
+- [Faizur Rahman brought this change]
+
+  schannel: Make CURLOPT_CAINFO work better on Windows 7
+  
+  - Support hostname verification via alternative names (SAN) in the
+    peer certificate when CURLOPT_CAINFO is used in Windows 7 and earlier.
+  
+  CERT_NAME_SEARCH_ALL_NAMES_FLAG doesn't exist before Windows 8. As a
+  result CertGetNameString doesn't quite work on those versions of
+  Windows. This change provides an alternative solution for
+  CertGetNameString by iterating through CERT_ALT_NAME_INFO for earlier
+  versions of Windows.
+  
+  Prior to this change many certificates failed the hostname validation
+  when CURLOPT_CAINFO was used in Windows 7 and earlier. Most certificates
+  now represent multiple hostnames and rely on the alternative names field
+  exclusively to represent their hostnames.
+  
+  Reported-by: Jeroen Ooms
+  
+  Fixes https://github.com/curl/curl/issues/3711
+  Closes https://github.com/curl/curl/pull/4761
+
+- [Emil Engler brought this change]
+
+  ngtcp2: Add an error code for QUIC connection errors
+  
+  - Add new error code CURLE_QUIC_CONNECT_ERROR for QUIC connection
+    errors.
+  
+  Prior to this change CURLE_FAILED_INIT was used, but that was not
+  correct.
+  
+  Closes https://github.com/curl/curl/pull/4754
+
+- multi: Change curl_multi_wait/poll to error on negative timeout
+  
+  - Add new error CURLM_BAD_FUNCTION_ARGUMENT and return that error when
+    curl_multi_wait/poll is passed timeout param < 0.
+  
+  Prior to this change passing a negative value to curl_multi_wait/poll
+  such as -1 could cause the function to wait forever.
+  
+  Reported-by: hamstergene@users.noreply.github.com
+  
+  Fixes https://github.com/curl/curl/issues/4763
+  
+  Closes https://github.com/curl/curl/pull/4765
+
+- [Marc Aldorasi brought this change]
+
+  cmake: Enable SMB for Windows builds
+  
+  - Define USE_WIN32_CRYPTO by default. This enables SMB.
+  
+  - Show whether SMB is enabled in the "Enabled features" output.
+  
+  - Fix mingw compiler warning for call to CryptHashData by casting away
+    const param. mingw CryptHashData prototype is wrong.
+  
+  Closes https://github.com/curl/curl/pull/4717
+
+- vtls: Refactor Curl_multissl_version to make the code clearer
+  
+  Reported-by: Johannes Schindelin
+  
+  Ref: https://github.com/curl/curl/pull/3863#pullrequestreview-241395121
+  
+  Closes https://github.com/curl/curl/pull/4803
+
+Daniel Stenberg (10 Jan 2020)
+- fix: Copyright year out of date, should be 2020
+  
+  Follow-up to 875314ed0bf3b
+
+Marcel Raad (10 Jan 2020)
+- hostip: move code to resolve IP address literals to `Curl_resolv`
+  
+  The code was duplicated in the various resolver backends.
+  
+  Also, it was called after the call to `Curl_ipvalid`, which matters in
+  case of `CURLRES_IPV4` when called from `connect.c:bindlocal`. This
+  caused test 1048 to fail on classic MinGW.
+  
+  The code ignores `conn->ip_version` as done previously in the
+  individual resolver backends.
+  
+  Move the call to the `resolver_start` callback up to appease test 655,
+  which wants it to be called also for literal addresses.
+  
+  Closes https://github.com/curl/curl/pull/4798
+
+Daniel Stenberg (9 Jan 2020)
+- scripts/delta: adapt to new public header layout
+
+- test1167: verify global symbols in public headers are curl prefixed
+  
+  ... using the new badsymbols.pl perl script
+  
+  Fixes #4793
+  Closes #4794
+
+- libtest/mk-lib1521: adapt to new public header layout
+
+- include: remove non-curl prefixed defines
+  
+  ...requires some rearranging of the setup of CURLOPT_ and CURLMOPT_
+  enums.
+
+- curl.h: remove WIN32 define
+  
+  It isn't our job to define this in a public header - and it defines a
+  name outside of our naming scope.
+
+- tool_dirhie.c: fix the copyright year range
+  
+  Follow-up to: 4027bd72d9
+
+- bump: work towards 7.69.0 is started
+
+Jay Satiro (9 Jan 2020)
+- tool_dirhie: Allow directory traversal during creation
+  
+  - When creating a directory hierarchy do not error when mkdir fails due
+    to error EACCESS (13) "access denied".
+  
+  Some file systems allow for directory traversal; in this case that it
+  should be possible to create child directories when permission to the
+  parent directory is restricted.
+  
+  This is a regression caused by me in f16bed0 (precedes curl-7_61_1).
+  Basically I had assumed that if a directory already existed it would
+  fail only with error EEXIST, and not error EACCES. The latter may
+  happen if the directory exists but has certain restricted permissions.
+  
+  Reported-by: mbeifuss@users.noreply.github.com
+  
+  Fixes https://github.com/curl/curl/issues/4796
+  Closes https://github.com/curl/curl/pull/4797
+
+Daniel Stenberg (9 Jan 2020)
+- KNOWN_BUGS: AUTH PLAIN for SMTP is not working on all servers
+  
+  Closes #4080
+
+- docs/RELEASE-PROCEDURE.md: pushed some release dates
+  
+  Ref: https://curl.haxx.se/mail/lib-2020-01/0031.html
+
+- runtests: make random seed fixed for a month
+  
+  When using randomized features of runtests (-R and --shallow) it is
+  useful to have a fixed random seed to make sure for example extra
+  commits in a branch or a rebase won't change the seed that would make
+  repeated runs work differently.
+  
+  As it is also useful to change seed sometimes, the default seed is now
+  determined based on the current month (and first line curl -V
+  output). When the month changes, so will the random seed.
+  
+  The specific seed is also shown in the standard test suite top header
+  and it can be set explictly with the new --seed=[num] option so that the
+  exact order of a previous run can be achieved.
+  
+  Closes #4734
+
+- RELEASE-PROCEDURE.md: fix next release date (Feb 26)
+  
+  [skip ci]
+
+Version 7.68.0 (8 Jan 2020)
+
+Daniel Stenberg (8 Jan 2020)
+- RELEASE-NOTES: 7.68.0
+
+- THANKS: updated with names from the 7.68.0 release
+
+- RELEASE-PROCEDURE: add four future release dates
+  
+  and remove four past release dates
+  
+  [skip ci]
+
+Marcel Raad (6 Jan 2020)
+- TrackMemory tests: always remove CR before LF
+  
+  It was removed for output containing ' =' via `s/ =.*//`. With classic
+  MinGW, this made lines with `free()` end with CRLF, but lines with e.g.
+  `malloc()` end with only LF. The tests expect LF only.
+  
+  Closes https://github.com/curl/curl/pull/4788
+
+Daniel Stenberg (6 Jan 2020)
+- multi.h: move INITIAL_MAX_CONCURRENT_STREAMS from public header
+  
+  ... to the private multihhandle.h. It is not for public use and it
+  wasn't prefixed correctly anyway!
+  
+  Closes #4790
+
+- file: fix copyright year range
+  
+  Follow-up to 1b71bc532bd
+
+- curl -w: handle a blank input file correctly
+  
+  Previously it would end up with an uninitialized memory buffer that
+  would lead to a crash or junk getting output.
+  
+  Added test 1271 to verify.
+  
+  Reported-by: Brian Carpenter
+  Closes #4786
+
+- file: on Windows, refuse paths that start with \\
+  
+  ... as that might cause an unexpected SMB connection to a given host
+  name.
+  
+  Reported-by: Fernando Muñoz
+  CVE-2019-15601
+  Bug: https://curl.haxx.se/docs/CVE-2019-15601.html
+
+Jay Satiro (6 Jan 2020)
+- CURLOPT_READFUNCTION.3: fix fopen params in example
+
+- CURLOPT_READFUNCTION.3: fix variable name in example
+  
+  Reported-by: Paul Joyce
+  
+  Fixes https://github.com/curl/curl/issues/4787
+
+Daniel Stenberg (5 Jan 2020)
+- curl:getparameter return error for --http3 if libcurl doesn't support
+  
+  Closes #4785
+
+- docs: mention CURL_MAX_INPUT_LENGTH restrictions
+  
+  ... for curl_easy_setopt() and curl_url_set().
+  
+  [skip ci]
+  
+  Closes #4783
+
+- curl: properly free mimepost data
+  
+  ... as it could otherwise leak memory when a transfer failed.
+  
+  Added test 1293 to verify.
+  
+  Reported-by: Brian Carpenter
+  Fixes #4781
+  Closes #4782
+
+- curl: cleanup multi handle on failure
+  
+  ... to fix memory leak in error path.
+  
+  Fixes #4772
+  Closes #4780
+  Reported-by: Brian Carpenter
+
+Marcel Raad (3 Jan 2020)
+- lib: fix compiler warnings with `CURL_DISABLE_VERBOSE_STRINGS`
+  
+  Closes https://github.com/curl/curl/pull/4775
+
+Daniel Stenberg (3 Jan 2020)
+- COPYING: it's 2020!
+  
+  [skip ci]
+
+Jay Satiro (3 Jan 2020)
+- [Marc Aldorasi brought this change]
+
+  tests: Fix bounce requests with truncated writes
+  
+  Prior to this change the swsbounce check in service_connection could
+  fail because prevtestno and prevpartno were not set, which would cause
+  the wrong response data to be sent to some tests and cause them to fail.
+  
+  Ref: https://github.com/curl/curl/pull/4717#issuecomment-570240785
+
+Marcel Raad (31 Dec 2019)
+- tool: make a few char pointers point to const char instead
+  
+  These are read-only.
+  
+  Closes https://github.com/curl/curl/pull/4771
+
+Jay Satiro (31 Dec 2019)
+- tests: Change NTLM tests to require SSL
+  
+  Prior to this change tests that required NTLM feature did not require
+  SSL feature.
+  
+  There are pending changes to cmake builds that will allow enabling NTLM
+  in non-SSL builds in Windows. In that case the NTLM auth strings created
+  are different from what is expected by the NTLM tests and they fail:
+  
+  "The issue with NTLM is that previous non-SSL builds would not enable
+  NTLM and so the NTLM tests would be skipped."
+  
+  Assisted-by: marc-groundctl@users.noreply.github.com
+  
+  Ref: https://github.com/curl/curl/pull/4717#issuecomment-566218729
+  
+  Closes https://github.com/curl/curl/pull/4768
+
+- [Michael Forney brought this change]
+
+  bearssl: Improve I/O handling
+  
+  Factor out common I/O loop as bearssl_run_until, which reads/writes TLS
+  records until the desired engine state is reached. This is now used for
+  the handshake, read, write, and close.
+  
+  Match OpenSSL SSL_write behavior, and don't return the number of bytes
+  written until the corresponding records have been completely flushed
+  across the socket. This involves keeping track of the length of data
+  buffered into the TLS engine, and assumes that when CURLE_AGAIN is
+  returned, the write function will be called again with the same data
+  and length arguments. This is the same requirement of SSL_write.
+  
+  Handle TLS close notify as EOF when reading by returning 0.
+  
+  Closes https://github.com/curl/curl/pull/4748
+
+- travis: Fix error detection
+  
+  - Stop using inline shell scripts for before_script and script sections.
+  
+  Prior to this change Travis could ignore errors from commands in inline
+  scripts. I don't understand how or why it happens. This is a workaround.
+  
+  Assisted-by: Simon Warta
+  
+  Ref: https://github.com/travis-ci/travis-ci/issues/1066
+  
+  Fixes https://github.com/curl/curl/issues/3730
+  Closes https://github.com/curl/curl/pull/3755
+
+- tool_operate: fix mem leak when failed config parse
+  
+  Found by fuzzing the config file.
+  
+  Reported-by: Geeknik Labs
+  
+  Fixes https://github.com/curl/curl/issues/4767
+
+- [Xiang Xiao brought this change]
+
+  lib: remove erroneous +x file permission on some c files
+  
+  Modified by commit eb9a604 accidentally.
+  
+  Closes https://github.com/curl/curl/pull/4756
+
+- [Xiang Xiao brought this change]
+
+  lib: fix warnings found when porting to NuttX
+  
+  - Undefine DEBUGASSERT in curl_setup_once.h in case it was already
+    defined as a system macro.
+  
+  - Don't compile write32_le in curl_endian unless
+    CURL_SIZEOF_CURL_OFF_T > 4, since it's only used by Curl_write64_le.
+  
+  - Include <arpa/inet.h> in socketpair.c.
+  
+  Closes https://github.com/curl/curl/pull/4756
+
+- os400: Add missing CURLE error constants
+  
+  Bug: https://github.com/curl/curl/pull/4754#issuecomment-569126922
+  Reported-by: Emil Engler
+
+- CURLOPT_HEADERFUNCTION.3: Document that size is always 1
+  
+  For compatibility with `fwrite`, the `CURLOPT_HEADERFUNCTION` callback
+  is passed two `size_t` parameters which, when multiplied, designate the
+  number of bytes of data passed in. In practice, CURL always sets the
+  first parameter (`size`) to 1.
+  
+  This practice is also enshrined in documentation and cannot be changed
+  in future. The documentation states that the default callback is
+  `fwrite`, which means `fwrite` must be a suitable function for this
+  purpose. However, the documentation also states that the callback must
+  return the number of *bytes* it successfully handled, whereas ISO C
+  `fwrite` returns the number of items (each of size `size`) which it
+  wrote. The only way these numbers can be equal is if `size` is 1.
+  
+  Since `size` is 1 and can never be changed in future anyway, document
+  that fact explicitly and let users rely on it.
+  
+  Reported-by: Frank Gevaerts
+  Commit-message-by: Christopher Head
+  
+  Ref: https://github.com/curl/curl/pull/2787
+  
+  Fixes https://github.com/curl/curl/issues/4758
+
+- examples/postinmemory.c: Call curl_global_cleanup always
+  
+  Prior to this change curl_global_cleanup was not called if
+  curl_easy_init failed.
+  
+  Reported-by: kouzhudong@users.noreply.github.com
+  
+  Fixes https://github.com/curl/curl/issues/4751
+
+Daniel Stenberg (21 Dec 2019)
+- url2file.c: fix copyright year
+  
+  Follow-up to 525787269599b5
+
+- [Rickard Hallerbäck brought this change]
+
+  examples/url2file.c: corrected a comment
+  
+  The comment was confusing and suggested that setting CURLOPT_NOPROGRESS
+  to 0L would both enable and disable debug output at the same time, like
+  a Schrödinger's cat of CURLOPTs.
+  
+  Closes #4745
+
+- HISTORY: OSS-Fuzz started fuzzing libcurl in 2017
+
+- RELEASE-NOTES: synced
+
+Jay Satiro (20 Dec 2019)
+- ngtcp2: Support the latest update key callback type
+  
+  - Remove our cb_update_key in favor of ngtcp2's new
+    ngtcp2_crypto_update_key_cb which does the same thing.
+  
+  Several days ago the ngtcp2_update_key callback function prototype was
+  changed in ngtcp2/ngtcp2@42ce09c. Though it would be possible to
+  fix up our cb_update_key for that change they also added
+  ngtcp2_crypto_update_key_cb which does the same thing so we'll use that
+  instead.
+  
+  Ref: https://github.com/ngtcp2/ngtcp2/commit/42ce09c
+  
+  Closes https://github.com/curl/curl/pull/4735
+
+Daniel Stenberg (19 Dec 2019)
+- sws: search for "Testno:" header uncondtionally if no testno
+  
+  Even if the initial request line wasn't found. With the fix to 1455, the
+  test number is now detected correctly.
+  
+  (Problem found when running tests in random order.)
+  
+  Closes #4744
+
+- tests: set LC_ALL in more tests
+  
+  Follow-up to 23208e330ac0c21
+  
+  Closes #4743
+
+- test165: set LC_ALL=en_US.UTF-8 too
+  
+  On my current Debian Unstable with libidn2 2.2.0, I get an error if
+  LC_ALL is set to blank. Then curl errors out with:
+  
+  curl: (3) Failed to convert www.åäö.se to ACE; could not convert string to UTF-8
+  
+  Closes #4738
+
+- curl.h: add two defines for the "pre ISO C" case
+  
+  Without this fix, this caused a compilation failure on AIX with IBM xlc
+  13.1.3 compiler.
+  
+  Reported-by: Ram Krushna Mishra
+  Fixes #4739
+  Closes #4740
+
+- create_conn: prefer multiplexing to using new connections
+  
+  ... as it would previously prefer new connections rather than
+  multiplexing in most conditions! The (now removed) code was a leftover
+  from the Pipelining code that was translated wrongly into a
+  multiplex-only world.
+  
+  Reported-by: Kunal Ekawde
+  Bug: https://curl.haxx.se/mail/lib-2019-12/0060.html
+  Closes #4732
+
+- test1456: remove the use of a fixed local port
+  
+  Fixup the test to instead not compare the port number. It sometimes
+  caused problems like this:
+  
+  "curl: (45) bind failed with errno 98: Address already in use"
+  
+  Closes #4733
+
+Jay Satiro (18 Dec 2019)
+- CURLOPT_QUOTE.3: fix typos
+  
+  Prior to this change the EXAMPLE in the QUOTE/PREQUOTE/POSTQUOTE man
+  pages would not compile because a variable name was incorrect.
+  
+  Reported-by: Bylon2@users.noreply.github.com
+  
+  Fixes https://github.com/curl/curl/issues/4736
+
+- [Gisle Vanem brought this change]
+
+  strerror: Fix compiler warning "empty expression"
+  
+  - Remove the final semi-colon in the SEC2TXT() macro definition.
+  
+  Before:  #define SEC2TXT(sec) case sec: txt = #sec; break;
+  
+  After:   #define SEC2TXT(sec) case sec: txt = #sec; break
+  
+  Prior to this change SEC2TXT(foo); would generate break;; which caused
+  the empty expression warning.
+  
+  Ref: https://github.com/curl/curl/commit/5b22e1a#r36458547
+
+Daniel Stenberg (18 Dec 2019)
+- curl/parseconfig: use curl_free() to free memory allocated by libcurl
+  
+  Reported-by: bxac on github
+  Fixes #4730
+  Closes #4731
+
+- curl/parseconfig: fix mem-leak
+  
+  When looping, first trying '.curlrc' and then '_curlrc', the function
+  would not free the first string.
+  
+  Closes #4731
+
+- CURLOPT_URL.3: "curl supports SMB version 1 (only)"
+  
+  [skip ci]
+
+- test1270: a basic -w redirect_url test
+  
+  Closes #4728
+
+- HISTORY: the SMB(S) support landed in 2014
+
+- define: remove HAVE_ENGINE_LOAD_BUILTIN_ENGINES, not used anymore
+  
+  It is covered by USE_OPENSSL_ENGINE now.
+  
+  Reported-by: Gisle Vanem
+  Bug: https://github.com/curl/curl/commit/87b9337c8f76c21c57b204e88b68c6ecf3bd1ac0#commitcomment-36447951
+  
+  Closes #4725
+
+- lib: remove ASSIGNWITHINCONDITION exceptions, use our code style
+  
+  ... even for macros
+  
+  Reviewed-by: Daniel Gustafsson
+  Reviewed-by: Jay Satiro
+  Reported-by: Jay Satiro
+  Fixes #4683
+  Closes #4722
+
+- tests: make sure checksrc runs on header files too
+
+- Revert "checksrc: fix regexp for ASSIGNWITHINCONDITION"
+  
+  This reverts commit ba82673dac3e8d00a76aa5e3779a0cb80e7442af.
+  
+  Bug: #4683
+
+- KNOWN_BUGS: TLS session cache doesn't work with TFO
+  
+  [skip ci]
+  Closes #4301
+
+- KNOWN_BUGS: Connection information when using TCP Fast Open
+  
+  Also point to #4296 for more details
+  Closes #4296
+
+- KNOWN_BUGS: LDAP on Windows doesn't work
+  
+  Closes #4261
+
+- docs: TLS SRP doesn't work with TLS 1.3
+  
+  Reported-by: sayrer on github
+  Closes #4262
+  [skip ci]
+
+Dan Fandrich (16 Dec 2019)
+- cirrus: Switch to the FreeBSD 12.1 point release & enable more tests.
+  
+  A few tests are now passing on FreeBSD, so no longer skip them.
+  [skip ci]
+
+Daniel Stenberg (16 Dec 2019)
+- azure: the macos cmake doesn't need to install cmake
+  
+   Error: cmake 3.15.5 is already installed
+   To upgrade to 3.16.1, run `brew upgrade cmake`.
+  
+  Closes #4723
+
+Jay Satiro (15 Dec 2019)
+- winbuild: Document CURL_STATICLIB requirement for static libcurl
+  
+  A static libcurl (ie winbuild mode=static) requires that the user define
+  CURL_STATICLIB when using it in their application. This is already
+  covered in the FAQ and INSTALL.md, but is a pretty important point so
+  now it's noted in the BUILD.WINDOWS.txt as well.
+  
+  Assisted-by: Michael Vittiglio
+  
+  Closes https://github.com/curl/curl/pull/4721
+
+Daniel Stenberg (15 Dec 2019)
+- [Santino Keupp brought this change]
+
+  libssh2: add support for ECDSA and ed25519 knownhost keys
+  
+  ... if a new enough libssh2 version is present.
+  
+  Source: https://curl.haxx.se/mail/archive-2019-12/0023.html
+  Co-Authored-by: Daniel Stenberg
+  Closes #4714
+
+- lib1591: free memory properly on OOM, in the trailers callback
+  
+  Detected by torture tests.
+  
+  Closes #4720
+
+- runtests: --repeat=[num] to repeat tests
+  
+  Closes #4715
+
+- RELEASE-NOTES: synced
+
+- azure: add a torture test on mac
+  
+  Uses --shallow=25 to keep it small enough to get through in time.
+  
+  Closes #4712
+
+- multi: free sockhash on OOM
+  
+  This would otherwise leak memory in the error path.
+  
+  Detected by torture test 1540.
+  
+  Closes #4713
+
+Marcel Raad (13 Dec 2019)
+- tests: use DoH feature for DoH tests
+  
+  Previously, http/2 was used instead.
+  
+  Assisted-by: Jay Satiro
+  Closes https://github.com/curl/curl/pull/4692
+
+- hostip: suppress compiler warning
+  
+  With `--disable-doh --disable-threaded-resolver`, the `dns` parameter
+  is not used.
+  
+  Closes https://github.com/curl/curl/pull/4692
+
+- tests: fix build with `CURL_DISABLE_DOH`
+  
+  Closes https://github.com/curl/curl/pull/4692
+
+Daniel Stenberg (13 Dec 2019)
+- azure: add a torture test
+  
+  Skipping all FTP tests for speed reasons.
+  
+  Closes #4697
+
+- azure: make the default build use --enable-debug --enable-werror
+
+- ntlm_wb: fix double-free in OOM
+  
+  Detected by torture testing test 1310
+  
+  Closes #4710
+
+Dan Fandrich (13 Dec 2019)
+- cirrus: Drop the FreeBSD 10.4 build
+  
+  Upstream support for 10.4 ended a year ago, and it looks like the image
+  is now gone, too.
+  [skip ci]
+
+Daniel Stenberg (13 Dec 2019)
+- unit1620: fix bad free in OOM
+  
+  Closes #4709
+
+- unit1609: fix mem-leak in OOM
+  
+  Closes #4709
+
+- unit1607: fix mem-leak in OOM
+  
+  Closes #4709
+
+- lib1559: fix mem-leak in OOM
+  
+  Closes #4709
+
+- lib1557: fix mem-leak in OOM
+  
+  Closes #4709
+
+- altsvc: make the save function ignore NULL filenames
+  
+  It might happen in OOM situations. Detected bv torture tests.
+  
+  Closes #4707
+
+- curl: fix memory leak in OOM in etags logic
+  
+  Detected by torture tests
+  
+  Closes #4706
+
+- doh: make it behave when built without proxy support
+  
+  Reported-by: Marcel Raad
+  Bug: https://github.com/curl/curl/pull/4692#issuecomment-564115734
+  
+  Closes #4704
+
+- curl: improved cleanup in upload error path
+  
+  Memory leak found by torture test 58
+  
+  Closes #4705
+
+- mailmap: fix Andrew Ishchuk
+
+- travis: make torture use --shallow=40
+  
+  As a first step to enable it to run over a more diverse set of tests in
+  a reasonable time.
+
+- runtests: introduce --shallow to reduce huge torture tests
+  
+  When set, shallow mode limits runtests -t to make no more than NUM fails
+  per test case. If more are found, it will randomly discard entries until
+  the number is right. The random seed can also be set.
+  
+  This is particularly useful when running MANY tests as then most torture
+  failures will already fail the same functions over and over and make the
+  total operation painfully tedious.
+  
+  Closes #4699
+
+- conncache: CONNECT_ONLY connections assumed always in-use
+  
+  This makes them never to be considered "the oldest" to be discarded when
+  reaching the connection cache limit. The reasoning here is that
+  CONNECT_ONLY is primarily used in combination with using the
+  connection's socket post connect and since that is used outside of
+  curl's knowledge we must assume that it is in use until explicitly
+  closed.
+  
+  Reported-by: Pavel Pavlov
+  Reported-by: Pavel Löbl
+  Fixes #4426
+  Fixes #4369
+  Closes #4696
+
+- [Gisle Vanem brought this change]
+
+  vtls: make BearSSL possible to set with CURL_SSL_BACKEND
+  
+  Ref: https://github.com/curl/curl/commit/9b879160df01e7ddbb4770904391d3b74114302b#commitcomment-36355622
+  
+  Closes #4698
+
+- RELEASE-NOTES: synced
+
+- travis: remove "coverage", make it "torture"
+  
+  The coveralls service and test coverage numbers are just too unreliable.
+  Removed badge from README.md as well.
+  
+  Fixes #4694
+  Closes #4695
+
+- azure: add libssh2 and cmake macos builds
+  
+  Removed the macos libssh2 build from travis
+  
+  Closes #4686
+
+- curl: use errorf() better
+  
+  Change series of error outputs to use errorf().
+  
+  Only errors that are due to mistakes in command line option usage should
+  use helpf(), other types of errors in the tool should rather use
+  errorf().
+  
+  Closes #4691
+
+Jay Satiro (9 Dec 2019)
+- [Marc Hoersken brought this change]
+
+  tests: make it possible to set executable extensions
+  
+  This enables the use of Windows Subsystem for Linux (WSL) to run the
+  testsuite against Windows binaries while using Linux servers.
+  
+  This commit introduces the following environment variables:
+  - CURL_TEST_EXE_EXT: set the executable extension for all components
+  - CURL_TEST_EXE_EXT_TOOL: set it for the curl tool only
+  - CURL_TEST_EXE_EXT_SSH: set it for the SSH tools only
+  
+  Later testcurl.pl could be adjusted to make use of those variables.
+  - CURL_TEST_EXE_EXT_SRV: set it for the test servers only
+  
+  (This is one of several commits to support use of WSL for the tests.)
+  
+  Closes https://github.com/curl/curl/pull/3899
+
+- [Marc Hoersken brought this change]
+
+  tests: fix permissions of ssh keys in WSL
+  
+  Keys created on Windows Subsystem for Linux (WSL) require it for some
+  reason.
+  
+  (This is one of several commits to support use of WSL for the tests.)
+  
+  Ref: https://github.com/curl/curl/pull/3899
+
+- [Marc Hoersken brought this change]
+
+  tests: use \r\n for log messages in WSL
+  
+  Bash in Windows Subsystem for Linux (WSL) requires it for some reason.
+  
+  (This is one of several commits to support use of WSL for the tests.)
+  
+  Ref: https://github.com/curl/curl/pull/3899
+
+- [Andrew Ishchuk brought this change]
+
+  winbuild: Define CARES_STATICLIB when WITH_CARES=static
+  
+  When libcurl is built with MODE=static, c-ares is forced into static
+  linkage too. That doesn't happen when MODE=dll so linker would break
+  over undefined symbols.
+  
+  closes https://github.com/curl/curl/pull/4688
+
+Daniel Stenberg (9 Dec 2019)
+- conn: always set bits.close with connclose()
+  
+  Closes #4690
+
+- cirrus: enable clang sanitizers on freebsd 13
+
+- conncache: fix multi-thread use of shared connection cache
+  
+  It could accidentally let the connection get used by more than one
+  thread, leading to double-free and more.
+  
+  Reported-by: Christopher Reid
+  Fixes #4544
+  Closes #4557
+
+- azure: add a vanilla macos build
+  
+  Closes #4685
+
+- curl: make the etag load logic work without fseek
+  
+  The fseek()s were unnecessary and caused Coverity warning CID 1456554
+  
+  Closes #4681
+
+- mailmap: Mohammad Hasbini
+
+- [Mohammad Hasbini brought this change]
+
+  docs: fix some typos
+  
+  Closes #4680
+
+- RELEASE-NOTES: synced
+
+Jay Satiro (5 Dec 2019)
+- lib: fix some loose ends for recently added CURLSSLOPT_NO_PARTIALCHAIN
+  
+  Add support for CURLSSLOPT_NO_PARTIALCHAIN in CURLOPT_PROXY_SSL_OPTIONS
+  and OS400 package spec.
+  
+  Also I added the option to the NameValue list in the tool even though it
+  isn't exposed as a command-line option (...yet?). (NameValue stringizes
+  the option name for the curl cmd -> libcurl source generator)
+  
+  Follow-up to 564d88a which added CURLSSLOPT_NO_PARTIALCHAIN.
+  
+  Ref: https://github.com/curl/curl/pull/4655
+
+- setopt: Fix ALPN / NPN user option when built without HTTP2
+  
+  - Stop treating lack of HTTP2 as an unknown option error result for
+    CURLOPT_SSL_ENABLE_ALPN and CURLOPT_SSL_ENABLE_NPN.
+  
+  Prior to this change it was impossible to disable ALPN / NPN if libcurl
+  was built without HTTP2. Setting either option would result in
+  CURLE_UNKNOWN_OPTION and the respective internal option would not be
+  set. That was incorrect since ALPN and NPN are used independent of
+  HTTP2.
+  
+  Reported-by: Shailesh Kapse
+  
+  Fixes https://github.com/curl/curl/issues/4668
+  Closes https://github.com/curl/curl/pull/4672
+
+Daniel Stenberg (5 Dec 2019)
+- etag: allow both --etag-compare and --etag-save in same cmdline
+  
+  Fixes #4669
+  Closes #4678
+
+Marcel Raad (5 Dec 2019)
+- curl_setup: fix `CURLRES_IPV6` condition
+  
+  Move the definition of `CURLRES_IPV6` to before undefining
+  `HAVE_GETADDRINFO`. Regression from commit 67a08dca27a which caused
+  some tests to fail and others to be skipped with c-ares.
+  
+  Fixes https://github.com/curl/curl/issues/4673
+  Closes https://github.com/curl/curl/pull/4677
+
+Daniel Stenberg (5 Dec 2019)
+- test342: make it return a 304 as the tag matches
+
+Peter Wu (4 Dec 2019)
+- CMake: add support for building with the NSS vtls backend
+  
+  Options are cross-checked with configure.ac and acinclude.m4.
+  Tested on Arch Linux, untested on other platforms like Windows or macOS.
+  
+  Closes #4663
+  Reviewed-by: Kamil Dudka
+
+Daniel Stenberg (4 Dec 2019)
+- azure: add more builds
+  
+  ... removed two from travis (that now runs on azure instead)
+  
+  Closes #4671
+
+- CURLOPT_VERBOSE.3: see also ERRORBUFFER
+
+- hostip4.c: bump copyright year range
+
+Marcel Raad (3 Dec 2019)
+- configure: enable IPv6 support without `getaddrinfo`
+  
+  This makes it possible to recognize and connect to literal IPv6
+  addresses when `getaddrinfo` is not available, which is already the
+  case for the CMake build. This affects e.g. classic MinGW because it
+  still targets Windows 2000 by default, where `getaddrinfo` is not
+  available, but general IPv6 support is.
+  
+  Instead of checking for `getaddrinfo`, check for `sockaddr_in6` as the
+  CMake build does.
+  
+  Closes https://github.com/curl/curl/pull/4662
+
+- curl_setup: disable IPv6 resolver without `getaddrinfo`
+  
+  Also, use `CURLRES_IPV6` only for actual DNS resolution, not for IPv6
+  address support. This makes it possible to connect to IPv6 literals by
+  setting `ENABLE_IPV6` even without `getaddrinfo` support. It also fixes
+  the CMake build when using the synchronous resolver without
+  `getaddrinfo` support.
+  
+  Closes https://github.com/curl/curl/pull/4662
+
+Daniel Stenberg (3 Dec 2019)
+- github action/azure pipeline: run 'make test-nonflaky' for tests
+  
+  To match travis and give more info on failures.
+
+- openssl: CURLSSLOPT_NO_PARTIALCHAIN can disable partial cert chains
+  
+  Closes #4655
+
+- openssl: set X509_V_FLAG_PARTIAL_CHAIN
+  
+  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.
+  
+  Other TLS backends already accept partial chains.
+  
+  Reported-by: Jeffrey Walton
+  Bug: https://curl.haxx.se/mail/lib-2019-11/0094.html
+
+- curl: show better error message when no homedir is found
+  
+  Reported-by: Vlastimil Ovčáčík
+  Fixes #4644
+  Closes #4665
+
+- OPENSOCKETFUNCTION.3: correct the purpose description
+  
+  Reported-by: Jeff Mears
+  Bug: https://curl.haxx.se/mail/lib-2019-12/0007.html
+  
+  Closes #4667
+
+- [Peter Wu brought this change]
+
+  travis: do not use OVERRIDE_CC or OVERRIDE_CXX if empty
+  
+  Fixes the macOS builds where OVERRIDE_CC and OVERRIDE_CXX are not set.
+  
+  Reported-by: Jay Satiro
+  Fixes #4659
+  Closes #4661
+  Closes #4664
+
+- azure-pipelines: fix the test script
+
+- Azure Pipelines: initial CI setup
+  
+  [skip ci]
+
+- docs: add "added: 7.68.0" to the --etag-* docs
+
+- copyright: fix the year ranges for two files
+  
+  Follow-up to 9c1806ae
+
+Jay Satiro (1 Dec 2019)
+- build: Disable Visual Studio warning "conditional expression is constant"
+  
+  - Disable warning C4127 "conditional expression is constant" globally
+    in curl_setup.h for when building with Microsoft's compiler.
+  
+  This mainly affects building with the Visual Studio project files found
+  in the projects dir.
+  
+  Prior to this change the cmake and winbuild build systems already
+  disabled 4127 globally for when building with Microsoft's compiler.
+  Also, 4127 was already disabled for all build systems in the limited
+  circumstance of the WHILE_FALSE macro which disabled the warning
+  specifically for while(0). This commit removes the WHILE_FALSE macro and
+  all other cruft in favor of disabling globally in curl_setup.
+  
+  Background:
+  
+  We have various macros that cause 0 or 1 to be evaluated, which would
+  cause warning C4127 in Visual Studio. For example this causes it:
+  
+      #define Curl_resolver_asynch() 1
+  
+  Full behavior is not clearly defined and inconsistent across versions.
+  However it is documented that since VS 2015 Update 3 Microsoft has
+  addressed this somewhat but not entirely, not warning on while(true) for
+  example.
+  
+  Prior to this change some C4127 warnings occurred when I built with
+  Visual Studio using the generated projects in the projects dir.
+  
+  Closes https://github.com/curl/curl/pull/4658
+
+- openssl: retrieve reported LibreSSL version at runtime
+  
+  - Retrieve LibreSSL runtime version when supported (>= 2.7.1).
+  
+  For earlier versions we continue to use the compile-time version.
+  
+  Ref: https://man.openbsd.org/OPENSSL_VERSION_NUMBER.3
+  
+  Closes https://github.com/curl/curl/pull/2425
+
+- strerror: Add Curl_winapi_strerror for Win API specific errors
+  
+  - In all code call Curl_winapi_strerror instead of Curl_strerror when
+    the error code is known to be from Windows GetLastError.
+  
+  Curl_strerror prefers CRT error codes (errno) over Windows API error
+  codes (GetLastError) when the two overlap. When we know the error code
+  is from GetLastError it is more accurate to prefer the Windows API error
+  messages.
+  
+  Reported-by: Richard Alcock
+  
+  Fixes https://github.com/curl/curl/issues/4550
+  Closes https://github.com/curl/curl/pull/4581
+
+Daniel Stenberg (2 Dec 2019)
+- global_init: undo the "intialized" bump in case of failure
+  
+  ... so that failures in the global init function don't count as a
+  working init and it can then be called again.
+  
+  Reported-by: Paul Groke
+  Fixes #4636
+  Closes #4653
+
+- parsedate: offer a getdate_capped() alternative
+  
+  ... and use internally. This function will return TIME_T_MAX instead of
+  failure if the parsed data is found to be larger than what can be
+  represented. TIME_T_MAX being the largest value curl can represent.
+  
+  Reviewed-by: Daniel Gustafsson
+  Reported-by: JanB on github
+  Fixes #4152
+  Closes #4651
+
+- docs: add more references to curl_multi_poll
+  
+  Fixes #4643
+  Closes #4652
+
+- sha256: bump the copyright year range
+  
+  Follow-up from 66e21520f
+
+Daniel Gustafsson (28 Nov 2019)
+- curl_setup_once: consistently use WHILE_FALSE in macros
+  
+  The WHILE_FALSE construction is used to avoid compiler warnings in
+  macro constructions. This fixes a few instances where it was not
+  used in order to keep the code consistent.
+  
+  Closes #4649
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+Daniel Stenberg (28 Nov 2019)
+- [Steve Holme brought this change]
+
+  http_ntlm: Remove duplicate NSS initialisation
+  
+  Given that this is performed by the NTLM code there is no need to
+  perform the initialisation in the HTTP layer. This also keeps the
+  initialisation the same as the SASL based protocols and also fixes a
+  possible compilation issue if both NSS and SSPI were to be used as
+  multiple SSL backends.
+  
+  Reviewed-by: Kamil Dudka
+  Closes #3935
+
+Daniel Gustafsson (28 Nov 2019)
+- checksrc: fix regexp for ASSIGNWITHINCONDITION
+  
+  The regexp looking for assignments within conditions was too greedy
+  and matched a too long string in the case of multiple conditionals
+  on the same line. This is basically only a problem in single line
+  macros, and the code which exemplified this was essentially:
+  
+    do { if((x) != NULL) { x = NULL; } } while(0)
+  
+  ..where the final parenthesis of while(0) matched the regexp, and
+  the legal assignment in the block triggered the warning. Fix by
+  making the regexp less greedy by matching for the tell-tale signs
+  of the if statement ending.
+  
+  Also remove the one occurrence where the warning was disabled due
+  to a construction like the above, where the warning didn't apply
+  when fixed.
+  
+  Closes #4647
+  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
+
+Daniel Stenberg (28 Nov 2019)
+- RELEASE-NOTES: synced
+
+- [Maros Priputen brought this change]
+
+  curl: two new command line options for etags
+  
+  --etag-compare and --etag-save
+  
+  Suggested-by: Paul Hoffman
+  Fixes #4277
+  Closes #4543
+
+Daniel Gustafsson (28 Nov 2019)
+- docs: fix typos
+
+Daniel Stenberg (28 Nov 2019)
+- mailmap: Niall O'Reilly's name
+
+- [Niall O'Reilly brought this change]
+
+  doh: use dedicated probe slots
+  
+  ... to easier allow additional DNS transactions.
+  
+  Closes #4629
+
+- travis: build ngtcp2 with --enable-lib-only
+  
+  ... makes it skip the examples and other stuff we don't neeed.
+  
+  Closes #4646
+
+- [David Benjamin brought this change]
+
+  ngtcp2: fix thread-safety bug in error-handling
+  
+  ERR_error_string(NULL) should never be called. It places the error in a
+  global buffer, which is not thread-safe. Use ERR_error_string_n with a
+  local buffer instead.
+  
+  Closes #4645
+
+- travis: export the CC/CXX variables when set
+  
+  Suggested-by: Peter Wu
+  Fixes #4637
+  Closes #4640
+
+Marcel Raad (26 Nov 2019)
+- dist: add error-codes.pl
+  
+  Follow-up to commit 74f441c6d31.
+  This should fix test 1175 when run via the daily source tarballs.
+  
+  Closes https://github.com/curl/curl/pull/4638
+
+Daniel Stenberg (26 Nov 2019)
+- [John Schroeder brought this change]
+
+  curl: fix --upload-file . hangs if delay in STDIN
+  
+  Attempt to unpause a busy read in the CURLOPT_XFERINFOFUNCTION.
+  
+  When uploading from stdin in non-blocking mode, a delay in reading
+  the stream (EAGAIN) causes curl to pause sending data
+  (CURL_READFUNC_PAUSE).  Prior to this change, a busy read was
+  detected and unpaused only in the CURLOPT_WRITEFUNCTION handler.
+  This change performs the same busy read handling in a
+  CURLOPT_XFERINFOFUNCTION handler.
+  
+  Fixes #2051
+  Closes #4599
+  Reported-by: bdry on github
+
+- [John Schroeder brought this change]
+
+  XFERINFOFUNCTION: support CURL_PROGRESSFUNC_CONTINUE
+  
+  (also for PROGRESSFUNCTION)
+  
+  By returning this value from the callback, the internal progress
+  function call is still called afterward.
+  
+  Closes #4599
+
+- [Michael Forney brought this change]
+
+  TLS: add BearSSL vtls implementation
+  
+  Closes #4597
+
+- curl_multi_wakeup.3: add example and AVAILABILITY
+  
+  Reviewed-by: Gergely Nagy
+  Closes #4635
+
+- [Gergely Nagy brought this change]
+
+  multi: add curl_multi_wakeup()
+  
+  This commit adds curl_multi_wakeup() which was previously in the TODO
+  list under the curl_multi_unblock name.
+  
+  On some platforms and with some configurations this feature might not be
+  available or can fail, in these cases a new error code
+  (CURLM_WAKEUP_FAILURE) is returned from curl_multi_wakeup().
+  
+  Fixes #4418
+  Closes #4608
+
+Jay Satiro (24 Nov 2019)
+- [Xiaoyin Liu brought this change]
+
+  schannel: fix --tls-max for when min is --tlsv1 or default
+  
+  Prior to this change schannel ignored --tls-max (CURL_SSLVERSION_MAX_
+  macros) when --tlsv1 (CURL_SSLVERSION_TLSv1) or default TLS
+  (CURL_SSLVERSION_DEFAULT), using a max of TLS 1.2 always.
+  
+  Closes https://github.com/curl/curl/pull/4633
+
+- checksrc.bat: Add a check for vquic and vssh directories
+  
+  Ref: https://github.com/curl/curl/pull/4607
+
+- projects: Fix Visual Studio projects SSH builds
+  
+  - Generate VQUIC and VSSH filenames in Visual Studio project files.
+  
+  Prior to this change generated Visual Studio project configurations that
+  enabled SSH did not build properly. Broken since SSH files were moved to
+  lib/vssh 3 months ago in 5b2d703.
+  
+  Fixes https://github.com/curl/curl/issues/4492
+  Fixes https://github.com/curl/curl/issues/4630
+  Closes https://github.com/curl/curl/pull/4607
+
+Daniel Stenberg (23 Nov 2019)
+- RELEASE-NOTES: synced
+
+Jay Satiro (22 Nov 2019)
+- openssl: Revert to less sensitivity for SYSCALL errors
+  
+  - Disable the extra sensitivity except in debug builds (--enable-debug).
+  
+  - Improve SYSCALL error message logic in ossl_send and ossl_recv so that
+    "No error" / "Success" socket error text isn't shown on SYSCALL error.
+  
+  Prior to this change 0ab38f5 (precedes 7.67.0) increased the sensitivity
+  of OpenSSL's SSL_ERROR_SYSCALL error so that abrupt server closures were
+  also considered errors. For example, a server that does not send a known
+  protocol termination point (eg HTTP content length or chunked encoding)
+  _and_ does not send a TLS termination point (close_notify alert) would
+  cause an error if it closed the connection.
+  
+  To be clear that behavior made it into release build 7.67.0
+  unintentionally. Several users have reported it as an issue.
+  
+  Ultimately the idea is a good one, since it can help prevent against a
+  truncation attack. Other SSL backends may already behave similarly (such
+  as Windows native OS SSL Schannel). However much more of our user base
+  is using OpenSSL and there is a mass of legacy users in that space, so I
+  think that behavior should be partially reverted and then rolled out
+  slowly.
+  
+  This commit changes the behavior so that the increased sensitivity is
+  disabled in all curl builds except curl debug builds (DEBUGBUILD). If
+  after a period of time there are no major issues then it can be enabled
+  in dev and release builds with the newest OpenSSL (1.1.1+), since users
+  using the newest OpenSSL are the least likely to have legacy problems.
+  
+  Bug: https://github.com/curl/curl/issues/4409#issuecomment-555955794
+  Reported-by: Bjoern Franke
+  
+  Fixes https://github.com/curl/curl/issues/4624
+  Closes https://github.com/curl/curl/pull/4623
+
+- [Daniel Stenberg brought this change]
+
+  openssl: improve error message for SYSCALL during connect
+  
+  Reported-by: Paulo Roberto Tomasi
+  Bug: https://curl.haxx.se/mail/archive-2019-11/0005.html
+  
+  Closes https://github.com/curl/curl/pull/4593
+
+Daniel Stenberg (22 Nov 2019)
+- test1175: verify symbols-in-versions and libcurl-errors.3 in sync
+  
+  Closes #4628
+
+- include: make CURLE_HTTP3 use a new error code
+  
+  To avoid potential issues with error code reuse.
+  
+  Reported-by: Christoph M. Becker
+  Assisted-by: Dan Fandrich
+  Fixes #4601
+  Closes #4627
+
+- bump: next release will be 7.68.0
+
+- curl: add --parallel-immediate
+  
+  Starting with this change when doing parallel transfers, without this
+  option set, curl will prefer to create new transfers multiplexed on an
+  existing connection rather than creating a brand new one.
+  
+  --parallel-immediate can be set to tell curl to prefer to use new
+  connections rather than to wait and try to multiplex.
+  
+  libcurl-wise, this means that curl will set CURLOPT_PIPEWAIT by default
+  on parallel transfers.
+  
+  Suggested-by: Tom van der Woerdt
+  Closes #4500
+
+Daniel Gustafsson (20 Nov 2019)
+- [Victor Magierski brought this change]
+
+  docs: fix typos
+  
+  Change 'experiemental' to 'experimental'.
+  
+  Closes #4618
+  Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
+
+Jay Satiro (18 Nov 2019)
+- projects: Fix Visual Studio wolfSSL configurations
+  
+  - s/USE_CYASSL/USE_WOLFSSL/
+  
+  - Remove old compatibility macros.
+  
+  Follow-up to 1c6c59a from several months ago when CyaSSL named symbols
+  were renamed to wolfSSL. The wolfSSL library was formerly named CyaSSL
+  and we kept using their old name for compatibility reasons, until
+  earlier this year.
+
+Daniel Stenberg (18 Nov 2019)
+- RELEASE-NOTES: synced
+
+- [Javier Blazquez brought this change]
+
+  ngtcp2: use overflow buffer for extra HTTP/3 data
+  
+  Fixes #4525
+  Closes #4603
+
+- altsvc: bump to h3-24
+  
+  ... as both ngtcp2 and quiche now support that in their master branches
+  
+  Closes #4604
+
+- ngtcp2: free used resources on disconnect
+  
+  Fixes #4614
+  Closes #4615
+
+- ngtcp2: handle key updates as ngtcp2 master branch tells us
+  
+  Reviewed-by: Tatsuhiro Tsujikawa
+  
+  Fixes #4612
+  Closes #4613
+
+Jay Satiro (17 Nov 2019)
+- [Gergely Nagy brought this change]
+
+  multi: Fix curl_multi_poll wait when extra_fds && !extra_nfds
+  
+  Prior to this change:
+  
+  The check if an extra wait is necessary was based not on the
+  number of extra fds but on the pointer.
+  
+  If a non-null pointer was given in extra_fds, but extra_nfds
+  was zero, then the wait was skipped even though poll was not
+  called.
+  
+  Closes https://github.com/curl/curl/pull/4610
+
+- lib: Move lib/ssh.h -> lib/vssh/ssh.h
+  
+  Follow-up to 5b2d703 which moved ssh source files to vssh.
+  
+  Closes https://github.com/curl/curl/pull/4609
+
+Daniel Stenberg (16 Nov 2019)
+- [Andreas Falkenhahn brought this change]
+
+  INSTALL.md: provide Android build instructions
+  
+  Closes #4606
+
+- [Niall O'Reilly brought this change]
+
+  doh: improced both encoding and decoding
+  
+  Improved estimation of expected_len and updated related comments;
+  increased strictness of QNAME-encoding, adding error detection for empty
+  labels and names longer than the overall limit; avoided treating DNAME
+  as unexpected;
+  
+  updated unit test 1655 with more thorough set of proofs and tests
+  
+  Closes #4598
+
+- ngtcp2: increase QUIC window size when data is consumed
+  
+  Assisted-by: Javier Blazquez
+  Ref #4525 (partial fix)
+  Closes #4600
+
+- [Melissa Mears brought this change]
+
+  config-win32: cpu-machine-OS for Windows on ARM
+  
+  Define the OS macro properly for Windows on ARM builds.  Also, we might
+  as well add the GCC-style IA-64 macro.
+  
+  Closes #4590
+
+- examples: add multi-poll.c
+  
+  Show how curl_multi_poll() makes it even easier to use the multi
+  interface.
+  
+  Closes #4596
+
+- multi_poll: avoid busy-loop when called without easy handles attached
+  
+  Fixes #4594
+  Closes #4595
+  Reported-by: 3dyd on github
+
+- curl: fix -T globbing
+  
+  Regression from e59371a4936f8 (7.67.0)
+  
+  Added test 490, 491 and 492 to verify the functionality.
+  
+  Reported-by: Kamil Dudka
+  Reported-by: Anderson Sasaki
+  
+  Fixes #4588
+  Closes #4591
+
+- HISTORY: added cmake, HTTP/3 and parallel downloads with curl
+
+- quiche: reject headers in the wrong order
+  
+  Pseudo header MUST come before regular headers or cause an error.
+  
+  Reported-by: Cynthia Coan
+  Fixes #4571
+  Closes #4584
+
+- openssl: prevent recursive function calls from ctx callbacks
+  
+  Follow the pattern of many other callbacks.
+  
+  Ref: #4546
+  Closes #4585
+
+- CURL-DISABLE: initial docs for the CURL_DISABLE_* defines
+  
+  The disable-scan script used in test 1165 is extended to also verify
+  that the docs cover all used defines and all defines offered by
+  configure.
+  
+  Reported-by: SLDiggie on github
+  Fixes #4545
+  Closes #4587
+
+- remove_handle: clear expire timers after multi_done()
+  
+  Since 59041f0, a new timer might be set in multi_done() so the clearing
+  of the timers need to happen afterwards!
+  
+  Reported-by: Max Kellermann
+  Fixes #4575
+  Closes #4583
+
+Marcel Raad (10 Nov 2019)
+- test1558: use double slash after file:
+  
+  Classic MinGW / MSYS 1 doesn't support `MSYS2_ARG_CONV_EXCL`, so this
+  test unnecessarily failed when using `file:/` instead of `file:///`.
+  
+  Closes https://github.com/curl/curl/pull/4554
+
+Daniel Stenberg (10 Nov 2019)
+- pause: avoid updating socket if done was already called
+  
+  ... avoids unnecesary recursive risk when the transfer is already done.
+  
+  Reported-by: Richard Bowker
+  Fixes #4563
+  Closes #4574
+
+Jay Satiro (9 Nov 2019)
+- strerror: Fix an error looking up some Windows error strings
+  
+  - Use FORMAT_MESSAGE_IGNORE_INSERTS to ignore format specifiers in
+    Windows error strings.
+  
+  Since we are not in control of the error code we don't know what
+  information may be needed by the error string's format specifiers.
+  
+  Prior to this change Windows API error strings which contain specifiers
+  (think specifiers like similar to printf specifiers) would not be shown.
+  The FormatMessage Windows API call which turns a Windows error code into
+  a string could fail and set error ERROR_INVALID_PARAMETER if that error
+  string contained a format specifier. FormatMessage expects a va_list for
+  the specifiers, unless inserts are ignored in which case no substitution
+  is attempted.
+  
+  Ref: https://devblogs.microsoft.com/oldnewthing/20071128-00/?p=24353
+
+- [r-a-sattarov brought this change]
+
+  system.h: fix for MCST lcc compiler
+  
+  Fixed build by MCST lcc compiler on MCST Elbrus 2000 architecture and do
+  some code cleanup.
+  
+  e2k (Elbrus 2000) - this is VLIW/EPIC architecture, like Intel Itanium
+  architecture.
+  
+  Ref: https://en.wikipedia.org/wiki/Elbrus_2000
+  
+  Closes https://github.com/curl/curl/pull/4576
+
+Daniel Stenberg (8 Nov 2019)
+- TODO: curl_multi_unblock
+  
+  Closes #4418
+
+- TODO: Run web-platform-tests url tests
+  
+  Closes #4477
+
+- TODO: 1.4 alt-svc sharing
+  
+  Closes #4476
+
+- test1560: require IPv6 for IPv6 aware URL parsing
+  
+  The URL parser function can't reject a bad IPv6 address properly when
+  curl was built without IPv6 support.
+  
+  Reported-by: Marcel Raad
+  Fixes #4556
+  Closes #4572
+
+- checksrc: repair the copyrightyear check
+  
+  - Consider a modified file to be committed this year.
+  
+  - Make the travis CHECKSRC also do COPYRIGHTYEAR scan in examples and
+    includes
+  
+  - Ignore 0 parents when getting latest commit date of file.
+  
+  since in the CI we're dealing with a truncated repo of last 50 commits,
+  the file's most recent commit may not be available. when this happens
+  git log and rev-list show the initial commit (ie first commit not to be
+  truncated) but that's incorrect so ignore it.
+  
+  Ref: https://github.com/curl/curl/pull/4547
+  
+  Closes https://github.com/curl/curl/pull/4549
+  
+  Co-authored-by: Jay Satiro
+
+- copyrights: fix copyright year range
+  
+  .. because checksrc's copyright year check stopped working.
+  
+  Ref: https://github.com/curl/curl/pull/4547
+  
+  Closes https://github.com/curl/curl/pull/4549
+
+- RELEASE-NOTES: synced
+
+- curlver: bump to 7.67.1
+
+- mailmap: fixup Massimiliano Fantuzzi
+
+- scripts/contributors: make committers get included too
+  
+  in addition to authors
+
+Jay Satiro (8 Nov 2019)
+- [Massimiliano Fantuzzi brought this change]
+
+  configure: fix typo in help text
+  
+  Closes https://github.com/curl/curl/pull/4570
+
+Daniel Stenberg (7 Nov 2019)
+- [Christian Schmitz brought this change]
+
+  ntlm: USE_WIN32_CRYPTO check removed to get USE_NTLM2SESSION set
+  
+  Closes #3704
+
+Jay Satiro (6 Nov 2019)
+- [Wyatt O'Day brought this change]
+
+  build: fix for CURL_DISABLE_DOH
+  
+  Fixes https://github.com/curl/curl/issues/4565
+  Closes https://github.com/curl/curl/pull/4566
+
+- [Leonardo Taccari brought this change]
+
+  configure: avoid unportable `==' test(1) operator
+  
+  Closes https://github.com/curl/curl/pull/4567
+
 Version 7.67.0 (5 Nov 2019)
 
 Daniel Stenberg (5 Nov 2019)
@@ -606,7 +3870,7 @@
 
 - CURLMOPT_MAX_CONCURRENT_STREAMS.3: fix SEE ALSO typo
 
-- [Niall brought this change]
+- [Niall O'Reilly brought this change]
 
   ESNI: initial build/setup
   
@@ -3973,3127 +7237,3 @@
   tests: make test 1420 and 1406 work with rtsp-disabled libcurl
   
   Closes #3948
-
-Kamil Dudka (27 May 2019)
-- [Hubert Kario brought this change]
-
-  nss: allow to specify TLS 1.3 ciphers if supported by NSS
-  
-  Closes #3916
-
-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.
-  
-  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.
-  
-  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.
-  
-  Revert "tests: Fix the line endings for the SASL alt-auth tests"
-  
-  This reverts commit c2a8d52a1356a722ff9f4aeb983cd4eaf80ef221.
-  
-  Revert "examples: Added SASL PLAIN authorisation identity (authzid) examples"
-  
-  This reverts commit 8c1cc369d0c7163c6dcc91fd38edfea1f509ae75.
-  
-  Revert "curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool"
-  
-  This reverts commit a9499ff136d89987af885e2d7dff0a066a3e5817.
-  
-  Revert "sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID"
-  
-  This reverts commit a14d72ca2fec5d4eb5a043936e4f7ce08015c177.
-
-- [dbrowndan brought this change]
-
-  FAQ: more minor updates and spelling fixes
-  
-  Closes #3937
-
-- RELEASE-NOTES: synced
-
-- sectransp: handle errSSLPeerAuthCompleted from SSLRead()
-  
-  Reported-by: smuellerDD on github
-  Fixes #3932
-  Closes #3933
-
-GitHub (24 May 2019)
-- [Gisle Vanem brought this change]
-
-  Fix typo.
-
-Daniel Stenberg (23 May 2019)
-- tool_setopt: for builds with disabled-proxy, skip all proxy setopts()
-  
-  Reported-by: Marcel Raad
-  Fixes #3926
-  Closes #3929
-
-Steve Holme (23 May 2019)
-- winbuild: Use two space indentation
-  
-  Closes #3930
-
-GitHub (23 May 2019)
-- [Gisle Vanem brought this change]
-
-  tool_parse_cfg: Avoid 2 fopen() for WIN32
-  
-  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")
-  
-  No need for 'fopen(), 'fclose()' and a 'fopen()' yet again.
-
-Daniel Stenberg (23 May 2019)
-- md4: include the mbedtls config.h to get the MD4 info
-
-- md4: build correctly with openssl without MD4
-  
-  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().
-
-Daniel Stenberg (23 May 2019)
-- .github/FUNDING: mention our opencollective "home" [ci skip]
-
-Marcel Raad (23 May 2019)
-- [Zenju brought this change]
-
-  config-win32: add support for if_nametoindex and getsockname
-  
-  Closes https://github.com/curl/curl/pull/3923
-
-Jay Satiro (23 May 2019)
-- tests: Fix the line endings for the SASL alt-auth tests
-  
-  - Change data and protocol sections to CRLF line endings.
-  
-  Prior to this change the tests would fail or hang, which is because
-  certain sections such as protocol require CRLF line endings.
-  
-  Follow-up to a9499ff from today which added the tests.
-  
-  Ref: https://github.com/curl/curl/pull/3790
-
-Daniel Stenberg (23 May 2019)
-- url: fix bad #ifdef
-  
-  Regression since e91e48161235272ff485.
-  
-  Reported-by: Tom Greenslade
-  Fixes #3924
-  Closes #3925
-
-- Revert "progress: CURL_DISABLE_PROGRESS_METER"
-  
-  This reverts commit 3b06e68b7734cb10a555f9d7e804dd5d808236a4.
-  
-  Clearly this change wasn't good enough as it broke CURLOPT_LOW_SPEED_LIMIT +
-  CURLOPT_LOW_SPEED_TIME
-  
-  Reported-by: Dave Reisner
-  
-  Fixes #3927
-  Closes #3928
-
-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
-  
-  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.
-  
-  Fixed #3653
-  Closes #3790
-
-Marc Hoersken (22 May 2019)
-- tests: add support to test against OpenSSH for Windows
-  
-  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
-
-Marcel Raad (22 May 2019)
-- examples: fix "clarify calculation precedence" warnings
-  
-  Closes https://github.com/curl/curl/pull/3919
-
-- hiperfifo: remove unused variable
-  
-  Closes https://github.com/curl/curl/pull/3919
-
-- examples: remove dead variable stores
-  
-  Closes https://github.com/curl/curl/pull/3919
-
-- examples: reduce variable scopes
-  
-  Closes https://github.com/curl/curl/pull/3919
-
-- http2-download: fix format specifier
-  
-  Closes https://github.com/curl/curl/pull/3919
-
-Daniel Stenberg (22 May 2019)
-- PolarSSL: deprecate support step 1. Removed from configure.
-  
-  Also removed mentions from most docs.
-  
-  Discussed: https://curl.haxx.se/mail/lib-2019-05/0045.html
-  
-  Closes #3888
-
-- configure/cmake: check for if_nametoindex()
-  
-  - adds the check to cmake
-  
-  - fixes the configure check to work for cross-compiled windows builds
-  
-  Closes #3917
-
-- parse_proxy: use the IPv6 zone id if given
-  
-  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.
-  
-  Reported-by: Edmond Yu
-  
-  Fixes #3482
-  Closes #3918
-
-Version 7.65.0 (22 May 2019)
-
-Daniel Stenberg (22 May 2019)
-- RELEASE-NOTES: 7.65.0 release
-
-- THANKS: from the 7.65.0 release-notes
-
-- url: convert the zone id from a IPv6 URL to correct scope id
-  
-  Reported-by: GitYuanQu on github
-  Fixes #3902
-  Closes #3914
-
-- configure: detect getsockname and getpeername on windows too
-  
-  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.
-  
-  Follow-up to e91e4816123
-  
-  Fixes #3913
-  Closes #3915
-
-Marcel Raad (21 May 2019)
-- examples: remove unused variables
-  
-  Fixes Codacy/CppCheck warnings.
-  
-  Closes
-
-Daniel Gustafsson (21 May 2019)
-- udpateconninfo: mark variable unused
-  
-  When compiling without getpeername() or getsockname(), the sockfd
-  paramter to Curl_udpateconninfo() became unused after commit e91e481612
-  added ifdef guards.
-  
-  Closes #3910
-  Fixes https://curl.haxx.se/dev/log.cgi?id=20190520172441-32196
-  Reviewed-by: Marcel Raad, Daniel Stenberg
-
-- ftp: move ftp_ccc in under featureflag
-  
-  Commit e91e48161235272ff485ff32bd048c53af731f43 moved ftp_ccc in under
-  the FTP featureflag in the UserDefined struct, but vtls callsites were
-  still using it unprotected.
-  
-  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: Olen Andoni
-  Fixes #3906
-  Closes #3907
-
-- [Guy Poizat brought this change]
-
-  mbedtls: enable use of EC keys
-  
-  Closes #3892
-
-- lib1560: add tests for parsing URL with too long scheme
-  
-  Ref: #3905
-
-- [Omar Ramadan brought this change]
-
-  urlapi: increase supported scheme length to 40 bytes
-  
-  The longest currently registered URI scheme at IANA is 36 bytes long.
-  
-  Closes #3905
-  Closes #3900
-
-Marcel Raad (20 May 2019)
-- lib: reduce variable scopes
-  
-  Fixes Codacy/CppCheck warnings.
-  
-  Closes https://github.com/curl/curl/pull/3872
-
-- tool_formparse: remove redundant assignment
-  
-  Just initialize word_begin with the correct value.
-  
-  Closes https://github.com/curl/curl/pull/3873
-
-- ssh: move variable declaration to where it's used
-  
-  This way, we need only one call to free.
-  
-  Closes https://github.com/curl/curl/pull/3873
-
-- ssh-libssh: remove unused variable
-  
-  sock was only used to be assigned to fd_read.
-  
-  Closes https://github.com/curl/curl/pull/3873
-
-Daniel Stenberg (20 May 2019)
-- test332: verify the blksize fix
-
-- tftp: use the current blksize for recvfrom()
-  
-  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
-  
-  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>
-
-Steve Holme (18 May 2019)
-- http_ntlm_wb: Handle auth for only a single request
-  
-  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).
-  
-  Implemented by imploying an additional state once a connection is
-  re-used to indicate that if we receive 401 we need to restart
-  authentication.
-  
-  Missed in fe6049f0.
-
-- http_ntlm_wb: Cleanup handshake after clean NTLM failure
-  
-  Missed in 50b87c4e.
-
-- http_ntlm_wb: Return the correct error on receiving an empty auth message
-  
-  Missed in fe20826b as it wasn't implemented in http.c in b4d6db83.
-  
-  Closes #3894
-
-Daniel Stenberg (18 May 2019)
-- curl: make code work with protocol-disabled libcurl
-  
-  Closes #3844
-
-- libcurl: #ifdef away more code for disabled features/protocols
-
-- progress: CURL_DISABLE_PROGRESS_METER
-
-- hostip: CURL_DISABLE_SHUFFLE_DNS
-
-- netrc: CURL_DISABLE_NETRC
-
-Viktor Szakats (16 May 2019)
-- docs: Markdown and misc improvements [ci skip]
-  
-  Approved-by: Daniel Stenberg
-  Closes #3896
-
-- 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
-
-Daniel Stenberg (16 May 2019)
-- travis: add an osx http-only build
-  
-  Closes #3887
-
-- 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
-
-- curl: don't set FTP options for FTP-disabled builds
-  
-  ... since libcurl has started to be totally unaware of options for
-  disabled protocols they now return error.
-  
-  Bug: https://github.com/curl/curl/commit/c9c5304dd4747cbe75d2f24be85920d572fcb5b8#commitcomment-33533937
-  
-  Reported-by: Marcel Raad
-  Closes #3886
-
-Steve Holme (16 May 2019)
-- http_ntlm_wb: Move the type-2 message processing into a dedicated function
-  
-  This brings the code inline with the other HTTP authentication mechanisms.
-  
-  Closes #3890
-
-Daniel Stenberg (15 May 2019)
-- RELEASE-NOTES: synced
-
-- docs/RELEASE-PROCEDURE: updated coming releases dates [ci skip]
-
-- CURLOPT_READFUNCTION.3: see also CURLOPT_UPLOAD_BUFFERSIZE [ci skip]
-  
-  Reported-by: Roy Bellingan
-  Bug: #3885
-
-- parse_proxy: use the URL parser API
-  
-  As we treat a given proxy as a URL we should use the unified URL parser
-  to extract the parts out of it.
-  
-  Closes #3878
-
-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.
-  
-  Closes #3882
-
-- http_ntlm: Move the NTLM state out of the ntlmdata structure
-  
-  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()
-  
-  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().
-  
-  Closes #3881
-
-Daniel Stenberg (14 May 2019)
-- urlapi: require a non-zero host name length when parsing URL
-  
-  Updated test 1560 to verify.
-  
-  Closes #3880
-
-- configure: error out if OpenSSL wasn't detected when asked for
-  
-  If --with-ssl is used and configure still couldn't enable SSL this
-  creates an error instead of just silently ignoring the fact.
-  
-  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()
-  
-  No need to set variables to zero as calloc() does this for us.
-  
-  Closes #3879
-
-Daniel Stenberg (14 May 2019)
-- CURLOPT_CAINFO.3: with Schannel, you want Windows 8 or later [ci skip]
-  
-  Clues-provided-by: Jay Satiro
-  Clues-provided-by: Jeroen Ooms
-  Fixes #3711
-  Closes #3874
-
-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 (13 May 2019)
-- RELEASE-NOTES: synced
-
-- appveyor: also build "/ci" branches like travis
-
-- pingpong: disable more when no pingpong enabled
-
-- proxy: acknowledge DISABLE_PROXY more
-
-- parsedate: CURL_DISABLE_PARSEDATE
-
-- sasl: only enable if there's a protocol enabled using it
-
-- mime: acknowledge CURL_DISABLE_MIME
-
-- wildcard: disable from build when FTP isn't present
-
-- http: CURL_DISABLE_HTTP_AUTH
-
-- base64: build conditionally if there are users
-
-- doh: CURL_DISABLE_DOH
-
-Steve Holme (12 May 2019)
-- auth: Rename the various authentication clean up functions
-  
-  For consistency and to a avoid confusion.
-  
-  Closes #3869
-
-Daniel Stenberg (12 May 2019)
-- [Jay Satiro brought this change]
-
-  docs/INSTALL: fix broken link [ci skip]
-  
-  Reported-by: Joombalaya on github
-  Fixes #3818
-
-Marcel Raad (12 May 2019)
-- easy: fix another "clarify calculation precedence" warning
-  
-  I missed this one in commit 6b3dde7fe62ea5a557fd1fd323fac2bcd0c2e9be.
-
-- build: fix "clarify calculation precedence" warnings
-  
-  Codacy/CppCheck warns about this. Consistently use parentheses as we
-  already do in some places to silence the warning.
-  
-  Closes https://github.com/curl/curl/pull/3866
-
-- cmake: restore C89 compatibility of CurlTests.c
-  
-  I broke it in d1b5cf830bfe169745721b21245d2217d2c2453e and
-  97de97daefc2ed084c91eff34af2426f2e55e134.
-  
-  Reported-by: Viktor Szakats
-  Ref: https://github.com/curl/curl/commit/97de97daefc2ed084c91eff34af2426f2e55e134#commitcomment-33499044
-  Closes https://github.com/curl/curl/pull/3868
-
-Steve Holme (11 May 2019)
-- http_ntlm: Corrected the name of the include guard
-  
-  Missed in f0bdd72c.
-  
-  Closes #3867
-
-- http_digest: Don't expose functions when HTTP and Crypto Auth are disabled
-  
-  Closes #3861
-
-- http_negotiate: Don't expose functions when HTTP is disabled
-
-Daniel Stenberg (11 May 2019)
-- SECURITY-PROCESS: fix links [ci skip]
-
-Marcel Raad (11 May 2019)
-- CMake: suppress unused variable warnings
-  
-  I missed these in commit d1b5cf830bfe169745721b21245d2217d2c2453e.
-
-Daniel Stenberg (11 May 2019)
-- doh: disable DOH for the cases it doesn't work
-  
-  Due to limitations in Curl_resolver_wait_resolv(), it doesn't work for
-  DOH resolves. This fix disables DOH for those.
-  
-  Limitation added to KNOWN_BUGS.
-  
-  Fixes #3850
-  Closes #3857
-
-Jay Satiro (11 May 2019)
-- checksrc.bat: Ignore snprintf warnings in docs/examples
-  
-  .. because we allow snprintf use in docs/examples.
-  
-  Closes https://github.com/curl/curl/pull/3862
-
-Steve Holme (10 May 2019)
-- vauth: Fix incorrect function description for Curl_auth_user_contains_domain()
-  
-  ...and misalignment of these comments. From a78c61a4.
-  
-  Closes #3860
-
-Jay Satiro (10 May 2019)
-- Revert "multi: support verbose conncache closure handle"
-  
-  This reverts commit b0972bc.
-  
-  - No longer show verbose output for the conncache closure handle.
-  
-  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.
-  
-  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.
-  
-  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.
-  
-  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.
-  
-  Bug: https://curl.haxx.se/mail/lib-2019-05/0021.html
-  Reported-by: Kristoffer Gleditsch
-  
-  Ref: https://github.com/curl/curl/pull/3598
-  Ref: https://github.com/curl/curl/pull/3618
-  
-  Closes https://github.com/curl/curl/pull/3856
-
-Steve Holme (10 May 2019)
-- ntlm: Fix misaligned function comments for Curl_auth_ntlm_cleanup()
-  
-  From 6012fa5a.
-  
-  Closes #3858
-
-Daniel Stenberg (9 May 2019)
-- BUG-BOUNTY: minor formatting fixes [ci skip]
-
-- RELEASE-NOTES: synced
-
-- BUG-BOUNTY.md: add the Dropbox "bonus" extra payout ability [ci skip]
-  
-  Closes #3839
-
-Kamil Dudka (9 May 2019)
-- http_negotiate: do not treat failure of gss_init_sec_context() as fatal
-  
-  Fixes #3726
-  Closes #3849
-
-- spnego_gssapi: fix return code on gss_init_sec_context() failure
-  
-  Fixes #3726
-  Closes #3849
-
-Steve Holme (9 May 2019)
-- gen_resp_file.bat: Removed unnecessary @ from all but the first command
-  
-  There is need to use @ on every command once echo has been turned off.
-  
-  Closes #3854
-
-Jay Satiro (8 May 2019)
-- http: Ignore HTTP/2 prior knowledge setting for HTTP proxies
-  
-  - Do not switch to HTTP/2 for an HTTP proxy that is not tunnelling to
-    the destination host.
-  
-  We already do something similar for HTTPS proxies by not sending h2. [1]
-  
-  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.
-  
-  [1]: https://github.com/curl/curl/commit/17c5d05
-  
-  Bug: https://github.com/curl/curl/issues/3570
-  Bug: https://github.com/curl/curl/issues/3832
-  
-  Closes https://github.com/curl/curl/pull/3853
-
-Marcel Raad (8 May 2019)
-- travis: update mesalink build to xenial
-  
-  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
-  
-  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
-  
-  Closes #3771
-
-Kamil Dudka (7 May 2019)
-- [Frank Gevaerts brought this change]
-
-  nss: allow fifos and character devices for certificates.
-  
-  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.
-  
-  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.
-  
-  Closes #3807
-
-Daniel Gustafsson (6 May 2019)
-- test2100: Fix typos in test description
-
-Daniel Stenberg (6 May 2019)
-- ssh: define USE_SSH if SSH is enabled (any backend)
-  
-  Closes #3846
-
-Steve Holme (5 May 2019)
-- winbuild: Add our standard copyright header to the winbuild batch files
-
-- makedebug: Fix ERRORLEVEL detection after running where.exe
-  
-  Closes #3838
-
-Daniel Stenberg (5 May 2019)
-- urlapi: add CURLUPART_ZONEID to set and get
-  
-  The zoneid can be used with IPv6 numerical addresses.
-  
-  Updated test 1560 to verify.
-  
-  Closes #3834
-
-- [Taiyu Len brought this change]
-
-  WRITEFUNCTION: add missing set_in_callback around callback
-  
-  Closes #3837
-
-- RELEASE-NOTES: synced
-
-- CURLMOPT_TIMERFUNCTION.3: warn about the recursive risk [ci skip]
-  
-  Reported-by: Ricardo Gomes
-  
-  Bug: #3537
-  Closes #3836
-
-- CURLOPT_CHUNK_BGN_FUNCTION.3: document the struct and time value
-  
-  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.
-  
-  Fixes #3829
-  Closes #3835
-
-- OS400/ccsidcurl.c: code style fixes
-
-- OS400/ccsidcurl: replace use of Curl_vsetopt
-  
-  (and make the code style comply)
-  
-  Fixes #3833
-
-- 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.
-  
-  Also makes curl_url_set() syntax check CURLUPART_HOST.
-  
-  Fixes #3817
-  Closes #3822
-
-- RELEASE-NOTES: synced
-
-- multiif.h: remove unused protos
-  
-  ... for functions related to pipelining. Those functions were removed in
-  2f44e94efb3df.
-  
-  Closes #3828
-
-- [Yiming Jing brought this change]
-
-  travis: mesalink: temporarily disable test 3001
-  
-  ... due to SHA-1 signatures in test certs
-
-- [Yiming Jing brought this change]
-
-  travis: upgrade the MesaLink TLS backend to v1.0.0
-  
-  Closes #3823
-  Closes #3776
-
-- ConnectionExists: improve non-multiplexing use case
-  
-  - better log output
-  
-  - make sure multiplex is enabled for it to be used
-
-- multi: provide Curl_multiuse_state to update information
-  
-  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
-  
-  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.
-
-- http: mark bundle as not for multiuse on < HTTP/2 response
-  
-  Fixes #3813
-  Closes #3815
-
-Daniel Gustafsson (1 May 2019)
-- cookie: Guard against possible NULL ptr deref
-  
-  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.
-  
-  Closes #3820 #3821
-  Reported-by: Jonathan Moerman
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Patrick Monnerat (30 Apr 2019)
-- os400: Add CURLOPT_MAXAGE_CONN to ILE/RPG bindings
-
-Kamil Dudka (29 Apr 2019)
-- nss: provide more specific error messages on failed init
-  
-  Closes #3808
-
-Daniel Stenberg (29 Apr 2019)
-- [Reed Loden brought this change]
-
-  docs: minor polish to the bug bounty / security docs
-  
-  Closes #3811
-
-- CURL_MAX_INPUT_LENGTH: largest acceptable string input size
-  
-  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().
-  
-  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.
-  
-  NOTE: This does not apply to `CURLOPT_POSTFIELDS`.
-  
-  Test 1559 verifies.
-  
-  Closes #3805
-
-- [Tseng Jun brought this change]
-
-  curlver.h: use parenthesis in CURL_VERSION_BITS macro
-  
-  Closes #3809
-
-Marcel Raad (27 Apr 2019)
-- [Simon Warta brought this change]
-
-  cmake: rename CMAKE_USE_DARWINSSL to CMAKE_USE_SECTRANSP
-  
-  Closes https://github.com/curl/curl/pull/3769
-
-Steve Holme (23 Apr 2019)
-- ntlm: Missed pre-processor || (or) during rebase for cd15acd0
-
-- ntlm: Support the NT response in the type-3 when OpenSSL doesn't include MD4
-  
-  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.
-
-Daniel Gustafsson (23 Apr 2019)
-- INTERNALS: fix misindentation of ToC item
-  
-  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
-  
-  Add the subsections under "Structs in libcurl" to the table of contents.
-  
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-  Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
-
-- [Aron Bergman brought this change]
-
-  INTERNALS: Add code highlighting
-  
-  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>
-
-Daniel Stenberg (22 Apr 2019)
-- docs/BUG-BOUNTY: bug bounty time [skip ci]
-  
-  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.
-  
-  Assisted-by: Daniel Gustafsson
-  
-  Closes #3488
-
-Steve Holme (22 Apr 2019)
-- sasl: Don't send authcid as authzid for the PLAIN mechanism as per RFC 4616
-  
-  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.
-
-Jay Satiro (22 Apr 2019)
-- [Gisle Vanem brought this change]
-
-  memdebug: fix variable name
-  
-  Follow-up to 76b6348 which renamed logfile as curl_dbg_logfile.
-  
-  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
-  
-  Follow up to 762a292f.
-
-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.
-  
-  Ref: #3722
-  Closes #3782
-
-Daniel Gustafsson (20 Apr 2019)
-- [Po-Chuan Hsieh brought this change]
-
-  altsvc: Fix building with cookies disables
-  
-  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.
-  
-  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
-  
-  which basically just makes sure LOGOUT is *not* issued on disconnect
-
-- Curl_disconnect: treat all CONNECT_ONLY connections as "dead"
-  
-  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.
-  
-  Bug: https://curl.haxx.se/mail/lib-2019-04/0052.html
-  
-  Closes #3795
-
-- multi: fix the statenames (follow-up fix from 2f44e94efb3df8e)
-  
-  The list of names must be in sync with the defined states in the header
-  file!
-
-Steve Holme (16 Apr 2019)
-- openvms: Remove pre-processors for Windows as VMS cannot support them
-
-- openvms: Remove pre-processor for SecureTransport as VMS cannot support it
-  
-  Fixes #3768
-  Closes #3785
-
-Jay Satiro (16 Apr 2019)
-- TODO: Add issue link to an existing entry
-
-Daniel Stenberg (16 Apr 2019)
-- RELEASE-NOTES: synced
-
-Jay Satiro (16 Apr 2019)
-- tool_help: Warn if curl and libcurl versions do not match
-  
-  .. because functionality may be affected if the versions differ.
-  
-  This commit implements TODO 18.7 "warning if curl version is not in sync
-  with libcurl version".
-  
-  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
-
-- md5: Forgot to update the code alignment in d84da52d
-
-- md5: Return CURLcode from the internally accessible functions
-  
-  Following 28f826b3 to return CURLE_OK instead of numeric 0.
-
-Daniel Gustafsson (15 Apr 2019)
-- tests: Run global cleanup at end of tests
-  
-  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:
-  
-    ==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)
-  
-  Closes #3783
-  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Marcel Raad (15 Apr 2019)
-- travis: use mbedtls from Xenial
-  
-  No need to build it from source anymore.
-  
-  Closes https://github.com/curl/curl/pull/3779
-
-- travis: use libpsl from Xenial
-  
-  This makes building libpsl and libidn2 from source unnecessary and
-  removes the need for the autopoint and libunistring-dev packages.
-  
-  Closes https://github.com/curl/curl/pull/3779
-
-Daniel Stenberg (15 Apr 2019)
-- runtests: start socksd like other servers
-  
-  ... without a $srcdir prefix. Triggered by the failures in several
-  autobuilds.
-  
-  Closes #3781
-
-Daniel Gustafsson (14 Apr 2019)
-- socksd: Fix typos
-  
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-- socksd: Properly decorate static variables
-  
-  Mark global variables static to avoid compiler warning in Clang when
-  using -Wmissing-variable-declarations.
-  
-  Closes #3778
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Steve Holme (14 Apr 2019)
-- md(4|5): Fixed indentation oddities with the importation of replacement code
-  
-  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.
-
-- md5: Code style to return CURLE_OK rather than numeric 0
-
-- md5: Corrected code style for some pointer arguments
-
-Marcel Raad (13 Apr 2019)
-- travis: update some builds to xenial
-  
-  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.
-  
-  Closes https://github.com/curl/curl/pull/3777
-
-Daniel Stenberg (13 Apr 2019)
-- test: make tests and test scripts use socksd for SOCKS
-  
-  Make all SOCKS tests use socksd instead of ssh.
-
-- socksd: new SOCKS 4+5 server for tests
-  
-  Closes #3752
-
-- singleipconnect: show port in the verbose "Trying ..." message
-  
-  To aid debugging better.
-
-- [tmilburn brought this change]
-
-  CURLOPT_ADDRESS_SCOPE: fix range check and more
-  
-  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.
-  
-  I have fixed the documentation so it all refers to scope ids.
-  
-  In addition Curl_if2ip refered to the scope id as remote_scope_id which
-  is incorrect, so I renamed it to local_scope_id.
-  
-  Adjusted-by: Daniel Stenberg
-  
-  Closes #3655
-  Closes #3765
-  Fixes #3713
-
-- urlapi: stricter CURLUPART_PORT parsing
-  
-  Only allow well formed decimal numbers in the input.
-  
-  Document that the number MUST be between 1 and 65535.
-  
-  Add tests to test 1560 to verify the above.
-  
-  Ref: https://github.com/curl/curl/issues/3753
-  Closes #3762
-
-Jay Satiro (13 Apr 2019)
-- [Jan Ehrhardt brought this change]
-
-  winbuild: Support MultiSSL builds
-  
-  - Remove the lines in winbuild/Makefile.vc that generate an error with
-    multiple SSL backends.
-  
-  - Add /DCURL_WITH_MULTI_SSL in winbuild/MakefileBuild.vc if multiple SSL
-    backends are set.
-  
-  Closes https://github.com/curl/curl/pull/3772
-
-Daniel Stenberg (12 Apr 2019)
-- travis: remove mesalink builds (temporarily?)
-  
-  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.
-  
-  Closes #3767
-
-- openssl: mark connection for close on TLS close_notify
-  
-  Without this, detecting and avoid reusing a closed TLS connection
-  (without a previous GOAWAY) when doing HTTP/2 is tricky.
-  
-  Reported-by: Tom van der Woerdt
-  Fixes #3750
-  Closes #3763
-
-- 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
-
-Daniel Stenberg (11 Apr 2019)
-- test1906: verify CURLOPT_CURLU + CURLOPT_PORT usage
-  
-  Based-on-code-by: Poul T Lomholt
-
-- url: always clone the CUROPT_CURLU handle
-  
-  Since a few code paths actually update that data.
-  
-  Fixes #3753
-  Closes #3761
-  
-  Reported-by: Poul T Lomholt
-
-- CURLOPT_DNS_USE_GLOBAL_CACHE: remove
-  
-  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.
-  
-  Closes #3654
-
-Marcel Raad (11 Apr 2019)
-- travis: install libgnutls28-dev only for --with-gnutls build
-  
-  Reduces the time needed for the other jobs a little.
-  
-  Closes https://github.com/curl/curl/pull/3721
-
-- travis: install libnss3-dev only for --with-nss build
-  
-  Reduces the time needed for the other jobs a little.
-  
-  Closes https://github.com/curl/curl/pull/3721
-
-- travis: install libssh2-dev only for --with-libssh2 build
-  
-  Reduces the time needed for the other jobs a little.
-  
-  Closes https://github.com/curl/curl/pull/3721
-
-- travis: install libssh-dev only for --with-libssh build
-  
-  Reduces the time needed for the other jobs a little.
-  
-  Closes https://github.com/curl/curl/pull/3721
-
-- travis: install krb5-user only for --with-gssapi build
-  
-  Reduces the time needed for the other jobs a little.
-  
-  Closes https://github.com/curl/curl/pull/3721
-
-- travis: install lcov only for the coverage job
-  
-  Reduces the time needed for the other jobs a little.
-  
-  Closes https://github.com/curl/curl/pull/3721
-
-- travis: install clang only when needed
-  
-  This reduces the GCC job runtimes a little and it's needed to
-  selectively update clang builds to xenial.
-  
-  Closes https://github.com/curl/curl/pull/3721
-
-- AppVeyor: enable testing for WinSSL build
-  
-  Closes https://github.com/curl/curl/pull/3725
-
-- build: fix Codacy/CppCheck warnings
-  
-  - 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
-  
-  Closes https://github.com/curl/curl/pull/3739
-
-- polarssl_threadlock: remove conditionally unused code
-  
-  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.
-  
-  Also, move POLARSSL_MUTEX_T define to implementation file as it's not
-  used externally.
-  
-  Closes https://github.com/curl/curl/pull/3739
-
-- lib557: initialize variables
-  
-  These variables are only conditionally initialized.
-  
-  Closes https://github.com/curl/curl/pull/3739
-
-- lib509: add missing include for strdup
-  
-  Closes https://github.com/curl/curl/pull/3739
-
-- README.md: fix no-consecutive-blank-lines Codacy warning
-  
-  Consistently use one blank line between blocks.
-  
-  Closes https://github.com/curl/curl/pull/3739
-
-- tests/server/util: fix Windows Unicode build
-  
-  Always use the ANSI version of FormatMessage as we don't have the
-  curl_multibyte gear available here.
-  
-  Closes https://github.com/curl/curl/pull/3758
-
-Daniel Stenberg (11 Apr 2019)
-- curl_easy_getinfo.3: fix minor formatting mistake
-
-Daniel Gustafsson (11 Apr 2019)
-- xattr: skip unittest on unsupported platforms
-  
-  The stripcredentials unittest fails to compile on platforms without
-  xattr support, for example the Solaris member in the buildfarm which
-  fails with the following:
-  
-    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
-  
-  Fix by excluding the test on such platforms by using the reverse
-  logic from where stripcredentials() is defined.
-  
-  Closes #3759
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Steve Holme (11 Apr 2019)
-- emailL Added reference to RFC8314 for implicit TLS
-
-- README: Schannel, stop calling it "winssl"
-  
-  Stick to "Schannel" everywhere - follow up to 180501cb.
-
-Jakub Zakrzewski (10 Apr 2019)
-- cmake: clear CMAKE_REQUIRED_LIBRARIES after each use
-  
-  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.
-  
-  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.
-  
-  This commit also avoids #3743 (GSSAPI build errors) on itself with cmake
-  3.6 or above. That issue was fixed separately for all versions.
-  
-  Ref: #3744
-
-- cmake: minor cleanup
-  
-  - Remove nneeded include_regular_expression.
-    It was setting what is already a default.
-  
-  - Remove duplicated include.
-  
-  - Don't check for pre-3.0.0 CMake version.
-    We already require at least 3.0.0, so it's just clutter.
-  
-  Ref: #3744
-
-Steve Holme (8 Apr 2019)
-- build-openssl.bat: Fixed support for OpenSSL v1.1.0+
-
-- build-openssl.bat: Perfer the use of if statements rather than goto (where possible)
-
-- build-openssl.bat: Perform the install for each build type directly after the build
-
-- build-openssl.bat: Split the install of static and shared build types
-
-- build-openssl.bat: Split the building of static and shared build types
-
-- build-openssl.bat: Move the installation into a separate function
-
-- build-openssl.bat: Move the build step into a separate function
-
-- build-openssl.bat: Move the OpenSSL configuration into a separate function
-
-- build-openssl.bat: Fixed the BUILD_CONFIG variable not being initialised
-  
-  Should the parent environment set this variable then the build might
-  not be performed as the user intended.
-
-Daniel Stenberg (8 Apr 2019)
-- socks: fix error message
-
-- config.d: clarify that initial : and = might need quoting [skip ci]
-  
-  Fixes #3738
-  Closes #3749
-
-- RELEASE-NOTES: synced
-  
-  bumped to 7.65.0 for next release
-
-- socks5: user name and passwords must be shorter than 256
-  
-  bytes... since the protocol needs to store the length in a single byte field.
-  
-  Reported-by: XmiliaH on github
-  Fixes #3737
-  Closes #3740
-
-- [Jakub Zakrzewski brought this change]
-
-  test: urlapi: urlencode characters above 0x7f correctly
-
-- [Jakub Zakrzewski brought this change]
-
-  urlapi: urlencode characters above 0x7f correctly
-  
-  fixes #3741
-  Closes #3742
-
-- [Even Rouault brought this change]
-
-  multi_runsingle(): fix use-after-free
-  
-  Fixes #3745
-  Closes #3746
-  
-  The following snippet
-  ```
-  
-  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
-  
-  ```
-  ==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)
-  ```
-  
-  This has been bisected to commit 2f44e94
-  
-  Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=14109
-  Credit to OSS Fuzz
-
-- pipelining: removed
-  
-  As previously planned and documented in DEPRECATE.md, all pipelining
-  code is removed.
-  
-  Closes #3651
-
-- [cclauss brought this change]
-
-  tests: make Impacket (SMB server) Python 3 compatible
-  
-  Closes #3731
-  Fixes #3289
-
-Marcel Raad (6 Apr 2019)
-- [Simon Warta brought this change]
-
-  cmake: set SSL_BACKENDS
-  
-  This groups all SSL backends into the feature "SSL" and sets the
-  SSL_BACKENDS analogue to configure.ac
-  
-  Closes https://github.com/curl/curl/pull/3736
-
-- [Simon Warta brought this change]
-
-  cmake: don't run SORT on empty list
-  
-  In case of an empty list, SORTing leads to the cmake error "list
-  sub-command SORT requires list to be present."
-  
-  Closes https://github.com/curl/curl/pull/3736
-
-Daniel Gustafsson (5 Apr 2019)
-- [Eli Schwartz brought this change]
-
-  configure: fix default location for fish completions
-  
-  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).
-  
-  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.
-  
-  Closes #3723
-  Reviewed-by: Daniel Gustafsson
-
-Marcel Raad (5 Apr 2019)
-- ftplistparser: fix LGTM alert "Empty block without comment"
-  
-  Removing the block is consistent with line 954/957.
-  
-  Closes https://github.com/curl/curl/pull/3732
-
-- transfer: fix LGTM alert "Comparison is always true"
-  
-  Just remove the redundant condition, which also makes it clear that
-  k->buf is always 0-terminated if this break is not hit.
-  
-  Closes https://github.com/curl/curl/pull/3732
-
-Jay Satiro (4 Apr 2019)
-- [Rikard Falkeborn brought this change]
-
-  smtp: fix compiler warning
-  
-  - Fix clang string-plus-int warning.
-  
-  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.
-  
-  (In other words clang warns about "foo"+2 but not &"foo"[2] so use the
-  latter.)
-  
-  smtp.c:1221:29: warning: adding 'int' to a string does not append to the
-  string [-Wstring-plus-int]
-        eob = strdup(SMTP_EOB + 2);
-              ~~~~~~~~~~~~~~~~^~~~
-  
-  Closes https://github.com/curl/curl/pull/3729
-
-Marcel Raad (4 Apr 2019)
-- VS projects: use Unicode for VC10+
-  
-  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.
-  
-  This avoids issues like KNOWN_BUGS 6.5.
-  
-  Ref: https://github.com/curl/curl/issues/2120
-  Closes https://github.com/curl/curl/pull/3720
-
-Daniel Gustafsson (3 Apr 2019)
-- 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]
-
-  documentation: Fix several typos
-  
-  Closes #3724
-  Reviewed-by: Jakub Zakrzewski
-  Reviewed-by: Daniel Gustafsson
-
-Jay Satiro (2 Apr 2019)
-- [Mert Yazıcıoğlu brought this change]
-
-  vauth/oauth2: Fix OAUTHBEARER token generation
-  
-  OAUTHBEARER tokens were incorrectly generated in a format similar to
-  XOAUTH2 tokens. These changes make OAUTHBEARER tokens conform to the
-  RFC7628.
-  
-  Fixes: #2487
-  Reported-by: Paolo Mossino
-  
-  Closes https://github.com/curl/curl/pull/3377
-
-Marcel Raad (2 Apr 2019)
-- tool_cb_wrt: fix bad-function-cast warning
-  
-  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.
-  
-  Closes https://github.com/curl/curl/pull/3718
-
-- VC15 project: remove MinimalRebuild
-  
-  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
-  
-  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
-  
-  Reported-by: Wyatt O'Day
-  Fixes #3715
-  Closes #3716
-
-Daniel Gustafsson (31 Mar 2019)
-- scripts: fix typos
-
-Dan Fandrich (28 Mar 2019)
-- travis: allow builds on branches named "ci"
-  
-  This allows a way to test changes other than through PRs.
-
-Daniel Stenberg (27 Mar 2019)
-- [Brad Spencer brought this change]
-
-  resolve: apply Happy Eyeballs philosophy to parallel c-ares queries
-  
-  Closes #3699
-
-- multi: improved HTTP_1_1_REQUIRED handling
-  
-  Make sure to downgrade to 1.1 even when we get this HTTP/2 stream error
-  on first flight.
-  
-  Reported-by: niner on github
-  Fixes #3696
-  Closes #3707
-
-- [Leonardo Taccari brought this change]
-
-  configure: avoid unportable `==' test(1) operator
-  
-  Closes #3709
-
-Version 7.64.1 (27 Mar 2019)
-
-Daniel Stenberg (27 Mar 2019)
-- RELEASE: 7.64.1
-
-- Revert "ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set"
-  
-  This reverts commit 9130ead9fcabdb6b8fbdb37c0b38be2d326adb00.
-  
-  Fixes #3708
-
-- [Christian Schmitz brought this change]
-
-  ntlm: remove USE_WIN32_CRYPTO check to get USE_NTLM2SESSION set
-  
-  Closes #3704
-
-Jay Satiro (26 Mar 2019)
-- tool_cb_wrt: fix writing to Windows null device NUL
-  
-  - Improve console detection.
-  
-  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.
-  
-  Bug: https://github.com/curl/curl/issues/3175#issuecomment-439068724
-  Reported-by: Gisle Vanem
-
-- CURLMOPT_PIPELINING.3: fix typo
-
-Daniel Stenberg (25 Mar 2019)
-- TODO: config file parsing
-  
-  Closes #3698
-
-Jay Satiro (24 Mar 2019)
-- os400: Disable Alt-Svc by default since it's experimental
-  
-  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.
-  
-  Ref: https://github.com/curl/curl/commit/520f0b4#commitcomment-32792332
-  Ref: https://curl.haxx.se/mail/lib-2019-02/0008.html
-  
-  Closes https://github.com/curl/curl/pull/3688
-
-Dan Fandrich (24 Mar 2019)
-- tests: Fixed XML validation errors in some test files.
-
-- tests: Fix some incorrect precheck error messages.
-  
-  [ci skip]
-
-Daniel Stenberg (22 Mar 2019)
-- curl_url.3: this is not experimental anymore
-
-- travis: bump the used wolfSSL version to 4.0.0
-  
-  Test 311 is now fine, leaving only 313 (CRL) disabled.
-  
-  Test 313 details can be found here:
-  https://github.com/wolfSSL/wolfssl/issues/1546
-  
-  Closes #3697
-
-Daniel Gustafsson (22 Mar 2019)
-- lib: Fix typos in comments
-
-David Woodhouse (20 Mar 2019)
-- openssl: if cert type is ENG and no key specified, key is ENG too
-  
-  Fixes #3692
-  Closes #3692
-
-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
-
-- test1541: threaded connection sharing
-  
-  The threaded-shared-conn.c example turned into test case. Only works if
-  pthread was detected.
-  
-  An attempt to detect future regressions such as e3a53e3efb942a5
-  
-  Closes #3687
-
-Patrick Monnerat (17 Mar 2019)
-- os400: alt-svc support.
-  
-  Although experimental, enable it in the platform config file.
-  Upgrade ILE/RPG binding.
-
-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.
-  
-  - clear ->data when returning the connection to the cache again
-  
-  Regression since 7.62.0 (probably in commit 1b76c38904f0)
-  
-  Bug: https://curl.haxx.se/mail/lib-2019-03/0064.html
-  
-  Closes #3686
-
-- RELEASE-NOTES: synced
-
-- [Chris Young brought this change]
-
-  configure: add --with-amissl
-  
-  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.
-  
-  Closes #3677
-
-- [Chris Young brought this change]
-
-  vtls: rename some of the SSL functions
-  
-  ... in the SSL structure as AmiSSL is using macros for the socket API
-  functions.
-
-- [Chris Young brought this change]
-
-  tool_getpass: termios.h is present on AmigaOS 3, but no tcgetattr/tcsetattr
-
-- [Chris Young brought this change]
-
-  tool_operate: build on AmigaOS
-
-- makefile: make checksrc and hugefile commands "silent"
-  
-  ... to match the style already used for compiling, linking
-  etc. Acknowledges 'make V=1' to enable verbose.
-  
-  Closes #3681
-
-- curl.1: --user and --proxy-user are hidden from ps output
-  
-  Suggested-by: Eric Curtin
-  Improved-by: Dan Fandrich
-  Ref: #3680
-  
-  Closes #3683
-
-- curl.1: mark the argument to --cookie as <data|filename>
-  
-  From a discussion in #3676
-  
-  Suggested-by: Tim Rühsen
-  
-  Closes #3682
-
-Dan Fandrich (14 Mar 2019)
-- fuzzer: Only clone the latest fuzzer code, for speed.
-
-Daniel Stenberg (14 Mar 2019)
-- [Dominik Hölzl brought this change]
-
-  Negotiate: fix for HTTP POST with Negotiate
-  
-  * 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
-  
-  Fixes #1261
-  Closes #1975
-
-- [Marc Schlatter brought this change]
-
-  http: send payload when (proxy) authentication is done
-  
-  The check that prevents payload from sending in case of authentication
-  doesn't check properly if the authentication is done or not.
-  
-  They're cases where the proxy respond "200 OK" before sending
-  authentication challenge. This change takes care of that.
-  
-  Fixes #2431
-  Closes #3669
-
-- file: fix "Checking if unsigned variable 'readcount' is less than zero."
-  
-  Pointed out by codacy
-  
-  Closes #3672
-
-- memdebug: log pointer before freeing its data
-  
-  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 fix still changes the order of execution to avoid the warnings.
-  
-  Coverity CID 1443033 and 1443034
-  
-  Closes #3671
-
-- RELEASE-NOTES: synced
-
-Marcel Raad (12 Mar 2019)
-- travis: actually use updated compiler versions
-  
-  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.
-  
-  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.
-  
-  Also remove GCC 7, it's not needed anymore.
-  
-  Ref: https://docs.travis-ci.com/user/languages/c/#c11c11-and-beyond-and-toolchain-versioning
-  
-  Closes https://github.com/curl/curl/pull/3670
-
-- travis: update clang to version 7
-  
-  Closes https://github.com/curl/curl/pull/3670
-
-Jay Satiro (11 Mar 2019)
-- [Andre Guibert de Bruet brought this change]
-
-  examples/externalsocket: add missing close socket calls
-  
-  .. and for Windows also call WSACleanup since we call WSAStartup.
-  
-  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).
-  
-  Fixes https://github.com/curl/curl/pull/3663
-
-Daniel Stenberg (11 Mar 2019)
-- multi: removed unused code for request retries
-  
-  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.
-  
-  Closes #3666
-
-Jay Satiro (11 Mar 2019)
-- doh: inherit some SSL options from user's easy handle
-  
-  - 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.
-  
-  - Fix inheritance of verbose setting.
-  
-  - Inherit NOSIGNAL.
-  
-  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.
-  
-  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.
-  
-  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).
-  
-  Fixes https://github.com/curl/curl/issues/3660
-  Closes https://github.com/curl/curl/pull/3661
-
-Daniel Stenberg (9 Mar 2019)
-- test331: verify set-cookie for dotless host name
-  
-  Reproduced bug #3649
-  Closes #3659
-
-- Revert "cookies: extend domain checks to non psl builds"
-  
-  This reverts commit 3773de378d48b06c09931e44dca4d274d0bfdce0.
-  
-  Regression shipped in 7.64.0
-  Fixes #3649
-
-- memdebug: make debug-specific functions use curl_dbg_ prefix
-  
-  To not "collide" or use up the regular curl_ name space. Also makes them
-  easier to detect in helper scripts.
-  
-  Closes #3656
-
-- cmdline-opts/proxytunnel.d: the option tunnnels all protocols
-  
-  Clarify the language and simplify.
-  
-  Reported-by: Daniel Lublin
-  Closes #3658
-
-- KNOWN_BUGS: Client cert (MTLS) issues with Schannel
-  
-  Closes #3145
-
-- ROADMAP: updated to some more current things to work on
-
-- tests: fix multiple may be used uninitialized warnings
-
-- RELEASE-NOTES: synced
-
-- source: fix two 'nread' may be used uninitialized warnings
-  
-  Both seem to be false positives but we don't like warnings.
-  
-  Closes #3646
-
-- gopher: remove check for path == NULL
-  
-  Since it can't be NULL and it makes Coverity believe we lack proper NULL
-  checks. Verified by test 659, landed in commit 15401fa886b.
-  
-  Pointed out by Coverity CID 1442746.
-  
-  Assisted-by: Dan Fandrich
-  Fixes #3617
-  Closes #3642
-
-- examples: only include <curl/curl.h>
-  
-  That's the only public curl header we should encourage use of.
-  
-  Reviewed-by: Marcel Raad
-  Closes #3645
-
-- ssh: loop the state machine if not done and not blocking
-  
-  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.
-  
-  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.
-  
-  Fixes #3506
-  Closes #3644
-
-Jay Satiro (5 Mar 2019)
-- multi: support verbose conncache closure handle
-  
-  - Change closure handle to receive verbose setting from the easy handle
-    most recently added via curl_multi_add_handle.
-  
-  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.
-  
-  Ref: https://github.com/curl/curl/pull/3598
-  
-  Co-authored-by: Daniel Stenberg
-  
-  Closes https://github.com/curl/curl/pull/3618
-
-Daniel Stenberg (4 Mar 2019)
-- CURLU: fix NULL dereference when used over proxy
-  
-  Test 659 verifies
-  
-  Also fixed the test 658 name
-  
-  Closes #3641
-
-- altsvc_out: check the return code from Curl_gmtime
-  
-  Pointed out by Coverity, CID 1442956.
-  
-  Closes #3640
-
-- docs/ALTSVC.md: docs describing the approach
-  
-  Closes #3498
-
-- alt-svc: add a travis build
-
-- alt-svc: add test 355 and 356 to verify with command line curl
-
-- alt-svc: the curl command line bits
-
-- alt-svc: the libcurl bits
-
-- travis: add build using gnutls
-  
-  Closes #3637
-
-- RELEASE-NOTES: synced
-
-- [Simon Legner brought this change]
-
-  scripts/completion.pl: also generate fish completion file
-  
-  This is the renamed script formerly known as zsh.pl
-  
-  Closes #3545
-
-- gnutls: remove call to deprecated gnutls_compression_get_name
-  
-  It has been deprecated by GnuTLS since a year ago and now causes build
-  warnings.
-  
-  Ref: https://gitlab.com/gnutls/gnutls/commit/b0041897d2846737f5fb0f
-  Docs: https://www.gnutls.org/manual/html_node/Compatibility-API.html
-  
-  Closes #3636
-
-Jay Satiro (2 Mar 2019)
-- system_win32: move win32_init here from easy.c
-  
-  .. since system_win32 is a more appropriate location for the functions
-  and to extern the globals.
-  
-  Ref: https://github.com/curl/curl/commit/ca597ad#r32446578
-  Reported-by: Gisle Vanem
-  
-  Closes https://github.com/curl/curl/pull/3625
-
-Daniel Stenberg (1 Mar 2019)
-- curl_easy_duphandle.3: clarify that a duped handle has no shares
-  
-  Reported-by: Sara Golemon
-  
-  Fixes #3592
-  Closes #3634
-
-- 10-at-a-time.c: fix too long line
-
-- [Arnaud Rebillout brought this change]
-
-  examples: various fixes in ephiperfifo.c
-  
-  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.
-  
-  As a quick check you can run this command before and after applying this
-  commit:
-  
-      # shell 1
-      ./ephiperfifo 2>&1 | tee ephiperfifo.log
-      # shell 2
-      echo http://hacking.elboulangero.com > hiper.fifo
-  
-  Then just compare the size of the logs files.
-  
-  Closes #3633
-  Fixes #3632
-  Signed-off-by: Arnaud Rebillout <arnaud.rebillout@collabora.com>
-
-- urldata: simplify bytecounters
-  
-  - no need to have them protocol specific
-  
-  - no need to set pointers to them with the Curl_setup_transfer() call
-  
-  - make Curl_setup_transfer() operate on a transfer pointer, not
-    connection
-  
-  - switch some counters from long to the more proper curl_off_t type
-  
-  Closes #3627
-
-- examples/10-at-a-time.c: improve readability and simplify
-  
-   - use better variable names to explain their purposes
-   - convert logic to curl_multi_wait()
-
-- 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.
-  
-  Reported-by: Michael Schmid
-  Fixes #3629
-  Closes #3630
-
-- [Ԝеѕ brought this change]
-
-  docs: update max-redirs.d phrasing
-  
-  clarify redir - "in absurdum" doesn't seem to make sense in this context
-  
-  Closes #3631
-
-- 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
-
-- test578: make it read data from the correct test
-
-- Curl_easy: remove req.maxfd - never used!
-  
-  Introduced in 8b6314ccfb, but not used anymore in current code. Unclear
-  since when.
-  
-  Closes #3626
-
-- 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
-
-- INSTALL: refer to the current TLS library names and configure options
-
-- FAQ: minor updates and spelling fixes
-
-- GOVERNANCE.md: minor spelling fixes
-
-- Secure Transport: no more "darwinssl"
-  
-  Everyone calls it Secure Transport, now we do too.
-  
-  Reviewed-by: Nick Zitzmann
-  
-  Closes #3619
-
-Marcel Raad (27 Feb 2019)
-- AppVeyor: add classic MinGW build
-  
-  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.
-  
-  Closes https://github.com/curl/curl/pull/3623
-
-- AppVeyor: add MinGW-w64 build
-  
-  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.
-  
-  Closes https://github.com/curl/curl/pull/3623
-
-Daniel Stenberg (27 Feb 2019)
-- cookies: only save the cookie file if the engine is enabled
-  
-  Follow-up to 8eddb8f4259.
-  
-  If the cookieinfo pointer is NULL there really is nothing to save.
-  
-  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).
-  
-  Test 1905 now verifies that this works.
-  
-  Assisted-by: Michael Wallner
-  Assisted-by: Marcel Raad
-  
-  Closes #3621
-
-- [DaVieS brought this change]
-
-  cacertinmem.c: use multiple certificates for loading CA-chain
-  
-  Closes #3421
-
-- urldata: convert bools to bitfields and move to end
-  
-  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.
-  
-  Removed an unused struct field.
-  
-  No functionality changes.
-  
-  Closes #3610
-
-- [Don J Olmstead brought this change]
-
-  curl.h: use __has_declspec_attribute for shared builds
-  
-  Closes #3616
-
-- curl: display --version features sorted alphabetically
-  
-  Closes #3611
-
-- runtests: detect "schannel" as an alias for "winssl"
-  
-  Follow-up to 180501cb02
-  
-  Reported-by: Marcel Raad
-  Fixes #3609
-  Closes #3620
-
-Marcel Raad (26 Feb 2019)
-- AppVeyor: update to Visual Studio 2017
-  
-  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.
-  
-  Closes https://github.com/curl/curl/pull/3606
-
-- AppVeyor: switch VS 2015 builds to VS 2017 image
-  
-  The Visual Studio 2017 image has Visual Studio 2015 and 2017 installed.
-  
-  Closes https://github.com/curl/curl/pull/3606
-
-- AppVeyor: explicitly select worker image
-  
-  Currently, we're using the default Visual Studio 2015 image for
-  everything.
-  
-  Closes https://github.com/curl/curl/pull/3606
-
-Daniel Stenberg (26 Feb 2019)
-- strerror: make the strerror function use local buffers
-  
-  Instead of using a fixed 256 byte buffer in the connectdata struct.
-  
-  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.
-  
-  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.
-  
-  Co-authored-by: Jay Satiro
-  
-  Closes #3612
-
-- [Michael Wallner brought this change]
-
-  cookies: fix NULL dereference if flushing cookies with no CookieInfo set
-  
-  Regression brought by a52e46f3900fb0 (shipped in 7.63.0)
-  
-  Closes #3613
-
-Marcel Raad (26 Feb 2019)
-- AppVeyor: re-enable test 500
-  
-  It's passing now.
-  
-  Closes https://github.com/curl/curl/pull/3615
-
-- AppVeyor: remove redundant builds
-  
-  Remove the Visual Studio 2012 and 2013 builds as they add little value.
-  
-  Ref: https://github.com/curl/curl/pull/3606
-  Closes https://github.com/curl/curl/pull/3614
-
-Daniel Stenberg (25 Feb 2019)
-- RELEASE-NOTES: synced
-
-- [Bernd Mueller brought this change]
-
-  OpenSSL: add support for TLS ASYNC state
-  
-  Closes #3591
-
-Jay Satiro (25 Feb 2019)
-- [Michael Felt brought this change]
-
-  acinclude: add additional libraries to check for LDAP support
-  
-  - Add an additional check for LDAP that also checks for OpenSSL since
-    on AIX those libraries may be required to link LDAP properly.
-  
-  Fixes https://github.com/curl/curl/issues/3595
-  Closes https://github.com/curl/curl/pull/3596
-
-- [Giorgos Oikonomou brought this change]
-
-  schannel: support CALG_ECDH_EPHEM algorithm
-  
-  Add support for Ephemeral elliptic curve Diffie-Hellman key exchange
-  algorithm option when selecting ciphers. This became available on the
-  Win10 SDK.
-  
-  Closes https://github.com/curl/curl/pull/3608
-
-Daniel Stenberg (24 Feb 2019)
-- multi: call multi_done on connect timeouts
-  
-  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).
-  
-  Reported-by: accountantM on github
-  Fixes #3602
-  Closes #3605
-
-- examples: remove recursive calls to curl_multi_socket_action
-  
-  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.
-  
-  Discussed in #3537
-  Closes #3601
-
-Marcel Raad (23 Feb 2019)
-- configure: remove CURL_CHECK_FUNC_FDOPEN call
-  
-  The macro itself has been removed in commit
-  11974ac859c5d82def59e837e0db56fef7f6794e.
-  
-  Closes https://github.com/curl/curl/pull/3604
-
-Daniel Stenberg (23 Feb 2019)
-- wolfssl: stop custom-adding curves
-  
-  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 #3599
-
-- configure: remove the unused fdopen macro
-  
-  and the two remaining #ifdefs for it
-  
-  Closes #3600
-
-Jay Satiro (22 Feb 2019)
-- url: change conn shutdown order to unlink data as last step
-  
-  - Split off connection shutdown procedure from Curl_disconnect into new
-    function conn_shutdown.
-  
-  - Change the shutdown procedure to close the sockets before
-    disassociating the transfer.
-  
-  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.
-  
-  Bug: https://curl.haxx.se/mail/lib-2019-02/0101.html
-  Reported-by: Pavel Löbl
-  
-  Closes https://github.com/curl/curl/issues/3597
-  Closes https://github.com/curl/curl/pull/3598
-
-Marcel Raad (22 Feb 2019)
-- Fix strict-prototypes GCC warning
-  
-  As seen in the MinGW autobuilds. Caused by commit
-  f26bc29cfec0be84c67cf74065cf8e5e78fd68b7.
-
-Dan Fandrich (21 Feb 2019)
-- tests: Fixed XML validation errors in some test files.
-
-Daniel Stenberg (20 Feb 2019)
-- TODO: Allow SAN names in HTTP/2 server push
-  
-  Suggested-by: Nicolas Grekas
-
-- RELEASE-NOTES: synced
-
-- curl: remove MANUAL from -M output
-  
-  ... 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.
-  
-  In the compressed scenario, this removes ~15K data from the binary,
-  which is 25% of the -M output.
-  
-  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.
-  
-  Closes #3587
-
-- http2: verify :athority in push promise requests
-  
-  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.
-  
-  Fixes #3577
-  Reported-by: Nicolas Grekas
-  Bug: https://curl.haxx.se/mail/lib-2019-02/0057.html
-  Closes #3581
-
-- singlesocket: fix the 'sincebefore' placement
-  
-  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.
-  
-  This is a follow-up to 4c35574 (shipped in curl 7.64.0)
-  
-  Reported-by: buzo-ffm on github
-  Detected-by: Jan Alexander Steffens
-  Fixes #3585
-  Closes #3589
-
-- connection: never reuse CONNECT_ONLY conections
-  
-  and make CONNECT_ONLY conections never reuse any existing ones either.
-  
-  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
-  
-  Reported-by: Marcel Raad
-  Fixes #3576
-  Closes #3583
-
-Daniel Stenberg (19 Feb 2019)
-- x509asn1: cleanup and unify code layout
-  
-  - rename 'n' to buflen in functions, and use size_t for them. Don't pass
-    in negative buffer lengths.
-  
-  - move most function comments to above the function starts like we use
-    to
-  
-  - remove several unnecessary typecasts (especially of NULL)
-  
-  Reviewed-by: Patrick Monnerat
-  Closes #3582
-
-- curl_multi_remove_handle.3: use at any time, just not from within callbacks
-  
-  [ci skip]
-
-- http: make adding a blank header thread-safe
-  
-  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 approach now makes a local copy when it needs to edit the string.
-  
-  Reported-by: d912e3 on github
-  Fixes #3578
-  Closes #3579
-
-- unit1651: survive curl_easy_init() fails
-
-- [Frank Gevaerts brought this change]
-
-  rand: Fix a mismatch between comments in source and header.
-  
-  Reported-by: Björn Stenberg <bjorn@haxx.se>
-  Closes #3584
-
-Patrick Monnerat (18 Feb 2019)
-- x509asn1: replace single char with an array
-  
-  Although safe in this context, using a single char as an array may
-  cause invalid accesses to adjacent memory locations.
-  
-  Detected by Coverity.
-
-Daniel Stenberg (18 Feb 2019)
-- examples/http2-serverpush: add some sensible error checks
-  
-  To avoid NULL pointer dereferences etc in the case of problems.
-  
-  Closes #3580
-
-Jay Satiro (18 Feb 2019)
-- easy: fix win32 init to work without CURL_GLOBAL_WIN32
-  
-  - Change the behavior of win32_init so that the required initialization
-    procedures are not affected by CURL_GLOBAL_WIN32 flag.
-  
-  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).
-  
-  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.
-  
-  Ref: https://github.com/curl/curl/pull/3573
-  
-  Fixes https://github.com/curl/curl/issues/3313
-  Closes https://github.com/curl/curl/pull/3575
-
-Daniel Gustafsson (17 Feb 2019)
-- cookie: Add support for cookie prefixes
-  
-  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.
-  
-  Closes #3554
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-- 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>
-
-Patrick Monnerat (16 Feb 2019)
-- cli tool: refactor encoding conversion sequence for switch case fallthrough.
-
-- version.c: silent scan-build even when librtmp is not enabled
-
-Daniel Stenberg (15 Feb 2019)
-- RELEASE-NOTES: synced
-
-- Curl_now: figure out windows version in win32_init
-  
-  ... and avoid use of static variables that aren't thread safe.
-  
-  Fixes regression from e9ababd4f5a (present in the 7.64.0 release)
-  
-  Reported-by: Paul Groke
-  Fixes #3572
-  Closes #3573
-
-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.
-  
-  Closes https://github.com/curl/curl/pull/3568
-
-Daniel Stenberg (15 Feb 2019)
-- travis: enable valgrind for the iconv tests too
-  
-  Closes #3571
-
-- travis: add scan-build
-  
-  Closes #3564
-
-- examples/sftpuploadresume: Value stored to 'result' is never read
-  
-  Detected by scan-build
-
-- examples/http2-upload: cleaned up
-  
-  Fix scan-build warnings, no globals, no silly handle scan. Also remove
-  handles from the multi before cleaning up.
-
-- examples/http2-download: cleaned up
-  
-  To avoid scan-build warnings and global variables.
-
-- examples/postinmemory: Potential leak of memory pointed to by 'chunk.memory'
-  
-  Detected by scan-build
-
-- examples/httpcustomheader: Value stored to 'res' is never read
-  
-  Detected by scan-build
-
-- examples: remove superfluous null-pointer checks
-  
-  in ftpget, ftpsget and sftpget, so that scan-build stops warning for
-  potential NULL pointer dereference below!
-  
-  Detected by scan-build
-
-- strip_trailing_dot: make sure NULL is never used for strlen
-  
-  scan-build warning: Null pointer passed as an argument to a 'nonnull'
-  parameter
-
-- [Jay Satiro brought this change]
-
-  connection_check: restore original conn->data after the check
-  
-  - Save the original conn->data before it's changed to the specified
-    data transfer for the connection check and then restore it afterwards.
-  
-  This is a follow-up to 38d8e1b 2019-02-11.
-  
-  History:
-  
-  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.
-  
-  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.
-  
-  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.
-  
-  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.
-  
-  Assisted-by: tholin@users.noreply.github.com
-  Reported-by: tholin@users.noreply.github.com
-  
-  Fixes https://github.com/curl/curl/issues/3542
-  Closes #3559
-
-- memdebug: bring back curl_mark_sclose
-  
-  Used by debug builds with NSS.
-  
-  Reverted from 05b100aee247bb
-
-Patrick Monnerat (14 Feb 2019)
-- transfer.c: do not compute length of undefined hex buffer.
-  
-  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.
-  
-  Reported by valgrind.
-
-Daniel Stenberg (14 Feb 2019)
-- KNOWN_BUGS: Cannot compile against a static build of OpenLDAP
-  
-  Closes #2367
-
-Patrick Monnerat (14 Feb 2019)
-- x509asn1: "Dereference of null pointer"
-  
-  Detected by scan-build (false positive).
-
-Daniel Stenberg (14 Feb 2019)
-- configure: show features as well in the final summary
-  
-  Closes #3569
-
-- KNOWN_BUGS: curl compiled on OSX 10.13 failed to run on OSX 10.10
-  
-  Closes #2905
-
-- KNOWN_BUGS: Deflate error after all content was received
-  
-  Closes #2719
-
-- gssapi: fix deprecated header warnings
-  
-  Heimdal includes on FreeBSD spewed out lots of them. Less so now.
-  
-  Closes #3566
-
-- TODO: Upgrade to websockets
-  
-  Closes #3523
-
-- TODO: cmake test suite improvements
-  
-  Closes #3109
-
-Patrick Monnerat (13 Feb 2019)
-- curl: "Dereference of null pointer"
-  
-  Rephrase to satisfy scan-build.
-
-Marcel Raad (13 Feb 2019)
-- unit1307: require FTP support
-  
-  This test doesn't link without FTP support after
-  fc7ab4835b5fd09d0a6f57000633bb6bb6edfda1, which made Curl_fnmatch
-  unavailable without FTP support.
-  
-  Closes https://github.com/curl/curl/pull/3565
-
-Daniel Stenberg (13 Feb 2019)
-- TODO: TFO support on Windows
-  
-  Nobody works on this now.
-  
-  Closes #3378
-
-- multi: Dereference of null pointer
-  
-  Mostly a false positive, but this makes the code easier to read anyway.
-  
-  Detected by scan-build.
-  
-  Closes #3563
-
-- urlglob: Argument with 'nonnull' attribute passed null
-  
-  Detected by scan-build.
-
-Jay Satiro (12 Feb 2019)
-- schannel: restore some debug output but only for debug builds
-  
-  Follow-up to 84c10dc from earlier today which wrapped a lot of the noisy
-  debug output in DEBUGF but omitted a few lines.
-  
-  Ref: https://github.com/curl/curl/commit/84c10dc#r32292900
-
-- examples/crawler: Fix the Accept-Encoding setting
-  
-  - Pass an empty string to CURLOPT_ACCEPT_ENCODING to use the default
-    supported encodings.
-  
-  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.
-
-Daniel Stenberg (12 Feb 2019)
-- mime: put the boundary buffer into the curl_mime struct
-  
-  ... instead of allocating it separately and point to it. It is
-  fixed-size and always used for each part.
-  
-  Closes #3561
-
-- schannel: be quiet
-  
-  Convert numerous infof() calls into debug-build only messages since they
-  are annoyingly verbose for regular applications. Removed a few.
-  
-  Bug: https://curl.haxx.se/mail/lib-2019-02/0027.html
-  Reported-by: Volker Schmid
-  Closes #3552
-
-- [Romain Geissler brought this change]
-
-  Curl_resolv: fix a gcc -Werror=maybe-uninitialized warning
-  
-  Closes #3562
-
-- http2: multi_connchanged() moved from multi.c, only used for h2
-  
-  Closes #3557
-
-- curl: "Function call argument is an uninitialized value"
-  
-  Follow-up to cac0e4a6ad14b42471eb
-  
-  Detected by scan-build
-  Closes #3560
-
-- pretransfer: don't strlen() POSTFIELDS set for GET requests
-  
-  ... since that data won't be used in the request anyway.
-  
-  Fixes #3548
-  Reported-by: Renaud Allard
-  Close #3549
-
-- multi: remove verbose "Expire in" ... messages
-  
-  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
-  
-  Reported-by: MAntoniak on github
-  Fixes #3553
-  Closes #3556
-
-Daniel Gustafsson (12 Feb 2019)
-- non-ascii.c: fix typos in comments
-  
-  Fix two occurrences of s/convers/converts/ spotted while reading code.
-
-Daniel Stenberg (12 Feb 2019)
-- fnmatch: disable if FTP is disabled
-  
-  Closes #3551
-
-- curl_path: only enabled for SSH builds
-
-- [Frank Gevaerts brought this change]
-
-  tests: add stderr comparison to the test suite
-  
-  The code is more or less copied from the stdout comparison code, maybe
-  some better reuse is possible.
-  
-  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
-  
-  Closes #3536
-
-Patrick Monnerat (11 Feb 2019)
-- cli tool: do not use mime.h private structures.
-  
-  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.
-  
-  Reported-by: Daniel Stenberg
-  Fixes #3532
-  Closes #3546
-
-Daniel Stenberg (11 Feb 2019)
-- curlver: bump to 7.64.1-dev
-
-- RELEASE-NOTES: synced
-  
-  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
-  
-  Commit 3f16990ec84cc4b followed-up a bug in b49652ac66cc0 but was
-  inadvertently introducing a new bug in the ternary expression.
-  
-  Close #3555
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-- dns: release sharelock as soon as possible
-  
-  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.
-  
-  Closes #3516
-  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
-
-Daniel Stenberg (11 Feb 2019)
-- curl: follow-up to b49652ac66cc0
-  
-  On FreeBSD, return non-zero on error otherwise zero.
-  
-  Reported-by: Marcel Raad
-
-- multi: (void)-prefix when ignoring return values
-  
-  ... 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
-  
-  Closes #3550
-
-- 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.
-  
-  Reported-by: jnbr on github
-  Fixes #3541
-  Closes #3547
-
-- hostip: make create_hostcache_id avoid alloc + free
-  
-  Closes #3544
-
-- scripts/singleuse: script to use to track single-use functions
-  
-  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.
-  
-  It also verifies that all used curl_ prefixed functions are "blessed"
-  
-  Closes #3538
-
-- cleanup: make local functions static
-  
-  urlapi: turn three local-only functions into statics
-  
-  conncache: make conncache_find_first_connection static
-  
-  multi: make detach_connnection static
-  
-  connect: make getaddressinfo static
-  
-  curl_ntlm_core: make hmac_md5 static
-  
-  http2: make two functions static
-  
-  http: make http_setup_conn static
-  
-  connect: make tcpnodelay static
-  
-  tests: make UNITTEST a thing to mark functions with, so they can be static for
-  normal builds and non-static for unit test builds
-  
-  ... and mark Curl_shuffle_addr accordingly.
-  
-  url: make up_free static
-  
-  setopt: make vsetopt static
-  
-  curl_endian: make write32_le static
-  
-  rtsp: make rtsp_connisdead static
-  
-  warnless: remove unused functions
-  
-  memdebug: remove one unused function, made another static
-
-Dan Fandrich (10 Feb 2019)
-- cirrus: Added FreeBSD builds using Cirrus CI.
-  
-  The build logs will be at https://cirrus-ci.com/github/curl/curl
-  
-  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.
-
-Daniel Stenberg (9 Feb 2019)
-- url/idnconvert: remove scan for <= 32 ascii values
-  
-  The check was added back in fa939220df before the URL parser would catch
-  these problems and therefore these will never trigger now.
-  
-  Closes #3539
-
-- urlapi: reduce variable scope, remove unreachable 'break'
-  
-  Both nits pointed out by codacy.com
-  
-  Closes #3540
-
-Alessandro Ghedini (7 Feb 2019)
-- zsh.pl: escape ':' character
-  
-  ':' is interpreted as separator by zsh, so if used as part of the argument
-  or option's description it needs to be escaped.
-  
-  The problem can be reproduced as follows:
-  
-   % curl --reso<TAB>
-   % curl -E <TAB>
-  
-  Bug: https://bugs.debian.org/921452
diff --git a/CMake/CurlSymbolHiding.cmake b/CMake/CurlSymbolHiding.cmake
index 224755a..8e5fd67 100644
--- a/CMake/CurlSymbolHiding.cmake
+++ b/CMake/CurlSymbolHiding.cmake
@@ -11,13 +11,7 @@
     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 0000000..20d239a
--- /dev/null
+++ b/CMake/FindBearSSL.cmake
@@ -0,0 +1,9 @@
+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/FindCARES.cmake b/CMake/FindCARES.cmake
index 723044a..3d1bae6 100644
--- a/CMake/FindCARES.cmake
+++ b/CMake/FindCARES.cmake
@@ -7,34 +7,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/FindLibSSH2.cmake b/CMake/FindLibSSH2.cmake
index 84822db..91e17c1 100644
--- a/CMake/FindLibSSH2.cmake
+++ b/CMake/FindLibSSH2.cmake
@@ -5,31 +5,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/FindNGHTTP2.cmake b/CMake/FindNGHTTP2.cmake
index 348b961..5138e99 100644
--- a/CMake/FindNGHTTP2.cmake
+++ b/CMake/FindNGHTTP2.cmake
@@ -10,9 +10,9 @@
     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/OtherTests.cmake b/CMake/OtherTests.cmake
index c1c9aa3..8b15029 100644
--- a/CMake/OtherTests.cmake
+++ b/CMake/OtherTests.cmake
@@ -32,7 +32,7 @@
     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 *" )
@@ -81,7 +81,7 @@
     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()
diff --git a/CMake/Utilities.cmake b/CMake/Utilities.cmake
index 5cb1d44..ffc411a 100644
--- a/CMake/Utilities.cmake
+++ b/CMake/Utilities.cmake
@@ -2,12 +2,11 @@
 
 # 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/CMakeLists.txt b/CMakeLists.txt
index 20b9bd0..73b053b 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
@@ -38,7 +38,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.0...3.16 FATAL_ERROR)
+
 set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake;${CMAKE_MODULE_PATH}")
 include(Utilities)
 include(Macros)
@@ -49,7 +50,7 @@
 
 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 +80,18 @@
 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)
+  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})
+  elseif(ENABLE_INET_PTON)
+    # _WIN32_WINNT_VISTA (0x0600)
+    add_definitions(-D_WIN32_WINNT=0x0600)
+  else()
+    # _WIN32_WINNT_WINXP (0x0501)
+    add_definitions(-D_WIN32_WINNT=0x0501)
+  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"
@@ -93,8 +105,9 @@
     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)
       # 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()
@@ -123,7 +136,6 @@
   set(USE_ARES 1)
   find_package(CARES REQUIRED)
   list(APPEND CURL_LIBS ${CARES_LIBRARY})
-  set(CURL_LIBS ${CURL_LIBS} ${CARES_LIBRARY})
 endif()
 
 include(CurlSymbolHiding)
@@ -172,6 +184,7 @@
   set(CURL_DISABLE_RTSP ON)
   set(CURL_DISABLE_POP3 ON)
   set(CURL_DISABLE_IMAP ON)
+  set(CURL_DISABLE_SMB ON)
   set(CURL_DISABLE_SMTP ON)
   set(CURL_DISABLE_GOPHER ON)
 endif()
@@ -234,6 +247,7 @@
 endif()
 
 # Include all the necessary files for macros
+include(CMakePushCheckState)
 include(CheckFunctionExists)
 include(CheckIncludeFile)
 include(CheckIncludeFiles)
@@ -284,7 +298,7 @@
 endif()
 
 # check SSL libraries
-# TODO support GNUTLS, NSS, POLARSSL, CYASSL
+# TODO support GnuTLS and WolfSSL
 
 if(APPLE)
   option(CMAKE_USE_SECTRANSP "enable Apple OS native SSL/TLS" OFF)
@@ -295,9 +309,11 @@
     CMAKE_USE_WINSSL 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)
 
 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_WINSSL OR CMAKE_USE_MBEDTLS OR CMAKE_USE_NSS)
   set(openssl_default OFF)
 endif()
 option(CMAKE_USE_OPENSSL "Use OpenSSL code. Experimental" ${openssl_default})
@@ -307,6 +323,8 @@
   CMAKE_USE_SECTRANSP
   CMAKE_USE_OPENSSL
   CMAKE_USE_MBEDTLS
+  CMAKE_USE_BEARSSL
+  CMAKE_USE_NSS
 )
 if(enabled_ssl_options_count GREATER "1")
   set(CURL_WITH_MULTI_SSL ON)
@@ -379,6 +397,27 @@
   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_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 +425,10 @@
   list(APPEND CURL_LIBS ${NGHTTP2_LIBRARIES})
 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)
@@ -666,7 +709,9 @@
   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()
@@ -895,20 +940,7 @@
 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 +1164,23 @@
   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)
@@ -1171,14 +1220,22 @@
   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_WINDOWS_SSPI 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)
@@ -1200,15 +1257,14 @@
                         (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)
+# 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("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,6 +1289,8 @@
 _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)
@@ -1251,6 +1309,8 @@
 _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)
 if(_items)
   list(SORT _items)
 endif()
diff --git a/COPYING b/COPYING
index 3528bd7..9d9e4af 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 550afee..2b5359c 100644
--- a/METADATA
+++ b/METADATA
@@ -7,12 +7,12 @@
   }
   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_69_0/curl-7.69.0.tar.xz"
   }
-  version: "curl-7_67_0"
+  version: "curl-7_69_0"
   last_upgrade_date {
-    year: 2019
-    month: 11
-    day: 6
+    year: 2020
+    month: 3
+    day: 4
   }
 }
diff --git a/Makefile.am b/Makefile.am
index 3116e10..1e9ecd8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -30,8 +30,8 @@
  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/FindMbedTLS.cmake CMake/FindBearSSL.cmake                \
+ CMake/cmake_uninstall.cmake.in CMake/curl-config.cmake.in
 
 VC6_LIBTMPL = projects/Windows/VC6/lib/libcurl.tmpl
 VC6_LIBDSP = projects/Windows/VC6/lib/libcurl.dsp.dist
@@ -328,6 +328,10 @@
 	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 +344,10 @@
 	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 +359,15 @@
 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 +429,22 @@
     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 +490,10 @@
 		-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 +514,10 @@
 		-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 +538,10 @@
 		-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 +562,10 @@
 		-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 +586,10 @@
 		-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 +610,10 @@
 		-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 +634,10 @@
 		-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 +658,10 @@
 		-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 +682,10 @@
 		-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 +706,10 @@
 		-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 c439dab..490faca 100644
--- a/README
+++ b/README
@@ -21,6 +21,8 @@
   curl binaries or other binaries that involve libcurl, you might enjoy the
   LICENSE-MIXING document.
 
+  All of those documents and more can be found in the docs/ directory.
+
 CONTACT
 
   If you have problems, questions, ideas or suggestions, please contact us
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index cea2deb..afcc617 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,144 +1,142 @@
-curl and libcurl 7.67.0
+curl and libcurl 7.69.0
 
- Public curl releases:         186
- Command line options:         226
- curl_easy_setopt() options:   269
- Public functions in libcurl:  81
- Contributors:                 2056
+ Public curl releases:         189
+ Command line options:         230
+ curl_easy_setopt() options:   270
+ Public functions in libcurl:  82
+ Contributors:                 2113
 
 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 polarssl: removed [16]
+ o smtp: add CURLOPT_MAIL_RCPT_ALLLOWFAILS and --mail-rcpt-allowfails [23]
+ o wolfSSH: new SSH backend [5]
 
 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: improved header parser [63]
+ o altsvc: keep a copy of the file name to survive handle reset [50]
+ o altsvc: make saving the cache an atomic operation [84]
+ o altsvc: use h3-27
+ o azure: disable brotli on the macos debug-builds [68]
+ o build: remove all HAVE_OPENSSL_ENGINE_H defines [99]
+ o checksrc.bat: Fix not being able to run script from the main curl dir [54]
+ o cleanup: fix several comment typos [78]
+ o cleanup: fix typos and wording in docs and comments [39]
+ o cmake: add support for CMAKE_LTO option [22]
+ o cmake: clean up and improve build procedures [100]
+ o cmake: enable SMB for Windows builds [12]
+ o cmake: improve libssh2 check on Windows [8]
+ o cmake: Show HTTPS-proxy in the features output [110]
+ o cmake: support specifying the target Windows version [27]
+ o cmake: use check_symbol_exists also for inet_pton [19]
+ o configure.ac: fix comments about --with-quiche [53]
+ o configure: disable metalink if mbedTLS is specified [105]
+ o configure: disable metalink support for incompatible SSL/TLS [40]
+ o conn: do not reuse connection if SOCKS proxy credentials differ [32]
+ o conncache: removed unused Curl_conncache_bundle_size() [33]
+ o connect: remove some spurious infof() calls [80]
+ o connection reuse: respect the max_concurrent_streams limits [3]
+ o contributors: also include people who contributed to curl-www [58]
+ o contrithanks: use the most recent tag by default [59]
+ o cookie: check __Secure- and __Host- case sensitively [43]
+ o cookies: make saving atomic with a rename [85]
+ o create-dirs.d: mention the mode [73]
+ o curl: avoid using strlen for testing if a string is empty [37]
+ o curl: error on --alt-svc use w/o support [61]
+ o curl: let -D merge headers in one file again [25]
+ o curl: make #0 not output the full URL [4]
+ o curl: make the -# spaceship bar not wrap the line [30]
+ o curl: remove 'config' field from OutStruct [6]
+ o curl:progressbarinit: ignore column width from terminals < 20 [18]
+ o curl_escape.3: add a link to curl_free [107]
+ o curl_getenv.3: fix the memory handling description [107]
+ o curl_global_init: assume the EINTR bit by default [31]
+ o curl_global_init: move the IPv6 works status bool to multi handle [48]
+ o CURLINFO_COOKIELIST.3: Fix example [67]
+ o CURLOPT_ALTSVC_CTRL.3: fix the DEFAULT wording [74]
+ o CURLOPT_PROXY_SSL_OPTIONS.3: Sync with CURLOPT_SSL_OPTIONS.3
+ o CURLOPT_REDIR_PROTOCOLS.3: update the DEFAULT section [83]
+ o data.d: remove "Multiple files can also be specified" [26]
+ o digest: do not quote algorithm in HTTP authorisation [55]
+ o docs/HTTP3: add --enable-alt-svc to curl's configure
+ o docs/HTTP3: update the OpenSSL branch to use for ngtcp2
+ o docs: fix typo on CURLINFO_RETRY_AFTER [101]
+ o easy: remove dead code [72]
+ o form.d: fix two minor typos [34]
+ o ftp: convert 'sock_accepted' to a plain boolean [66]
+ o ftp: remove superfluous checking for crlf in user or pwd [56]
+ o ftp: shrink temp buffers used for PORT [60]
+ o github action: add CIFuzz [77]
+ o github: Instructions to post "uname -a" on Unix systems in issues [52]
+ o GnuTLS: always send client cert [76]
+ o gtls: fixed compilation when using GnuTLS < 3.5.0 [98]
+ o hostip: move code to resolve IP address literals to `Curl_resolv` [13]
+ o HTTP-COOKIES: describe the cookie file format [21]
+ o HTTP-COOKIES: mention that a trailing newline is required [81]
+ o http2: make pausing/unpausing set/clear local stream window [86]
+ o http2: now requires nghttp2 >= 1.12.0 [75]
+ o http: added 417 response treatment [89]
+ o http: increase EXPECT_100_THRESHOLD to 1Mb [28]
+ o http: mark POSTs with no body as "upload done" from the start [104]
+ o http: move "oauth_bearer" from connectdata to Curl_easy [24]
+ o include: remove non-curl prefixed defines [15]
+ o KNOWN_BUGS: Multiple methods in a single WWW-Authenticate: header
+ o libssh2: add support for forcing a hostkey type [7]
+ o libssh2: fix variable type [17]
+ o libssh: improve known hosts handling [87]
+ o llist: removed unused Curl_llist_move() [33]
+ o location.d: the method change is from POST to GET only [46]
+ o md4: fixed compilation issues when using GNU TLS gcrypt [95]
+ o md4: use init/update/final functions in Secure Transport [108]
+ o md5: added implementation for mbedTLS [102]
+ o mk-ca-bundle: add support for CKA_NSS_SERVER_DISTRUST_AFTER [36]
+ o multi: change curl_multi_wait/poll to error on negative timeout [11]
+ o multi: fix outdated comment [71]
+ o multi: if Curl_readwrite sets 'comeback' use expire, not loop [65]
+ o multi_done: if multiplexed, make conn->data point to another transfer [45]
+ o multi_wait: stop loop when sread() returns zero [103]
+ o ngtcp2: add error code for QUIC connection errors [10]
+ o ngtcp2: fixed to only use AF_INET6 when ENABLE_IPV6 [63]
+ o ngtcp2: update to git master and its draft-25 support [42]
+ o ntlm: move the winbind data into the NTLM data structure
+ o ntlm: pass the Curl_easy structure to the private winbind functions
+ o ntlm: removed the dependency on the TLS libaries when using MD5 [93]
+ o ntlm_wb: use Curl_socketpair() for greater portability [57]
+ o oauth2-bearer.d: works for HTTP too [44]
+ o openssl: make CURLINFO_CERTINFO not truncate x509v3 fields [35]
+ o openssl: remove redundant assignment [38]
+ o os400: fixed the build [29]
+ o pause: force-drain the transfer on unpause [96]
+ o quiche: update to draft-25 [41]
+ o README: mention that the docs is in docs/ [49]
+ o RELEASE-PROCEDURE: feature win is closed post-release a few days [62]
+ o runtests: make random seed fixed for a month [1]
+ o runtests: restore the command log [97]
+ o schannel: make CURLOPT_CAINFO work better on Windows 7 [9]
+ o schannel_verify: Fix alt names manual verify for UNICODE builds [20]
+ o sha256: use crypto implementations when available [106]
+ o singleuse.pl: support new API functions, fix curl_dbg_ handling [33]
+ o smtp: support the SMTPUTF8 extension [90]
+ o smtp: support UTF-8 based host names in MAIL FROM [109]
+ o SOCKS: make the connect phase non-blocking [64]
+ o strcase: turn Curl_raw_tolower into static [33]
+ o strerror: increase STRERROR_LEN 128 -> 256 [70]
+ o test1323: added missing 'unit test' feature requirement
+ o tests: add a unit test for MD4 digest generation [92]
+ o tests: add a unit test for SHA256 digest generation [94]
+ o tests: add a unit test for the HMAC hash generation [91]
+ o tests: deduce the tool name from the test case for unit tests [88]
+ o tests: fix Python 3 compatibility of smbserver.py
+ o tool_dirhie: allow directory traversal during creation [2]
+ o tool_homedir: change GetEnv() to use libcurl's curl_getenv() [69]
+ o tool_util: improve Windows version of tvnow() [82]
+ o travis: update non-OpenSSL Linux jobs to Bionic [38]
+ o url: include the failure reason when curl_win32_idn_to_ascii() fails [51]
+ o urlapi: guess scheme properly with credentials given [47]
+ o urldata: do string enums without #ifdefs for build scripts [29]
+ o vtls: refactor Curl_multissl_version to make the code clearer [14]
+ o win32: USE_WIN32_CRYPTO to enable Win32 based MD4, MD5 and SHA256 [79]
 
 This release includes the following known bugs:
 
@@ -147,136 +145,135 @@
 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)
+  3dyd on github, Alessandro Ghedini, Anders Berg, Anderson Toshiyuki Sasaki,
+  Andrew Potter, Andrius Merkys, Aron Rotteveel, Austin Green, bnfp on github,
+  bramus on github, Brian Carpenter, bsammon on github, Christian Heimes,
+  Christoph M. Becker, Craig Andrews, crazydef on github, Cristian Greco,
+  Dan Fandrich, Daniel Gustafsson, Daniel Marjamäki, Daniel Stenberg,
+  Dan Jacobson, dmitrmax on github, Edgaras Janušauskas, Emil Engler,
+  Faizur Rahman, Frank Gevaerts, hamstergene on github, Harry Sintonen,
+  IvanoG on github, James Fuller, Jeroen Ooms, jethrogb on github,
+  Johannes Schindelin, Jonathan Cardoso Machado, Jon Rumsey, Joonas Kuorilehto,
+  Kristian Mide, Kunal Ekawde, Leo Neat, Marc Aldorasi, Marcel Raad,
+  Marc Hörsken, mbeifuss on github, Mike Frysinger, Mike Norton, Mischa Salle,
+  MrdUkk on github, naost3rn on github, Nick Zitzmann, Nicolas Guillier,
+  Orgad Shaneh, Patrick Monnerat, Pavel Volgarev, Pedro Monreal,
+  Peter Piekarski, Peter Wu, Pierre-Yves Bigourdan, Ray Satiro, Robert Dunaj,
+  Rolf Eike Beer, RuurdBeerstra on github, Santino Keupp, Steve Holme,
+  Sunny Bean, Tobias Hieta, vshmuk on hackerone, ygthien on github, 加藤郁之,
+  (69 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=4734
+ [2] = https://curl.haxx.se/bug/?i=4796
+ [3] = https://curl.haxx.se/bug/?i=4779
+ [4] = https://curl.haxx.se/bug/?i=4812
+ [5] = https://daniel.haxx.se/blog/2020/01/12/curl-even-more-wolfed/
+ [6] = https://curl.haxx.se/bug/?i=4807
+ [7] = https://curl.haxx.se/bug/?i=4747
+ [8] = https://curl.haxx.se/bug/?i=4804
+ [9] = https://curl.haxx.se/bug/?i=3711
+ [10] = https://curl.haxx.se/bug/?i=4754
+ [11] = https://curl.haxx.se/bug/?i=4763
+ [12] = https://curl.haxx.se/bug/?i=4717
+ [13] = https://curl.haxx.se/bug/?i=4798
+ [14] = https://curl.haxx.se/bug/?i=4803
+ [15] = https://curl.haxx.se/bug/?i=4793
+ [16] = https://curl.haxx.se/bug/?i=4825
+ [17] = https://curl.haxx.se/bug/?i=4823
+ [18] = https://curl.haxx.se/bug/?i=4818
+ [19] = https://curl.haxx.se/bug/?i=4808
+ [20] = https://curl.haxx.se/bug/?i=4761
+ [21] = https://curl.haxx.se/bug/?i=4805
+ [22] = https://curl.haxx.se/bug/?i=4799
+ [23] = https://curl.haxx.se/bug/?i=4816
+ [24] = https://curl.haxx.se/bug/?i=4824
+ [25] = https://curl.haxx.se/bug/?i=4762
+ [26] = https://curl.haxx.se/mail/archive-2020-01/0016.html
+ [27] = https://curl.haxx.se/bug/?i=4815
+ [28] = https://curl.haxx.se/bug/?i=4814
+ [29] = https://curl.haxx.se/bug/?i=4822
+ [30] = https://curl.haxx.se/bug/?i=4849
+ [31] = https://curl.haxx.se/bug/?i=4840
+ [32] = https://curl.haxx.se/bug/?i=4835
+ [33] = https://curl.haxx.se/bug/?i=4842
+ [34] = https://curl.haxx.se/bug/?i=4843
+ [35] = https://curl.haxx.se/bug/?i=4837
+ [36] = https://curl.haxx.se/bug/?i=4834
+ [37] = https://curl.haxx.se/bug/?i=4873
+ [38] = https://curl.haxx.se/bug/?i=4872
+ [39] = https://curl.haxx.se/bug/?i=4869
+ [40] = https://curl.haxx.se/bug/?i=5006
+ [41] = https://curl.haxx.se/bug/?i=4867
+ [42] = https://curl.haxx.se/bug/?i=4865
+ [43] = https://curl.haxx.se/bug/?i=4864
+ [44] = https://curl.haxx.se/bug/?i=4862
+ [45] = https://curl.haxx.se/bug/?i=4845
+ [46] = https://curl.haxx.se/bug/?i=4859
+ [47] = https://curl.haxx.se/bug/?i=4856
+ [48] = https://curl.haxx.se/bug/?i=4851
+ [49] = https://curl.haxx.se/bug/?i=4830
+ [50] = https://curl.haxx.se/bug/?i=4898
+ [51] = https://curl.haxx.se/bug/?i=4899
+ [52] = https://curl.haxx.se/bug/?i=4896
+ [53] = https://curl.haxx.se/bug/?i=4897
+ [54] = https://curl.haxx.se/bug/?i=4894
+ [55] = https://curl.haxx.se/bug/?i=4890
+ [56] = https://curl.haxx.se/bug/?i=4887
+ [57] = https://curl.haxx.se/bug/?i=4886
+ [58] = https://curl.haxx.se/bug/?i=4884
+ [59] = https://curl.haxx.se/bug/?i=4883
+ [60] = https://curl.haxx.se/bug/?i=4880
+ [61] = https://curl.haxx.se/bug/?i=4878
+ [62] = https://curl.haxx.se/bug/?i=4877
+ [63] = https://curl.haxx.se/bug/?i=4875
+ [64] = https://curl.haxx.se/bug/?i=4907
+ [65] = https://curl.haxx.se/bug/?i=4927
+ [66] = https://curl.haxx.se/bug/?i=4929
+ [67] = https://curl.haxx.se/bug/?i=4930
+ [68] = https://curl.haxx.se/bug/?i=4925
+ [69] = https://curl.haxx.se/bug/?i=4774
+ [70] = https://curl.haxx.se/bug/?i=4920
+ [71] = https://curl.haxx.se/bug/?i=4901
+ [72] = https://curl.haxx.se/bug/?i=4900
+ [73] = https://curl.haxx.se/bug/?i=4766
+ [74] = https://curl.haxx.se/bug/?i=4909
+ [75] = https://curl.haxx.se/bug/?i=4961
+ [76] = https://curl.haxx.se/bug/?i=1411
+ [77] = https://curl.haxx.se/bug/?i=4960
+ [78] = https://curl.haxx.se/bug/?i=4957
+ [79] = https://curl.haxx.se/bug/?i=4955
+ [80] = https://curl.haxx.se/bug/?i=4951
+ [81] = https://curl.haxx.se/bug/?i=4946
+ [82] = https://curl.haxx.se/bug/?i=4947
+ [83] = https://curl.haxx.se/bug/?i=4943
+ [84] = https://curl.haxx.se/bug/?i=4936
+ [85] = https://curl.haxx.se/bug/?i=4914
+ [86] = https://curl.haxx.se/bug/?i=4939
+ [87] = https://curl.haxx.se/bug/?i=4953
+ [88] = https://curl.haxx.se/bug/?i=4976
+ [89] = https://curl.haxx.se/bug/?i=4949
+ [90] = https://curl.haxx.se/bug/?i=4892
+ [91] = https://curl.haxx.se/bug/?i=4973
+ [92] = https://curl.haxx.se/bug/?i=4970
+ [93] = https://curl.haxx.se/bug/?i=4967
+ [94] = https://curl.haxx.se/bug/?i=4968
+ [95] = https://curl.haxx.se/bug/?i=4959
+ [96] = https://curl.haxx.se/bug/?i=4966
+ [97] = https://curl.haxx.se/bug/?i=4911
+ [98] = https://curl.haxx.se/bug/?i=4984
+ [99] = https://curl.haxx.se/bug/?i=5007
+ [100] = https://curl.haxx.se/bug/?i=4975
+ [101] = https://curl.haxx.se/bug/?i=5005
+ [102] = https://curl.haxx.se/bug/?i=4980
+ [103] = https://curl.haxx.se/mail/archive-2020-02/0011.html
+ [104] = https://curl.haxx.se/bug/?i=4996
+ [105] = https://curl.haxx.se/bug/?i=5013
+ [106] = https://curl.haxx.se/bug/?i=4956
+ [107] = https://curl.haxx.se/bug/?i=5016
+ [108] = https://curl.haxx.se/bug/?i=4979
+ [109] = https://curl.haxx.se/bug/?i=4928
+ [110] = https://curl.haxx.se/bug/?i=5025
diff --git a/configure b/configure
index 45c2bd7..5e4827e 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
 
@@ -902,7 +902,6 @@
 MANOPT
 NROFF
 PERL
-IPV6_ENABLED
 FISH_FUNCTIONS_DIR
 ZSH_FUNCTIONS_DIR
 USE_QUICHE
@@ -915,6 +914,7 @@
 CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_TRUE
 CURL_LT_SHLIB_VERSIONED_FLAVOUR
 USE_LIBRTMP
+USE_WOLFSSH
 USE_LIBSSH
 USE_LIBSSH2
 LIBMETALINK_CPPFLAGS
@@ -927,6 +927,7 @@
 SSL_ENABLED
 NSS_LIBS
 USE_NSS
+USE_BEARSSL
 USE_MESALINK
 USE_WOLFSSL
 USE_MBEDTLS
@@ -942,6 +943,7 @@
 DEFAULT_SSL_BACKEND
 BUILD_STUB_GSS_FALSE
 BUILD_STUB_GSS_TRUE
+IPV6_ENABLED
 USE_OPENLDAP
 HAVE_BROTLI
 ZLIB_LIBS
@@ -1179,6 +1181,7 @@
 with_mbedtls
 with_wolfssl
 with_mesalink
+with_bearssl
 with_nss
 with_ca_bundle
 with_ca_path
@@ -1187,6 +1190,7 @@
 with_libmetalink
 with_libssh2
 with_libssh
+with_wolfssh
 with_librtmp
 enable_versioned_symbols
 with_winidn
@@ -1973,7 +1977,7 @@
   --disable-progress-meter
                           Disable progress-meter
   --enable-dnsshuffle     Enable DNS shuffling
-  --disable-dnsshuffle    Disable DNS shufflinf
+  --disable-dnsshuffle    Disable DNS shuffling
   --enable-alt-svc        Enable alt-svc support
   --disable-alt-svc       Disable alt-svc support
 
@@ -2034,6 +2038,9 @@
   --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
@@ -2054,14 +2061,19 @@
                           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 +2185,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
 _ACEOF
@@ -5857,8 +5869,8 @@
 
 
 
-    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_gss_msg="no      (--with-gssapi)"
@@ -8764,7 +8776,7 @@
 fi
 
 : ${AR=ar}
-: ${AR_FLAGS=cru}
+: ${AR_FLAGS=cr}
 
 
 
@@ -10482,8 +10494,8 @@
 _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 +11890,12 @@
 	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*)
@@ -21806,16 +21824,23 @@
 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 +21864,14 @@
 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
@@ -24795,6 +24826,168 @@
 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 +25424,12 @@
   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$WINSSL_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
@@ -25880,6 +26073,13 @@
 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 +26121,16 @@
 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"
@@ -26409,6 +26619,81 @@
     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
 
 
@@ -27457,11 +27742,11 @@
     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 +27758,26 @@
 #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 :
@@ -41331,17 +41616,6 @@
 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"
@@ -42518,7 +42792,7 @@
     ESNI_ENABLED=0
   ESNI_SUPPORT=''
 
-      if test "x$OPENSSL_ENABLED" == "x1"; then
+      if test "x$OPENSSL_ENABLED" = "x1"; then
     for ac_func in SSL_get_esni_status
 do :
   ac_fn_c_check_func "$LINENO" "SSL_get_esni_status" "ac_cv_func_SSL_get_esni_status"
@@ -42534,7 +42808,7 @@
 
     fi
 
-    if test "x$ESNI_ENABLED" == "x1"; then
+    if test "x$ESNI_ENABLED" = "x1"; then
 
 $as_echo "#define USE_ESNI 1" >>confdefs.h
 
@@ -42766,6 +43040,10 @@
   SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SCP"
   SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP"
 fi
+if test "x$USE_WOLFSSH" = "x1"; then
+  SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SCP"
+  SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP"
+fi
 if test "x$CURL_DISABLE_RTSP" != "x1"; then
   SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS RTSP"
 fi
diff --git a/configure.ac b/configure.ac
index cb8f494..e7ad639 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 @@
 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])
 
@@ -156,8 +156,8 @@
 
 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_gss_msg="no      (--with-gssapi)"
@@ -1203,16 +1203,23 @@
        ;;
   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 +1234,12 @@
   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>
@@ -2400,6 +2411,98 @@
 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 +2632,10 @@
   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$WINSSL_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
@@ -2667,6 +2770,12 @@
       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 +2801,23 @@
 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"
@@ -2849,6 +2964,28 @@
     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 **********************************************************************
@@ -3248,9 +3385,9 @@
     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)"
@@ -3592,9 +3729,9 @@
         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
@@ -3960,15 +4097,6 @@
   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 ************************************************************
@@ -4400,7 +4528,7 @@
 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)
@@ -4449,7 +4577,7 @@
 
   dnl OpenSSL with a chosen ESNI function should be enough
   dnl so more exhaustive checking seems unnecessary for now
-  if test "x$OPENSSL_ENABLED" == "x1"; then
+  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)
@@ -4458,7 +4586,7 @@
   fi
 
   dnl now deal with whatever we found
-  if test "x$ESNI_ENABLED" == "x1"; then
+  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"
@@ -4667,6 +4795,10 @@
   SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SCP"
   SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP"
 fi
+if test "x$USE_WOLFSSH" = "x1"; then
+  SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SCP"
+  SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS SFTP"
+fi
 if test "x$CURL_DISABLE_RTSP" != "x1"; then
   SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS RTSP"
 fi
diff --git a/docs/ALTSVC.md b/docs/ALTSVC.md
index 4840141..6a462bb 100644
--- a/docs/ALTSVC.md
+++ b/docs/ALTSVC.md
@@ -27,7 +27,7 @@
 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/CURL-DISABLE.md b/docs/CURL-DISABLE.md
new file mode 100644
index 0000000..83436b4
--- /dev/null
+++ b/docs/CURL-DISABLE.md
@@ -0,0 +1,110 @@
+# 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_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_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_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 4f4ef8a..26877c4 100644
--- a/docs/DEPRECATE.md
+++ b/docs/DEPRECATE.md
@@ -5,32 +5,8 @@
 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/ESNI.md b/docs/ESNI.md
index eefb666..7feaa75 100644
--- a/docs/ESNI.md
+++ b/docs/ESNI.md
@@ -122,7 +122,7 @@
 
 ## 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/FAQ b/docs/FAQ
index 4136b91..53f1c9e 100644
--- a/docs/FAQ
+++ b/docs/FAQ
@@ -447,9 +447,9 @@
 
   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?
 
diff --git a/docs/GOVERNANCE.md b/docs/GOVERNANCE.md
index d49358b..8174717 100644
--- a/docs/GOVERNANCE.md
+++ b/docs/GOVERNANCE.md
@@ -18,7 +18,8 @@
 
 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 @@
 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 criterias,
+they can be mentioned on the Sponsors page on the curl web site.
+
+## 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
@@ -108,8 +131,8 @@
 
 ### 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/HISTORY.md b/docs/HISTORY.md
index 3024907..a628d05 100644
--- a/docs/HISTORY.md
+++ b/docs/HISTORY.md
@@ -218,6 +218,8 @@
 
 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
@@ -283,6 +285,8 @@
 
  September: Web site had 245,000 unique visitors and served 236GB data
 
+ SMB and SMBS support
+
 2015
 ----
 
@@ -304,6 +308,8 @@
 2017
 ----
 
+ July: OSS-Fuzz started fuzzing libcurl
+
  September: Added Multi-SSL support
 
  The web site serves 3100 GB/month
@@ -344,3 +350,10 @@
     curl_easy_setopt() options:   261
     Public functions in libcurl:  80
     Contributors:                 1808
+
+2019
+----
+
+ August: the first HTTP/3 requests with curl.
+
+ September: 7.66.0 is released and the tool offers parallel downloads
diff --git a/docs/HTTP-COOKIES.md b/docs/HTTP-COOKIES.md
index 632cb4e..31af9f6 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
diff --git a/docs/HTTP3.md b/docs/HTTP3.md
index 2dbd256..55bdd02 100644
--- a/docs/HTTP3.md
+++ b/docs/HTTP3.md
@@ -13,7 +13,7 @@
 
 ## QUIC libraries
 
-QUIC libraries we're experiementing with:
+QUIC libraries we're experimenting with:
 
 [ngtcp2](https://github.com/ngtcp2/ngtcp2)
 
@@ -33,7 +33,7 @@
 
 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_1d-quic-draft-27 https://github.com/tatsuhiro-t/openssl
      % cd openssl
      % ./config enable-tls1_3 --prefix=<somewhere1>
      % make
@@ -65,7 +65,7 @@
      % 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
@@ -93,13 +93,13 @@
      % cd ../..
      % QUICHE_BSSL_PATH=$PWD/deps/boringssl cargo build --release --features pkg-config-meta
 
-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/.openssl --with-quiche=$PWD/../quiche/target/release --enable-alt-svc
      % make
 
 ## Run
diff --git a/docs/INSTALL.md b/docs/INSTALL.md
index 78d632c..380f3b3 100644
--- a/docs/INSTALL.md
+++ b/docs/INSTALL.md
@@ -120,6 +120,7 @@
  - 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 +196,8 @@
 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:
 
@@ -296,6 +285,47 @@
     ./configure --with-darwinssl
     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 9ae7228..9fb0733 100644
--- a/docs/INTERNALS.md
+++ b/docs/INTERNALS.md
@@ -97,7 +97,7 @@
  - NSS          3.14.x
  - PolarSSL     1.3.0
  - Heimdal      ?
- - nghttp2      1.0.0
+ - nghttp2      1.12.0
 
 Operating Systems
 -----------------
diff --git a/docs/KNOWN_BUGS b/docs/KNOWN_BUGS
index 5134e73..351eca2 100644
--- a/docs/KNOWN_BUGS
+++ b/docs/KNOWN_BUGS
@@ -12,6 +12,7 @@
 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
@@ -30,12 +31,13 @@
  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
 
  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
@@ -85,8 +87,6 @@
  9.1 SFTP doesn't do CURLOPT_POSTQUOTE correct
 
  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
 
@@ -102,6 +102,7 @@
  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 +114,13 @@
 
 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 +149,7 @@
 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
@@ -255,6 +263,10 @@
 
  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
+
 3. Email protocols
 
 3.1 IMAP SEARCH ALL truncated response
@@ -269,20 +281,18 @@
  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
 
@@ -339,7 +349,7 @@
 
 5.1 USE_UNIX_SOCKETS on Windows
 
- Due to incorrect CMake checks for the presense of the feature, it will never
+ Due to incorrect CMake checks for the presence of the feature, it will never
  be enabled for windows in a cmake build.
 
  See https://github.com/curl/curl/issues/4040
@@ -609,21 +619,6 @@
 
 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.
-
-10.2 SOCKS don't support timeouts
-
- 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.3 FTPS over SOCKS
 
  libcurl doesn't support FTPS over a SOCKS proxy.
@@ -674,7 +669,8 @@
  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
 
@@ -728,6 +724,13 @@
 
  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
index e4f6759..1083a2d 100644
--- a/docs/LICENSE-MIXING.md
+++ b/docs/LICENSE-MIXING.md
@@ -75,6 +75,11 @@
  (May be used for SSL/TLS support) As an OpenSSL fork, it has the same
  license as that.
 
+## BearSSL
+
+ (May be used for SSL/TLS support) Uses an MIT license that is very liberal
+ and imposes no restrictions on any other library or part you may link with.
+
 ## c-ares
 
  (Used for asynchronous name resolves) Uses an MIT license that is very
diff --git a/docs/Makefile.am b/docs/Makefile.am
index b269670..5ce0d83 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -52,6 +52,7 @@
  CODE_OF_CONDUCT.md                             \
  CODE_STYLE.md                                  \
  CONTRIBUTE.md                                  \
+ CURL-DISABLE.md                                \
  DEPRECATE.md                                   \
  ESNI.md                                        \
  EXPERIMENTAL.md                                \
diff --git a/docs/PARALLEL-TRANSFERS.md b/docs/PARALLEL-TRANSFERS.md
index d3b38ae..da688ea 100644
--- a/docs/PARALLEL-TRANSFERS.md
+++ b/docs/PARALLEL-TRANSFERS.md
@@ -18,7 +18,7 @@
 
  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/RELEASE-PROCEDURE.md b/docs/RELEASE-PROCEDURE.md
index 70609fd..f2b4343 100644
--- a/docs/RELEASE-PROCEDURE.md
+++ b/docs/RELEASE-PROCEDURE.md
@@ -61,12 +61,12 @@
 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 +78,28 @@
   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
+- March 4, 2020 (7.69.0)
+- April 29, 2020
+- June 24, 2020
+- August 19, 2020
+- October 14, 2020
+- December 9, 2020
+- February 3, 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/ROADMAP.md b/docs/ROADMAP.md
index 1d47682..7bd0719 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -27,6 +27,13 @@
 
  Initial work exists in https://github.com/curl/curl/pull/4011
 
+thread-safe `curl_global_init()`
+--------------------------------
+
+ Fix the libcurl specific parts of the function to be thread-safe. Make sure
+ it can be thread-safe if built with thread-safe 3rd party libraries.
+ (probably can't include `curl_global_init_mem()` for obvious reasons)
+
 tiny-curl
 ---------
 
diff --git a/docs/THANKS b/docs/THANKS
index 884906a..82d7d8f 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,10 +24,13 @@
 Adam Piggott
 Adam Sampson
 Adam Tkac
+adnn on github
 Adrian Burcea
 Adrian Peniak
 Adrian Schuur
 Adriano Meirelles
+afrind on github
+ahodesuka on github
 Ajit Dhumale
 Akhil Kedia
 Aki Koskinen
@@ -45,6 +49,7 @@
 Ales Novak
 Alessandro Ghedini
 Alessandro Vesely
+Alex aka WindEagle
 Alex Baines
 Alex Bligh
 Alex Chan
@@ -62,7 +67,6 @@
 Alex Samorukov
 Alex Suykov
 Alex Vinnik
-Alex aka WindEagle
 Alexander Beedie
 Alexander Dyagilev
 Alexander Elgert
@@ -93,14 +97,17 @@
 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
@@ -124,22 +131,26 @@
 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 Serpa
 Andy Tsouladze
 Angus Mackay
+anshnd on github
 Anthon Pang
 Anthony Avina
 Anthony Bryan
@@ -155,6 +166,7 @@
 Antonio Larrosa
 Antony74 on github
 Antti Hätälä
+arainchik on github
 Archangel_SDY on github
 Arkadiusz Miskiewicz
 Armel Asselin
@@ -162,15 +174,18 @@
 Arnaud Ebalard
 Arnaud Rebillout
 Aron Bergman
+Aron Rotteveel
 Artak Galoyan
 Arthur Murray
 Arve Knudsen
 Arvid Norberg
+asavah on github
 Ashish Shukla
 Ask Bjørn Hansen
 Askar Safin
 Ates Goral
 Augustus Saunders
+Austin Green
 Avery Fay
 Axel Tillequin
 Ayoub Boudhar
@@ -186,6 +201,8 @@
 Bas van Schaik
 Bastien Bouclet
 Basuke Suzuki
+baumanj on github
+bdry on github
 Ben Boeckel
 Ben Darnell
 Ben Greear
@@ -221,14 +238,17 @@
 Bill Nagel
 Bill Pyne
 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,6 +257,7 @@
 Brad King
 Brad Spencer
 Bradford Bruce
+bramus on github
 Brandon Casey
 Brandon Dong
 Brandon Wang
@@ -257,11 +278,14 @@
 Bru Rom
 Bruce Mitchener
 Bruce Stephens
+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
@@ -269,6 +293,7 @@
 Cameron MacMinn
 Camille Moncelier
 Caolan McNamara
+Captain Basil
 Carie Pointer
 Carlo Cannas
 Carlo Marcelo Arenas Belón
@@ -278,6 +303,8 @@
 Carsten Lange
 Casey O'Donnell
 Catalin Patulea
+cbartl on github
+cclauss on github
 Chad Monroe
 Chandrakant Bagul
 Charles Kerr
@@ -318,17 +345,21 @@
 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
 Colby Ranger
@@ -341,18 +372,24 @@
 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
 Dair Grant
@@ -372,6 +409,7 @@
 Dan Petitt
 Dan Torop
 Dan Zitter
+Daniel at touchtunes
 Daniel Bankhead
 Daniel Black
 Daniel Cater
@@ -384,6 +422,7 @@
 Daniel Krügler
 Daniel Lee Hwang
 Daniel Lublin
+Daniel Marjamäki
 Daniel Melani
 Daniel Mentz
 Daniel Romero
@@ -394,13 +433,13 @@
 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 +467,7 @@
 David L.
 David Lang
 David LeBlanc
+David Lopes
 David Lord
 David McCreedy
 David Odin
@@ -444,6 +484,7 @@
 David Woodhouse
 David Wright
 David Yan
+dbrowndan on github
 Dengminwen
 Denis Chaplygin
 Denis Feklushkin
@@ -451,6 +492,7 @@
 Dennis Clarke
 Derek Higgins
 Desmond O. Chang
+destman on github
 Detlef Schmier
 Dheeraj Sangamkar
 Didier Brisebourg
@@ -469,9 +511,12 @@
 Dirk Eddelbuettel
 Dirk Feytons
 Dirk Manske
+dkjjr89 on github
+dkwolfe4 on github
 Dmitri Shubin
 Dmitri Tikhonov
 Dmitriy Sergeyev
+dmitrmax on github
 Dmitry Bartsevich
 Dmitry Eremin-Solenikov
 Dmitry Falko
@@ -481,6 +526,7 @@
 Dmitry Popov
 Dmitry Rechkin
 Dmitry S. Baikov
+dnivras on github
 Dolbneff A.V
 Domenico Andreoli
 Dominick Meglio
@@ -498,7 +544,9 @@
 Douglas R. Horner
 Douglas Steinwand
 Dov Murik
+dpull on github
 Drake Arconis
+dtmsecurity on github
 Duane Cathey
 Duncan Mac-Vicar Prett
 Dustin Boswell
@@ -513,6 +561,7 @@
 Eason-Yu on github
 Ebenezer Ikonne
 Ed Morley
+Edgaras Janušauskas
 Edin Kadribasic
 Edmond Yu
 Eduard Bloch
@@ -524,11 +573,14 @@
 Eetu Ojanen
 Egon Eckert
 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
@@ -574,6 +626,7 @@
 Evert Pot
 Evgeny Grin
 Evgeny Turnaev
+eXeC64 on github
 Eygene Ryabinkin
 Fabian Frank
 Fabian Hiernaux
@@ -582,13 +635,14 @@
 Fabrice Fontaine
 Fabrizio Ammollo
 Fahim Chandurwala
+Faizur Rahman
 Federico Bianchi
 Fedor Karpelevitch
 Feist Josselin
 Felix Hädicke
 Felix Kaiser
-Felix Yan
 Felix von Leitner
+Felix Yan
 Feng Tu
 Fernando Muñoz
 Flavio Medeiros
@@ -676,6 +730,7 @@
 Guenole Bescon
 Guido Berhoerster
 Guillaume Arluison
+guitared on github
 Gunter Knauf
 Gustaf Hui
 Gustavo Grieco
@@ -687,6 +742,7 @@
 Hagai Auro
 Haibo Huang
 Hamish Mackenzie
+hamstergene on github
 Han Han
 Han Qiao
 Hang Kin Lau
@@ -722,6 +778,7 @@
 Hongli Lai
 Howard Blaise
 Howard Chu
+hsiao yi
 Hubert Kario
 Huzaifa Sidhpurwala
 Hzhijun
@@ -743,8 +800,10 @@
 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
@@ -756,7 +815,9 @@
 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 +827,7 @@
 Jactry Zeng
 Jad Chamcham
 Jaime Fullaondo
+jakirkham on github
 Jakub Wilk
 Jakub Zakrzewski
 James Atwill
@@ -775,6 +837,7 @@
 James Clancy
 James Cone
 James Dury
+James Fuller
 James Gallagher
 James Griffiths
 James Housley
@@ -792,11 +855,13 @@
 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
@@ -826,6 +891,7 @@
 Jeff Johnson
 Jeff King
 Jeff Lawson
+Jeff Mears
 Jeff Phillips
 Jeff Pohlmeyer
 Jeff Weber
@@ -852,6 +918,7 @@
 Jesse Chisholm
 Jesse Noller
 Jesse Tan
+jethrogb on github
 Jie He
 Jim Drash
 Jim Freeman
@@ -863,6 +930,7 @@
 Jiri Hruska
 Jiri Jaburek
 Jiří Malák
+jnbr on github
 Jocelyn Jaubert
 Joe Halpin
 Joe Malicki
@@ -901,6 +969,7 @@
 John Marshall
 John McGowan
 John P. McCaskey
+John Schroeder
 John Starks
 John Suprock
 John V. Chow
@@ -913,6 +982,7 @@
 Jon DeVree
 Jon Grubbs
 Jon Nelson
+Jon Rumsey
 Jon Sargeant
 Jon Seymour
 Jon Spencer
@@ -930,6 +1000,7 @@
 Jonathan Moerman
 Jonathan Nieder
 Jongki Suwandi
+jonrumsey on github
 Joombalaya on github
 Joonas Kuorilehto
 Jose Alf
@@ -937,6 +1008,7 @@
 Josef Wolf
 Josh Bialkowski
 Josh Kapell
+joshhe on github
 Joshua Kwan
 Joshua Swink
 Josie Huddleston
@@ -959,6 +1031,7 @@
 Julien Nabet
 Julien Royer
 Jun-ichiro itojun Hagino
+jungle-boogie on github
 Junho Choi
 Jurij Smakov
 Juro Bystricky
@@ -967,11 +1040,14 @@
 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
@@ -1018,11 +1094,14 @@
 Koen Dergent
 Konstantin Isakov
 Konstantin Kushnir
+kouzhudong on github
+kreshano on github
 Kris Kennaway
 Krishnendu Majumdar
 Krister Johansen
 Kristian Gunstone
 Kristian Köhntopp
+Kristian Mide
 Kristiyan Tsaklev
 Kristoffer Gleditsch
 Kunal Ekawde
@@ -1034,6 +1113,7 @@
 Kyle Sallee
 Kyohei Kadota
 Kyselgov E.N
+l00p3r on Hackerone
 Lachlan O'Dea
 Ladar Levison
 Lance Ware
@@ -1063,11 +1143,13 @@
 Len Marinaccio
 Lenaic Lefever
 Lenny Rachitsky
+Leo Neat
 Leon Breedt
 Leon Winter
 Leonardo Rosati
 Leonardo Taccari
 Liam Healy
+lijian996 on github
 Lijo Antony
 Linas Vepstas
 Lindley French
@@ -1096,6 +1178,7 @@
 Ludwig Nussel
 Lukas Ruzicka
 Lukasz Czekierda
+lukaszgn on github
 Luke Amery
 Luke Call
 Luke Dashjr
@@ -1105,10 +1188,10 @@
 Luật Nguyễn
 Lyman Epp
 Lyndon Hill
-MAntoniak on github
 Maciej Karpiuk
 Maciej Puzio
 Maciej W. Rozycki
+madblobfish on github
 Mahmoud Samir Fayed
 Maks Naumov
 Maksim Kuzevanov
@@ -1117,6 +1200,7 @@
 Mamta Upadhyay
 Mandy Wu
 Manfred Schwarb
+MAntoniak on github
 Manuel Massing
 Marc Aldorasi
 Marc Boucher
@@ -1128,6 +1212,7 @@
 Marc Renault
 Marc Schlatter
 Marc-Antoine Perennou
+marc-groundctl on github
 Marcel Hernandez
 Marcel Raad
 Marcel Roelofs
@@ -1165,6 +1250,7 @@
 Markus Moeller
 Markus Oberhumer
 Markus Westerlind
+Maros Priputen
 Marquis de Muesli
 Martijn Koster
 Martin Ankerl
@@ -1186,6 +1272,8 @@
 Martin Vejnár
 Marty Kuhrt
 Maruko
+masbug on github
+Massimiliano Fantuzzi
 Massimiliano Ziccardi
 Massimo Callegari
 Mateusz Loskot
@@ -1215,6 +1303,7 @@
 Mauro Rappa
 Max Dymond
 Max Katsev
+Max Kellermann
 Max Khon
 Max Savenkov
 Maxim Ivanov
@@ -1222,6 +1311,8 @@
 Maxim Prohorov
 Maxime Larocque
 Maxime Legros
+mbeifuss on github
+mccormickt12 on github
 Mehmet Bozkurt
 Mekonikum
 Melissa Mears
@@ -1235,6 +1326,7 @@
 Michael Curtis
 Michael Day
 Michael Felt
+Michael Forney
 Michael Gmelin
 Michael Goffioul
 Michael Jahn
@@ -1254,6 +1346,7 @@
 Michael Stapelberg
 Michael Steuer
 Michael Stillwell
+Michael Vittiglio
 Michael Wallner
 Michal Bonino
 Michal Marek
@@ -1269,6 +1362,7 @@
 Michele Bini
 Miguel Angel
 Miguel Diaz
+migueljcrum on github
 Mihai Ionescu
 Mikael Johansson
 Mikael Sennerholm
@@ -1277,11 +1371,13 @@
 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
@@ -1290,18 +1386,24 @@
 Mingliang Zhu
 Miroslav Franc
 Miroslav Spousta
+Mischa Salle
 Mitz Wark
+mkzero on github
 Mohamed Lrhazi
 Mohammad AlSaleh
+Mohammad Hasbini
 Mohun Biswas
+momala454 on github
+moohoorama on github
 Mostyn Bramley-Moore
 Moti Avrahami
+MrdUkk on github
 MrSorcus on github
 Muz Dima
 Myk Taylor
-NTMan on Github
 Nach M. S.
 Nagai H
+naost3rn on github
 Nate Prewitt
 Nathan Coulter
 Nathan O'Sullivan
@@ -1311,12 +1413,18 @@
 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,10 +1434,12 @@
 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
 Niels van Tongeren
 Nikita Schmidt
@@ -1339,14 +1449,18 @@
 Nikolai Kondrashov
 Nikos Mavrogiannopoulos
 Nikos Tsipinakis
+niner on github
 Ning Dong
 Nir Soffer
 Nis Jorgensen
+nk
 Nobuhiro Ban
 Nodak Sodak
+nopjmp on github
 Norbert Frese
 Norbert Kett
 Norbert Novotny
+NTMan on Github
 Octavio Schroeder
 Ofer
 Okhin Vasilij
@@ -1355,6 +1469,7 @@
 Olaf Stüben
 Oleg Pudeyev
 Olen Andoni
+olesteban on github
 Oli Kingshott
 Oliver Gondža
 Oliver Graute
@@ -1363,15 +1478,18 @@
 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 +1500,8 @@
 Pasha Kuznetsov
 Pasi Karkkainen
 Pat Ray
+patelvivekv1993 on github
+patnyb on github
 Patrice Guerin
 Patricia Muscalu
 Patrick Bihan-Faou
@@ -1401,6 +1521,7 @@
 Paul Groke
 Paul Harrington
 Paul Harris
+Paul Hoffman
 Paul Howarth
 Paul Joyce
 Paul Marks
@@ -1410,6 +1531,7 @@
 Paul Oliver
 Paul Querna
 Paul Saab
+Paulo Roberto Tomasi
 Pavel Cenek
 Pavel Gushchin
 Pavel Löbl
@@ -1417,11 +1539,14 @@
 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
@@ -1474,6 +1599,7 @@
 Pierre Chapuis
 Pierre Joye
 Pierre Ynard
+Pierre-Yves Bigourdan
 Piotr Dobrogost
 Piotr Komborski
 Po-Chuan Hsieh
@@ -1484,6 +1610,7 @@
 Praveen Pvs
 Priyanka Shah
 Przemysław Tomaszewski
+pszemus on github
 Puneet Pawaia
 Quagmire
 Quanah Gibson-Mount
@@ -1504,6 +1631,7 @@
 Ralf S. Engelschall
 Ralph Beckmann
 Ralph Mitchell
+Ram Krushna Mishra
 Ran Mozes
 Randall S. Becker
 Randy Armstrong
@@ -1541,6 +1669,7 @@
 Richard Alcock
 Richard Archer
 Richard Atterer
+Richard Bowker
 Richard Bramante
 Richard Clayton
 Richard Cooper
@@ -1558,6 +1687,7 @@
 Rick Jones
 Rick Richardson
 Rick Welykochy
+Rickard Hallerbäck
 Ricki Hirner
 Ricky Leverence
 Ricky-Tigg on github
@@ -1573,6 +1703,7 @@
 Robert A. Monat
 Robert B. Harris
 Robert D. Young
+Robert Dunaj
 Robert Foreman
 Robert Iakobashvili
 Robert Kolcun
@@ -1616,6 +1747,7 @@
 Ruslan Gazizov
 Rutger Hofman
 Ruurd Beerstra
+RuurdBeerstra on github
 Ryan Braud
 Ryan Chan
 Ryan Nelson
@@ -1625,7 +1757,6 @@
 Ryuichi KAWAMATA
 Rémy Léone
 S. Moonesamy
-SBKarr on github
 Salah-Eddin Shaban
 Salvador Dávila
 Salvatore Sorrentino
@@ -1641,12 +1772,15 @@
 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 +1811,7 @@
 Sevan Janiyan
 Sh Diao
 Shachaf Ben-Kiki
+Shailesh Kapse
 Shankar Jadhavar
 Shao Shuchao
 Sharad Gupta
@@ -1691,23 +1826,29 @@
 Siddhartha Prakash Jain
 Sidney San Martín
 Siegfried Gyuricsko
+silveja1 on github
 Simon Dick
 Simon H.
 Simon Josefsson
 Simon Legner
 Simon Liu
 Simon Warta
+SLDiggie on github
+smuellerDD on github
 Somnath Kundu
 Song Ma
 Sonia Subramanian
 Spacen Jasset
 Spezifant on github
 Spiridonoff A.V
+Spoon Man
 Spork Schivago
+sstruchtrup on github
 Stadler Stephan
 Stan van de Burgt
 Stanislav Ivochkin
 Stanislav Zidek
+steelman on github
 Stefan Agner
 Stefan Bühler
 Stefan Eissing
@@ -1721,6 +1862,7 @@
 Stefan Ulrich
 Stefano Simonelli
 Steinar H. Gunderson
+steini2000 on github
 Stepan Broz
 Stephan Bergmann
 Stephan Lagerholm
@@ -1749,26 +1891,29 @@
 Steven Parkes
 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
 Tae Hyoung Ahn
 Tae Wong
 Taiyu Len
 Taneli Vähäkangas
 Tanguy Fautre
+tarek112 on github
 Tatsuhiro Tsujikawa
 Teemu Yli-Elsila
 Temprimus
@@ -1777,6 +1922,7 @@
 The Infinnovation team
 TheAssassin on github
 Theodore Dubois
+tholin on github
 Thomas Braun
 Thomas Gamper
 Thomas Glanzmann
@@ -1788,8 +1934,8 @@
 Thomas Ruecker
 Thomas Schwinge
 Thomas Tonino
-Thomas Vegas
 Thomas van Hesteren
+Thomas Vegas
 Thorsten Schöning
 Tiit Pikma
 Till Maas
@@ -1813,7 +1959,9 @@
 Timothe Litt
 Timothy Polich
 Tinus van den Berg
+TJ Saunders
 Tobias Blomberg
+Tobias Hieta
 Tobias Hintze
 Tobias Lindgren
 Tobias Markus
@@ -1836,9 +1984,9 @@
 Tom Regner
 Tom Seddon
 Tom Sparrow
+Tom van der Woerdt
 Tom Wright
 Tom Zerucha
-Tom van der Woerdt
 Tomas Hoger
 Tomas Jakobsson
 Tomas Mlcoch
@@ -1849,16 +1997,19 @@
 Tomasz Kojm
 Tomasz Lacki
 Tommie Gannert
+tommink[at]post.pl
 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
@@ -1877,12 +2028,14 @@
 Ulrich Zadow
 Valentin David
 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
@@ -1901,11 +2054,13 @@
 Vladimir Grishchenko
 Vladimir Kotal
 Vladimir Lazarenko
+Vlastimil Ovčáčík
 Vojtech Janota
 Vojtech Minarik
 Vojtěch Král
 Volker Schmid
 Vsevolod Novikov
+vshmuk on hackerone
 W. Mark Kubacki
 Waldek Kozba
 Walter J. Mack
@@ -1915,6 +2070,7 @@
 Wenchao Li
 Wenxiang Qian
 Werner Koch
+wesinator on github
 Wesley Laxton
 Wesley Miaw
 Wez Furlong
@@ -1924,13 +2080,17 @@
 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
 Yaakov Selkowitz
 Yang Tse
@@ -1940,10 +2100,12 @@
 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
@@ -1954,6 +2116,7 @@
 Zachary Seguin
 Zdenek Pavlas
 Zekun Ni
+zelinchen on github
 Zenju on github
 Zero King
 Zhao Yisha
@@ -1962,101 +2125,9 @@
 Zhouyihai Ding
 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 42d37c1..b288e4d 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -20,6 +20,7 @@
  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.7 Support HTTP/2 for HTTP(S) proxies
  1.8 CURLOPT_RESOLVE for any port number
@@ -86,6 +87,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
@@ -131,6 +134,7 @@
  18.1 sync
  18.2 glob posts
  18.3 prevent file overwriting
+ 18.4 --proxycommand
  18.5 UTF-8 filenames in Content-Disposition
  18.7 at least N milliseconds between requests
  18.9 Choose the name of file in braces for complex URLs
@@ -157,6 +161,7 @@
  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
 
  21. Next SONAME bump
  21.1 http-style HEAD output for FTP
@@ -195,6 +200,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:
@@ -394,7 +406,6 @@
  EWOULDBLOCK or similar. Blocking cases include:
 
  - Name resolves on non-windows unless c-ares or the threaded resolver is used
- - SOCKS proxy handshakes
  - file:// transfers
  - TELNET transfers
  - The "DONE" operation (post transfer protocol-specific actions) for the
@@ -594,6 +605,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
@@ -804,7 +826,7 @@
 
  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...
 
@@ -848,6 +870,16 @@
  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
@@ -1045,6 +1077,15 @@
  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
+
 21. Next SONAME bump
 
 21.1 http-style HEAD output for FTP
diff --git a/docs/cmdline-opts/Makefile.inc b/docs/cmdline-opts/Makefile.inc
index c90e9c5..829551f 100644
--- a/docs/cmdline-opts/Makefile.inc
+++ b/docs/cmdline-opts/Makefile.inc
@@ -38,6 +38,8 @@
   dump-header.d					\
   egd-file.d					\
   engine.d					\
+  etag-save.d                   \
+  etag-compare.d                \
   expect100-timeout.d				\
   fail-early.d					\
   fail.d					\
@@ -103,9 +105,10 @@
   ntlm.d ntlm-wb.d				\
   oauth2-bearer.d				\
   output.d                                      \
+  parallel-immediate.d                          \
+  parallel-max.d                                \
   parallel.d                                    \
   pass.d                			\
-  parallel-max.d                                \
   path-as-is.d					\
   pinnedpubkey.d				\
   post301.d					\
diff --git a/docs/cmdline-opts/alt-svc.d b/docs/cmdline-opts/alt-svc.d
index ba2ded1..15877a2 100644
--- a/docs/cmdline-opts/alt-svc.d
+++ b/docs/cmdline-opts/alt-svc.d
@@ -4,7 +4,7 @@
 Help: Enable alt-svc with this cache file
 Added: 7.64.1
 ---
-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 +14,4 @@
 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/create-dirs.d b/docs/cmdline-opts/create-dirs.d
index 49e22e7..b09d96c 100644
--- a/docs/cmdline-opts/create-dirs.d
+++ b/docs/cmdline-opts/create-dirs.d
@@ -6,4 +6,6 @@
 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/data.d b/docs/cmdline-opts/data.d
index d18312a..8b5200d 100644
--- a/docs/cmdline-opts/data.d
+++ b/docs/cmdline-opts/data.d
@@ -22,9 +22,8 @@
 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/etag-compare.d b/docs/cmdline-opts/etag-compare.d
new file mode 100644
index 0000000..1a698a8
--- /dev/null
+++ b/docs/cmdline-opts/etag-compare.d
@@ -0,0 +1,18 @@
+Long: etag-compare
+Arg: <file>
+Help: Pass an ETag from a file as a custom header
+Protocols: HTTP
+Added: 7.68.0
+---
+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 0000000..214723f
--- /dev/null
+++ b/docs/cmdline-opts/etag-save.d
@@ -0,0 +1,16 @@
+Long: etag-save
+Arg: <file>
+Help: Parse ETag from a request and save it to a file
+Protocols: HTTP
+Added: 7.68.0
+---
+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/form.d b/docs/cmdline-opts/form.d
index 0bbc370..7f1aa31 100644
--- a/docs/cmdline-opts/form.d
+++ b/docs/cmdline-opts/form.d
@@ -33,11 +33,11 @@
 
  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/http3.d b/docs/cmdline-opts/http3.d
index ca85e3a..8265937 100644
--- a/docs/cmdline-opts/http3.d
+++ b/docs/cmdline-opts/http3.d
@@ -8,7 +8,7 @@
 See-also: http1.1 http2
 ---
 
-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/location.d b/docs/cmdline-opts/location.d
index 7c70e69..b5ba1f4 100644
--- a/docs/cmdline-opts/location.d
+++ b/docs/cmdline-opts/location.d
@@ -13,11 +13,13 @@
 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/oauth2-bearer.d b/docs/cmdline-opts/oauth2-bearer.d
index 7807167..30466e5 100644
--- a/docs/cmdline-opts/oauth2-bearer.d
+++ b/docs/cmdline-opts/oauth2-bearer.d
@@ -1,7 +1,7 @@
 Long: oauth2-bearer
 Help: OAuth 2 Bearer Token
 Arg: <token>
-Protocols: IMAP POP3 SMTP
+Protocols: 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
diff --git a/docs/cmdline-opts/parallel-immediate.d b/docs/cmdline-opts/parallel-immediate.d
new file mode 100644
index 0000000..3439310
--- /dev/null
+++ b/docs/cmdline-opts/parallel-immediate.d
@@ -0,0 +1,9 @@
+Long: parallel-immediate
+Help: Do not wait for multiplexing (with --parallel)
+Added: 7.68.0
+See-also: parallel parallel-max
+---
+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/tlspassword.d b/docs/cmdline-opts/tlspassword.d
index 234a116..b2e6536 100644
--- a/docs/cmdline-opts/tlspassword.d
+++ b/docs/cmdline-opts/tlspassword.d
@@ -4,3 +4,5 @@
 ---
 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 72f1e16..7192b9f 100644
--- a/docs/cmdline-opts/tlsuser.d
+++ b/docs/cmdline-opts/tlsuser.d
@@ -5,3 +5,5 @@
 ---
 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/curl-config.1 b/docs/curl-config.1
index 9711f4b..9f88ff0 100644
--- a/docs/curl-config.1
+++ b/docs/curl-config.1
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl-config 1 "November 30, 2017" "Curl 7.67.0" "curl-config manual"
+.TH curl-config 1 "November 30, 2017" "Curl 7.69.0" "curl-config manual"
 
 .SH NAME
 curl-config \- Get information about a libcurl installation
diff --git a/docs/curl.1 b/docs/curl.1
index 94ac970..fda4571 100644
--- a/docs/curl.1
+++ b/docs/curl.1
@@ -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.69.0" "Curl Manual"
 
 .SH NAME
 curl \- transfer a URL
@@ -147,7 +147,7 @@
 
 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 +157,7 @@
 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"
@@ -461,6 +461,8 @@
 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).
@@ -540,12 +542,11 @@
 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.
+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 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.
 .IP "--delegation <LEVEL>"
@@ -662,6 +663,34 @@
 (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 +775,11 @@
 
  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/
@@ -1085,7 +1114,7 @@
 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
@@ -1262,14 +1291,16 @@
 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 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.
+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.
+
+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 +1322,18 @@
 (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.
@@ -1497,7 +1540,7 @@
 
 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.
 
@@ -1533,6 +1576,13 @@
 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.
+.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.
@@ -2475,11 +2525,15 @@
 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.
diff --git a/docs/examples/Makefile.inc b/docs/examples/Makefile.inc
index f03fcf2..b588b5f 100644
--- a/docs/examples/Makefile.inc
+++ b/docs/examples/Makefile.inc
@@ -36,7 +36,7 @@
   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.
diff --git a/docs/examples/anyauthput.c b/docs/examples/anyauthput.c
index 14da10c..a6ecb31 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 - 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/chkspeed.c b/docs/examples/chkspeed.c
index 0b0ba72..bf9c487 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 496d88c..7ddfb81 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 - 2019 Jeroen Ooms <jeroenooms@gmail.com>
  * License: MIT
  *
  * To compile:
diff --git a/docs/examples/curlgtk.c b/docs/examples/curlgtk.c
index 4083c8f..5990799 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 8302079..e21a9ff 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 - 2019 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
diff --git a/docs/examples/fileupload.c b/docs/examples/fileupload.c
index 8128608..0689275 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 7151add..a11a522 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 bd77bb1..25e292d 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 aa2b438..c04733c 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 0175452..b4c7d37 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/https.c b/docs/examples/https.c
index cca83fe..07b417f 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 291e1e6..cbd3ebb 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 d130c3d..c77d46a 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 566890e..719919a 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 8479457..b08dd42 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/multi-poll.c b/docs/examples/multi-poll.c
new file mode 100644
index 0000000..255a3d4
--- /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/pop3-dele.c b/docs/examples/pop3-dele.c
index 1449783..ca07515 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 b530a04..ef3c6d3 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 bc162d0..6242d32 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 b36ddb5..61cb424 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 f0d4e26..b557906 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 46a0a45..5b3a8de 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 f127120..578844a 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 376f334..e2718c5 100644
--- a/docs/examples/postinmemory.c
+++ b/docs/examples/postinmemory.c
@@ -104,10 +104,9 @@
 
     /* 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 75b5d39..1793d9d 100644
--- a/docs/examples/rtsp.c
+++ b/docs/examples/rtsp.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Jim Hollinger
+ * Copyright (c) 2011 - 2019, Jim Hollinger
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/docs/examples/sessioninfo.c b/docs/examples/sessioninfo.c
index 86a813a..d137c4b 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 - 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-expn.c b/docs/examples/smtp-expn.c
index fb0ed1d..bc23c42 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 019da7d..7c62966 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 671a80d..94d918b 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 4e0623f..50bdc06 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/url2file.c b/docs/examples/url2file.c
index 1bede8c..314cbe0 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 @@
   /* 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 2dc2643..7427ae7 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/libcurl/Makefile.inc b/docs/libcurl/Makefile.inc
index bd88c9c..e1185e7 100644
--- a/docs/libcurl/Makefile.inc
+++ b/docs/libcurl/Makefile.inc
@@ -54,6 +54,7 @@
  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 002c56c..e2f9f0c 100644
--- a/docs/libcurl/curl_easy_cleanup.3
+++ b/docs/libcurl/curl_easy_cleanup.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_cleanup - End a libcurl easy handle
diff --git a/docs/libcurl/curl_easy_duphandle.3 b/docs/libcurl/curl_easy_duphandle.3
index db84f61..fd8189d 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.69.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 7d54c6c..dc771e3 100644
--- a/docs/libcurl/curl_easy_escape.3
+++ b/docs/libcurl/curl_easy_escape.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_escape - URL encodes the given string
diff --git a/docs/libcurl/curl_easy_getinfo.3 b/docs/libcurl/curl_easy_getinfo.3
index 09a0a3d..85cc9f9 100644
--- a/docs/libcurl/curl_easy_getinfo.3
+++ b/docs/libcurl/curl_easy_getinfo.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_getinfo 3 "August 06, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_getinfo 3 "August 06, 2019" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_getinfo - extract information from a curl handle
diff --git a/docs/libcurl/curl_easy_init.3 b/docs/libcurl/curl_easy_init.3
index 4b76c02..963524c 100644
--- a/docs/libcurl/curl_easy_init.3
+++ b/docs/libcurl/curl_easy_init.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_init - Start a libcurl easy session
diff --git a/docs/libcurl/curl_easy_pause.3 b/docs/libcurl/curl_easy_pause.3
index 472b524..6cb9a37 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.69.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 2e45387..abcd91c 100644
--- a/docs/libcurl/curl_easy_perform.3
+++ b/docs/libcurl/curl_easy_perform.3
@@ -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 23, 2018" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_perform - perform a blocking file transfer
diff --git a/docs/libcurl/curl_easy_recv.3 b/docs/libcurl/curl_easy_recv.3
index d796a1b..c2bacf4 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.69.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 e413c80..a1f9995 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.69.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_reset - reset all options of a libcurl session handle
@@ -34,7 +34,8 @@
 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 dc54c8b..a5fe6ab 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.69.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 a35c996..996f00e 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 "January 14, 2020" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_setopt \- set options for a curl easy handle
@@ -358,6 +358,8 @@
 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
@@ -624,6 +626,10 @@
 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).
+
 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
diff --git a/docs/libcurl/curl_easy_strerror.3 b/docs/libcurl/curl_easy_strerror.3
index 2a08f42..5ec7719 100644
--- a/docs/libcurl/curl_easy_strerror.3
+++ b/docs/libcurl/curl_easy_strerror.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_strerror - return string describing error code
diff --git a/docs/libcurl/curl_easy_unescape.3 b/docs/libcurl/curl_easy_unescape.3
index 3188cfc..20d6cb8 100644
--- a/docs/libcurl/curl_easy_unescape.3
+++ b/docs/libcurl/curl_easy_unescape.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_easy_unescape - URL decodes the given string
diff --git a/docs/libcurl/curl_escape.3 b/docs/libcurl/curl_escape.3
index 5ef8dd4..329e724 100644
--- a/docs/libcurl/curl_escape.3
+++ b/docs/libcurl/curl_escape.3
@@ -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 "March 02, 2020" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_escape - URL encodes the given string
@@ -39,7 +39,7 @@
 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.
diff --git a/docs/libcurl/curl_formadd.3 b/docs/libcurl/curl_formadd.3
index 51b903c..16f7cc9 100644
--- a/docs/libcurl/curl_formadd.3
+++ b/docs/libcurl/curl_formadd.3
@@ -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 "December 11, 2018" "libcurl 7.69.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 b9732fa..ea406d6 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.69.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 a2054c3..ededca3 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.69.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 abaedea..9859d49 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.69.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 1457d0b..7ae9bf5 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.69.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 7cbabf6..42ad7e1 100644
--- a/docs/libcurl/curl_getenv.3
+++ b/docs/libcurl/curl_getenv.3
@@ -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 "March 02, 2020" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_getenv - return value for environment name
@@ -32,15 +32,15 @@
 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 zero 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 eb731c6..c510ebc 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.69.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 6c71388..f63e374 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.69.0" "libcurl Manual"
 
 .SH NAME
 curl_global_init - Global libcurl initialisation
@@ -88,9 +88,11 @@
 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 c3e99a8..ed433ad 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.69.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 eaabbe4..38333fa 100644
--- a/docs/libcurl/curl_global_sslset.3
+++ b/docs/libcurl/curl_global_sslset.3
@@ -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 "November 07, 2019" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_global_sslset - Select SSL backend to use with libcurl
@@ -44,7 +44,8 @@
   CURLSSLBACKEND_DARWINSSL = 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 cf19bed..52a8c27 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.69.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 2d35885..1a29631 100644
--- a/docs/libcurl/curl_mime_data.3
+++ b/docs/libcurl/curl_mime_data.3
@@ -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 "September 22, 2017" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_data - set a mime part's body data from memory
diff --git a/docs/libcurl/curl_mime_data_cb.3 b/docs/libcurl/curl_mime_data_cb.3
index 6d985f8..08192d0 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.69.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 d6213e6..a97eab4 100644
--- a/docs/libcurl/curl_mime_encoder.3
+++ b/docs/libcurl/curl_mime_encoder.3
@@ -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 "September 05, 2017" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_encoder - set a mime part's encoder and content transfer encoding
diff --git a/docs/libcurl/curl_mime_filedata.3 b/docs/libcurl/curl_mime_filedata.3
index 259c10d..788bbcf 100644
--- a/docs/libcurl/curl_mime_filedata.3
+++ b/docs/libcurl/curl_mime_filedata.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_filedata - set a mime part's body data from a file contents
diff --git a/docs/libcurl/curl_mime_filename.3 b/docs/libcurl/curl_mime_filename.3
index 1b697c7..27101bb 100644
--- a/docs/libcurl/curl_mime_filename.3
+++ b/docs/libcurl/curl_mime_filename.3
@@ -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 "September 22, 2017" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_filename - set a mime part's remote file name
diff --git a/docs/libcurl/curl_mime_free.3 b/docs/libcurl/curl_mime_free.3
index 383534d..d2fd7a6 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.69.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 39c65a4..c0c9f2a 100644
--- a/docs/libcurl/curl_mime_headers.3
+++ b/docs/libcurl/curl_mime_headers.3
@@ -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 22, 2017" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_headers - set a mime part's custom headers
diff --git a/docs/libcurl/curl_mime_init.3 b/docs/libcurl/curl_mime_init.3
index 0afa6bf..dd84db7 100644
--- a/docs/libcurl/curl_mime_init.3
+++ b/docs/libcurl/curl_mime_init.3
@@ -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 22, 2017" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_init - create a mime handle
diff --git a/docs/libcurl/curl_mime_name.3 b/docs/libcurl/curl_mime_name.3
index 66789ef..5800994 100644
--- a/docs/libcurl/curl_mime_name.3
+++ b/docs/libcurl/curl_mime_name.3
@@ -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 "September 22, 2017" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_name - set a mime part's name
diff --git a/docs/libcurl/curl_mime_subparts.3 b/docs/libcurl/curl_mime_subparts.3
index bfb4f24..84e0584 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.69.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 931eeaf..145e0c0 100644
--- a/docs/libcurl/curl_mime_type.3
+++ b/docs/libcurl/curl_mime_type.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_mime_type - set a mime part's content type
diff --git a/docs/libcurl/curl_mprintf.3 b/docs/libcurl/curl_mprintf.3
index 94a78bb..e50dff5 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.69.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 3ced488..f5d94cc 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.69.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 03240d8..ce592fb 100644
--- a/docs/libcurl/curl_multi_assign.3
+++ b/docs/libcurl/curl_multi_assign.3
@@ -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 "February 03, 2016" "libcurl 7.69.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 b97eebd..d6c1786 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.69.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 2a9411e..8d57b76 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.69.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 50633af..1291439 100644
--- a/docs/libcurl/curl_multi_info_read.3
+++ b/docs/libcurl/curl_multi_info_read.3
@@ -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 "February 03, 2016" "libcurl 7.69.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 9f1a879..cb8cca6 100644
--- a/docs/libcurl/curl_multi_init.3
+++ b/docs/libcurl/curl_multi_init.3
@@ -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 "September 23, 2018" "libcurl 7.69.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 a2db4d0..3d97cdb 100644
--- a/docs/libcurl/curl_multi_perform.3
+++ b/docs/libcurl/curl_multi_perform.3
@@ -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 "October 31, 2019" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_perform - reads/writes available data from each easy handle
diff --git a/docs/libcurl/curl_multi_poll.3 b/docs/libcurl/curl_multi_poll.3
index 481858e..9ddc86b 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.69.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_poll - polls on all easy handles in a multi handle
@@ -49,10 +49,16 @@
 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 @@
 .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 a9f664e..8035753 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.69.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 44dba4a..a89a875 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.69.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 e82d2e0..0091bdc 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.69.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 f3fed74..9ced594 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.69.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 839d89d..86c0048 100644
--- a/docs/libcurl/curl_multi_strerror.3
+++ b/docs/libcurl/curl_multi_strerror.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_strerror - return string describing error code
diff --git a/docs/libcurl/curl_multi_timeout.3 b/docs/libcurl/curl_multi_timeout.3
index 08fe54b..50fd695 100644
--- a/docs/libcurl/curl_multi_timeout.3
+++ b/docs/libcurl/curl_multi_timeout.3
@@ -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 "September 23, 2018" "libcurl 7.69.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 aeaf989..5f444fb 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.69.0" "libcurl Manual"
 
 .SH NAME
 curl_multi_wait - polls on all easy handles in a multi handle
@@ -50,7 +50,8 @@
 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 @@
 .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 0000000..8bcf2bb
--- /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.69.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 325e759..6435b47 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.69.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 40df3c1..ee15370 100644
--- a/docs/libcurl/curl_share_init.3
+++ b/docs/libcurl/curl_share_init.3
@@ -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 "September 23, 2018" "libcurl 7.69.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 be034bf..a067e1a 100644
--- a/docs/libcurl/curl_share_setopt.3
+++ b/docs/libcurl/curl_share_setopt.3
@@ -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 "June 04, 2019" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_share_setopt - Set options for a shared object
diff --git a/docs/libcurl/curl_share_strerror.3 b/docs/libcurl/curl_share_strerror.3
index c6b3f9c..a261735 100644
--- a/docs/libcurl/curl_share_strerror.3
+++ b/docs/libcurl/curl_share_strerror.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_share_strerror - return string describing error code
diff --git a/docs/libcurl/curl_slist_append.3 b/docs/libcurl/curl_slist_append.3
index c0603cb..9d80df0 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.69.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 69bd467..4f3ec03 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.69.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 4ab8ce2..3f0514e 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.69.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 5d8068b..6e82596 100644
--- a/docs/libcurl/curl_unescape.3
+++ b/docs/libcurl/curl_unescape.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_unescape - URL decodes the given string
diff --git a/docs/libcurl/curl_url.3 b/docs/libcurl/curl_url.3
index 55ef54c..ccfa4d1 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.69.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 8588b5a..7c4c6ba 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.69.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 b9b3270..27dbd25 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.69.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 e18af64..c4728fa 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.69.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 ca5b357..97917bb 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 "January 05, 2020" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_url_set - set a URL part
@@ -123,6 +123,10 @@
 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 42a2d67..53f420f 100644
--- a/docs/libcurl/curl_version.3
+++ b/docs/libcurl/curl_version.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_version - returns the libcurl version string
diff --git a/docs/libcurl/curl_version_info.3 b/docs/libcurl/curl_version_info.3
index 25bd5de..700da42 100644
--- a/docs/libcurl/curl_version_info.3
+++ b/docs/libcurl/curl_version_info.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH curl_version_info 3 "August 13, 2019" "libcurl 7.67.0" "libcurl Manual"
+.TH curl_version_info 3 "August 13, 2019" "libcurl 7.69.0" "libcurl Manual"
 
 .SH NAME
 curl_version_info - returns run-time libcurl version info
diff --git a/docs/libcurl/libcurl-easy.3 b/docs/libcurl/libcurl-easy.3
index 02479ac..3cb0006 100644
--- a/docs/libcurl/libcurl-easy.3
+++ b/docs/libcurl/libcurl-easy.3
@@ -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 "February 03, 2016" "libcurl 7.69.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 0404570..6e50643 100644
--- a/docs/libcurl/libcurl-env.3
+++ b/docs/libcurl/libcurl-env.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "libcurl environment variables"
 
 .SH NAME
 libcurl-env \- environment variables libcurl understands
diff --git a/docs/libcurl/libcurl-errors.3 b/docs/libcurl/libcurl-errors.3
index b3579fe..5719bb9 100644
--- a/docs/libcurl/libcurl-errors.3
+++ b/docs/libcurl/libcurl-errors.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH libcurl-errors 3 "October 31, 2019" "libcurl 7.67.0" "libcurl errors"
+.TH libcurl-errors 3 "December 24, 2019" "libcurl 7.69.0" "libcurl errors"
 
 .SH NAME
 libcurl-errors \- error codes in libcurl
@@ -60,9 +60,9 @@
 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 @@
 .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 @@
 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.
@@ -269,6 +275,9 @@
 between. Before version 7.20.0 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)"
@@ -292,6 +301,10 @@
 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 c457c15..c22f74d 100644
--- a/docs/libcurl/libcurl-multi.3
+++ b/docs/libcurl/libcurl-multi.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH libcurl-multi 3 "October 31, 2019" "libcurl 7.67.0" "libcurl multi interface"
+.TH libcurl-multi 3 "November 28, 2019" "libcurl 7.69.0" "libcurl multi interface"
 
 .SH NAME
 libcurl-multi \- how to use the multi interface
@@ -86,7 +86,7 @@
 
 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
diff --git a/docs/libcurl/libcurl-security.3 b/docs/libcurl/libcurl-security.3
index 4d39802..b214e4b 100644
--- a/docs/libcurl/libcurl-security.3
+++ b/docs/libcurl/libcurl-security.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH libcurl-security 3 "July 16, 2019" "libcurl 7.67.0" "libcurl security"
+.TH libcurl-security 3 "July 16, 2019" "libcurl 7.69.0" "libcurl security"
 
 .SH NAME
 libcurl-security \- security considerations when using libcurl
diff --git a/docs/libcurl/libcurl-share.3 b/docs/libcurl/libcurl-share.3
index e054a54..e739915 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.69.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 ec2e492..103c99f 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 "Mar  4, 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.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
 .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 @@
 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
 .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.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,8 @@
 Introduced in 7.1
 .IP CURLE_PEER_FAILED_VERIFICATION
 Introduced in 7.17.1
+.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 +332,7 @@
 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
@@ -697,14 +707,14 @@
 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 +741,8 @@
 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 +761,10 @@
 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_FUNCTIONPOINT
 Introduced in 7.1
 .IP CURLOPTTYPE_LONG
@@ -757,10 +773,10 @@
 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 CURLOPT_ABSTRACT_UNIX_SOCKET
 Introduced in 7.53.0
 .IP CURLOPT_ACCEPTTIMEOUT_MS
@@ -1010,6 +1026,8 @@
 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
@@ -1530,6 +1548,8 @@
 .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
@@ -1565,6 +1585,8 @@
 Introduced in 7.49.0
 .IP CURLSSLOPT_ALLOW_BEAST
 Introduced in 7.25.0
+.IP CURLSSLOPT_NO_PARTIALCHAIN
+Introduced in 7.68.0
 .IP CURLSSLOPT_NO_REVOKE
 Introduced in 7.44.0
 .IP CURLSSLSET_NO_BACKENDS
@@ -1653,10 +1675,10 @@
 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
@@ -1673,10 +1695,10 @@
 Introduced in 7.10
 .IP CURLVERSION_SECOND
 Introduced in 7.11.1
-.IP CURLVERSION_THIRD
-Introduced in 7.12.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,6 +1857,8 @@
 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
@@ -2007,6 +2031,8 @@
 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 b608b89..1a4b790 100644
--- a/docs/libcurl/libcurl-thread.3
+++ b/docs/libcurl/libcurl-thread.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH libcurl-thread 3 "June 30, 2019" "libcurl 7.67.0" "libcurl thread safety"
+.TH libcurl-thread 3 "June 30, 2019" "libcurl 7.69.0" "libcurl thread safety"
 
 .SH NAME
 libcurl-thread \- libcurl thread safety
diff --git a/docs/libcurl/libcurl-tutorial.3 b/docs/libcurl/libcurl-tutorial.3
index cee2082..879d0f1 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.69.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 ad75c7a..84ba8fd 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.69.0" "libcurl url interface"
 
 .SH NAME
 libcurl-url \- URL interface overview
diff --git a/docs/libcurl/libcurl.3 b/docs/libcurl/libcurl.3
index dd0d16c..805e064 100644
--- a/docs/libcurl/libcurl.3
+++ b/docs/libcurl/libcurl.3
@@ -19,7 +19,7 @@
 .\" * KIND, either express or implied.
 .\" *
 .\" **************************************************************************
-.TH libcurl 3 "July 15, 2017" "libcurl 7.67.0" "libcurl overview"
+.TH libcurl 3 "July 15, 2017" "libcurl 7.69.0" "libcurl overview"
 
 .SH NAME
 libcurl \- client-side URL transfers
diff --git a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3 b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
index f76c374..e7cfdc3 100644
--- a/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
+++ b/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_ACTIVESOCKET \- get the active socket
diff --git a/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3
index 6d95889..0dccad8 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.69.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 aa6e80d..7bcd9a2 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.69.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 af68da4..fa7119b 100644
--- a/docs/libcurl/opts/CURLINFO_CERTINFO.3
+++ b/docs/libcurl/opts/CURLINFO_CERTINFO.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CERTINFO 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CERTINFO 3 "November 07, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CERTINFO \- get the TLS certificate chain
diff --git a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3 b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
index b88ec38..a6e3791 100644
--- a/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
+++ b/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_CONDITION_UNMET 3 "February 23, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_CONDITION_UNMET 3 "February 23, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONDITION_UNMET \- get info on unmet time conditional
diff --git a/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3 b/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3
index 624691f..cb9eb42 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.69.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 476377c..deec195 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.69.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 f1bbffb..2bd85a5 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 "June 15, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
index ee5fa2e..f251a44 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3
@@ -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 "March 31, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3
index 4534d19..6879b0b 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 "June 15, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
index ad02801..9d47265 100644
--- a/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3
@@ -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 "March 31, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
diff --git a/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3 b/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3
index 04a6e6a..98d85f8 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 "May 06, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_CONTENT_TYPE \- get Content-Type
diff --git a/docs/libcurl/opts/CURLINFO_COOKIELIST.3 b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
index 1880eff..d25e544 100644
--- a/docs/libcurl/opts/CURLINFO_COOKIELIST.3
+++ b/docs/libcurl/opts/CURLINFO_COOKIELIST.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_COOKIELIST 3 "March 20, 2018" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_COOKIELIST 3 "February 15, 2020" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_COOKIELIST \- get all known cookies
@@ -46,8 +46,8 @@
 if(curl) {
   curl_easy_setopt(curl, CURLOPT_URL, "http://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 @@
       /* 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_URL.3 b/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3
index 39be19b..1f17a62 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 "May 04, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_EFFECTIVE_URL \- get the last used URL
diff --git a/docs/libcurl/opts/CURLINFO_FILETIME.3 b/docs/libcurl/opts/CURLINFO_FILETIME.3
index 55cd8e4..183751a 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.69.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 c93bfe8..bee3e16 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.69.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 36afa95..b6107c0 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.69.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 05482b2..6057a5d 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 "May 06, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_HEADER_SIZE \- get size of retrieved headers
diff --git a/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3
index f879acc..4ef05a5 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 "October 07, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
diff --git a/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3 b/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3
index 503156a..91864bf 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.69.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 1054cdb..4fc892b 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 "August 07, 2019" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_HTTP_VERSION \- get the http version used in the connection
diff --git a/docs/libcurl/opts/CURLINFO_LASTSOCKET.3 b/docs/libcurl/opts/CURLINFO_LASTSOCKET.3
index d3bff64..21a4700 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 "May 06, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_LASTSOCKET \- get the last socket used
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_IP.3 b/docs/libcurl/opts/CURLINFO_LOCAL_IP.3
index f0a9a44..fcbe964 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_LOCAL_IP \- get local IP address of last connection
diff --git a/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3 b/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3
index 212fe2c..e6c1fec 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 "March 16, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_LOCAL_PORT \- get the latest local port number
diff --git a/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3 b/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3
index 475a2c8..f7a6efc 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.69.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 f610591..2952e98 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.69.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 cf0f5c2..9832ab1 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 "May 06, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_NUM_CONNECTS \- get number of created connections
diff --git a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3 b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
index f37fdef..5b89e24 100644
--- a/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
+++ b/docs/libcurl/opts/CURLINFO_OS_ERRNO.3
@@ -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 "November 07, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_OS_ERRNO \- get errno number from last connect failure
diff --git a/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3
index 2a9af48..4484660 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.69.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 a94f8e8..a9cf116 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.69.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 11f4fd6..b20f169 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 "March 22, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PRIMARY_IP \- get IP address of last connection
diff --git a/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3 b/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3
index 4b9b240..6f22712 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 "May 06, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PRIMARY_PORT \- get the latest destination port number
diff --git a/docs/libcurl/opts/CURLINFO_PRIVATE.3 b/docs/libcurl/opts/CURLINFO_PRIVATE.3
index 805f881..89c4d81 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PRIVATE \- get the private pointer
diff --git a/docs/libcurl/opts/CURLINFO_PROTOCOL.3 b/docs/libcurl/opts/CURLINFO_PROTOCOL.3
index 438ce6d..5d473e8 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 "April 27, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PROTOCOL \- get the protocol used in the connection
diff --git a/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3 b/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3
index d0e8ae6..8c6ff4f 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 "October 07, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
diff --git a/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3 b/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3
index beeb3bd..8fc09dc 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.69.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 7ed3775..b70ebe6 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_REDIRECT_COUNT \- get the number of redirects
diff --git a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3 b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
index 46b7b73..24379c3 100644
--- a/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
+++ b/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3
@@ -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 "May 17, 2018" "libcurl 7.69.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 77623fb..bbe33c5 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.69.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 8fdc740..caead5d 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 "June 24, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
diff --git a/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3 b/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3
index a3a67aa..6dda1de 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 "May 06, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_REQUEST_SIZE \- get size of sent request
diff --git a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3 b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
index af49e85..d10836d 100644
--- a/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
+++ b/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_RESPONSE_CODE \- get the last response code
diff --git a/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3 b/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
index 366e749..e7877c1 100644
--- a/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
+++ b/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3
@@ -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 "February 29, 2020" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_RETRY_AFTER \- returns the Retry-After retry delay
@@ -34,7 +34,7 @@
 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.
diff --git a/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3 b/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3
index c17ed75..e161fed 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.69.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 3910cce..4c805f4 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.69.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 33c976a..521e1cf 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.69.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 0b92c51..1df4739 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.69.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 a96e273..edf89ad 100644
--- a/docs/libcurl/opts/CURLINFO_SCHEME.3
+++ b/docs/libcurl/opts/CURLINFO_SCHEME.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.67.0" "curl_easy_getinfo options"
+.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3
index 153b280..b446d41 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 "June 15, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
index 694f1ad..6a57dcd 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3
@@ -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 "March 31, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3
index 7a0ebea..1598143 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 "June 15, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
index 089edfb..cafb1bb 100644
--- a/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3
@@ -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 "March 31, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3
index 6ccb045..54a5b0a 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 "June 15, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SPEED_DOWNLOAD \- get download speed
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
index e11d7f2..38ab77d 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3
@@ -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 "March 31, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SPEED_DOWNLOAD_T \- get download speed
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3
index aaadcf4..85831cf 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 "June 15, 2017" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SPEED_UPLOAD \- get upload speed
diff --git a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3 b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
index 1611431..f08f25e 100644
--- a/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
+++ b/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3
@@ -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 "March 31, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SPEED_UPLOAD_T \- get upload speed
diff --git a/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3 b/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3
index 2561e51..e03f261 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.69.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 3a66feb..a85e02c 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 "March 21, 2018" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
diff --git a/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3 b/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3
index b23a54d..be9aa0f 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.69.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 082d39b..e575350 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.69.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 6ad3956..b3b9a3a 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.69.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 24e1662..f31eca3 100644
--- a/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
+++ b/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3
@@ -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 "July 16, 2019" "libcurl 7.69.0" "curl_easy_getinfo options"
 
 .SH NAME
 CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
diff --git a/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3 b/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3
index 18696f7..36ec3d2 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.69.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 226760a..f3130e7 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.69.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 b12a6ea..3f9134a 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.69.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 2dc7608..979fbb9 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.69.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 c6fb6c3..8764010 100644
--- a/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
+++ b/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_MAXCONNECTS 3 "September 23, 2018" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_MAXCONNECTS 3 "September 23, 2018" "libcurl 7.69.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 b6250dd..546c158 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.69.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 ddb00fb..6c3f207 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.69.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 1a7e05d..d9499c1 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.69.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 e3427ac..3eda98a 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.69.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 22076f5..62013dd 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_PIPELINING_SERVER_BL 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SERVER_BL 3 "April 05, 2019" "libcurl 7.69.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
diff --git a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3 b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
index fc42675..6a8d37d 100644
--- a/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
+++ b/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_PIPELINING_SITE_BL 3 "April 05, 2019" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PIPELINING_SITE_BL 3 "April 05, 2019" "libcurl 7.69.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
diff --git a/docs/libcurl/opts/CURLMOPT_PUSHDATA.3 b/docs/libcurl/opts/CURLMOPT_PUSHDATA.3
index 04935c6..5a2a3aa 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.69.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 9a9ce54..34967fbe 100644
--- a/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
+++ b/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.67.0" "curl_multi_setopt options"
+.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.69.0" "curl_multi_setopt options"
 
 .SH NAME
 CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
diff --git a/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3 b/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3
index d8be37b..97e8a57 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.69.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 08c006f..39d6149 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.69.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 f62320b..6e6fed9 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.69.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 848d335..aab194f 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.69.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 a4e9090..aaa926d 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 "January 09, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
diff --git a/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3
index 9b4f2fd..b0db319 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.69.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 7c21d60..8fabc64 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 "August 27, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
diff --git a/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3 b/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3
index 300b2e6..0cfca23 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.69.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 a21628d..9a3dcfe 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.69.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 a27267a..0b8e4d7 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.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ALTSVC_CTRL \- control alt-svc behavior
@@ -70,7 +70,10 @@
 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 8003fe1..92b0f23 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.69.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 48b7036..25ac261 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_AUTOREFERER \- automatically update the referer header
diff --git a/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3 b/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3
index dcde4a8..1707644 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.69.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 5cf1812..1166403 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 10, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
diff --git a/docs/libcurl/opts/CURLOPT_CAPATH.3 b/docs/libcurl/opts/CURLOPT_CAPATH.3
index 4d60c6b..029d179 100644
--- a/docs/libcurl/opts/CURLOPT_CAPATH.3
+++ b/docs/libcurl/opts/CURLOPT_CAPATH.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CAPATH \- specify directory holding CA certificates
diff --git a/docs/libcurl/opts/CURLOPT_CERTINFO.3 b/docs/libcurl/opts/CURLOPT_CERTINFO.3
index 0d3b3dc..8a80cfa 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.69.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 7f17c26..246362d 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.69.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 5dfb8c7..2dd2775 100644
--- a/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
+++ b/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3
@@ -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 "November 07, 2018" "libcurl 7.69.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 ea83c70..06c1baf 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.69.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 c336a02..871538a 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CLOSESOCKETDATA 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETDATA 3 "November 07, 2018" "libcurl 7.69.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 a5cc5d8..e3fad6c 100644
--- a/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CLOSESOCKETFUNCTION 3 "November 07, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CLOSESOCKETFUNCTION 3 "November 07, 2018" "libcurl 7.69.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 a0745e8..2a615fa 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 "October 03, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
diff --git a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
index beb6065..8fdd7f7 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3
@@ -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 23, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
diff --git a/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3 b/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3
index ae066ec..6cee594 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.69.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 8c27c9b..971f4c2 100644
--- a/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
+++ b/docs/libcurl/opts/CURLOPT_CONNECT_TO.3
@@ -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 "May 05, 2018" "libcurl 7.69.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
diff --git a/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3
index b7c4b10..0c1a0e3 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.69.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 a71a2b6..9847496 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.69.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 42af18c..424d603 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.69.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 5393d1c..d5ea360 100644
--- a/docs/libcurl/opts/CURLOPT_COOKIE.3
+++ b/docs/libcurl/opts/CURLOPT_COOKIE.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIE \- set contents of HTTP Cookie header
diff --git a/docs/libcurl/opts/CURLOPT_COOKIEFILE.3 b/docs/libcurl/opts/CURLOPT_COOKIEFILE.3
index 0897fb2..d6ba8ab 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 "January 10, 2020" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIEFILE \- file name to read cookies from
@@ -76,6 +76,10 @@
   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 acbdea1..da8eedb 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIEJAR \- file name to store cookies to
diff --git a/docs/libcurl/opts/CURLOPT_COOKIELIST.3 b/docs/libcurl/opts/CURLOPT_COOKIELIST.3
index 2f5198c..b7db0a5 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.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
@@ -105,6 +105,10 @@
 
 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 9582141..0bed44d 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COOKIESESSION \- start a new cookie session
diff --git a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
index 5552229..8edd97b 100644
--- a/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
diff --git a/docs/libcurl/opts/CURLOPT_CRLF.3 b/docs/libcurl/opts/CURLOPT_CRLF.3
index b32b0a5..2f4fcee 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.69.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 de9d437..dae53a7 100644
--- a/docs/libcurl/opts/CURLOPT_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_CRLFILE.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CRLFILE \- specify a Certificate Revocation List file
diff --git a/docs/libcurl/opts/CURLOPT_CURLU.3 b/docs/libcurl/opts/CURLOPT_CURLU.3
index 9acead7..ae24743 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 "October 31, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CURLU \- set URL with CURLU *
diff --git a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3 b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
index 1822c31..f51134b 100644
--- a/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
+++ b/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_CUSTOMREQUEST 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_CUSTOMREQUEST 3 "April 17, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_CUSTOMREQUEST \- custom string for request
diff --git a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3 b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
index df833ba..8f6dfca 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGDATA.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.69.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 573197b..083673c 100644
--- a/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DEBUGFUNCTION \- debug callback
diff --git a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3 b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
index 2984c7e..8422562 100644
--- a/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
+++ b/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3
@@ -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 "December 21, 2016" "libcurl 7.69.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 d4b6b6d..76ffd4f 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.69.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 de6ff96..dc0a480 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 "February 25, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DISALLOW_USERNAME_IN_URL \- disallow specifying username in the url
diff --git a/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3
index b0edaad..d1664db 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 "December 09, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
diff --git a/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3 b/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3
index dc727ed..743c0e0 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3
index 699695d..e74c96d 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 "December 10, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
diff --git a/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3 b/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3
index db00f7f..ba55b32 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3 b/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3
index 6fb7876..6c5440d 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DNS_SERVERS \- set preferred DNS servers
diff --git a/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3 b/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3
index 120dd76..3f1afc9 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.69.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 e2391fc..ead82f5 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.69.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 aed70fb..d3a83bc 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 06, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_DOH_URL \- provide the DNS-over-HTTPS URL
diff --git a/docs/libcurl/opts/CURLOPT_EGDSOCKET.3 b/docs/libcurl/opts/CURLOPT_EGDSOCKET.3
index 7eab229..fa668d8 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_EGDSOCKET \- set EGD socket path
diff --git a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3 b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
index c097376..9e775aa 100644
--- a/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
+++ b/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_ERRORBUFFER 3 "March 13, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_ERRORBUFFER 3 "March 13, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ERRORBUFFER \- set error buffer for error messages
diff --git a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
index cfdff25..a5abbfc 100644
--- a/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
diff --git a/docs/libcurl/opts/CURLOPT_FAILONERROR.3 b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
index b89d369..fc0fb16 100644
--- a/docs/libcurl/opts/CURLOPT_FAILONERROR.3
+++ b/docs/libcurl/opts/CURLOPT_FAILONERROR.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_FAILONERROR 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_FAILONERROR 3 "April 17, 2018" "libcurl 7.69.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 c4f5350..da3eb15 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.69.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 deecdce..e03330b 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.69.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 8d1709b..bc1f6ed 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.69.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 5556a49..0135d92 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 "January 28, 2020" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
@@ -47,7 +47,7 @@
 
 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.
 
diff --git a/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3 b/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3
index 88d2c1c..99518cb 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.69.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 c9291a7..6b58319 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.69.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 072761a..781f952 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 "May 30, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTPPORT \- make FTP transfer active
diff --git a/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3 b/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3
index 4f2301d..c28d86e 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.69.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 55621d7..415a99c 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_FTP_ACCOUNT \- set account info for FTP
diff --git a/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3 b/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3
index 472a374..1a42037 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.69.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 7de48bb..f86772e 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.69.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 c3fd821..b9064c3 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.69.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 d9c13f3..ebb5cb4 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.69.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 28f614e..8b509e0 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.69.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 fe03c5b..b572a22 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.69.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 55b61f6..da8d3a7 100644
--- a/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
+++ b/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3
@@ -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 "February 03, 2016" "libcurl 7.69.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 fb4a579..2eb7564 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.69.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 7951250..3b65a0f 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.69.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 42c3edd..2ffb778 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.69.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 47d02e6..877024e 100644
--- a/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3
@@ -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 "February 21, 2018" "libcurl 7.69.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 a092626..e37c8ff 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.69.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 cca9d23..0079c4a 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 "October 03, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HEADER \- pass headers to the data stream
diff --git a/docs/libcurl/opts/CURLOPT_HEADERDATA.3 b/docs/libcurl/opts/CURLOPT_HEADERDATA.3
index fcdc268..c20bcec 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HEADERDATA \- pointer to pass to header callback
diff --git a/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3 b/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3
index 60c6577..4192b62 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 "December 26, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HEADERFUNCTION \- callback that receives header data
@@ -40,9 +40,9 @@
 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 zero terminated!
 
 The pointer named \fIuserdata\fP is the one you set with the
 \fICURLOPT_HEADERDATA(3)\fP option.
diff --git a/docs/libcurl/opts/CURLOPT_HEADEROPT.3 b/docs/libcurl/opts/CURLOPT_HEADEROPT.3
index 9efb17b..4788e87 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.69.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 28393b5..519c13a 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.69.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 3e07980..a391b19 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
diff --git a/docs/libcurl/opts/CURLOPT_HTTPAUTH.3 b/docs/libcurl/opts/CURLOPT_HTTPAUTH.3
index 3d16dd6..16083d0 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.69.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 7238017..74c7083 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 "May 21, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTPGET \- ask for an HTTP GET request
diff --git a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3 b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
index 89b09ed..74ff57c 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPHEADER.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTPHEADER 3 "December 30, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPHEADER 3 "December 30, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_HTTPHEADER \- set custom HTTP headers
diff --git a/docs/libcurl/opts/CURLOPT_HTTPPOST.3 b/docs/libcurl/opts/CURLOPT_HTTPPOST.3
index 4c306cf..a3b1da7 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.69.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 a1ed04a..6dadd69 100644
--- a/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
+++ b/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_HTTPPROXYTUNNEL 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_HTTPPROXYTUNNEL 3 "April 17, 2018" "libcurl 7.69.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 b21ab4c..c56ac2e 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.69.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 f888503..6331322 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.69.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 e9c948f..92001c6 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.69.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 26bd100..accb0c8 100644
--- a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
+++ b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
diff --git a/docs/libcurl/opts/CURLOPT_INFILESIZE.3 b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
index 2a2d1a2..c645ad0 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.69.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 e6b6522..bfe0922 100644
--- a/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3
@@ -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 "September 23, 2018" "libcurl 7.69.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 bc86b98..9d74bbf 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 "June 18, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_INTERFACE \- source interface for outgoing traffic
diff --git a/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3 b/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3
index 8c59cc8..14eae1c 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.69.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 6018367..5d104a0 100644
--- a/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_INTERLEAVEFUNCTION 3 "August 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_INTERLEAVEFUNCTION 3 "August 11, 2018" "libcurl 7.69.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 9cfc971..3b732ef 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.69.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 c0dc856..cdfed88 100644
--- a/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_IOCTLFUNCTION 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_IOCTLFUNCTION 3 "April 17, 2018" "libcurl 7.69.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 6b12e82..c5076b8 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_IPRESOLVE \- specify which IP protocol version to use
diff --git a/docs/libcurl/opts/CURLOPT_ISSUERCERT.3 b/docs/libcurl/opts/CURLOPT_ISSUERCERT.3
index 70925f8..54fdb3a 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_ISSUERCERT \- issuer SSL certificate filename
diff --git a/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3 b/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3
index 0561e77..6f60c8a 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.69.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 b63d1d0..2d3d0f4 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_KEYPASSWD \- set passphrase to private key
diff --git a/docs/libcurl/opts/CURLOPT_KRBLEVEL.3 b/docs/libcurl/opts/CURLOPT_KRBLEVEL.3
index 1286d63..0a1152f 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.69.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 fe2dbf4..742fba7 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 "October 31, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_LOCALPORT \- set local port number to use for socket
diff --git a/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3 b/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3
index f13e0fe..473c3e8 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 "October 31, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
diff --git a/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3
index 46cc892..be3c65c 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_LOGIN_OPTIONS \- set login options
diff --git a/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3 b/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3
index 144a01f..4e5a669 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.69.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 0b30ebe..819f7c9 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.69.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 1f382cc..e22903a 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAIL_AUTH \- SMTP authentication address
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_FROM.3 b/docs/libcurl/opts/CURLOPT_MAIL_FROM.3
index 7b4bff7..6ac78a9 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAIL_FROM \- SMTP sender address
diff --git a/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3 b/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3
index ac4bcbe..8dacb7d 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.69.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 0000000..48039c9
--- /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.69.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 1884513..fdbfe24 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 "April 14, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAXAGE_CONN \- max idle time allowed for reusing a connection
diff --git a/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3 b/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3
index 31d224e..df6eaf1 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.69.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 83cc15b..bb539a4 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.69.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 db24c5b..3387340 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.69.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 2d9188d..039bb46 100644
--- a/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
+++ b/docs/libcurl/opts/CURLOPT_MAXREDIRS.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAXREDIRS \- maximum number of redirects allowed
diff --git a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
index d7c75a4..1bbc37a 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3
@@ -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 "May 30, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
diff --git a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3 b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
index 5201a6e..dcf3588 100644
--- a/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3
@@ -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 "May 30, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
diff --git a/docs/libcurl/opts/CURLOPT_MIMEPOST.3 b/docs/libcurl/opts/CURLOPT_MIMEPOST.3
index 9d2466b..f4b4f0d 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.69.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 c6c3122..f1aa141 100644
--- a/docs/libcurl/opts/CURLOPT_NETRC.3
+++ b/docs/libcurl/opts/CURLOPT_NETRC.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NETRC 3 "November 03, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NETRC 3 "November 03, 2018" "libcurl 7.69.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 7b80c03..389473b 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NETRC_FILE \- file name to read .netrc info from
diff --git a/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3 b/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3
index 5c0eaad..be1ca5c 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.69.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 b121323..f471364 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.69.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 4776ff8..d7833e4 100644
--- a/docs/libcurl/opts/CURLOPT_NOBODY.3
+++ b/docs/libcurl/opts/CURLOPT_NOBODY.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NOBODY \- do the download request without getting the body
diff --git a/docs/libcurl/opts/CURLOPT_NOPROGRESS.3 b/docs/libcurl/opts/CURLOPT_NOPROGRESS.3
index 9533bc8..9383ecc 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 "October 09, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NOPROGRESS \- switch off the progress meter
diff --git a/docs/libcurl/opts/CURLOPT_NOPROXY.3 b/docs/libcurl/opts/CURLOPT_NOPROXY.3
index 460550a..a1e3d4d 100644
--- a/docs/libcurl/opts/CURLOPT_NOPROXY.3
+++ b/docs/libcurl/opts/CURLOPT_NOPROXY.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NOPROXY 3 "August 24, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOPROXY 3 "August 24, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_NOPROXY \- disable proxy use for specific hosts
diff --git a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3 b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
index 0509250..3f5e360 100644
--- a/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
+++ b/docs/libcurl/opts/CURLOPT_NOSIGNAL.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.69.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 d7b4c9a..525470f 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.69.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 acb38f3..12a9e2d 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 - 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_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_OPENSOCKETFUNCTION 3 "December 03, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
@@ -30,8 +30,6 @@
 
 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 @@
 
 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.
diff --git a/docs/libcurl/opts/CURLOPT_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PASSWORD.3
index 8fe212f..0fb1409 100644
--- a/docs/libcurl/opts/CURLOPT_PASSWORD.3
+++ b/docs/libcurl/opts/CURLOPT_PASSWORD.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PASSWORD 3 "September 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PASSWORD 3 "September 23, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PASSWORD \- password to use in authentication
diff --git a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3 b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
index 5b05748..be9ee5b 100644
--- a/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
+++ b/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3
@@ -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 23, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
diff --git a/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3
index 93836f3..84e962e 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 02, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PINNEDPUBLICKEY \- set pinned public key
diff --git a/docs/libcurl/opts/CURLOPT_PIPEWAIT.3 b/docs/libcurl/opts/CURLOPT_PIPEWAIT.3
index 4dc706e..b92d680 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.69.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 1285bf5..851ed79 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PORT \- set remote port number to work with
diff --git a/docs/libcurl/opts/CURLOPT_POST.3 b/docs/libcurl/opts/CURLOPT_POST.3
index 8013ee5..e473ee8 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 "July 22, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POST \- request an HTTP POST
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
index 168c3e8..8ba4a7b 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDS.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POSTFIELDS 3 "May 21, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDS 3 "January 14, 2020" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTFIELDS \- specify data to POST to server
@@ -55,8 +55,8 @@
 
 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.
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
index 83b09e3..cc20345 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
diff --git a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3 b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
index 57bc47c..b8eb117 100644
--- a/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
diff --git a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3 b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
index 8aec039..a4c1576 100644
--- a/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_POSTQUOTE.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTQUOTE 3 "December 18, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
@@ -41,16 +41,16 @@
 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 c29d85e..dd74350 100644
--- a/docs/libcurl/opts/CURLOPT_POSTREDIR.3
+++ b/docs/libcurl/opts/CURLOPT_POSTREDIR.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_POSTREDIR 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_POSTREDIR 3 "April 17, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_POSTREDIR \- how to act on an HTTP POST redirect
diff --git a/docs/libcurl/opts/CURLOPT_PREQUOTE.3 b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
index 19f38f0..329c1f4 100644
--- a/docs/libcurl/opts/CURLOPT_PREQUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_PREQUOTE.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PREQUOTE 3 "December 18, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PREQUOTE \- commands to run before an FTP transfer
@@ -44,15 +44,15 @@
 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 838d2d8..f53a9f2 100644
--- a/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
+++ b/docs/libcurl/opts/CURLOPT_PRE_PROXY.3
@@ -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 23, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PRE_PROXY \- set pre-proxy to use
diff --git a/docs/libcurl/opts/CURLOPT_PRIVATE.3 b/docs/libcurl/opts/CURLOPT_PRIVATE.3
index 698175a..7a94eeb 100644
--- a/docs/libcurl/opts/CURLOPT_PRIVATE.3
+++ b/docs/libcurl/opts/CURLOPT_PRIVATE.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PRIVATE 3 "December 08, 2017" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PRIVATE 3 "December 08, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PRIVATE \- store a private pointer
diff --git a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3 b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
index 27b211c..d8fe57a 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.69.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 10ad5af..66aef2b 100644
--- a/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROGRESSFUNCTION 3 "November 26, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
@@ -61,8 +61,11 @@
 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 743a272..b412ddb 100644
--- a/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
+++ b/docs/libcurl/opts/CURLOPT_PROTOCOLS.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.69.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 0e68cdf..e0afa57 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 "August 24, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY \- set proxy to use
diff --git a/docs/libcurl/opts/CURLOPT_PROXYAUTH.3 b/docs/libcurl/opts/CURLOPT_PROXYAUTH.3
index f8d287d..5b0ed84 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.69.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 3d58975..6b41a85 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.69.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 4543e9a..be969c3 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 "May 30, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXYPORT.3 b/docs/libcurl/opts/CURLOPT_PROXYPORT.3
index 73c882d..38b1964 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYPORT \- port number the proxy listens on
diff --git a/docs/libcurl/opts/CURLOPT_PROXYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXYTYPE.3
index cd6ad8c..4604c85 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.69.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 8d76597..d6807af 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 "May 30, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3 b/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3
index c2c3dd6..394278d 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 "May 30, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
index fc28516..aff8bfe 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3 b/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3
index 5535dea..e1b2e87 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 "May 15, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3 b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
index 75637a6..c3f6592 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3 b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
index 58414a2..4118f18 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3
index 224225d..da5e59a 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 "May 15, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3
index 754a0ca..980307f 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.69.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 750523a..3a43347 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
index 25aeb67..14f6d14 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3
index 48fc160..3f35a0b 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cert
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
index a477de6..b1022f2 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3
@@ -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 "April 17, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3
index 3d0153b..f8c9738 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.69.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 520732e..7bb9971 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3
@@ -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 "October 10, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
index fbe58d6..0bc5e69 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3
@@ -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 "January 23, 2020" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
@@ -29,25 +29,31 @@
 
 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.
-
-\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.
+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 DarwinSSL, 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 blacklist 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)
 .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 3e4f046..2334497 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.69.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 e048aae..c3ec480 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.69.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 89ffc13..d4f2b39 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 "October 31, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_TLS13_CIPHERS \- ciphers suites for proxy TLS 1.3
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3
index 33b728a..b778632 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3
index 34fbe98..23196d7 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3 b/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3
index 93d7f8d..908dd05 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
diff --git a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3 b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
index 9e074a3..d43d2bb 100644
--- a/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
+++ b/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3
@@ -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 "April 17, 2018" "libcurl 7.69.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 825edd7..540d821 100644
--- a/docs/libcurl/opts/CURLOPT_PUT.3
+++ b/docs/libcurl/opts/CURLOPT_PUT.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_PUT 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_PUT 3 "April 17, 2018" "libcurl 7.69.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 78869c4..a0669a1 100644
--- a/docs/libcurl/opts/CURLOPT_QUOTE.3
+++ b/docs/libcurl/opts/CURLOPT_QUOTE.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_QUOTE 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_QUOTE 3 "December 18, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_QUOTE \- (S)FTP commands to run before transfer
@@ -82,16 +82,16 @@
 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 c54f602..59ea67a 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RANDOM_FILE \- specify a source for random data
diff --git a/docs/libcurl/opts/CURLOPT_RANGE.3 b/docs/libcurl/opts/CURLOPT_RANGE.3
index 54c98cd..060cf39 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 "October 31, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RANGE \- set byte range to request
diff --git a/docs/libcurl/opts/CURLOPT_READDATA.3 b/docs/libcurl/opts/CURLOPT_READDATA.3
index 88bf8d3..ce2e68f 100644
--- a/docs/libcurl/opts/CURLOPT_READDATA.3
+++ b/docs/libcurl/opts/CURLOPT_READDATA.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_READDATA 3 "August 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_READDATA 3 "August 11, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_READDATA \- custom pointer passed to the read callback
diff --git a/docs/libcurl/opts/CURLOPT_READFUNCTION.3 b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
index 6582b80..9c36411 100644
--- a/docs/libcurl/opts/CURLOPT_READFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_READFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_READFUNCTION 3 "August 12, 2019" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_READFUNCTION 3 "January 06, 2020" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_READFUNCTION \- read callback for data uploads
@@ -89,14 +89,14 @@
 
 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 6d9af70..af62211 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.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
@@ -76,7 +76,10 @@
 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 01a2d5f..dd5d46a 100644
--- a/docs/libcurl/opts/CURLOPT_REFERER.3
+++ b/docs/libcurl/opts/CURLOPT_REFERER.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_REFERER \- set the HTTP referer header
diff --git a/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3 b/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3
index f8293cd..7ab866e 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 "June 21, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVE.3 b/docs/libcurl/opts/CURLOPT_RESOLVE.3
index 2049a92..23788ba 100644
--- a/docs/libcurl/opts/CURLOPT_RESOLVE.3
+++ b/docs/libcurl/opts/CURLOPT_RESOLVE.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_RESOLVE 3 "May 30, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_RESOLVE 3 "May 30, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RESOLVE \- provide custom host name to IP address resolves
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3 b/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3
index 162187f..af7a7e1 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 "February 14, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RESOLVER_START_DATA \- custom pointer passed to the resolver start callback
diff --git a/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3 b/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3
index 79d0422..20dfe21 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 "February 14, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RESOLVER_START_FUNCTION \- set callback to be called before a new resolve request is started
diff --git a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3 b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
index e52e523..7a8d9d4 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM.3
@@ -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 "February 03, 2016" "libcurl 7.69.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 d40f981..f877992 100644
--- a/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
+++ b/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3
@@ -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 "February 03, 2016" "libcurl 7.69.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 e19440c..e26c777 100644
--- a/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
+++ b/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3
@@ -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 "April 17, 2018" "libcurl 7.69.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 8d8565a..e08c8f8 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.69.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 8526d93..0406d5d 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.69.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 d2ba956..3edd390 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.69.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 c276242..2e28c59 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.69.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 60c776b..391c14b 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.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
diff --git a/docs/libcurl/opts/CURLOPT_SASL_IR.3 b/docs/libcurl/opts/CURLOPT_SASL_IR.3
index 6f09c4d..981f892 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.69.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 8bf2ddd..6b26232 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.69.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 62cf7cd..178e96f 100644
--- a/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_SEEKFUNCTION 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_SEEKFUNCTION 3 "April 17, 2018" "libcurl 7.69.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 e1e4d55..e7099df 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.69.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 3d2ba33..95d5216 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.69.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 bff5f28..f6f8902 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 "May 15, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
diff --git a/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3 b/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3
index 44cc560..d6c73a6 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.69.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 d197bd9..00ae3f9 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.69.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 9ca4271..904064f 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.69.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 beab699..449cb70 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.69.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 7f726ef..4337034 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.69.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 893922c..f997480 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.69.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 86ffb35..2756d38 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.69.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 545007f..504b30b 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.69.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 cda31e3..43925d7 100644
--- a/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3
@@ -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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
diff --git a/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3 b/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3
index 06afe8c..3051a27 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
diff --git a/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3 b/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3
index 953a3c0..3487d11 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.69.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 b4c12f2..a4ad360 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.69.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 a3e293d..2ce5b59 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 "January 29, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLCERT \- set SSL client certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3
index 95f20a3..af8384b 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE.3
index 2ca6da4..8e93e26 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLENGINE \- set SSL engine identifier
diff --git a/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3 b/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3
index bc64851..1b9056f 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.69.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 9d2fb13..922a0c4 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
diff --git a/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3 b/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3
index e4b3ae3..2199f25 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 "May 31, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSLKEYTYPE \- set type of the private key file
diff --git a/docs/libcurl/opts/CURLOPT_SSLVERSION.3 b/docs/libcurl/opts/CURLOPT_SSLVERSION.3
index 5cce52a..b166b1f 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.69.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 848dd7f..1ec350f 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3
@@ -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 "October 10, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
diff --git a/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3 b/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3
index 5e9c125..d1b0e7c 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.69.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 fade26e..7f363f9 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.69.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_ENABLE_ALPN.3 b/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3
index 8f55d89..c4725c8 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.69.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 1fe88a8..d059b91 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.69.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 60c7bae..535c947 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.69.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 d6445fd..7674b1d 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3
@@ -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 "December 02, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_OPTIONS \- set SSL behavior options
@@ -29,23 +29,27 @@
 
 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 DarwinSSL, 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 blacklist 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)
 .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 20b04a5..61afecc 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.69.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 026fcf8..fdf8c7f 100644
--- a/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
+++ b/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3
@@ -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 "August 20, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
diff --git a/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3 b/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3
index 0aa1f28..5862165 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.69.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 344ce8e..f2ce238 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.69.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 aebf685..917b127 100644
--- a/docs/libcurl/opts/CURLOPT_STDERR.3
+++ b/docs/libcurl/opts/CURLOPT_STDERR.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_STDERR \- redirect stderr to another stream
diff --git a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3 b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3
index 47949b2..d2dec19 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.69.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 fa2d943..67cc95f 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3
@@ -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 "April 17, 2018" "libcurl 7.69.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 699304b..939cad7 100644
--- a/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
+++ b/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3
@@ -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 "April 17, 2018" "libcurl 7.69.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 d7d4607..2330a41 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.69.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 eeb5f06..b72eafc 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 "May 15, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
index 5f2a16d..a0d5e84 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3
@@ -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 "February 03, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
index 0d49cd0..f2bdfe9 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3
@@ -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 "January 02, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
diff --git a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3 b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
index 0034c36..2716477 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3
@@ -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 "January 02, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
diff --git a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3 b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
index e1f22e2..c96cc5a 100644
--- a/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
+++ b/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3
@@ -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 "January 15, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
diff --git a/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3 b/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3
index f5309db..699f6e9 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.69.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 cdc5a08..2567442 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.69.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 d814be4..c78c782 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.69.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 05976eb..287e818 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 "April 03, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMECONDITION \- select condition for a time request
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT.3
index 0d33da8..9876e4b 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 "October 15, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
diff --git a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3 b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
index d5de79b..a8e3446 100644
--- a/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
+++ b/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3
@@ -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 23, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE.3
index 61542bf..cb9740c 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 "January 25, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMEVALUE \- set time value for conditional
diff --git a/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3 b/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3
index 61de7dd..6aab48e 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 "January 25, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TIMEVALUE_LARGE \- set time value for conditional
diff --git a/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3 b/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3
index 0561d9d..96cdf9b 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 "October 31, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TLS13_CIPHERS \- specify ciphers suites to use for TLS 1.3
diff --git a/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3 b/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3
index 005e5e9..109d4f0 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 "December 16, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
@@ -36,6 +36,8 @@
 
 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 aa1ee16..d8a60ad 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 "December 16, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
@@ -29,8 +29,8 @@
 
 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 zero 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 @@
 
 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 7646035..3ac7015 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 "December 16, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
@@ -36,6 +36,8 @@
 
 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 46c4665..7d97658 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.69.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 b4535f4..5e1e6d0 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 31, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TRAILERFUNCTION \- Set callback for sending trailing headers
diff --git a/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3 b/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3
index 3f0f976..50fe599 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.69.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 6cb2d3b..8f7bd13 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 "May 15, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
diff --git a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3 b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
index 7a61b82..b8822c4 100644
--- a/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
+++ b/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3
@@ -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 "April 17, 2018" "libcurl 7.69.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 493be9a..2c961ab 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 "May 15, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
diff --git a/docs/libcurl/opts/CURLOPT_UPLOAD.3 b/docs/libcurl/opts/CURLOPT_UPLOAD.3
index f9b42fe..057dad0 100644
--- a/docs/libcurl/opts/CURLOPT_UPLOAD.3
+++ b/docs/libcurl/opts/CURLOPT_UPLOAD.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_UPLOAD 3 "April 17, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_UPLOAD 3 "April 17, 2018" "libcurl 7.69.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 dc39eb5..cadb256 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.69.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 8097690..d549076 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 - 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_URL 3 "November 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_URL 3 "December 18, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_URL \- provide the URL to use in the request
@@ -228,7 +228,6 @@
 
 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 +260,7 @@
 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
diff --git a/docs/libcurl/opts/CURLOPT_USERAGENT.3 b/docs/libcurl/opts/CURLOPT_USERAGENT.3
index edaa01b..cb4b291 100644
--- a/docs/libcurl/opts/CURLOPT_USERAGENT.3
+++ b/docs/libcurl/opts/CURLOPT_USERAGENT.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_USERAGENT \- set HTTP user-agent header
diff --git a/docs/libcurl/opts/CURLOPT_USERNAME.3 b/docs/libcurl/opts/CURLOPT_USERNAME.3
index 5325731..91ebac3 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 "May 05, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_USERNAME \- user name to use in authentication
diff --git a/docs/libcurl/opts/CURLOPT_USERPWD.3 b/docs/libcurl/opts/CURLOPT_USERPWD.3
index 2b3b92d..e76c451 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 "August 24, 2017" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_USERPWD \- user name and password to use in authentication
diff --git a/docs/libcurl/opts/CURLOPT_USE_SSL.3 b/docs/libcurl/opts/CURLOPT_USE_SSL.3
index c72812b..1b89a72 100644
--- a/docs/libcurl/opts/CURLOPT_USE_SSL.3
+++ b/docs/libcurl/opts/CURLOPT_USE_SSL.3
@@ -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 "October 10, 2018" "libcurl 7.69.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 8063eb2..2ca0945 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 "December 04, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_VERBOSE \- set verbose mode on/off
@@ -62,3 +62,4 @@
 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 280d6ea..43cfc85 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.69.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 4a3491a..c0d7e3d 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEDATA.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEDATA.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_WRITEDATA 3 "August 11, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEDATA 3 "August 11, 2018" "libcurl 7.69.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 e9ca2e4..fb31888 100644
--- a/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_WRITEFUNCTION 3 "November 23, 2018" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_WRITEFUNCTION 3 "November 23, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_WRITEFUNCTION \- set callback for writing received data
diff --git a/docs/libcurl/opts/CURLOPT_XFERINFODATA.3 b/docs/libcurl/opts/CURLOPT_XFERINFODATA.3
index c7dfbe2..be5cc24 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.69.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 b0ec54f..54a6f7b 100644
--- a/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
+++ b/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3
@@ -20,7 +20,7 @@
 .\" *
 .\" **************************************************************************
 .\"
-.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.67.0" "curl_easy_setopt options"
+.TH CURLOPT_XFERINFOFUNCTION 3 "November 26, 2019" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
@@ -58,8 +58,11 @@
 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 09e5315..b4c4999 100644
--- a/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
+++ b/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3
@@ -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 "May 22, 2018" "libcurl 7.69.0" "curl_easy_setopt options"
 
 .SH NAME
 CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
diff --git a/docs/libcurl/opts/Makefile.inc b/docs/libcurl/opts/Makefile.inc
index 93c4357..52bf422 100644
--- a/docs/libcurl/opts/Makefile.inc
+++ b/docs/libcurl/opts/Makefile.inc
@@ -188,6 +188,7 @@
   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                         \
diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions
index bf23b44..0469d08 100644
--- a/docs/libcurl/symbols-in-versions
+++ b/docs/libcurl/symbols-in-versions
@@ -38,7 +38,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_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_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_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,7 @@
 CURLE_OUT_OF_MEMORY             7.1
 CURLE_PARTIAL_FILE              7.1
 CURLE_PEER_FAILED_VERIFICATION  7.17.1
+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 +145,7 @@
 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
@@ -316,10 +318,10 @@
 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 +335,7 @@
 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 +345,14 @@
 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_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
 CURLOPT_ABSTRACT_UNIX_SOCKET    7.53.0
 CURLOPT_ACCEPTTIMEOUT_MS        7.24.0
 CURLOPT_ACCEPT_ENCODING         7.21.6
@@ -466,6 +471,7 @@
 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
@@ -718,6 +724,7 @@
 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
@@ -735,6 +742,7 @@
 CURLSSLBACKEND_SECURETRANSPORT  7.64.1
 CURLSSLBACKEND_WOLFSSL          7.49.0
 CURLSSLOPT_ALLOW_BEAST          7.25.0
+CURLSSLOPT_NO_PARTIALCHAIN      7.68.0
 CURLSSLOPT_NO_REVOKE            7.44.0
 CURLSSLSET_NO_BACKENDS          7.56.0
 CURLSSLSET_OK                   7.56.0
@@ -779,8 +787,8 @@
 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
@@ -789,8 +797,8 @@
 CURLVERSION_FOURTH              7.16.1
 CURLVERSION_NOW                 7.10
 CURLVERSION_SECOND              7.11.1
-CURLVERSION_THIRD               7.12.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,6 +874,7 @@
 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
@@ -951,5 +960,6 @@
 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/include/curl/curl.h b/include/curl/curl.h
index dcbe899..b7cb30a 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 @@
 
 #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 @@
 
 #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 @@
   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 @@
                                        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,8 @@
                                     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 */
   CURL_LAST /* never use! */
 } CURLcode;
 
@@ -821,6 +829,10 @@
    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)
+
 /* 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. */
@@ -932,75 +944,58 @@
 /* *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
 
 /* handy aliases that make no run-time difference */
 #define CURLOPTTYPE_STRINGPOINT  CURLOPTTYPE_OBJECTPOINT
 #define CURLOPTTYPE_SLISTPOINT  CURLOPTTYPE_OBJECTPOINT
 
 /*
- * 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_OBJECTPOINT, 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_OBJECTPOINT, 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 +1006,20 @@
    * 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 +1028,10 @@
    */
 
   /* 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 +1039,48 @@
    * 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_OBJECTPOINT, 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_LONG, 32),
 
   /* What kind of HTTP time condition to use, see defines */
-  CINIT(TIMECONDITION, LONG, 33),
+  CURLOPT(CURLOPT_TIMECONDITION, CURLOPTTYPE_LONG, 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 +1088,58 @@
      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),
 
-  CINIT(OBSOLETE40, OBJECTPOINT, 40), /* OBSOLETE, do not use! */
+   /* OBSOLETE, do not use! */
+  CURLOPT(CURLOPT_OBSOLETE40, CURLOPTTYPE_OBJECTPOINT, 40),
 
-  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 */
+  /* talk a lot */
+  CURLOPT(CURLOPT_VERBOSE, CURLOPTTYPE_LONG, 41),
 
-  CINIT(APPEND, LONG, 50),       /* Append instead of overwrite on upload! */
+  /* 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),
+
+  /* this is an upload */
+  CURLOPT(CURLOPT_UPLOAD, CURLOPTTYPE_LONG, 46),
+
+  /* HTTP POST method */
+  CURLOPT(CURLOPT_POST, CURLOPTTYPE_LONG, 47),
+
+  /* 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_LONG, 51),
 
-  CINIT(FOLLOWLOCATION, LONG, 52),  /* use Location: Luke! */
+  /* use Location: Luke! */
+  CURLOPT(CURLOPT_FOLLOWLOCATION, CURLOPTTYPE_LONG, 52),
 
-  CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */
-  CINIT(PUT, LONG, 54),          /* HTTP PUT */
+   /* transfer data in text/ASCII format */
+  CURLOPT(CURLOPT_TRANSFERTEXT, CURLOPTTYPE_LONG, 53),
+
+  /* HTTP PUT */
+  CURLOPT(CURLOPT_PUT, CURLOPTTYPE_LONG, 54),
 
   /* 55 = OBSOLETE */
 
@@ -1131,265 +1147,267 @@
    * 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),
+  CURLOPT(CURLOPT_PROGRESSDATA, CURLOPTTYPE_OBJECTPOINT, 57),
 #define CURLOPT_XFERINFODATA CURLOPT_PROGRESSDATA
 
   /* 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_LONG, 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_OBJECTPOINT, 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_LONG, 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_LONG, 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_OBJECTPOINT, 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_LONG, 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_LONG, 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_LONG, 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 +1427,143 @@
      CURLFTPAUTH_SSL     - try "AUTH SSL" first, then TLS
      CURLFTPAUTH_TLS     - try "AUTH TLS" first, then SSL
   */
-  CINIT(FTPSSLAUTH, LONG, 129),
+  CURLOPT(CURLOPT_FTPSSLAUTH, CURLOPTTYPE_LONG, 129),
 
-  CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),
-  CINIT(IOCTLDATA, OBJECTPOINT, 131),
+  CURLOPT(CURLOPT_IOCTLFUNCTION, CURLOPTTYPE_FUNCTIONPOINT, 130),
+  CURLOPT(CURLOPT_IOCTLDATA, CURLOPTTYPE_OBJECTPOINT, 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
      "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_LONG, 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_OBJECTPOINT, 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_LONG, 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_LONG, 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_OBJECTPOINT, 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_OBJECTPOINT, 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 +1572,103 @@
      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_OBJECTPOINT, 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_LONG, 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_OBJECTPOINT, 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_OBJECTPOINT, 201),
 
   /* FNMATCH_FUNCTION user pointer */
-  CINIT(FNMATCH_DATA, OBJECTPOINT, 202),
+  CURLOPT(CURLOPT_FNMATCH_DATA, CURLOPTTYPE_OBJECTPOINT, 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 +1680,274 @@
      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_OBJECTPOINT, 209),
 
   /* allow GSSAPI credential delegation */
-  CINIT(GSSAPI_DELEGATION, LONG, 210),
+  CURLOPT(CURLOPT_GSSAPI_DELEGATION, CURLOPTTYPE_LONG, 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_LONG, 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_LONG, 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_LONG, 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_OBJECTPOINT, 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_OBJECTPOINT, 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),
 
   CURLOPT_LASTENTRY /* the last unused */
 } CURLoption;
@@ -2207,52 +2229,35 @@
                                        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 ************/
+  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,
 
-  /*  */
-  CFINIT(COPYNAME),
-  CFINIT(PTRNAME),
-  CFINIT(NAMELENGTH),
-  CFINIT(COPYCONTENTS),
-  CFINIT(PTRCONTENTS),
-  CFINIT(CONTENTSLENGTH),
-  CFINIT(FILECONTENT),
-  CFINIT(ARRAY),
-  CFINIT(OBSOLETE),
-  CFINIT(FILE),
+  CURLFORM_BUFFER,
+  CURLFORM_BUFFERPTR,
+  CURLFORM_BUFFERLENGTH,
 
-  CFINIT(BUFFER),
-  CFINIT(BUFFERPTR),
-  CFINIT(BUFFERLENGTH),
+  CURLFORM_CONTENTTYPE,
+  CURLFORM_CONTENTHEADER,
+  CURLFORM_FILENAME,
+  CURLFORM_END,
+  CURLFORM_OBSOLETE2,
 
-  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_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;
diff --git a/include/curl/curlver.h b/include/curl/curlver.h
index cab09ee..5264f19 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,16 +26,16 @@
    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.69.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 69
 #define LIBCURL_VERSION_PATCH 0
 
 /* This is the numeric version of the libcurl version number, meant for easier
@@ -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 0x074500
 
 /*
  * 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-03-04"
 
 #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/multi.h b/include/curl/multi.h
index b392183..bda9bb7 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 @@
                             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 @@
                                       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()
   *
@@ -333,71 +344,58 @@
 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),
+  CURLOPT(CURLMOPT_PIPELINING_SITE_BL, CURLOPTTYPE_OBJECTPOINT, 11),
 
   /* a list of server types that are blacklisted from
      pipelining */
-  CINIT(PIPELINING_SERVER_BL, OBJECTPOINT, 12),
+  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;
@@ -451,9 +449,6 @@
                                   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/system.h b/include/curl/system.h
index cd37c2b..867af61 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/lib/CMakeLists.txt b/lib/CMakeLists.txt
index eca9a8a..e73efb9 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -20,7 +20,6 @@
 
 if(MSVC)
   list(APPEND CSOURCES libcurl.rc)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4127")
 endif()
 
 # SET(CSOURCES
@@ -97,6 +96,12 @@
 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"
diff --git a/lib/Makefile.inc b/lib/Makefile.inc
index 72ef428..46ded90 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
@@ -28,20 +28,22 @@
 LIB_VAUTH_HFILES = vauth/vauth.h vauth/digest.h vauth/ntlm.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
+  vtls/mbedtls_threadlock.c vtls/wolfssl.c vtls/schannel.c              \
+  vtls/schannel_verify.c vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c   \
+  vtls/mesalink.c vtls/bearssl.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/openssl.h vtls/vtls.h vtls/gtls.h vtls/nssg.h    \
+  vtls/mbedtls_threadlock.h vtls/wolfssl.h vtls/schannel.h              \
+  vtls/sectransp.h vtls/gskit.h vtls/mbedtls.h vtls/mesalink.h          \
+  vtls/bearssl.h
 
 LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c
 
 LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h
 
-LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c
+LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c vssh/wolfssh.c
+
+LIB_VSSH_HFILES = vssh/ssh.h
 
 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       \
@@ -61,7 +63,7 @@
   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
+  doh.c urlapi.c curl_get_line.c altsvc.c socketpair.c rename.c
 
 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         \
@@ -72,7 +74,7 @@
   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      \
+  socks.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           \
@@ -82,11 +84,11 @@
   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
+  curl_get_line.h altsvc.h quic.h socketpair.h rename.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 ae88f4d..ac6b3de 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
@@ -270,8 +270,8 @@
     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"
diff --git a/lib/Makefile.netware b/lib/Makefile.netware
index a405346..752d3d6 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 @@
 	@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) >> $@
diff --git a/lib/altsvc.c b/lib/altsvc.c
index 64971a9..c39d86e 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,20 @@
 #define MAX_ALTSVC_ALPNLENSTR "10"
 #define MAX_ALTSVC_ALPNLEN 10
 
+#if (defined(USE_QUICHE) || defined(USE_NGTCP2)) && !defined(UNITTESTS)
+#define H3VERSION "h3-27"
+#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"))
+  if(strcasecompare(name, H3VERSION))
     return ALPN_h3;
-#else
-  if(strcasecompare(name, "h3"))
-    return ALPN_h3;
-#endif
   return ALPN_none; /* unknown, probably rubbish input */
 }
 
@@ -73,11 +76,7 @@
   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,7 +160,7 @@
               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;
@@ -188,7 +187,16 @@
 {
   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 +217,7 @@
   return result;
 
   fail:
+  Curl_safefree(asi->filename);
   free(line);
   fclose(fp);
   return CURLE_OUT_OF_MEMORY;
@@ -302,6 +311,7 @@
       n = e->next;
       altsvc_free(as);
     }
+    free(altsvc->filename);
     free(altsvc);
   }
 }
@@ -309,34 +319,57 @@
 /*
  * 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;
   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 +384,12 @@
   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;
 }
 
@@ -402,6 +435,10 @@
  *
  * '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 +452,11 @@
   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 +468,20 @@
     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 *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 +489,15 @@
           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 +505,86 @@
         }
         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(*p && ISBLANK(*p) && *p != ';' && *p != ',')
+            p++;
+          if(!*p || *p == ',')
+            break;
+          p++; /* pass the semicolon */
+          if(!*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);
+            asi->num++; /* one more entry */
+            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 +592,11 @@
         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;
diff --git a/lib/altsvc.h b/lib/altsvc.h
index 99d0499..248e71e 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
@@ -59,7 +59,8 @@
 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);
 CURLcode Curl_altsvc_parse(struct Curl_easy *data,
@@ -70,9 +71,9 @@
                         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)
 #endif /* CURL_DISABLE_HTTP || USE_ALTSVC */
 #endif /* HEADER_CURL_ALTSVC_H */
diff --git a/lib/asyn-ares.c b/lib/asyn-ares.c
index 835cfa4..b76e665 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
@@ -626,26 +626,11 @@
 {
   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);
-
   switch(conn->ip_version) {
   default:
 #if ARES_VERSION >= 0x010601
@@ -684,7 +669,7 @@
     res->last_status = ARES_ENOTFOUND;
 #ifdef ENABLE_IPV6 /* CURLRES_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 */
diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c
old mode 100755
new mode 100644
index 8c552ba..68dcbb3
--- 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"
@@ -692,16 +691,11 @@
                                          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! */
@@ -726,32 +720,12 @@
                                          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 +742,7 @@
     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 +752,6 @@
   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/checksrc.pl b/lib/checksrc.pl
index b2cfa83..8343645 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 - 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
@@ -717,12 +717,17 @@
         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 3e973de..aa83c4b 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
 
diff --git a/lib/config-mac.h b/lib/config-mac.h
index 3c12bdf..14b98fe 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-plan9.h b/lib/config-plan9.h
index 64bfbde..41440a1 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-symbian.h b/lib/config-symbian.h
index cb2e96d..82a27bf 100644
--- a/lib/config-symbian.h
+++ b/lib/config-symbian.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
@@ -128,9 +128,6 @@
 /* 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
 
@@ -361,9 +358,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-tpf.h b/lib/config-tpf.h
index f0c095b..a79afae 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
@@ -119,10 +119,6 @@
 /* #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 +316,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 d352578..2769cdf 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
@@ -143,9 +143,6 @@
 /* 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 +418,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 90c1054..8b488c1 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
@@ -714,7 +714,9 @@
 #endif
 
 /* Define to use the Windows crypto library. */
+#if !defined(CURL_WINDOWS_APP)
 #define USE_WIN32_CRYPTO
+#endif
 
 /* Define to use Unix sockets. */
 #if defined(_MSC_VER) && (_MSC_VER >= 1500)
@@ -735,8 +737,12 @@
 #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 1820522..5eb1c18 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 57d6061..cbd3bb1 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)
@@ -122,6 +101,7 @@
     }
     curr = curr->next;
   }
+  DEBUGASSERT(0);
   return 0;
 }
 
@@ -199,18 +179,6 @@
   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);
-  return num;
-}
-
 /* Look up the bundle with all the connections to the same host this
    connectdata struct is setup to use.
 
@@ -428,17 +396,15 @@
  *
  * 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) {
@@ -541,7 +507,8 @@
     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);
 
diff --git a/lib/conncache.h b/lib/conncache.h
index 58f9024..e3e4c9c 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
@@ -42,6 +42,27 @@
 #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 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
+
 struct connectbundle {
   int multiuse;                 /* supports multi-use */
   size_t num_connections;       /* Number of connections in the bundle */
@@ -59,9 +80,9 @@
 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 3b88a59..0a7475c 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
@@ -745,13 +745,15 @@
   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;
 
@@ -760,44 +762,63 @@
     /* 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);
+                           host, port, sockindex, conn, done);
       break;
 
     case CURLPROXY_SOCKS4:
     case CURLPROXY_SOCKS4A:
       result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
-                           conn);
+                           conn, done);
       break;
 
     default:
       failf(conn->data, "unknown proxytype option given");
       result = CURLE_COULDNT_CONNECT;
     } /* switch proxytype */
-    conn->bits.socksproxy_connecting = FALSE;
 #else
   (void)sockindex;
 #endif /* CURL_DISABLE_PROXY */
   }
+  else
+    *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);
+}
+
+/*
  * Curl_is_connected() checks if the socket has connected.
  */
 
@@ -834,6 +855,14 @@
     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)
@@ -900,18 +929,13 @@
           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;
       }
@@ -932,9 +956,11 @@
       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);
+#endif
         infof(data, "connect to %s port %ld failed: %s\n",
               ipaddress, conn->port,
               Curl_strerror(error, buffer, sizeof(buffer)));
@@ -992,14 +1018,12 @@
 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 @@
                 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;
@@ -1216,8 +1238,6 @@
       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 */
@@ -1428,12 +1448,11 @@
                       curl_socket_t sock)
 {
   if(conn && conn->fclosesocket) {
-    if((sock == conn->sock[SECONDARYSOCKET]) &&
-       conn->sock_accepted[SECONDARYSOCKET])
+    if((sock == conn->sock[SECONDARYSOCKET]) && conn->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->sock_accepted = FALSE;
     else {
       int rc;
       Curl_multi_closed(conn->data, sock);
diff --git a/lib/cookie.c b/lib/cookie.c
index f56bd85..69bc042 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 @@
 #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"
@@ -536,9 +539,9 @@
          * 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 +718,7 @@
     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
@@ -1045,7 +1048,7 @@
 
         *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 +1503,14 @@
  *
  * 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 +1519,24 @@
   /* 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 +1551,7 @@
 
     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 +1570,7 @@
       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 +1578,24 @@
 
     free(array);
   }
-  if(!use_stdout)
-    fclose(out);
 
-  return 0;
+  if(!use_stdout) {
+    fclose(out);
+    out = NULL;
+    if(Curl_rename(tempstore, filename)) {
+      unlink(tempstore);
+      goto error;
+    }
+  }
+
+  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 +1654,7 @@
     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_base64.h b/lib/curl_base64.h
index 7e9fc26..cfb6ee7 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 d3bc43e..e5b99a7 100644
--- a/lib/curl_config.h
+++ b/lib/curl_config.h
@@ -436,6 +436,9 @@
 /* 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
 
@@ -788,6 +791,9 @@
 /* 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 */
 
@@ -938,6 +944,9 @@
 /* Define to enable c-ares support */
 /* #undef USE_ARES */
 
+/* if BearSSL is enabled */
+/* #undef USE_BEARSSL */
+
 /* if ESNI support is available */
 /* #undef USE_ESNI */
 
@@ -1030,6 +1039,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 e0793a7..98cdf51 100644
--- a/lib/curl_config.h.cmake
+++ b/lib/curl_config.h.cmake
@@ -73,6 +73,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
 
@@ -148,9 +151,6 @@
 /* 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
 
@@ -455,9 +455,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 +936,15 @@
 /* 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 libSSH2 is in use */
 #cmakedefine USE_LIBSSH2 1
 
@@ -957,6 +954,9 @@
 /* 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
 
diff --git a/lib/curl_config.h.in b/lib/curl_config.h.in
index 32a87bd..8f29f51 100644
--- a/lib/curl_config.h.in
+++ b/lib/curl_config.h.in
@@ -435,6 +435,9 @@
 /* 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
 
@@ -787,6 +790,9 @@
 /* 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
 
@@ -955,6 +961,9 @@
 /* Define to enable c-ares support */
 #undef USE_ARES
 
+/* if BearSSL is enabled */
+#undef USE_BEARSSL
+
 /* if ESNI support is available */
 #undef USE_ESNI
 
@@ -1047,6 +1056,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 b123a00..39c0f35 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 129060f..a42eeb5 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 b7563b3..a774d13 100644
--- a/lib/curl_endian.c
+++ b/lib/curl_endian.c
@@ -81,6 +81,7 @@
                           ((unsigned short)buf[1]));
 }
 
+#if (CURL_SIZEOF_CURL_OFF_T > 4)
 /*
  * write32_le()
  *
@@ -100,7 +101,6 @@
   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 69ffe39..34fccae 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_gethostname.h b/lib/curl_gethostname.h
index 07517c5..8ae15e6 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 - 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_hmac.h b/lib/curl_hmac.h
index 756dc9e..3ff799b 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,
@@ -62,6 +64,11 @@
                      unsigned int len);
 int Curl_HMAC_final(HMAC_context *context, unsigned char *result);
 
+CURLcode Curl_hmacit(const HMAC_params *hashparams,
+                     const unsigned char *key, const size_t keylen,
+                     const unsigned char *data, const size_t datalen,
+                     unsigned char *output);
+
 #endif
 
 #endif /* HEADER_CURL_HMAC_H */
diff --git a/lib/curl_ldap.h b/lib/curl_ldap.h
index 94c0029..912e131 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 82df708..c7bb209 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 aaf25f6..dd46441 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
@@ -49,8 +49,8 @@
 extern const MD5_params Curl_DIGEST_MD5[1];
 extern const 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,
diff --git a/lib/curl_memrchr.h b/lib/curl_memrchr.h
index 747509c..90a8a07 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 e48334f..e384344 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 - 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.h b/lib/curl_multibyte.h
index 615f5c0..3becf41 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 - 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
@@ -61,8 +61,13 @@
 
 #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 Curl_unicodefree(ptr)                           \
+  do {                                                  \
+    if(ptr) {                                           \
+      free(ptr);                                        \
+      (ptr) = NULL;                                     \
+    }                                                   \
+  } while(0)
 
 typedef union {
   unsigned short       *tchar_ptr;
@@ -76,7 +81,7 @@
 #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
+  do {(ptr) = NULL;} while(0)
 
 typedef union {
   char                *tchar_ptr;
diff --git a/lib/curl_ntlm_core.c b/lib/curl_ntlm_core.c
index 19f9b61..f9b823b 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
@@ -120,7 +120,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)
 
@@ -567,25 +566,6 @@
 
 #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 +595,8 @@
   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 +642,7 @@
 
   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 +661,7 @@
     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 +669,7 @@
     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 +682,7 @@
 
   /* 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 +690,7 @@
   }
 
   /* 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 +725,8 @@
   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;
 
diff --git a/lib/curl_ntlm_core.h b/lib/curl_ntlm_core.h
index 3b4b805..e1643d6 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
@@ -46,9 +46,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
 
diff --git a/lib/curl_ntlm_wb.c b/lib/curl_ntlm_wb.c
index 80266e2..f820b84 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 @@
         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 @@
 #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 @@
     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 @@
   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 @@
     /* 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 @@
             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,21 @@
 /* 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 defined(CURL_DISABLE_VERBOSE_STRINGS)
+  (void) data;
+#endif
+
   if(!buf)
     return CURLE_OUT_OF_MEMORY;
 
   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)
@@ -281,7 +288,7 @@
     ssize_t size;
     char *newbuf;
 
-    size = sread(conn->ntlm_auth_hlpr_socket, buf + len_out, NTLM_BUFSIZE);
+    size = sread(ntlm->ntlm_auth_hlpr_socket, buf + len_out, NTLM_BUFSIZE);
     if(size == -1) {
       if(errno == EINTR)
         continue;
@@ -297,7 +304,7 @@
     }
 
     if(len_out > MAX_NTLM_WB_RESPONSE) {
-      failf(conn->data, "too large ntlm_wb response!");
+      failf(data, "too large ntlm_wb response!");
       free(buf);
       return CURLE_OUT_OF_MEMORY;
     }
@@ -325,9 +332,9 @@
      (buf[0]!='A' || buf[1]!='F' || buf[2]!=' '))
     goto done;
 
-  conn->response_header = aprintf("NTLM %.*s", len_out - 4, buf + 3);
+  ntlm->response = aprintf("%.*s", len_out - 4, buf + 3);
   free(buf);
-  if(!conn->response_header)
+  if(!ntlm->response)
     return CURLE_OUT_OF_MEMORY;
   return CURLE_OK;
 done:
@@ -339,6 +346,7 @@
                             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 +357,8 @@
     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 */
@@ -389,11 +397,11 @@
   char **allocuserpwd;
   /* point to the name and password for this */
   const char *userp;
+  struct ntlmdata *ntlm;
   curlntlm *state;
   struct auth *authp;
 
   CURLcode res = CURLE_OK;
-  char *input;
 
   DEBUGASSERT(conn);
   DEBUGASSERT(conn->data);
@@ -401,12 +409,14 @@
   if(proxy) {
     allocuserpwd = &conn->allocptr.proxyuserpwd;
     userp = conn->http_proxy.user;
+    ntlm = &conn->proxyntlm;
     state = &conn->proxy_ntlm_state;
     authp = &conn->data->state.authproxy;
   }
   else {
     allocuserpwd = &conn->allocptr.userpwd;
     userp = conn->user;
+    ntlm = &conn->ntlm;
     state = &conn->http_ntlm_state;
     authp = &conn->data->state.authhost;
   }
@@ -432,38 +442,36 @@
      * 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 +479,7 @@
     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 +494,10 @@
   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_rtmp.h b/lib/curl_rtmp.h
index 3306e22..86a0138 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 0aa1f5b..8c1c866 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
@@ -272,6 +272,7 @@
     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 +342,7 @@
       }
     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 +352,17 @@
         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) {
@@ -431,6 +432,7 @@
   char *serverdata;
 #endif
   size_t len = 0;
+  const char *oauth_bearer = data->set.str[STRING_BEARER];
 
   *progress = SASL_INPROGRESS;
 
@@ -558,7 +560,7 @@
       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 +568,7 @@
     }
     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 13af8cd..4ecda6a 100644
--- a/lib/curl_setup.h
+++ b/lib/curl_setup.h
@@ -27,6 +27,14 @@
 #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
  */
 
@@ -563,6 +571,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,12 +591,6 @@
 #  define CURLRES_SYNCH
 #endif
 
-#ifdef ENABLE_IPV6
-#  define CURLRES_IPV6
-#else
-#  define CURLRES_IPV4
-#endif
-
 /* ---------------------------------------------------------------- */
 
 /*
@@ -644,7 +652,8 @@
 #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
 
@@ -713,7 +722,7 @@
  */
 
 #ifndef Curl_nop_stmt
-#  define Curl_nop_stmt do { } WHILE_FALSE
+#  define Curl_nop_stmt do { } while(0)
 #endif
 
 /*
diff --git a/lib/curl_setup_once.h b/lib/curl_setup_once.h
index 413ccea..8890f38 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 - 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
@@ -330,27 +330,6 @@
 #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 @@
 #ifdef DEBUGBUILD
 #define DEBUGF(x) x
 #else
-#define DEBUGF(x) do { } WHILE_FALSE
+#define DEBUGF(x) do { } while(0)
 #endif
 
 
@@ -395,10 +374,11 @@
  * 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
 
 
diff --git a/lib/curl_sha256.h b/lib/curl_sha256.h
index 6db4b04..35d286c 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 1d0de4e..f7cc10f 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 - 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_sspi.h b/lib/curl_sspi.h
index 2bbf947..c09026e 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 8e5937a..064c075 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 - 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.h b/lib/curl_threads.h
index 2a93644..65d1a79 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/dict.h b/lib/dict.h
index 12c0f33..38a55ac 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 d179578..aaa8f15 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
@@ -86,12 +86,36 @@
   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 +133,30 @@
   *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,8 +167,8 @@
 
   *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;
 }
@@ -195,7 +218,7 @@
   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,
@@ -280,38 +303,42 @@
       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);
+    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,8 +351,6 @@
     }
     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);
     if(data->set.ssl.fsslctx)
       ERROR_CHECK_SETOPT(CURLOPT_SSL_CTX_FUNCTION, data->set.ssl.fsslctx);
     if(data->set.ssl.fsslctxp)
@@ -362,6 +387,7 @@
 {
   struct Curl_easy *data = conn->data;
   CURLcode result = CURLE_OK;
+  int slot;
   *waitp = TRUE; /* this never returns synchronously */
   (void)conn;
   (void)hostname;
@@ -380,8 +406,8 @@
 
   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 +416,8 @@
 
   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,8 +428,9 @@
   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;
 }
 
@@ -521,7 +548,7 @@
       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;
@@ -586,6 +613,9 @@
     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;
@@ -647,8 +677,10 @@
       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;
 
@@ -909,46 +941,43 @@
 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];
     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);
+    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);
+    }
     /* 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);
-    }
-    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) {
+    for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) {
+      rc[slot] = doh_decode(data->req.doh.probe[slot].serverdoh.memory,
+                            data->req.doh.probe[slot].serverdoh.size,
+                            data->req.doh.probe[slot].dnstype,
+                            &de);
+      Curl_safefree(data->req.doh.probe[slot].serverdoh.memory);
+      if(rc[slot]) {
+        infof(data, "DOH: %s type %s for %s\n", doh_strerror(rc[slot]),
+              type2name(data->req.doh.probe[slot].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 +999,26 @@
       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 f522d33..fc053ed 100644
--- a/lib/doh.h
+++ b/lib/doh.h
@@ -55,14 +55,16 @@
   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
diff --git a/lib/dotdot.c b/lib/dotdot.c
index 2c6177a..fe4f497 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 - 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/dotdot.h b/lib/dotdot.h
index 125af43..f70b1db 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/easy.c b/lib/easy.c
index 001648d..1a69127 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,10 +72,11 @@
 #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"
 
 /* The last 3 #include files should be in this order */
 #include "curl_printf.h"
@@ -157,20 +158,20 @@
 
   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 +183,31 @@
 
   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 +275,10 @@
 
   Curl_ssh_cleanup();
 
+#ifdef USE_WOLFSSH
+  (void)wolfSSH_Cleanup();
+#endif
+
   init_flags  = 0;
 }
 
@@ -680,10 +691,6 @@
 
   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);
 
@@ -979,57 +986,63 @@
   /* 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;
+  if(!(newstate & KEEP_RECV_PAUSE)) {
+    Curl_http2_stream_pause(data, FALSE);
 
-    /* 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;
+    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];
+        data->state.tempwrite[i].buf = NULL;
+      }
+      data->state.tempcount = 0;
+
+      /* 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);
+      }
+
+      /* recover previous owner of the connection */
+      if(saved_data)
+        conn->data = saved_data;
+
+      if(result)
+        return result;
     }
-    data->state.tempcount = 0;
-
-    /* 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);
-    }
-
-    /* recover previous owner of the connection */
-    if(saved_data)
-      conn->data = saved_data;
-
-    if(result)
-      return result;
   }
 
   /* if there's no error and we're not pausing both directions, we want
      to have this handle checked soon */
   if((newstate & (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) !=
      (KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) {
+    data->state.drain++;
     Curl_expire(data, 0, EXPIRE_RUN_NOW); /* get this handle going again */
     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/easyif.h b/lib/easyif.h
index 6ba7e54..8a309c5 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 - 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/file.c b/lib/file.c
index d349cd9..2492370 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
@@ -136,7 +136,7 @@
   struct Curl_easy *data = conn->data;
   char *real_path;
   struct FILEPROTO *file = data->req.protop;
-  int fd;
+  int fd = -1;
 #ifdef DOS_FILESYSTEM
   size_t i;
   char *actual_path;
@@ -181,7 +181,9 @@
       return CURLE_URL_MALFORMAT;
     }
 
-  fd = open_readonly(actual_path, O_RDONLY|O_BINARY);
+  if(strncmp("\\\\", actual_path, 2))
+    /* refuse to open path that starts with two backslashes */
+    fd = open_readonly(actual_path, O_RDONLY|O_BINARY);
   file->path = actual_path;
 #else
   if(memchr(real_path, 0, real_path_len)) {
diff --git a/lib/file.h b/lib/file.h
index 20828ad..f6b74a7 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/formdata.c b/lib/formdata.c
index 429d479..50a37e0 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
diff --git a/lib/ftp.c b/lib/ftp.c
index 8072a33..57b22ad 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,7 +55,6 @@
 #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"
@@ -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"
@@ -253,18 +253,6 @@
   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 +291,7 @@
 
   conn->sock[SECONDARYSOCKET] = s;
   (void)curlx_nonblock(s, TRUE); /* enable non-blocking */
-  conn->sock_accepted[SECONDARYSOCKET] = TRUE;
+  conn->sock_accepted = TRUE;
 
   if(data->set.fsockopt) {
     int error = 0;
@@ -785,9 +773,8 @@
 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:"");
+  PPSENDF(&conn->proto.ftpc.pp, "USER %s", conn->user?conn->user:"");
 
   state(conn, FTP_USER);
   conn->data->state.ftp_trying_alternative = FALSE;
@@ -823,6 +810,9 @@
    * 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);
 
@@ -920,7 +910,7 @@
   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;
@@ -931,9 +921,8 @@
 #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];
@@ -1246,8 +1235,10 @@
       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 @@
       *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));
@@ -1806,7 +1797,7 @@
   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 */
 
@@ -2039,13 +2030,11 @@
                      &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
@@ -2530,7 +2519,6 @@
 {
   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,7 +2526,7 @@
   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:"");
+    PPSENDF(&ftpc->pp, "PASS %s", conn->passwd?conn->passwd:"");
     state(conn, FTP_PASS);
   }
   else if(ftpcode/100 == 2) {
@@ -4371,18 +4359,6 @@
   /* 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 2c88d56..984347f 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
@@ -102,8 +102,6 @@
    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 */
 
diff --git a/lib/ftplistparser.h b/lib/ftplistparser.h
index 8128887..b34ae9b 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 e444a6a..9385b8f 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.h b/lib/getinfo.h
index aecf717..8d2af42 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.h b/lib/gopher.h
index 501c990..dec2557 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/hmac.c b/lib/hmac.c
index bf49ebe..ae68827 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"
@@ -129,4 +130,40 @@
   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 HMAC_params *hashparams,
+                     const unsigned char *key, const size_t keylen,
+                     const unsigned char *data, const size_t datalen,
+                     unsigned char *output)
+{
+  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/hostcheck.h b/lib/hostcheck.h
index f562df9..9c18085 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 d4e8f93..c0feb79 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"
@@ -482,16 +483,16 @@
  * 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;
 
@@ -512,13 +513,11 @@
   if(!dns) {
     /* The entry was not in the cache. Resolve it to IP address */
 
-    Curl_addrinfo *addr;
+    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;
+#ifndef USE_RESOLVE_ON_IPS
+    struct in_addr in;
+#endif
 
     /* notify the resolver start callback */
     if(data->set.resolver_start) {
@@ -531,20 +530,43 @@
         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);
     }
-    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,
+#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) {
+        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 +642,11 @@
  * 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 +662,7 @@
   volatile unsigned int prev_alarm = 0;
   struct Curl_easy *data = conn->data;
 #endif /* USE_ALARM_TIMEOUT */
-  int rc;
+  enum resolve_t rc;
 
   *entry = NULL;
 
@@ -1021,6 +1043,10 @@
 CURLcode Curl_resolv_check(struct connectdata *conn,
                            struct Curl_dns_entry **dns)
 {
+#if defined(CURL_DISABLE_DOH) && !defined(CURLRES_ASYNCH)
+  (void)dns;
+#endif
+
   if(conn->data->set.doh)
     return Curl_doh_is_resolved(conn, dns);
   return Curl_resolver_is_resolved(conn, dns);
diff --git a/lib/hostip.h b/lib/hostip.h
index e0597ea..baf1e58 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
@@ -79,26 +79,29 @@
  * 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
 
 /*
diff --git a/lib/hostip4.c b/lib/hostip4.c
index e6ba710..d5009a3 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"
@@ -128,28 +127,22 @@
 #endif
   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;
+  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;
-    }
+  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 @@
    * Since there are three different versions of it, the following code is
    * somewhat #ifdef-ridden.
    */
-  else {
-    int h_errnop;
+  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.
-     */
+  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);
+  /* 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 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
-#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.
-     */
-
-    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.
-     */
-
-    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
-#endif /* HAVE_...BYNAME_R_5 || HAVE_...BYNAME_R_6 || HAVE_...BYNAME_R_3 */
-    {
-      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);
-#endif /* HAVE_GETADDRINFO_THREADSAFE || HAVE_GETHOSTBYNAME_R */
+  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.
+   */
+
+  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.
+   */
+
+  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
+#endif /* HAVE_...BYNAME_R_5 || HAVE_...BYNAME_R_6 || HAVE_...BYNAME_R_3 */
+  {
+    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.
+   */
+  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 e0e0c58..41ff986 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 @@
       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_ipvalid(struct connectdata *conn)
 {
   if(conn->ip_version == CURL_IPRESOLVE_V6)
-    return Curl_ipv6works();
+    return Curl_ipv6works(conn);
 
   return TRUE;
 }
@@ -159,7 +165,7 @@
     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 3de6746..9e31008 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 4631a7f..bff3adc 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
@@ -344,7 +344,7 @@
   userp = &conn->allocptr.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;
@@ -555,7 +555,7 @@
   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 +565,7 @@
   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);
@@ -641,9 +641,7 @@
 {
   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;
@@ -707,7 +705,7 @@
   }
   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);
@@ -765,7 +763,7 @@
   authproxy = &data->state.authproxy;
 
   if((conn->bits.httpproxy && conn->bits.proxy_user_passwd) ||
-     conn->bits.user_passwd || conn->oauth_bearer)
+     conn->bits.user_passwd || data->set.str[STRING_BEARER])
     /* continue please */;
   else {
     authhost->done = TRUE;
@@ -1617,7 +1615,8 @@
     Curl_add_buffer_free(&http->send_buffer);
   }
 
-  Curl_http2_done(conn, premature);
+  Curl_http2_done(data, premature);
+  Curl_quic_done(data, premature);
 
   Curl_mime_cleanpart(&http->form);
 
@@ -1690,7 +1689,7 @@
   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
@@ -2389,7 +2388,7 @@
         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);
@@ -3045,6 +3044,8 @@
   }
   if(result)
     return result;
+  if(!postsize)
+    data->req.upload_done = TRUE;
 
   if(data->req.writebytecount) {
     /* if a request-body has been sent off, we make sure this progress is noted
@@ -3544,7 +3545,16 @@
              */
             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;
@@ -3973,7 +3983,7 @@
     else if(checkprefix("Retry-After:", k->p)) {
       /* 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(&k->p[12]);
       if(-1 == date) {
         /* not a date, try it as a decimal number */
         (void)curlx_strtoofft(&k->p[12], NULL, 10, &retry_after);
@@ -4031,9 +4041,7 @@
 #endif
     else if(!k->http_bodyless && checkprefix("Last-Modified:", k->p) &&
             (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(k->p + strlen("Last-Modified:"));
       if(data->set.get_filetime)
         data->info.filetime = k->timeofdoc;
     }
diff --git a/lib/http.h b/lib/http.h
index a3a2757..4c1825f 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
@@ -116,7 +116,7 @@
  *
  */
 #ifndef EXPECT_100_THRESHOLD
-#define EXPECT_100_THRESHOLD 1024
+#define EXPECT_100_THRESHOLD (1024*1024)
 #endif
 
 #endif /* CURL_DISABLE_HTTP */
@@ -193,12 +193,17 @@
 #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 */
+  char *overflow_buf; /* excess data received during a single Curl_read */
+  size_t overflow_buflen; /* amount of data currently in overflow_buf */
+  size_t overflow_bufsize; /* size of the overflow_buf allocation */
 #endif
 };
 
diff --git a/lib/http2.c b/lib/http2.c
index 6315fc4..72b38a3 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
@@ -43,19 +43,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 +55,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
 
 
@@ -344,35 +336,6 @@
   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
-}
-
 /*
  * The implementation of nghttp2_send_callback type. Here we write |data| with
  * size |length| to the network and return the number of bytes actually
@@ -838,7 +801,7 @@
       return 0;
     }
     H2BUGF(infof(data_s, "on_stream_close(), %s (err %d), stream %u\n",
-                 http2_strerror(error_code), error_code, stream_id));
+                 nghttp2_strerror(error_code), error_code, stream_id));
     stream = data_s->req.protop;
     if(!stream)
       return NGHTTP2_ERR_CALLBACK_FAILURE;
@@ -1138,8 +1101,7 @@
   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 +1118,10 @@
                               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,11 +1132,10 @@
   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 */
@@ -1258,9 +1220,7 @@
     /* 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);
@@ -1458,7 +1418,7 @@
   }
   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_strerror(httpc->error_code),
           httpc->error_code);
     *err = CURLE_HTTP2_STREAM;
     return -1;
@@ -1595,8 +1555,12 @@
     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",
@@ -1627,7 +1591,6 @@
     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);
@@ -2265,7 +2228,6 @@
     }
   }
 
-#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 +2235,6 @@
           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
@@ -2331,6 +2292,51 @@
   return CURLE_OK;
 }
 
+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 {
+    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;
+    }
+
+    /* make sure the window update gets sent */
+    rv = h2_session_send(data, httpc->h2);
+    if(rv)
+      return CURLE_SEND_ERROR;
+
+    DEBUGF(infof(data, "Set HTTP/2 window size to %u for stream %u\n",
+                 window, stream->stream_id));
+
+#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;
+}
+
 CURLcode Curl_http2_add_child(struct Curl_easy *parent,
                               struct Curl_easy *child,
                               bool exclusive)
diff --git a/lib/http2.h b/lib/http2.h
index 93058cc..1989aff 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
@@ -50,7 +50,7 @@
 /* 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 @@
 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 @@
 #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_ntlm.c b/lib/http_ntlm.c
index e4a4fe0..342b242 100644
--- a/lib/http_ntlm.c
+++ b/lib/http_ntlm.c
@@ -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
 
@@ -137,11 +135,6 @@
   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
-
   if(proxy) {
     allocuserpwd = &conn->allocptr.proxyuserpwd;
     userp = conn->http_proxy.user;
diff --git a/lib/http_proxy.c b/lib/http_proxy.c
index f095455..75c7a60 100644
--- a/lib/http_proxy.c
+++ b/lib/http_proxy.c
@@ -58,8 +58,9 @@
       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
diff --git a/lib/imap.h b/lib/imap.h
index 0efcfd2..4786f56 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 - 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_ntop.c b/lib/inet_ntop.c
index 855981c..9a5af7f 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 d150bb6..9d3f237 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 0d65ae0..9c87a05 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 - 2019 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
diff --git a/lib/inet_pton.h b/lib/inet_pton.h
index 0209b9b..e695af9 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 5a47d48..f50287a 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 - 2019 Daniel Stenberg
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/lib/ldap.c b/lib/ldap.c
index af3d61c..771edb4 100644
--- a/lib/ldap.c
+++ b/lib/ldap.c
@@ -112,7 +112,7 @@
   #define LDAP_TRACE(x)   do { \
                             _ldap_trace("%u: ", __LINE__); \
                             _ldap_trace x; \
-                          } WHILE_FALSE
+                          } while(0)
 
   static void _ldap_trace(const char *fmt, ...);
 #else
diff --git a/lib/libcurl.plist b/lib/libcurl.plist
index 55c2ed4..f0001fe 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.69.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.69.0</string>
 
 	<key>CFBundleGetInfoString</key>
-	<string>libcurl.plist 7.67.0</string>
+	<string>libcurl.plist 7.69.0</string>
 </dict>
 </plist>
diff --git a/lib/llist.c b/lib/llist.c
index f8769c2..e7c6f51 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
@@ -144,54 +144,3 @@
 {
   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 b9d4c89..0178c42 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
@@ -47,7 +47,4 @@
                        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 *);
-
 #endif /* HEADER_CURL_LLIST_H */
diff --git a/lib/md4.c b/lib/md4.c
index bbf8975..38f1b2b 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,16 @@
 
 #ifdef USE_OPENSSL
 #include <openssl/opensslconf.h>
-#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 +71,11 @@
 #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 +89,41 @@
 
 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(__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,7 +131,8 @@
 #include <wincrypt.h>
 
 #include "curl_memory.h"
- /* The last #include file should be: */
+
+/* The last #include file should be: */
 #include "memdebug.h"
 
 typedef struct {
@@ -156,7 +153,7 @@
 
 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,6 +176,7 @@
 #include <mbedtls/md4.h>
 
 #include "curl_memory.h"
+
 /* The last #include file should be: */
 #include "memdebug.h"
 
@@ -207,7 +205,11 @@
 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;
@@ -505,9 +507,11 @@
 
 #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 2b81ca4..3f601b3 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 @@
   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 @@
   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,6 +98,46 @@
 /* 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)) || \
       (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \
@@ -119,12 +167,12 @@
   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"
@@ -151,7 +199,7 @@
   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 +212,9 @@
 }
 
 #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).
@@ -513,12 +563,13 @@
 /*
  * @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);
 }
 
diff --git a/lib/memdebug.h b/lib/memdebug.h
index 5236f60..7ca4426 100644
--- a/lib/memdebug.h
+++ b/lib/memdebug.h
@@ -169,6 +169,6 @@
  */
 
 #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 081e51e..2571287 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
diff --git a/lib/mime.h b/lib/mime.h
index 3241fdc..4312125 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
diff --git a/lib/mk-ca-bundle.pl b/lib/mk-ca-bundle.pl
index 33977f3..09e8e5b 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 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 ($@) {
@@ -421,6 +422,8 @@
 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 @@
   }
   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 @@
   }
   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 @@
   }
   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,8 @@
       $skipnum ++;
       report "Skipping: $caname" if ($opt_v);
     } else {
+      my $data = $cka_value;
+      $cka_value = "";
       my $encoded = MIME::Base64::encode_base64($data, '');
       $encoded =~ s/(.{1,${opt_w}})/$1\n/g;
       my $pem = "-----BEGIN CERTIFICATE-----\n"
diff --git a/lib/mprintf.c b/lib/mprintf.c
index e190936..bc00913 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 - 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
@@ -104,7 +104,7 @@
       done++; \
     else \
      return done; /* return immediately on failure */ \
-  } WHILE_FALSE
+  } while(0)
 
 /* Data type to read from the arglist */
 typedef enum {
diff --git a/lib/multi.c b/lib/multi.c
old mode 100755
new mode 100644
index 6dfe884..cef2805
--- 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"
@@ -259,6 +261,7 @@
 
   /* 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 */
   }
@@ -367,6 +370,23 @@
 
   /* -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 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
+
   return multi;
 
   error:
@@ -531,6 +551,8 @@
     /* 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 +589,20 @@
 
   process_pending_handles(data->multi); /* connection / multiplex */
 
+  CONN_LOCK(data);
   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;
+    CONN_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) {
@@ -618,7 +645,10 @@
 #endif
      ) || conn->bits.close
        || (premature && !(conn->handler->flags & PROTOPT_STREAM))) {
-    CURLcode res2 = Curl_disconnect(data, conn, premature);
+    CURLcode res2;
+    connclose(conn, "disconnecting");
+    CONN_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. */
@@ -635,9 +665,9 @@
               conn->bits.httpproxy ? conn->http_proxy.host.dispname :
               conn->bits.conn_to_host ? conn->conn_to_host.dispname :
               conn->host.dispname);
-
     /* the connection is no longer in use by this transfer */
-    if(Curl_conncache_return_conn(conn)) {
+    CONN_UNLOCK(data);
+    if(Curl_conncache_return_conn(data, conn)) {
       /* remember the most recently used connection */
       data->state.lastconnect = conn;
       infof(data, "%s\n", buffer);
@@ -695,19 +725,14 @@
     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 +740,11 @@
     }
   }
 
+  /* 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 */
@@ -744,10 +774,8 @@
                                 vanish with this handle */
 
   /* Remove the association between the connection and the handle */
-  if(data->conn) {
-    data->conn->data = NULL;
+  if(data->conn)
     detach_connnection(data);
-  }
 
 #ifdef USE_LIBPSL
   /* Remove the PSL association. */
@@ -829,6 +857,9 @@
     return Curl_ssl_getsock(conn, sock);
 #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) {
       sock[s] = conn->tempsock[i];
@@ -1005,7 +1036,8 @@
                                  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];
@@ -1025,6 +1057,9 @@
   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 +1094,12 @@
   curlfds = nfds; /* number of internal file descriptors */
   nfds += extra_nfds; /* add the externally provided ones */
 
+#ifdef ENABLE_WAKEUP
+  if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+    ++nfds;
+  }
+#endif
+
   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
@@ -1117,6 +1158,14 @@
     ++nfds;
   }
 
+#ifdef ENABLE_WAKEUP
+  if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+    ufds[nfds].fd = multi->wakeup_pair[0];
+    ufds[nfds].events = POLLIN;
+    ++nfds;
+  }
+#endif
+
   if(nfds) {
     int pollrc;
     /* wait... */
@@ -1140,6 +1189,29 @@
 
         extra_fds[i].revents = mask;
       }
+
+#ifdef ENABLE_WAKEUP
+      if(use_wakeup && multi->wakeup_pair[0] != CURL_SOCKET_BAD) {
+        if(ufds[curlfds + extra_nfds].revents & POLLIN) {
+          char buf[64];
+          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. */
+            if(sread(multi->wakeup_pair[0], buf, sizeof(buf)) <= 0) {
+#ifndef USE_WINSOCK
+              if(EINTR == SOCKERRNO)
+                continue;
+#endif
+              break;
+            }
+          }
+          /* do not count the wakeup socket into the returned value */
+          retcode--;
+        }
+      }
+#endif
     }
   }
 
@@ -1147,7 +1219,7 @@
     free(ufds);
   if(ret)
     *ret = retcode;
-  if(!extrawait || extra_fds || curlfds)
+  if(!extrawait || nfds)
     /* if any socket was checked */
     ;
   else {
@@ -1157,6 +1229,10 @@
     if(!curl_multi_timeout(multi, &sleep_ms) && sleep_ms) {
       if(sleep_ms > timeout_ms)
         sleep_ms = timeout_ms;
+      /* when there are no easy handles in the multi, this holds a -1
+         timeout */
+      else if((sleep_ms < 0) && extrawait)
+        sleep_ms = timeout_ms;
       Curl_wait_ms((int)sleep_ms);
     }
   }
@@ -1170,7 +1246,8 @@
                           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 +1256,55 @@
                           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
+  /* 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
+  return CURLM_WAKEUP_FAILURE;
 }
 
 /*
@@ -1242,6 +1367,7 @@
 
   DEBUGASSERT(conn);
   DEBUGASSERT(conn->handler);
+  DEBUGASSERT(conn->data == data);
 
   if(conn->handler->do_it) {
     /* generic protocol-specific function pointer set in curl_connect() */
@@ -2069,8 +2195,13 @@
           }
         }
       }
-      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;
     }
 
@@ -2305,6 +2436,11 @@
 
     Curl_hash_destroy(&multi->hostcache);
     Curl_psl_destroy(&multi->psl);
+
+#ifdef ENABLE_WAKEUP
+    sclose(multi->wakeup_pair[0]);
+    sclose(multi->wakeup_pair[1]);
+#endif
     free(multi);
 
     return CURLM_OK;
@@ -2778,8 +2914,8 @@
       if(streams < 1)
         streams = 100;
       multi->max_concurrent_streams =
-          (streams > (long)INITIAL_MAX_CONCURRENT_STREAMS)?
-          (long)INITIAL_MAX_CONCURRENT_STREAMS : streams;
+        (streams > (long)INITIAL_MAX_CONCURRENT_STREAMS)?
+        INITIAL_MAX_CONCURRENT_STREAMS : (unsigned int)streams;
     }
     break;
   default:
@@ -3221,8 +3357,8 @@
 }
 #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 b65bd96..91eca16 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,6 +24,7 @@
 
 #include "conncache.h"
 #include "psl.h"
+#include "socketpair.h"
 
 struct Curl_message {
   struct curl_llist_element list;
@@ -66,6 +67,14 @@
 
 #define CURLPIPE_ANY (CURLPIPE_MULTIPLEX)
 
+#if defined(USE_SOCKETPAIR) && !defined(USE_BLOCKING_SOCKETS)
+#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
@@ -110,11 +119,6 @@
      same actual socket) */
   struct curl_hash sockhash;
 
-  /* multiplexing wanted */
-  bool multiplexing;
-
-  bool recheckstate; /* see Curl_multi_connchanged */
-
   /* Shared connection cache (bundles)*/
   struct conncache conn_cache;
 
@@ -132,8 +136,17 @@
   void *timer_userp;
   struct curltime timer_lastcall; /* the fixed time for the timeout for the
                                     previous callback */
+  unsigned int max_concurrent_streams;
+
+#ifdef ENABLE_WAKEUP
+  curl_socket_t wakeup_pair[2]; /* socketpair() used for wakeup
+                                   0 is used for read, 1 is used for write */
+#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 7502523..bde755e 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
@@ -90,9 +90,7 @@
                                  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 4d105c1..abeb659 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 eb18ea1..d50d315 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/parsedate.c b/lib/parsedate.c
index f4b18d0..585d7ea 100644
--- a/lib/parsedate.c
+++ b/lib/parsedate.c
@@ -587,6 +587,30 @@
   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.
diff --git a/lib/parsedate.h b/lib/parsedate.h
index 8dc3b90..8c7ae94 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 @@
 
 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/pop3.h b/lib/pop3.h
index a8e697c..3ba7999 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 2aa9295..60a941a 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -594,11 +594,13 @@
                                    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 +610,11 @@
                                    (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/quic.h b/lib/quic.h
index 6c132a3..1eb23e9 100644
--- a/lib/quic.h
+++ b/lib/quic.h
@@ -45,9 +45,13 @@
                                 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);
 
 #else /* ENABLE_QUIC */
 #define Curl_quic_done_sending(x)
+#define Curl_quic_done(x,y)
+#define Curl_quic_data_pending(x)
 #endif /* !ENABLE_QUIC */
 
 #endif /* HEADER_CURL_QUIC_H */
diff --git a/lib/rename.c b/lib/rename.c
new file mode 100644
index 0000000..bb170d3
--- /dev/null
+++ b/lib/rename.c
@@ -0,0 +1,62 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  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 "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.
+     MoveFileExA() 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();
+  for(;;) {
+    timediff_t diff;
+    if(MoveFileExA(oldpath, newpath, MOVEFILE_REPLACE_EXISTING))
+      break;
+    diff = Curl_timediff(Curl_now(), start);
+    if(diff < 0 || diff > max_wait_ms)
+      return 1;
+    Sleep(1);
+  }
+#else
+  if(rename(oldpath, newpath))
+    return 1;
+#endif
+  return 0;
+}
+
+#endif
diff --git a/lib/vtls/polarssl.h b/lib/rename.h
similarity index 72%
copy from lib/vtls/polarssl.h
copy to lib/rename.h
index 23c3636..d7442c8 100644
--- a/lib/vtls/polarssl.h
+++ b/lib/rename.h
@@ -1,5 +1,5 @@
-#ifndef HEADER_CURL_POLARSSL_H
-#define HEADER_CURL_POLARSSL_H
+#ifndef HEADER_CURL_RENAME_H
+#define HEADER_CURL_RENAME_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) 2020, Daniel Stenberg, <daniel@haxx.se>, 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,11 +21,7 @@
  * KIND, either express or implied.
  *
  ***************************************************************************/
-#include "curl_setup.h"
 
-#ifdef USE_POLARSSL
+int Curl_rename(const char *oldpath, const char *newpath);
 
-extern const struct Curl_ssl Curl_ssl_polarssl;
-
-#endif /* USE_POLARSSL */
-#endif /* HEADER_CURL_POLARSSL_H */
+#endif /* HEADER_CURL_RENAME_H */
diff --git a/lib/rtsp.h b/lib/rtsp.h
index 2f9cc32..1aae864 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/select.c b/lib/select.c
index 8cd9eb2..b372eff 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
@@ -53,9 +53,6 @@
 /* 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
@@ -74,13 +71,6 @@
  */
 int Curl_wait_ms(int 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)
@@ -94,28 +84,16 @@
 #elif defined(USE_WINSOCK)
   Sleep(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);
+  r = poll(NULL, 0, timeout_ms);
 #else
-    pending_tv.tv_sec = pending_ms / 1000;
-    pending_tv.tv_usec = (pending_ms % 1000) * 1000;
+  {
+    struct timeval pending_tv;
+    pending_tv.tv_sec = timeout_ms / 1000;
+    pending_tv.tv_usec = (timeout_ms % 1000) * 1000;
     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;
@@ -158,7 +136,6 @@
   fd_set fds_err;
   curl_socket_t maxfd;
 #endif
-  struct curltime initial_tv = {0, 0};
   int pending_ms = 0;
   int r;
   int ret;
@@ -183,7 +160,6 @@
 
   if(timeout_ms > 0) {
     pending_ms = (int)timeout_ms;
-    initial_tv = Curl_now();
   }
 
 #ifdef HAVE_POLL_FINE
@@ -208,26 +184,11 @@
     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(timeout_ms < 0)
+    pending_ms = -1;
+  else if(!timeout_ms)
+    pending_ms = 0;
+  r = poll(pfd, num, pending_ms);
 
   if(r < 0)
     return -1;
@@ -290,61 +251,45 @@
 
   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;
-    }
+  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:
+  /* 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.
+     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.
+     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.
+     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).
-    */
+     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);
+  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);
+  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)
@@ -399,7 +344,6 @@
   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;
@@ -425,31 +369,15 @@
 
   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(timeout_ms < 0)
+    pending_ms = -1;
+  else if(!timeout_ms)
+    pending_ms = 0;
+  r = poll(ufds, nfds, pending_ms);
 
   if(r < 0)
     return -1;
@@ -502,42 +430,27 @@
 
   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;
-    }
+  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);
+  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);
+  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;
diff --git a/lib/select.h b/lib/select.h
index f5652a7..ec3021a 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
@@ -75,20 +75,12 @@
 int Curl_socket_check(curl_socket_t readfd, curl_socket_t readfd2,
                       curl_socket_t writefd,
                       time_t timeout_ms);
-
 #define SOCKET_READABLE(x,z) \
   Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, (time_t)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);
-
-/* 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);
 
 #ifdef TPF
@@ -109,7 +101,7 @@
     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 5913ea4..6ef47aa 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"
@@ -224,7 +225,7 @@
   (void)sockindex;
   return false;
 }
-#define pre_receive_plain(c,n) do {} WHILE_FALSE
+#define pre_receive_plain(c,n) do {} while(0)
 #define get_pre_recved(c,n,b,l) 0
 #endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */
 
@@ -501,6 +502,9 @@
   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) {
@@ -529,6 +533,8 @@
     /* update the pointer and the size */
     s->tempwrite[i].buf = newptr;
     s->tempwrite[i].len = newlen;
+
+    len = newlen; /* for the debug output below */
   }
   else {
     dupl = Curl_memdup(ptr, len);
@@ -692,19 +698,20 @@
   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/setopt.c b/lib/setopt.c
index 64c29e3..2e494a6 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
@@ -2133,6 +2133,7 @@
     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);
     break;
 
 #ifndef CURL_DISABLE_PROXY
@@ -2141,6 +2142,7 @@
     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);
     break;
 #endif
 
@@ -2286,7 +2288,7 @@
 
   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 +2391,10 @@
     /* 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:
@@ -2612,14 +2618,12 @@
     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/sha256.c b/lib/sha256.c
index f9287af..9721418 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,135 @@
 #define USE_OPENSSL_SHA256
 #endif
 
-#endif
+#endif /* USE_OPENSSL */
 
-#ifdef USE_OPENSSL_SHA256
+#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)
+
 /* 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
+}
+
 #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. */
 
@@ -95,7 +215,8 @@
   unsigned long state[8], curlen;
   unsigned char buf[64];
 } SHA256_CTX;
-/* the K array */
+
+/* The K array */
 static const unsigned long K[64] = {
   0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, 0x3956c25bUL,
   0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, 0xd807aa98UL, 0x12835b01UL,
@@ -111,6 +232,7 @@
   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 +245,15 @@
 #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 +265,7 @@
     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 +278,15 @@
     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 +301,8 @@
   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 +314,7 @@
                          unsigned long inlen)
 {
   unsigned long n;
+
 #define block_size 64
   if(md->curlen > sizeof(md->buf))
     return -1;
@@ -210,9 +340,11 @@
       }
     }
   }
+
   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 +354,17 @@
                         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 +375,44 @@
     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/slist.c b/lib/slist.c
index 392b84d..d27fbe1 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 d73dbf6..799b3c0 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/smtp.c b/lib/smtp.c
index 65220b0..e187287 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_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);
@@ -481,13 +486,55 @@
   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 +559,86 @@
   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) {
+        free(from);
+        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 it */
+        auth = aprintf("<%s>", address);
+
+      free(address);
+      if(!from)
+        return CURLE_OUT_OF_MEMORY;
+    }
     else
       /* Empty AUTH, RFC-2554, sect. 5 */
       auth = strdup("<>");
@@ -561,6 +672,7 @@
     if(result) {
       free(from);
       free(auth);
+
       return result;
     }
 
@@ -583,19 +695,33 @@
     }
   }
 
+  /* 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 +745,28 @@
   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 +866,10 @@
     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 +1059,53 @@
   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);
+      }
     }
   }
 
@@ -1287,6 +1459,12 @@
   /* 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;
@@ -1537,6 +1715,76 @@
   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 convertion 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 '@' seperator 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(dup[length - 1] == '>')
+    dup[length - 1] = '\0';
+
+  /* Extract the host name from the addresss (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;
+}
+
 CURLcode Curl_smtp_escape_eob(struct connectdata *conn, const ssize_t nread)
 {
   /* When sending a SMTP payload we must detect CRLF. sequences making sure
diff --git a/lib/smtp.h b/lib/smtp.h
index b67340a..164a175 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 @@
   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 @@
   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 db14680..b037ee0 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 1f0e2e4..1ec0d75 100644
--- a/lib/socketpair.c
+++ b/lib/socketpair.c
@@ -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 6ae9818..0fb97e1 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 */
@@ -94,6 +95,81 @@
   }
   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
@@ -110,62 +186,89 @@
                      const char *hostname,
                      int remote_port,
                      int sockindex,
-                     struct connectdata *conn)
+                     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(!SOCKS_STATE(sx->state) && !*done)
+    sxstate(conn, CONNECT_SOCKS_INIT);
 
-  if(conn->bits.httpproxy)
-    infof(conn->data, "SOCKS4%s: connecting to HTTP proxy %s port %d\n",
-          protocol4a ? "a" : "", hostname, remote_port);
+  switch(sx->state) {
+  case CONNECT_SOCKS_INIT:
+    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);
 
-  infof(data, "SOCKS4 communication to %s:%d\n", hostname, remote_port);
+    /*
+     * Compose socks4 request
+     *
+     * Request format
+     *
+     *     +----+----+----+----+----+----+----+----+----+----+....+----+
+     *     | VN | CD | DSTPORT |      DSTIP        | USERID       |NULL|
+     *     +----+----+----+----+----+----+----+----+----+----+....+----+
+     * # of bytes:  1    1      2              4           variable       1
+     */
 
-  /*
-   * Compose socks4 request
-   *
-   * Request format
-   *
-   *     +----+----+----+----+----+----+----+----+----+----+....+----+
-   *     | VN | CD | DSTPORT |      DSTIP        | USERID       |NULL|
-   *     +----+----+----+----+----+----+----+----+----+----+....+----+
-   * # of bytes:  1    1      2              4           variable       1
-   */
+    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 */
 
-  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);
 
-  /* DNS resolve only for SOCKS4, not SOCKS4a */
-  if(!protocol4a) {
-    struct Curl_dns_entry *dns;
+      if(rc == CURLRESOLV_ERROR)
+        return CURLE_COULDNT_RESOLVE_PROXY;
+      else if(rc == CURLRESOLV_PENDING) {
+        sxstate(conn, CONNECT_RESOLVING);
+        infof(data, "SOCKS4 non-blocking resolve of %s\n", hostname);
+        return CURLE_OK;
+      }
+      sxstate(conn, CONNECT_RESOLVED);
+      goto CONNECT_RESOLVED;
+    }
+
+    /* socks4a doesn't resolve anything locally */
+    sxstate(conn, CONNECT_REQ_INIT);
+    goto CONNECT_REQ_INIT;
+
+  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);
+      /* stay in the state or error out */
+      return result;
+    }
+    /* FALLTHROUGH */
+  CONNECT_RESOLVED:
+  case CONNECT_RESOLVED: {
     Curl_addrinfo *hp = NULL;
-    int rc;
-
-    rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
-
-    if(rc == CURLRESOLV_ERROR)
-      return CURLE_COULDNT_RESOLVE_PROXY;
-
-    if(rc == CURLRESOLV_PENDING)
-      /* ignores the return code, but 'dns' remains NULL on failure */
-      (void)Curl_resolver_wait_resolv(conn, &dns);
-
+    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 +276,6 @@
     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 +291,6 @@
       }
       else {
         hp = NULL; /* fail! */
-
         failf(data, "SOCKS4 connection to %s not supported\n", buf);
       }
 
@@ -201,149 +302,166 @@
       return CURLE_COULDNT_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 */
-    }
-
-    /* Send request */
-    code = Curl_write_plain(conn, sock, (char *)socksreq,
-                            packetsize + hostnamelen,
-                            &written);
-    if(code || (written != packetsize + hostnamelen)) {
-      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.");
+    /* 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 name, can't use!\n");
         return CURLE_COULDNT_CONNECT;
       }
-    }
-
-    packetsize = 8; /* receive data size */
-
-    /* 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;
+      /* copy the proxy name WITH trailing zero */
+      memcpy(socksreq + 8, proxy_user, plen + 1);
     }
 
     /*
-     * 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
+     * Make connection
      */
+    {
+      ssize_t packetsize = 9 +
+        strlen((char *)socksreq + 8); /* size including NUL */
 
-    /* wrong version ? */
-    if(socksreq[0] != 0) {
-      failf(data,
-            "SOCKS4 reply has wrong version, version should be 0.");
+      /* If SOCKS4a, set special invalid IP address 0.0.0.x */
+      if(protocol4a) {
+        ssize_t hostnamelen = 0;
+        socksreq[4] = 0;
+        socksreq[5] = 0;
+        socksreq[6] = 0;
+        socksreq[7] = 1;
+        /* append hostname */
+        hostnamelen = (ssize_t)strlen(hostname) + 1; /* length including NUL */
+        if(hostnamelen <= 255)
+          strcpy((char *)socksreq + packetsize, hostname);
+        else {
+          failf(data, "SOCKS4: too long host name");
+          return CURLE_COULDNT_CONNECT;
+        }
+        packetsize += hostnamelen;
+      }
+      sx->outp = socksreq;
+      sx->outstanding = packetsize;
+      sxstate(conn, CONNECT_REQ_SENDING);
+    }
+    /* FALLTHROUGH */
+  case CONNECT_REQ_SENDING:
+    /* Send request */
+    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(written != sx->outstanding) {
+      /* not done, remain in state */
+      sx->outstanding -= written;
+      sx->outp += written;
+      return CURLE_OK;
+    }
 
-    /* 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]);
+    /* 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_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 CURLE_COULDNT_CONNECT;
     }
+    else if(actualread != sx->outstanding) {
+      /* remain in reading state */
+      sx->outstanding -= actualread;
+      sx->outp += actualread;
+      return CURLE_OK;
+    }
+    sxstate(conn, CONNECT_DONE);
+    break;
+  default: /* lots of unused states in SOCKS4 */
+    break;
   }
 
-  (void)curlx_nonblock(sock, TRUE);
+  /*
+   * 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;
+  }
+
+  /* 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;
+  }
+
+  *done = TRUE;
   return CURLE_OK; /* Proxy was successful! */
 }
 
@@ -356,7 +474,8 @@
                      const char *hostname,
                      int remote_port,
                      int sockindex,
-                     struct connectdata *conn)
+                     struct connectdata *conn,
+                     bool *done)
 {
   /*
     According to the RFC1928, section "6.  Replies". This is what a SOCK5
@@ -374,141 +493,158 @@
     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(conn->bits.httpproxy)
-    infof(conn->data, "SOCKS5: connecting to HTTP proxy %s port %d\n",
-          hostname, remote_port);
+  if(!SOCKS_STATE(sx->state) && !*done)
+    sxstate(conn, CONNECT_SOCKS_INIT);
 
-  /* 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;
-  }
+  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);
 
-  /* get timeout */
-  timeout = Curl_timeleft(data, NULL, TRUE);
+    /* 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(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);
+    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);
 
-  (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 */
-    ;
-  }
-#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.");
+    result = Curl_write_plain(conn, sockfd, (char *)socksreq, idx, &written);
+    if(result && (CURLE_AGAIN != result)) {
+      failf(data, "Unable to send initial SOCKS5 request.");
       return CURLE_COULDNT_CONNECT;
     }
-  }
+    if(written != idx) {
+      sxstate(conn, CONNECT_SOCKS_SEND);
+      sx->outstanding = idx - written;
+      sx->outp = &socksreq[written];
+      return CURLE_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 CURLE_COULDNT_CONNECT;
+    }
+    if(written != sx->outstanding) {
+      /* not done, remain in state */
+      sx->outstanding -= written;
+      sx->outp += written;
+      return CURLE_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 CURLE_COULDNT_CONNECT;
+    }
+    else if(actualread != sx->outstanding) {
+      /* remain in reading state */
+      sx->outstanding -= actualread;
+      sx->outp += actualread;
+      return CURLE_OK;
+    }
+    else if(socksreq[0] != 5) {
+      failf(data, "Received invalid version in initial SOCKS5 response.");
+      return CURLE_COULDNT_CONNECT;
+    }
+    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)) {
+      sxstate(conn, CONNECT_GSSAPI_INIT);
+      result = Curl_SOCKS5_gssapi_negotiate(sockindex, conn);
+      if(result) {
+        failf(data, "Unable to negotiate SOCKS5 GSS-API context.");
+        return CURLE_COULDNT_CONNECT;
+      }
+    }
 #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 CURLE_COULDNT_CONNECT;
+      }
+      else if(socksreq[1] == 255) {
+        failf(data, "No authentication method was acceptable.");
+        return CURLE_COULDNT_CONNECT;
+      }
+      failf(data,
+            "Undocumented SOCKS5 mode attempted to be used by server.");
+      return CURLE_COULDNT_CONNECT;
+    }
+    break;
+#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) {
@@ -549,18 +685,41 @@
       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;
     }
-
-    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 CURLE_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;
     }
+    if(actualread != sx->outstanding) {
+      /* remain in state */
+      sx->outstanding -= actualread;
+      sx->outp += actualread;
+      return CURLE_OK;
+    }
 
     /* ignore the first (VER) byte */
     if(socksreq[1] != 0) { /* status */
@@ -570,209 +729,248 @@
     }
 
     /* 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.)");
-      }
-      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_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);
 
-  /* 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(rc == CURLRESOLV_ERROR)
+        return CURLE_COULDNT_RESOLVE_HOST;
 
-  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;
+      if(rc == CURLRESOLV_PENDING) {
+        sxstate(conn, CONNECT_RESOLVING);
+        return CURLE_OK;
+      }
+      sxstate(conn, CONNECT_RESOLVED);
+      goto CONNECT_RESOLVED;
+    }
+    goto CONNECT_RESOLVE_REMOTE;
+
+  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, "SOCKS5: hostname '%s' found\n", hostname);
+    }
+
+    if(!dns) {
+      result = Curl_resolv_check(data->conn, &dns);
+      /* stay in the state or error out */
+      return result;
+    }
+    /* FALLTHROUGH */
+  CONNECT_RESOLVED:
+  case CONNECT_RESOLVED: {
     Curl_addrinfo *hp = NULL;
-    int rc = Curl_resolv(conn, hostname, remote_port, FALSE, &dns);
-
-    if(rc == CURLRESOLV_ERROR)
-      return CURLE_COULDNT_RESOLVE_HOST;
-
-    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;
-    }
-
-    /*
-     * 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)
       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];
-        }
-
-        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];
-        }
-
-        infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", dest);
-      }
-#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 */
-    }
     if(!hp) {
       failf(data, "Failed to resolve \"%s\" for SOCKS5 connect.",
             hostname);
       return CURLE_COULDNT_RESOLVE_HOST;
     }
-  }
 
-  socksreq[len++] = (unsigned char)((remote_port >> 8) & 0xff); /* PORT MSB */
-  socksreq[len++] = (unsigned char)(remote_port & 0xff);        /* PORT LSB */
+    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 defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
-  if(conn->socks5_gssapi_enctype) {
-    failf(data, "SOCKS5 GSS-API protection not yet implemented.");
-  }
-  else
-#endif
-    code = Curl_write_plain(conn, sock, (char *)socksreq, len, &written);
+    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 */
 
-  if(code || (len != written)) {
-    failf(data, "Failed to send SOCKS5 connect request.");
-    return CURLE_COULDNT_CONNECT;
-  }
-
-  len = 10; /* minimum packet size is 10 */
-
-#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
-  if(conn->socks5_gssapi_enctype) {
-    failf(data, "SOCKS5 GSS-API protection not yet implemented.");
-  }
-  else
-#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     |
-    +----+-----+-------+------+----------+----------+
-
-     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;
-  }
-
-  /* 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 */
-#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;
+      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];
       }
+
+      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];
+      }
+
+      infof(data, "SOCKS5 connect to IPv6 %s (locally resolved)\n", dest);
+    }
+#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 */
+
+  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.");
+      return CURLE_COULDNT_CONNECT;
+    }
+#endif
+    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 CURLE_COULDNT_CONNECT;
+    }
+    if(sx->outstanding != written) {
+      /* remain in state */
+      sx->outstanding -= written;
+      sx->outp += written;
+      return CURLE_OK;
     }
 #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
-  }
+    if(conn->socks5_gssapi_enctype) {
+      failf(data, "SOCKS5 GSS-API protection not yet implemented.");
+      return CURLE_COULDNT_CONNECT;
+    }
 #endif
+    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 CURLE_COULDNT_CONNECT;
+    }
+    else if(actualread != sx->outstanding) {
+      /* remain in state */
+      sx->outstanding -= actualread;
+      sx->outp += actualread;
+      return CURLE_OK;
+    }
 
-  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;
+    if(socksreq[0] != 5) { /* version */
+      failf(data,
+            "SOCKS5 reply has wrong version, version should be 5.");
+      return CURLE_COULDNT_CONNECT;
+    }
+    else if(socksreq[1] != 0) { /* Anything besides 0 is an error */
+      failf(data, "Can't complete SOCKS5 connection to %s. (%d)",
+            hostname, (unsigned char)socksreq[1]);
+      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     |
+       +----+-----+-------+------+----------+----------+
+
+       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;
+    }
+
+    /* 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 */
+#endif
+      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
+    /* 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 CURLE_COULDNT_CONNECT;
+    }
+    if(actualread != sx->outstanding) {
+      /* remain in state */
+      sx->outstanding -= actualread;
+      sx->outp += actualread;
+      return CURLE_OK;
+    }
+    sxstate(conn, CONNECT_DONE);
   }
   infof(data, "SOCKS5 request granted.\n");
 
-  (void)curlx_nonblock(sock, TRUE);
+  *done = TRUE;
   return CURLE_OK; /* Proxy was successful! */
 }
 
diff --git a/lib/socks.h b/lib/socks.h
index daa07c1..64a7563 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,6 +41,9 @@
                        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.
@@ -49,7 +52,8 @@
                      const char *hostname,
                      int remote_port,
                      int sockindex,
-                     struct connectdata *conn);
+                     struct connectdata *conn,
+                     bool *done);
 
 /*
  * This function logs in to a SOCKS5 proxy and sends the specifics to the
@@ -60,7 +64,8 @@
                      const char *hostname,
                      int remote_port,
                      int sockindex,
-                     struct connectdata *conn);
+                     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 65294bb..97ee718 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
@@ -167,6 +167,8 @@
     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(;;) {
@@ -513,6 +515,8 @@
     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 57027ef..d5be64a 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,6 +153,8 @@
     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(;;) {
@@ -587,6 +589,7 @@
     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 a894712..a309e35 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 @@
 
 /* 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 @@
     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 baa768b..cd4c419 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_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 51e7978..1ab10fd 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 - 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/strerror.c b/lib/strerror.c
index d0650d8..1a166bf 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,12 @@
   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";
+
     /* error codes not used by current libcurl */
   case CURLE_OBSOLETE20:
   case CURLE_OBSOLETE24:
@@ -386,6 +392,12 @@
   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 +448,26 @@
 }
 
 #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;
-  const char *p;
-
 #ifndef CURL_DISABLE_VERBOSE_STRINGS
+  const char *p;
+#endif
+
+  if(!len)
+    return NULL;
+
+  *buf = '\0';
+
+#ifdef CURL_DISABLE_VERBOSE_STRINGS
+  (void)err;
+  return NULL;
+#else
   switch(err) {
   case WSAEINTR:
     p = "Call interrupted";
@@ -617,27 +636,64 @@
   default:
     return NULL;
   }
-#else
-  if(!err)
-    return NULL;
-  else
-    p = "error";
-#endif
   strncpy(buf, p, len);
   buf [len-1] = '\0';
-
-  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
 }
 #endif   /* USE_WINSOCK */
 
+#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;
+
+  if(!buflen)
+    return NULL;
+
+  *buf = '\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)) {
+      size_t written = wcstombs(buf, wbuf, buflen - 1);
+      if(written != (size_t)-1)
+        buf[written] = '\0';
+      else
+        *buf = '\0';
+    }
+  }
+#else
+  if(!FormatMessageA((FORMAT_MESSAGE_FROM_SYSTEM |
+                      FORMAT_MESSAGE_IGNORE_INSERTS), NULL, err,
+                     LANG_NEUTRAL, buf, (DWORD)buflen, NULL)) {
+    *buf = '\0';
+  }
+#endif
+
+  /* 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 /* WIN32 || _WIN32_WCE */
+
 /*
  * Our thread-safe and smart strerror() replacement.
  *
@@ -648,6 +704,14 @@
  *
  * 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 +722,30 @@
   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,7 +793,7 @@
   }
 #endif
 
-#endif /* end of ! USE_WINSOCK */
+#endif /* end of not Windows */
 
   buf[max] = '\0'; /* make sure the string is zero terminated */
 
@@ -757,341 +816,35 @@
   return buf;
 }
 
-#ifdef USE_WINDOWS_SSPI
-const char *Curl_sspi_strerror(int err, char *buf, size_t buflen)
+/*
+ * 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;
-  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
-
-  switch(err) {
-    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;
-    default:
-      txt = "Unknown error";
+  if(!get_winapi_error(err, buf, buflen)) {
+    msnprintf(buf, buflen, "Unknown error %u (0x%08X)", err, err);
   }
-
-  if(err == SEC_E_OK)
-    strncpy(outbuf, txt, outmax);
-  else if(err == SEC_E_ILLEGAL_MESSAGE)
-    msnprintf(outbuf, outmax,
-              "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;
-    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(msg)
-      msnprintf(outbuf, outmax, "%s - %s", str, msg);
-    else
-      strncpy(outbuf, str, outmax);
+  {
+    const char *txt = (err == ERROR_SUCCESS) ? "No error" : "Error";
+    strncpy(buf, txt, buflen);
+    buf[buflen - 1] = '\0';
   }
-
-#else
-
-  if(err == SEC_E_OK)
-    txt = "No error";
-  else
-    txt = "Error";
-
-  strncpy(outbuf, txt, outmax);
-
 #endif
 
-  outbuf[outmax] = '\0';
-
   if(errno != old_errno)
     errno = old_errno;
 
@@ -1100,6 +853,157 @@
     SetLastError(old_win_err);
 #endif
 
-  return outbuf;
+  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
+  DWORD old_win_err = GetLastError();
+#endif
+  int old_errno = errno;
+  const char *txt;
+
+  if(!buflen)
+    return NULL;
+
+  *buf = '\0';
+
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
+
+  switch(err) {
+    case SEC_E_OK:
+      txt = "No error";
+      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_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 {
+    char txtbuf[80];
+    char msgbuf[256];
+
+    msnprintf(txtbuf, sizeof(txtbuf), "%s (0x%08X)", txt, err);
+
+    if(get_winapi_error(err, msgbuf, sizeof(msgbuf)))
+      msnprintf(buf, buflen, "%s - %s", txtbuf, msgbuf);
+    else {
+      strncpy(buf, txtbuf, buflen);
+      buf[buflen - 1] = '\0';
+    }
+  }
+
+#else
+  if(err == SEC_E_OK)
+    txt = "No error";
+  else
+    txt = "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 /* USE_WINDOWS_SSPI */
diff --git a/lib/strerror.h b/lib/strerror.h
index 683b5b4..bae8f89 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 460eb87..be8f481 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 - 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/strtok.h b/lib/strtok.h
index 90b831e..e221fa6 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 546a3ff..96e3820 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 52a5fd9..b9587b5 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
@@ -109,11 +109,11 @@
   if(Curl_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;
 }
 
diff --git a/lib/telnet.c b/lib/telnet.c
index 955255c..4bf4c65 100644
--- a/lib/telnet.c
+++ b/lib/telnet.c
@@ -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)
diff --git a/lib/telnet.h b/lib/telnet.h
index 668a78a..431427f 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.h b/lib/tftp.h
index 1335f64..3334830 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 9b05cf0..e761966 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 d0d4aeb..8270761 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
@@ -484,8 +484,9 @@
   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;
   /* 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) ||
@@ -499,6 +500,8 @@
        be called and we cannot signal the HTTP/2 stream has closed. As
        a workaround, we return nonzero here to call http2_recv. */
     ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion >= 20);
+#elif defined(ENABLE_QUIC)
+    Curl_ssl_data_pending(conn, FIRSTSOCKET) || Curl_quic_data_pending(data);
 #else
     Curl_ssl_data_pending(conn, FIRSTSOCKET);
 #endif
@@ -918,7 +921,7 @@
       break;
     }
 
-  } while(data_pending(conn) && maxloops--);
+  } while(data_pending(data) && maxloops--);
 
   if(maxloops <= 0) {
     /* we mark it as read-again-please */
@@ -1174,7 +1177,7 @@
     }
 
 
-  } WHILE_FALSE; /* just to break out from! */
+  } while(0); /* just to break out from! */
 
   return CURLE_OK;
 }
@@ -1214,7 +1217,8 @@
   else
     fd_write = CURL_SOCKET_BAD;
 
-  if(conn->data->state.drain) {
+  if(data->state.drain) {
+    data->state.drain--;
     select_res |= CURL_CSELECT_IN;
     DEBUGF(infof(data, "Curl_readwrite: forcibly told to drain data\n"));
   }
diff --git a/lib/url.c b/lib/url.c
index 8285474..47fc66a 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 @@
 #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"
@@ -128,7 +128,6 @@
 #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
@@ -187,7 +186,7 @@
   &Curl_handler_tftp,
 #endif
 
-#if defined(USE_SSH)
+#if defined(USE_SSH) && !defined(USE_WOLFSSH)
   &Curl_handler_scp,
 #endif
 
@@ -380,7 +379,7 @@
   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_save(data, data->asi, data->set.str[STRING_ALTSVC]);
   Curl_altsvc_cleanup(data->asi);
   data->asi = NULL;
 #endif
@@ -403,9 +402,11 @@
     Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
   }
 
+#ifndef CURL_DISABLE_DOH
   free(data->req.doh.probe[0].serverdoh.memory);
   free(data->req.doh.probe[1].serverdoh.memory);
   curl_slist_free_all(data->req.doh.headers);
+#endif
 
   /* destruct wildcard structures if it is needed */
   Curl_wildcard_dtor(&data->wildcard);
@@ -672,7 +673,7 @@
 }
 #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 */
 
 
@@ -712,14 +713,13 @@
   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);
+  Curl_free_idnconverted_hostname(&conn->host);
+  Curl_free_idnconverted_hostname(&conn->conn_to_host);
+  Curl_free_idnconverted_hostname(&conn->http_proxy.host);
+  Curl_free_idnconverted_hostname(&conn->socks_proxy.host);
 
   Curl_safefree(conn->user);
   Curl_safefree(conn->passwd);
-  Curl_safefree(conn->oauth_bearer);
   Curl_safefree(conn->sasl_authzid);
   Curl_safefree(conn->options);
   Curl_safefree(conn->http_proxy.user);
@@ -881,9 +881,37 @@
 
   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
@@ -1071,7 +1099,7 @@
     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 +1108,15 @@
       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(bundle->multiuse == BUNDLE_MULTIPLEX)
+        multiplexed = CONN_INUSE(check);
 
       if(canmultiplex) {
-        if(check->bits.protoconnstart && check->bits.close)
-          continue;
+        ;
       }
       else {
         if(multiplexed) {
@@ -1109,12 +1136,9 @@
           }
         }
 
-        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;
@@ -1146,8 +1170,9 @@
          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;
 
       if(needle->bits.conn_to_host != check->bits.conn_to_host)
@@ -1187,13 +1212,14 @@
         }
       }
 
+      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;
@@ -1242,7 +1268,7 @@
              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) {
@@ -1350,6 +1376,13 @@
                     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! */
@@ -1403,10 +1436,14 @@
 /*
  * 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 +1468,8 @@
 /*
  * 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 +1484,7 @@
   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 +1517,9 @@
       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 +1532,7 @@
 /*
  * 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) {
@@ -1618,7 +1657,8 @@
 
 #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 +1681,7 @@
      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:
@@ -1987,8 +2028,11 @@
 {
   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
 }
 
 
@@ -3193,8 +3237,8 @@
 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);
+  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);
@@ -3238,8 +3282,8 @@
 
   /* 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;
@@ -3335,14 +3379,6 @@
   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) {
@@ -3406,21 +3442,21 @@
   /*************************************************************
    * 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;
   }
   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;
   }
@@ -3593,25 +3629,6 @@
   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
diff --git a/lib/url.h b/lib/url.h
index 053fbdf..5000c51 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
@@ -62,6 +62,11 @@
 
 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 */
diff --git a/lib/urlapi.c b/lib/urlapi.c
index fa514bc..506e244 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
@@ -428,7 +428,6 @@
  *
  */
 static CURLUcode parse_hostname_login(struct Curl_URL *u,
-                                      const struct Curl_handler *h,
                                       char **hostname,
                                       unsigned int flags)
 {
@@ -437,6 +436,7 @@
   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 @@
    * 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 @@
 }
 
 /* scan for byte values < 31 or 127 */
-static CURLUcode junkscan(char *part)
+static CURLUcode junkscan(const char *part)
 {
   if(part) {
     static const char badbytes[]={
@@ -668,10 +672,9 @@
   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 @@
       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 @@
         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 @@
     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 @@
     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);
diff --git a/lib/urldata.h b/lib/urldata.h
index f9365b2..e1348cf 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
@@ -124,7 +124,7 @@
 #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"
@@ -257,6 +257,7 @@
   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 */
 };
 
 struct ssl_general_config {
@@ -366,6 +367,14 @@
   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
@@ -467,7 +476,6 @@
   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);
 };
 
@@ -528,6 +536,24 @@
   UPGR101_WORKING             /* talking upgraded protocol */
 };
 
+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
+};
+
 struct dohresponse {
   unsigned char *memory;
   size_t size;
@@ -544,7 +570,7 @@
 
 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;
@@ -790,6 +816,41 @@
 
 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,7 +860,7 @@
      caution that this might very well vary between different times this
      connection is used! */
   struct Curl_easy *data;
-
+  struct connstate cnnct;
   struct curl_llist_element bundle_node; /* conncache */
 
   /* chunk is for HTTP chunked encoding, but is in the general connectdata
@@ -887,7 +948,6 @@
   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 +959,6 @@
   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() */
   Curl_recv *recv[2];
   Curl_send *send[2];
 
@@ -992,14 +1050,6 @@
                                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
@@ -1063,6 +1113,8 @@
                               handle */
   BIT(writechannel_inuse); /* whether the write channel is in use by an easy
                               handle */
+  BIT(sock_accepted); /* TRUE if the SECONDARYSOCKET was created with
+                         accept() */
 };
 
 /* The end of connectdata. */
@@ -1390,6 +1442,8 @@
   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 +1486,14 @@
 
 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,36 +1550,35 @@
   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_LASTZEROTERMINATED,
@@ -1773,6 +1834,8 @@
   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 {
diff --git a/lib/vauth/cram.c b/lib/vauth/cram.c
index d148618..04438fa 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 - 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.c b/lib/vauth/digest.c
index 8cd4d83..a883570 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; \
@@ -660,7 +660,7 @@
 }
 
 /*
- * _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 @@
  *
  * 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 @@
                   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 @@
   size_t cnonce_sz = 0;
   char *userp_quoted;
   char *response = NULL;
+  char *hashthis = NULL;
   char *tmp = NULL;
 
   if(!digest->nc)
@@ -722,12 +723,12 @@
   }
 
   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 @@
            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 @@
       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 @@
     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 @@
     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 @@
 
   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 @@
   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 8686c44..cc05fdb 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/ntlm.c b/lib/vauth/ntlm.c
index 047c2b5..8f91038 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"
@@ -621,11 +622,11 @@
     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/version.c b/lib/version.c
index cfd09e3..77aca7c 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,7 +26,7 @@
 #include "urldata.h"
 #include "vtls/vtls.h"
 #include "http2.h"
-#include "ssh.h"
+#include "vssh/ssh.h"
 #include "quic.h"
 #include "curl_printf.h"
 
@@ -265,8 +265,10 @@
 #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) && \
diff --git a/lib/vquic/ngtcp2.c b/lib/vquic/ngtcp2.c
index c0f9b16..0788404 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
@@ -49,7 +49,7 @@
 #ifdef DEBUG_HTTP3
 #define H3BUGF(x) x
 #else
-#define H3BUGF(x) do { } WHILE_FALSE
+#define H3BUGF(x) do { } while(0)
 #endif
 
 /*
@@ -146,7 +146,7 @@
   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;
 }
 
 static FILE *keylog_file; /* not thread-safe */
@@ -174,8 +174,10 @@
          tx_secret, secretlen, NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
     return 0;
 
-  if(level == NGTCP2_CRYPTO_LEVEL_APP && init_ngh3_conn(qs) != CURLE_OK)
-    return 0;
+  if(level == NGTCP2_CRYPTO_LEVEL_APP) {
+    if(init_ngh3_conn(qs) != CURLE_OK)
+      return 0;
+  }
 
   return 1;
 }
@@ -188,11 +190,12 @@
   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 +206,8 @@
   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"));
   }
@@ -244,8 +247,9 @@
   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;
   }
 
@@ -305,7 +309,7 @@
   struct quicsocket *qs = (struct quicsocket *)user_data;
 
   if(ngtcp2_crypto_read_write_crypto_data(
-         quic, qs->ssl, NGTCP2_CRYPTO_LEVEL_INITIAL, NULL, 0) != 0)
+       quic, qs->ssl, NGTCP2_CRYPTO_LEVEL_INITIAL, NULL, 0) != 0)
     return NGTCP2_ERR_CALLBACK_FAILURE;
 
   return 0;
@@ -336,6 +340,16 @@
   return 0;
 }
 
+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, int64_t stream_id,
                                int fin, uint64_t offset,
                                const uint8_t *buf, size_t buflen,
@@ -346,9 +360,6 @@
   (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 +368,9 @@
     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);
 
@@ -514,13 +528,15 @@
   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 */
 };
 
 /*
@@ -560,10 +576,10 @@
   qs->version = NGTCP2_PROTO_VER;
   qs->sslctx = quic_ssl_ctx(data);
   if(!qs->sslctx)
-    return CURLE_FAILED_INIT; /* TODO: better return code */
+    return CURLE_QUIC_CONNECT_ERROR;
 
   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);
@@ -581,7 +597,7 @@
   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);
@@ -595,7 +611,7 @@
   rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER,
                               &ng_callbacks, &qs->settings, NULL, qs);
   if(rc)
-    return CURLE_FAILED_INIT; /* TODO: create a QUIC error code */
+    return CURLE_QUIC_CONNECT_ERROR;
 
   ngtcp2_conn_get_local_transport_params(qs->qconn, &params);
   nwrite = ngtcp2_encode_transport_params(
@@ -604,15 +620,15 @@
   if(nwrite < 0) {
     failf(data, "ngtcp2_encode_transport_params: %s\n",
           ngtcp2_strerror((int)nwrite));
-    return CURLE_FAILED_INIT;
+    return CURLE_QUIC_CONNECT_ERROR;
   }
 
   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 */
+    return CURLE_QUIC_CONNECT_ERROR;
 
   return CURLE_OK;
 }
@@ -656,8 +672,16 @@
 static CURLcode ng_disconnect(struct connectdata *conn,
                               bool dead_connection)
 {
-  (void)conn;
+  int i;
+  struct quicsocket *qs = &conn->hequic[0];
   (void)dead_connection;
+  if(qs->ssl)
+    SSL_free(qs->ssl);
+  for(i = 0; i < 3; i++)
+    free(qs->crypto_data[i].buf);
+  nghttp3_conn_del(qs->h3conn);
+  ngtcp2_conn_del(qs->qconn);
+  SSL_CTX_free(qs->sslctx);
   return CURLE_OK;
 }
 
@@ -704,42 +728,121 @@
 
   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;
 }
 
+/* Minimum size of the overflow buffer */
+#define OVERFLOWSIZE 1024
+
+/*
+ * allocate_overflow() ensures that there is room for incoming data in the
+ * overflow buffer, growing it to accommodate the new data if necessary. We
+ * may need to use the overflow buffer because we can't precisely limit the
+ * amount of HTTP/3 header data we receive using QUIC flow control mechanisms.
+ */
+static CURLcode allocate_overflow(struct Curl_easy *data,
+                                  struct HTTP *stream,
+                                  size_t length)
+{
+  size_t maxleft;
+  size_t newsize;
+  /* length can be arbitrarily large, so take care not to overflow newsize */
+  maxleft = CURL_MAX_READ_SIZE - stream->overflow_buflen;
+  if(length > maxleft) {
+    /* The reason to have a max limit for this is to avoid the risk of a bad
+       server feeding libcurl with a highly compressed list of headers that
+       will cause our overflow buffer to grow too large */
+    failf(data, "Rejected %zu bytes of overflow data (max is %d)!",
+          stream->overflow_buflen + length, CURL_MAX_READ_SIZE);
+    return CURLE_OUT_OF_MEMORY;
+  }
+  newsize = stream->overflow_buflen + length;
+  if(newsize > stream->overflow_bufsize) {
+    /* We enlarge the overflow buffer as it is too small */
+    char *newbuff;
+    newsize = CURLMAX(newsize * 3 / 2, stream->overflow_bufsize*2);
+    newsize = CURLMIN(CURLMAX(OVERFLOWSIZE, newsize), CURL_MAX_READ_SIZE);
+    newbuff = realloc(stream->overflow_buf, newsize);
+    if(!newbuff) {
+      failf(data, "Failed to alloc memory for overflow buffer!");
+      return CURLE_OUT_OF_MEMORY;
+    }
+    stream->overflow_buf = newbuff;
+    stream->overflow_bufsize = newsize;
+    infof(data, "Grew HTTP/3 overflow buffer to %zu bytes\n", newsize);
+  }
+  return CURLE_OK;
+}
+
+/*
+ * 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 Curl_easy *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);
+#if 0 /* extra debugging of incoming h3 data */
+    fprintf(stderr, "!! Copies %zd bytes to %p (total %zd)\n",
+            len, stream->mem, stream->memlen);
+#endif
+    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 = allocate_overflow(data, stream, ncopy);
+    if(result) {
+      return result;
+    }
+#if 0 /* extra debugging of incoming h3 data */
+    fprintf(stderr, "!! Copies %zd overflow bytes to %p (total %zd)\n",
+            ncopy, stream->overflow_buf, stream->overflow_buflen);
+#endif
+    memcpy(stream->overflow_buf + stream->overflow_buflen, buf, ncopy);
+    stream->overflow_buflen += ncopy;
+  }
+#if 0 /* extra debugging of incoming h3 data */
+  {
+    size_t i;
+    for(i = 0; i < memlen; i++) {
+      fprintf(stderr, "!! data[%d]: %02x '%c'\n", i, buf[i], buf[i]);
+    }
+  }
+#endif
+  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]);
-    }
+  result = write_data(data, stream, buf, buflen);
+  if(result) {
+    return -1;
   }
-#endif
-  stream->mem += ncopy;
-
-  ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, buflen);
-  ngtcp2_conn_extend_max_offset(qs->qconn, buflen);
-
+  stream->unacked_window += buflen;
+  (void)stream_id;
+  (void)user_data;
   return 0;
 }
 
@@ -750,10 +853,10 @@
   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 +892,17 @@
 {
   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(data, stream, "\r\n", 2);
+    if(result) {
+      return -1;
+    }
   }
   return 0;
 }
@@ -811,7 +916,7 @@
   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 +925,37 @@
 
   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(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(data, stream, h3name.base, h3name.len);
+    if(result) {
+      return -1;
+    }
+    result = write_data(data, stream, ": ", 2);
+    if(result) {
+      return -1;
+    }
+    result = write_data(data, stream, h3val.base, h3val.len);
+    if(result) {
+      return -1;
+    }
+    result = write_data(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 +1000,7 @@
 
   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 +1017,32 @@
 
   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 +1055,21 @@
 static Curl_recv ngh3_stream_recv;
 static Curl_send ngh3_stream_send;
 
+static size_t drain_overflow_buffer(struct HTTP *stream)
+{
+  size_t ncopy = CURLMIN(stream->overflow_buflen, stream->len);
+  if(ncopy > 0) {
+    memcpy(stream->mem, stream->overflow_buf, ncopy);
+    stream->len -= ncopy;
+    stream->mem += ncopy;
+    stream->memlen += ncopy;
+    stream->overflow_buflen -= ncopy;
+    memmove(stream->overflow_buf, stream->overflow_buf + ncopy,
+            stream->overflow_buflen);
+  }
+  return ncopy;
+}
+
 /* incoming data frames on the h3 stream */
 static ssize_t ngh3_stream_recv(struct connectdata *conn,
                                 int sockindex,
@@ -952,6 +1089,10 @@
   }
   /* 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 +1110,13 @@
     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;
   }
 
@@ -1455,9 +1601,11 @@
   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);
   }
@@ -1590,4 +1738,32 @@
 
   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_safefree(stream->overflow_buf);
+  }
+}
+
+/*
+ * 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 stream->overflow_buflen > 0;
+}
+
 #endif
diff --git a/lib/vquic/ngtcp2.h b/lib/vquic/ngtcp2.h
index 5570fc7..30d442f 100644
--- a/lib/vquic/ngtcp2.h
+++ b/lib/vquic/ngtcp2.h
@@ -46,7 +46,7 @@
   ngtcp2_settings settings;
   SSL_CTX *sslctx;
   SSL *ssl;
-  struct quic_handshake client_crypto_data[3];
+  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;
diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c
index 0ee360d..d09ba70 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
@@ -45,7 +45,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)
@@ -171,7 +171,7 @@
     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,
@@ -379,6 +379,9 @@
               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 +436,9 @@
     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;
@@ -780,4 +785,23 @@
   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/vssh/libssh.c b/lib/vssh/libssh.c
index cad8b37..647b4d4 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: */
@@ -318,14 +322,25 @@
   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;
 
@@ -350,6 +365,65 @@
     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:
+          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 +438,15 @@
       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:
@@ -396,15 +471,19 @@
         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 +504,20 @@
   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 +1672,6 @@
             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;
diff --git a/lib/vssh/libssh2.c b/lib/vssh/libssh2.c
index c71cfbc..8e04374 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
@@ -106,6 +106,7 @@
 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);
@@ -466,61 +467,95 @@
       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)?
+        /* 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 'foundkey' */
+        foundkey.key = remotekey;
+        foundkey.len = keylen;
+        foundkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
           CURLKHTYPE_RSA : CURLKHTYPE_DSS;
-        knownkeyp = &knownkey;
+
+        /*
+         * 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);
       }
-
-      /* 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;
-
-      /* 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! */
@@ -615,6 +650,129 @@
 }
 
 /*
+ * 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->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;
+      }
+    }
+
+    if(found) {
+      infof(data, "Found host %s in %s\n",
+            store->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
@@ -646,6 +804,12 @@
          non-blocking */
       libssh2_session_set_blocking(sshc->ssh_session, 0);
 
+      result = ssh_force_knownhost_key_type(conn);
+      if(result) {
+        state(conn, SSH_SESSION_FREE);
+        break;
+      }
+
       state(conn, SSH_S_STARTUP);
       /* FALLTHROUGH */
 
@@ -2217,7 +2381,6 @@
             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;
diff --git a/lib/ssh.h b/lib/vssh/ssh.h
similarity index 96%
rename from lib/ssh.h
rename to lib/vssh/ssh.h
index 3213c5a..0d4ee52 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
@@ -188,6 +191,12 @@
 #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 +204,6 @@
 
 #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 +243,13 @@
 #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 0000000..363a52c
--- /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 0000000..67f9458
--- /dev/null
+++ b/lib/vtls/bearssl.c
@@ -0,0 +1,866 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * 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
+ * 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;
+};
+
+#define BACKEND connssl->backend
+
+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];
+  const char * const ssl_cafile = SSL_CONN_CONFIG(CAfile);
+  const char *hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
+    conn->host.name;
+  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 &&
+       (!SSL_IS_PROXY() || !conn->bits.tunnel_proxy)) {
+      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];
+  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];
+  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];
+  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];
+  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];
+  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];
+  time_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];
+
+  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)
+{
+  return &BACKEND->ctx;
+}
+
+static void Curl_bearssl_close(struct connectdata *conn, int sockindex)
+{
+  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
+  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
similarity index 75%
rename from lib/vtls/polarssl.h
rename to lib/vtls/bearssl.h
index 23c3636..5f94922 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.h b/lib/vtls/gskit.h
index 466ee4d..b06b5e1 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 3737d7c..5f740ee 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
@@ -666,6 +666,10 @@
   /* 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;
diff --git a/lib/vtls/mbedtls.c b/lib/vtls/mbedtls.c
index e34ec9d..f057315 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
@@ -55,7 +55,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"
@@ -91,12 +91,12 @@
 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 +105,9 @@
 {
   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;
 }
@@ -1017,12 +1017,12 @@
  */
 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,
diff --git a/lib/vtls/mbedtls.h b/lib/vtls/mbedtls.h
index 4a93860..0cc64b3 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
similarity index 76%
rename from lib/vtls/polarssl_threadlock.c
rename to lib/vtls/mbedtls_threadlock.c
index 27c94b1..4d672f1 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 @@
   return 1; /* OK */
 }
 
-int Curl_polarsslthreadlock_thread_cleanup(void)
+int Curl_mbedtlsthreadlock_thread_cleanup(void)
 {
   int i;
 
@@ -95,7 +95,7 @@
   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 @@
     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 @@
   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 @@
     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 @@
   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
similarity index 64%
rename from lib/vtls/polarssl_threadlock.h
rename to lib/vtls/mbedtls_threadlock.h
index 1226475..96a787d 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/nss.c b/lib/vtls/nss.c
index a375f00..ef51b0d 100644
--- a/lib/vtls/nss.c
+++ b/lib/vtls/nss.c
@@ -113,7 +113,7 @@
   ptr->type = (_type);                                      \
   ptr->pValue = (_val);                                     \
   ptr->ulValueLen = (_len);                                 \
-} WHILE_FALSE
+} while(0)
 
 #define CERT_NewTempCertificate __CERT_NewTempCertificate
 
diff --git a/lib/vtls/openssl.c b/lib/vtls/openssl.c
index 760758d..1d09cad 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
@@ -142,10 +142,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)
@@ -392,11 +388,20 @@
  */
 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;
 }
 
@@ -2207,7 +2212,6 @@
   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;
@@ -2768,19 +2772,29 @@
     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) {
+    /* 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)
     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)) {
+      /* 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. */
+      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
@@ -2806,8 +2820,10 @@
 
   /* give application a chance to interfere with SSL set up. */
   if(data->set.ssl.fsslctx) {
+    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;
@@ -2988,8 +3004,13 @@
         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;
+        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;
       }
 
@@ -3065,7 +3086,7 @@
   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 +3118,28 @@
   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 +3149,10 @@
       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
@@ -3826,10 +3828,22 @@
       *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. */
@@ -3894,11 +3908,6 @@
       /* 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 +3916,44 @@
       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 +3961,35 @@
 
 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;
diff --git a/lib/vtls/polarssl.c b/lib/vtls/polarssl.c
deleted file mode 100644
index 9e7dd90..0000000
--- 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 bbd2fe9..0818d94 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
@@ -554,10 +554,6 @@
     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:
@@ -722,7 +718,7 @@
     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);
 
@@ -1859,7 +1855,9 @@
       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)));
diff --git a/lib/vtls/schannel_verify.c b/lib/vtls/schannel_verify.c
index 1bdf50a..e75132c 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
@@ -99,7 +99,8 @@
     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 @@
     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 @@
     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 @@
       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 @@
                 "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 @@
                     "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;
             }
@@ -288,6 +293,133 @@
   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(Curl_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 @@
   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 @@
     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) {
@@ -460,7 +575,7 @@
       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 {
@@ -489,7 +604,7 @@
         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 +627,7 @@
                                 &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;
     }
diff --git a/lib/vtls/sectransp.c b/lib/vtls/sectransp.c
index 4eece89..7dd028f 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
@@ -1164,7 +1164,7 @@
    * 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
diff --git a/lib/vtls/vtls.c b/lib/vtls/vtls.c
index e6d7562..dfefa1b 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
@@ -516,8 +516,8 @@
 }
 
 #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];
@@ -1183,12 +1183,12 @@
   &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 +1215,15 @@
 #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 +1231,7 @@
 {
   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 +1243,32 @@
 
     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 61d8416..f58adee 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,12 +102,12 @@
 #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 */
diff --git a/lib/vtls/wolfssl.c b/lib/vtls/wolfssl.c
index 890bcbf..8c2d3f4 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
@@ -923,7 +923,7 @@
 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 +937,11 @@
 }
 
 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);
diff --git a/local-configure.patch b/local-configure.patch
index 8cab352..08ef437 100644
--- a/local-configure.patch
+++ b/local-configure.patch
@@ -2,7 +2,7 @@
 ===================================================================
 --- curl.orig/lib/curl_config.h
 +++ curl/lib/curl_config.h
-@@ -473,7 +473,7 @@
+@@ -476,7 +476,7 @@
  #define HAVE_NETDB_H 1
  
  /* Define to 1 if you have the <netinet/in6.h> header file. */
@@ -11,7 +11,7 @@
  
  /* Define to 1 if you have the <netinet/in.h> header file. */
  #define HAVE_NETINET_IN_H 1
-@@ -513,7 +513,7 @@
+@@ -516,7 +516,7 @@
  #define HAVE_OPENSSL_RSA_H 1
  
  /* if you have the function SRP_Calc_client_key */
@@ -20,7 +20,7 @@
  
  /* Define to 1 if you have the <openssl/ssl.h> header file. */
  #define HAVE_OPENSSL_SSL_H 1
-@@ -836,9 +836,6 @@
+@@ -842,9 +842,6 @@
  /* Define absolute filename for winbind's ntlm_auth helper. */
  /* #undef NTLM_WB_FILE */
  
@@ -30,7 +30,7 @@
  /* Name of package */
  #define PACKAGE "curl"
  
-@@ -894,7 +891,7 @@
+@@ -900,7 +897,7 @@
  #define SELECT_TYPE_ARG5 struct timeval *
  
  /* Define to the function return type for select. */
@@ -39,7 +39,7 @@
  
  /* Define to the type qualifier of arg 2 for send. */
  #define SEND_QUAL_ARG2 const
-@@ -920,24 +917,9 @@
+@@ -926,24 +923,9 @@
  /* The number of bytes in type int */
  #define SIZEOF_INT 4
  
@@ -64,7 +64,7 @@
  /* Define to 1 if you have the ANSI C header files. */
  #define STDC_HEADERS 1
  
-@@ -1026,7 +1008,7 @@
+@@ -1035,7 +1017,7 @@
  /* #undef USE_THREADS_WIN32 */
  
  /* Use TLS-SRP authentication */
@@ -73,7 +73,7 @@
  
  /* Use Unix domain sockets */
  #define USE_UNIX_SOCKETS 1
-@@ -1068,7 +1050,7 @@
+@@ -1080,7 +1062,7 @@
  #endif
  
  /* Number of bits in a file offset, on hosts where this is settable. */
diff --git a/ltmain.sh b/ltmain.sh
index c12c197..e39eeac 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-13"
 package_revision=2.4.6
 
 
@@ -387,7 +387,7 @@
 # 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 @@
        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-13
        automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
        autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
 
@@ -7368,10 +7368,12 @@
       # -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-confopts.m4 b/m4/curl-confopts.m4
index af15a85..eaae5b9 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 @@
       ;;
     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 @@
       ;;
     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
diff --git a/m4/curl-functions.m4 b/m4/curl-functions.m4
index 9020f39..e773f67 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
 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
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index 0130746..3a03d84 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -1041,8 +1041,8 @@
 _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 @@
 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])
 
@@ -4704,6 +4704,12 @@
 	_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*)
diff --git a/packages/OS400/ccsidcurl.c b/packages/OS400/ccsidcurl.c
index 11e4c77..64fb739 100644
--- a/packages/OS400/ccsidcurl.c
+++ b/packages/OS400/ccsidcurl.c
@@ -1130,22 +1130,6 @@
   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);
diff --git a/packages/OS400/curl.inc.in b/packages/OS400/curl.inc.in
index 8be6c89..a160f10 100644
--- a/packages/OS400/curl.inc.in
+++ b/packages/OS400/curl.inc.in
@@ -596,6 +596,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 +768,8 @@
      d                 c                   X'0001'
      d CURLSSLOPT_NO_REVOKE...
      d                 c                   X'0002'
+     d CURLSSLOPT_NO_PARTIALCHAIN...
+     d                 c                   X'0004'
       *
      d CURL_HET_DEFAULT...
      d                 c                   200
@@ -1804,7 +1814,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/make-lib.sh b/packages/OS400/make-lib.sh
index 410bef0..fadb4c5 100644
--- a/packages/OS400/make-lib.sh
+++ b/packages/OS400/make-lib.sh
@@ -46,6 +46,26 @@
 
 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/vms/compare_curl_source.com b/packages/vms/compare_curl_source.com
index eeaec31..66f6a45 100644
--- a/packages/vms/compare_curl_source.com
+++ b/packages/vms/compare_curl_source.com
@@ -17,7 +17,7 @@
 $!        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.
 $!
diff --git a/packages/vms/config_h.com b/packages/vms/config_h.com
index 967eb40..9bfb40b 100644
--- a/packages/vms/config_h.com
+++ b/packages/vms/config_h.com
@@ -803,28 +803,6 @@
 $	    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 7a8d847..9f7cf66 100644
--- a/packages/vms/curl_crtl_init.c
+++ b/packages/vms/curl_crtl_init.c
@@ -1,7 +1,7 @@
 /* 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/generate_config_vms_h_curl.com b/packages/vms/generate_config_vms_h_curl.com
index 62870da..809aaaf 100644
--- a/packages/vms/generate_config_vms_h_curl.com
+++ b/packages/vms/generate_config_vms_h_curl.com
@@ -325,8 +325,8 @@
 $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"
diff --git a/packages/vms/readme b/packages/vms/readme
index ddfac74..be1278f 100644
--- a/packages/vms/readme
+++ b/packages/vms/readme
@@ -194,7 +194,7 @@
 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 @@
 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/projects/Windows/VC10/lib/libcurl.vcxproj b/projects/Windows/VC10/lib/libcurl.vcxproj
index 3765afd..b3603dc 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>

@@ -2402,6 +2402,7 @@
     <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" />

@@ -2446,14 +2447,19 @@
     <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\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\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" />

@@ -2541,6 +2547,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 +2563,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" />

@@ -2576,14 +2582,17 @@
     <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\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\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/lib/libcurl.vcxproj b/projects/Windows/VC11/lib/libcurl.vcxproj
index 595e4f7..5374c5b 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>

@@ -2458,6 +2458,7 @@
     <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" />

@@ -2502,14 +2503,19 @@
     <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\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\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" />

@@ -2597,6 +2603,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 +2619,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" />

@@ -2632,14 +2638,17 @@
     <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\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\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/lib/libcurl.vcxproj b/projects/Windows/VC12/lib/libcurl.vcxproj
index 2321d70..d4403ab 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>

@@ -2458,6 +2458,7 @@
     <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" />

@@ -2502,14 +2503,19 @@
     <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\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\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" />

@@ -2597,6 +2603,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 +2619,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" />

@@ -2632,14 +2638,17 @@
     <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\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\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/lib/libcurl.vcxproj b/projects/Windows/VC14/lib/libcurl.vcxproj
index b57db7a..78e1e47 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>

@@ -2458,6 +2458,7 @@
     <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" />

@@ -2502,14 +2503,19 @@
     <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\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\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" />

@@ -2597,6 +2603,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 +2619,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" />

@@ -2632,14 +2638,17 @@
     <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\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\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/lib/libcurl.vcxproj b/projects/Windows/VC15/lib/libcurl.vcxproj
index 1a19d32..b511472 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>

@@ -2430,6 +2430,7 @@
     <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" />

@@ -2474,14 +2475,19 @@
     <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\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\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" />

@@ -2569,6 +2575,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 +2591,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" />

@@ -2604,14 +2610,17 @@
     <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\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\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/VC6/lib/libcurl.dsp b/projects/Windows/VC6/lib/libcurl.dsp
index cd7bcd9..9c15344 100644
--- a/projects/Windows/VC6/lib/libcurl.dsp
+++ b/projects/Windows/VC6/lib/libcurl.dsp
@@ -1046,6 +1046,10 @@
 # End Source File

 # Begin Source File

 

+SOURCE=..\..\..\..\lib\rename.c

+# End Source File

+# Begin Source File

+

 SOURCE=..\..\..\..\lib\rtsp.c

 # End Source File

 # Begin Source File

@@ -1222,6 +1226,30 @@
 # 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\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

@@ -1234,6 +1262,10 @@
 # End Source File

 # Begin Source File

 

+SOURCE=..\..\..\..\lib\vtls\mbedtls_threadlock.c

+# End Source File

+# Begin Source File

+

 SOURCE=..\..\..\..\lib\vtls\mesalink.c

 # End Source File

 # Begin Source File

@@ -1246,14 +1278,6 @@
 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\..\lib\vtls\polarssl.c

-# End Source File

-# Begin Source File

-

-SOURCE=..\..\..\..\lib\vtls\polarssl_threadlock.c

-# End Source File

-# Begin Source File

-

 SOURCE=..\..\..\..\lib\vtls\schannel.c

 # End Source File

 # Begin Source File

@@ -1598,6 +1622,10 @@
 # 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 +1686,6 @@
 # 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

@@ -1738,6 +1762,22 @@
 # 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\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

@@ -1750,6 +1790,10 @@
 # End Source File

 # Begin Source File

 

+SOURCE=..\..\..\..\lib\vtls\mbedtls_threadlock.h

+# End Source File

+# Begin Source File

+

 SOURCE=..\..\..\..\lib\vtls\mesalink.h

 # End Source File

 # Begin Source File

@@ -1762,14 +1806,6 @@
 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\..\lib\vtls\polarssl.h

-# End Source File

-# Begin Source File

-

-SOURCE=..\..\..\..\lib\vtls\polarssl_threadlock.h

-# End Source File

-# Begin Source File

-

 SOURCE=..\..\..\..\lib\vtls\schannel.h

 # End Source File

 # Begin Source File

diff --git a/projects/Windows/VC7.1/lib/libcurl.vcproj b/projects/Windows/VC7.1/lib/libcurl.vcproj
index 9b35114..5471cd1 100644
--- a/projects/Windows/VC7.1/lib/libcurl.vcproj
+++ b/projects/Windows/VC7.1/lib/libcurl.vcproj
@@ -1493,6 +1493,9 @@
 				RelativePath="..\..\..\..\lib\rand.c">

 			</File>

 			<File

+				RelativePath="..\..\..\..\lib\rename.c">

+			</File>

+			<File

 				RelativePath="..\..\..\..\lib\rtsp.c">

 			</File>

 			<File

@@ -1833,6 +1836,9 @@
 				RelativePath="..\..\..\..\lib\rand.h">

 			</File>

 			<File

+				RelativePath="..\..\..\..\lib\rename.h">

+			</File>

+			<File

 				RelativePath="..\..\..\..\lib\rtsp.h">

 			</File>

 			<File

@@ -1878,9 +1884,6 @@
 				RelativePath="..\..\..\..\lib\splay.h">

 			</File>

 			<File

-				RelativePath="..\..\..\..\lib\ssh.h">

-			</File>

-			<File

 				RelativePath="..\..\..\..\lib\strcase.h">

 			</File>

 			<File

@@ -1994,12 +1997,63 @@
 			</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>

+			</Filter>

+			<Filter

+				Name="Header Files"

+				Filter="">

+				<File

+					RelativePath="..\..\..\..\lib\vquic\ngtcp2.h">

+				</File>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\quiche.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

@@ -2009,6 +2063,9 @@
 					RelativePath="..\..\..\..\lib\vtls\mbedtls.c">

 				</File>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.c">

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\mesalink.c">

 				</File>

 				<File

@@ -2018,12 +2075,6 @@
 					RelativePath="..\..\..\..\lib\vtls\openssl.c">

 				</File>

 				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl.c">

-				</File>

-				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.c">

-				</File>

-				<File

 					RelativePath="..\..\..\..\lib\vtls\schannel.c">

 				</File>

 				<File

@@ -2043,6 +2094,9 @@
 				Name="Header Files"

 				Filter="">

 				<File

+					RelativePath="..\..\..\..\lib\vtls\bearssl.h">

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\gskit.h">

 				</File>

 				<File

@@ -2052,6 +2106,9 @@
 					RelativePath="..\..\..\..\lib\vtls\mbedtls.h">

 				</File>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.h">

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\mesalink.h">

 				</File>

 				<File

@@ -2061,12 +2118,6 @@
 					RelativePath="..\..\..\..\lib\vtls\openssl.h">

 				</File>

 				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl.h">

-				</File>

-				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.h">

-				</File>

-				<File

 					RelativePath="..\..\..\..\lib\vtls\schannel.h">

 				</File>

 				<File

diff --git a/projects/Windows/VC7/lib/libcurl.vcproj b/projects/Windows/VC7/lib/libcurl.vcproj
index ce38525..6900385 100644
--- a/projects/Windows/VC7/lib/libcurl.vcproj
+++ b/projects/Windows/VC7/lib/libcurl.vcproj
@@ -1347,6 +1347,9 @@
 				RelativePath="..\..\..\..\lib\rand.c">

 			</File>

 			<File

+				RelativePath="..\..\..\..\lib\rename.c">

+			</File>

+			<File

 				RelativePath="..\..\..\..\lib\rtsp.c">

 			</File>

 			<File

@@ -1687,6 +1690,9 @@
 				RelativePath="..\..\..\..\lib\rand.h">

 			</File>

 			<File

+				RelativePath="..\..\..\..\lib\rename.h">

+			</File>

+			<File

 				RelativePath="..\..\..\..\lib\rtsp.h">

 			</File>

 			<File

@@ -1732,9 +1738,6 @@
 				RelativePath="..\..\..\..\lib\splay.h">

 			</File>

 			<File

-				RelativePath="..\..\..\..\lib\ssh.h">

-			</File>

-			<File

 				RelativePath="..\..\..\..\lib\strcase.h">

 			</File>

 			<File

@@ -1848,12 +1851,63 @@
 			</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>

+			</Filter>

+			<Filter

+				Name="Header Files"

+				Filter="">

+				<File

+					RelativePath="..\..\..\..\lib\vquic\ngtcp2.h">

+				</File>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\quiche.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

@@ -1863,6 +1917,9 @@
 					RelativePath="..\..\..\..\lib\vtls\mbedtls.c">

 				</File>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.c">

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\mesalink.c">

 				</File>

 				<File

@@ -1872,12 +1929,6 @@
 					RelativePath="..\..\..\..\lib\vtls\openssl.c">

 				</File>

 				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl.c">

-				</File>

-				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.c">

-				</File>

-				<File

 					RelativePath="..\..\..\..\lib\vtls\schannel.c">

 				</File>

 				<File

@@ -1897,6 +1948,9 @@
 				Name="Header Files"

 				Filter="">

 				<File

+					RelativePath="..\..\..\..\lib\vtls\bearssl.h">

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\gskit.h">

 				</File>

 				<File

@@ -1906,6 +1960,9 @@
 					RelativePath="..\..\..\..\lib\vtls\mbedtls.h">

 				</File>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.h">

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\mesalink.h">

 				</File>

 				<File

@@ -1915,12 +1972,6 @@
 					RelativePath="..\..\..\..\lib\vtls\openssl.h">

 				</File>

 				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl.h">

-				</File>

-				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.h">

-				</File>

-				<File

 					RelativePath="..\..\..\..\lib\vtls\schannel.h">

 				</File>

 				<File

diff --git a/projects/Windows/VC8/lib/libcurl.vcproj b/projects/Windows/VC8/lib/libcurl.vcproj
index d572cc8..4d35c00 100644
--- a/projects/Windows/VC8/lib/libcurl.vcproj
+++ b/projects/Windows/VC8/lib/libcurl.vcproj
@@ -3933,6 +3933,10 @@
 			>

 			</File>

 			<File

+				RelativePath="..\..\..\..\lib\rename.c"

+			>

+			</File>

+			<File

 				RelativePath="..\..\..\..\lib\rtsp.c"

 			>

 			</File>

@@ -4385,6 +4389,10 @@
 			>

 			</File>

 			<File

+				RelativePath="..\..\..\..\lib\rename.h"

+			>

+			</File>

+			<File

 				RelativePath="..\..\..\..\lib\rtsp.h"

 			>

 			</File>

@@ -4445,10 +4453,6 @@
 			>

 			</File>

 			<File

-				RelativePath="..\..\..\..\lib\ssh.h"

-			>

-			</File>

-			<File

 				RelativePath="..\..\..\..\lib\strcase.h"

 			>

 			</File>

@@ -4594,12 +4598,72 @@
 			</Filter>

 		</Filter>

 		<Filter

+			Name="vquic"

+			>

+			<Filter

+				Name="Source Files"

+				>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\ngtcp2.c"

+				>

+				</File>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\quiche.c"

+				>

+				</File>

+			</Filter>

+			<Filter

+				Name="Header Files"

+				>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\ngtcp2.h"

+				>

+				</File>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\quiche.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>

@@ -4612,6 +4676,10 @@
 				>

 				</File>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.c"

+				>

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\mesalink.c"

 				>

 				</File>

@@ -4624,14 +4692,6 @@
 				>

 				</File>

 				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl.c"

-				>

-				</File>

-				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.c"

-				>

-				</File>

-				<File

 					RelativePath="..\..\..\..\lib\vtls\schannel.c"

 				>

 				</File>

@@ -4656,6 +4716,10 @@
 				Name="Header Files"

 				>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\bearssl.h"

+				>

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\gskit.h"

 				>

 				</File>

@@ -4668,6 +4732,10 @@
 				>

 				</File>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.h"

+				>

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\mesalink.h"

 				>

 				</File>

@@ -4680,14 +4748,6 @@
 				>

 				</File>

 				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl.h"

-				>

-				</File>

-				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.h"

-				>

-				</File>

-				<File

 					RelativePath="..\..\..\..\lib\vtls\schannel.h"

 				>

 				</File>

diff --git a/projects/Windows/VC9/lib/libcurl.vcproj b/projects/Windows/VC9/lib/libcurl.vcproj
index 77c2e8b..65f70ae 100644
--- a/projects/Windows/VC9/lib/libcurl.vcproj
+++ b/projects/Windows/VC9/lib/libcurl.vcproj
@@ -3874,6 +3874,10 @@
 			>

 			</File>

 			<File

+				RelativePath="..\..\..\..\lib\rename.c"

+			>

+			</File>

+			<File

 				RelativePath="..\..\..\..\lib\rtsp.c"

 			>

 			</File>

@@ -4326,6 +4330,10 @@
 			>

 			</File>

 			<File

+				RelativePath="..\..\..\..\lib\rename.h"

+			>

+			</File>

+			<File

 				RelativePath="..\..\..\..\lib\rtsp.h"

 			>

 			</File>

@@ -4386,10 +4394,6 @@
 			>

 			</File>

 			<File

-				RelativePath="..\..\..\..\lib\ssh.h"

-			>

-			</File>

-			<File

 				RelativePath="..\..\..\..\lib\strcase.h"

 			>

 			</File>

@@ -4535,12 +4539,72 @@
 			</Filter>

 		</Filter>

 		<Filter

+			Name="vquic"

+			>

+			<Filter

+				Name="Source Files"

+				>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\ngtcp2.c"

+				>

+				</File>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\quiche.c"

+				>

+				</File>

+			</Filter>

+			<Filter

+				Name="Header Files"

+				>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\ngtcp2.h"

+				>

+				</File>

+				<File

+					RelativePath="..\..\..\..\lib\vquic\quiche.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>

@@ -4553,6 +4617,10 @@
 				>

 				</File>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.c"

+				>

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\mesalink.c"

 				>

 				</File>

@@ -4565,14 +4633,6 @@
 				>

 				</File>

 				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl.c"

-				>

-				</File>

-				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.c"

-				>

-				</File>

-				<File

 					RelativePath="..\..\..\..\lib\vtls\schannel.c"

 				>

 				</File>

@@ -4597,6 +4657,10 @@
 				Name="Header Files"

 				>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\bearssl.h"

+				>

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\gskit.h"

 				>

 				</File>

@@ -4609,6 +4673,10 @@
 				>

 				</File>

 				<File

+					RelativePath="..\..\..\..\lib\vtls\mbedtls_threadlock.h"

+				>

+				</File>

+				<File

 					RelativePath="..\..\..\..\lib\vtls\mesalink.h"

 				>

 				</File>

@@ -4621,14 +4689,6 @@
 				>

 				</File>

 				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl.h"

-				>

-				</File>

-				<File

-					RelativePath="..\..\..\..\lib\vtls\polarssl_threadlock.h"

-				>

-				</File>

-				<File

 					RelativePath="..\..\..\..\lib\vtls\schannel.h"

 				>

 				</File>

diff --git a/projects/checksrc.bat b/projects/checksrc.bat
index 54c976a..2ca90d0 100644
--- a/projects/checksrc.bat
+++ b/projects/checksrc.bat
@@ -6,7 +6,7 @@
 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 @@
   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 @@
   )
 
 :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 @@
       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 32a88f5..9aa0633 100644
--- a/projects/generate.bat
+++ b/projects/generate.bat
@@ -303,6 +303,14 @@
       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 +327,7 @@
 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 +335,10 @@
   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/src/CMakeLists.txt b/src/CMakeLists.txt
index 63e2b94..054541e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -46,6 +46,12 @@
   ${CURL_FILES}
   )
 
+if(CURL_HAS_LTO)
+  set_target_properties(${EXE_NAME} PROPERTIES
+    INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE
+    INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE)
+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})
diff --git a/src/slist_wc.c b/src/slist_wc.c
index 5233b1b..da25632 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 9bd6993..54f871b 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 f700156..b88a0fd 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 07b7ffe..1ff0f76 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 761192f..6014c6b 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 66e7c17..dfde589 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.h b/src/tool_cb_dbg.h
index 433e746..8883bb1 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 b0880f1..3b10238 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 @@
   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 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 @@
    * 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,57 @@
   }
 
   /*
+   * Write etag to file when --etag-save option is given.
+   * etag string that we want is enveloped in double quotes
+   */
+  if(per->config->etag_save_file && etag_save->stream) {
+    /* match only header that start with etag (case insensitive) */
+    if(curl_strnequal(str, "etag:", 5)) {
+      char *etag_h = NULL;
+      char *first = NULL;
+      char *last = NULL;
+      size_t etag_length = 0;
+
+      etag_h = ptr;
+      /* point to first occurrence of double quote */
+      first = memchr(etag_h, '\"', cb);
+
+      /*
+       * if server side messed with the etag header and doesn't include
+       * double quotes around the etag, kindly exit with a warning
+       */
+
+      if(!first) {
+        warnf(per->config->global,
+              "\nReceived header etag is missing double quote/s\n");
+        return 1;
+      }
+      else {
+        /* discard first double quote */
+        first++;
+      }
+
+      /* point to last occurrence of double quote */
+      last = memchr(first, '\"', cb);
+
+      if(!last) {
+        warnf(per->config->global,
+              "\nReceived header etag is missing double quote/s\n");
+        return 1;
+      }
+
+      /* get length of desired etag */
+      etag_length = (size_t)last - (size_t)first;
+
+      fwrite(first, size, etag_length, etag_save->stream);
+      /* terminate with new line */
+      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
@@ -143,7 +195,7 @@
           /* 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",
+            warnf(per->config->global, "Failed to rename %s -> %s: %s\n",
                   outs->filename, filename, strerror(errno));
           }
           if(outs->alloc_filename)
@@ -159,12 +211,12 @@
         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;
   }
 
@@ -174,7 +226,7 @@
     /* 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 cf544df..ec5772f 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 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 a18827c..aad451b 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 @@
   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 @@
      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 @@
   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 @@
       }
     }
 #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 8a33c84..78a169f 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 @@
   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 475f0b1..5f7e483 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 891dc45..99be273 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 - 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_see.h b/src/tool_cb_see.h
index ff8de0e..fed8bbf 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 - 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_wrt.c b/src/tool_cb_wrt.c
index 0f47b4d..ed10891 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
@@ -33,11 +33,14 @@
 #include "memdebug.h" /* keep this as LAST include */
 
 /* 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;
+  struct GlobalConfig *global;
   FILE *file;
-
+  DEBUGASSERT(outs);
+  DEBUGASSERT(config);
+  global = config->global;
   if(!outs->filename || !*outs->filename) {
     warnf(global, "Remote filename has no length!\n");
     return FALSE;
@@ -78,7 +81,7 @@
   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 +150,7 @@
   }
 #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 188d3ea..e49d8f3 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 efa8c50..f802a5a 100644
--- a/src/tool_cfgable.c
+++ b/src/tool_cfgable.c
@@ -128,6 +128,8 @@
   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 7232c35..e093b2c 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
@@ -108,6 +108,7 @@
   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,6 +157,8 @@
   char *pubkey;
   char *hostpubmd5;
   char *engine;
+  char *etag_save_file;
+  char *etag_compare_file;
   bool crlf;
   char *customrequest;
   char *krblevel;
@@ -300,6 +303,7 @@
 #endif
   bool parallel;
   long parallel_max;
+  bool parallel_connect;
   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 27b4ce9..6d78ecf 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 06b3c03..320fb36 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 @@
   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 @@
       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 011a577..96fae9e 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 779a3cb..221e386 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
@@ -38,33 +38,6 @@
 
 #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 +52,9 @@
 #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
@@ -724,6 +697,32 @@
   return slist;
 }
 
+LARGE_INTEGER Curl_freq;
+bool Curl_isVistaOrGreater;
+
+CURLcode win32_init(void)
+{
+  OSVERSIONINFOEXA osvi;
+  unsigned __int64 mask = 0;
+  unsigned char op = VER_GREATER_EQUAL;
+
+  memset(&osvi, 0, sizeof(osvi));
+  osvi.dwOSVersionInfoSize = sizeof(osvi);
+  osvi.dwMajorVersion = 6;
+  VER_SET_CONDITION(mask, VER_MAJORVERSION, op);
+  VER_SET_CONDITION(mask, VER_MINORVERSION, op);
+
+  if(VerifyVersionInfoA(&osvi, (VER_MAJORVERSION | VER_MINORVERSION), mask))
+    Curl_isVistaOrGreater = true;
+  else if(GetLastError() == ERROR_OLD_WIN_VERSION)
+    Curl_isVistaOrGreater = false;
+  else
+    return CURLE_FAILED_INIT;
+
+  QueryPerformanceFrequency(&Curl_freq);
+  return CURLE_OK;
+}
+
 #endif /* WIN32 */
 
 #endif /* MSDOS || WIN32 */
diff --git a/src/tool_doswin.h b/src/tool_doswin.h
index 415fac2..d1649d1 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
@@ -61,6 +61,7 @@
                          curl_sslbackend backend,
                          const char *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 cb30e40..bb1a135 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 - 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
@@ -123,7 +123,7 @@
   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_getparam.c b/src/tool_getparam.c
index 3882cb9..764caa2 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 */
@@ -268,9 +268,12 @@
   {"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},
   {"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},
@@ -321,6 +324,7 @@
   {"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 +422,7 @@
       /* 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;
@@ -1206,7 +1210,10 @@
         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! */
@@ -1271,7 +1278,10 @@
     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] == '@') {
@@ -1696,6 +1706,14 @@
           config->socks5_auth &= ~CURLAUTH_GSSAPI;
         break;
 
+      case 'C':
+        GetStr(&config->etag_save_file, nextarg);
+        break;
+
+      case 'D':
+        GetStr(&config->etag_compare_file, nextarg);
+        break;
+
       default: /* unknown flag */
         return PARAM_OPTION_UNKNOWN;
       }
@@ -1708,6 +1726,9 @@
       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;
       }
@@ -1974,8 +1995,7 @@
       }
       {
         /* 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 +2174,9 @@
            (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 */
diff --git a/src/tool_help.c b/src/tool_help.c
index 0229566..9ee99d1 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
@@ -131,6 +131,10 @@
    "EGD socket path for random data"},
   {"    --engine <name>",
    "Crypto engine to use"},
+  {"    --etag-save <file>",
+   "Get an ETag from response header and save it to a FILE"},
+  {"    --etag-compare <file>",
+   "Get an ETag from a file and send a conditional request"},
   {"    --expect100-timeout <seconds>",
    "How long to wait for 100-continue"},
   {"-f, --fail",
@@ -235,6 +239,8 @@
    "Mail from this address"},
   {"    --mail-rcpt <address>",
    "Mail to this address"},
+  {"    --mail-rcpt-allowfails",
+   "Allow RCPT TO command to fail for some recipients"},
   {"-M, --manual",
    "Display the full manual"},
   {"    --max-filesize <bytes>",
@@ -279,6 +285,8 @@
    "Write to file instead of stdout"},
   {"-Z, --parallel",
    "Perform transfers in parallel"},
+  {"    --parallel-immediate",
+   "Do not wait for multiplexing (with --parallel)"},
   {"    --parallel-max",
    "Maximum concurrency for parallel transfers"},
   {"    --pass <phrase>",
diff --git a/src/tool_helpers.h b/src/tool_helpers.h
index 33483eb..67d28be 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 483553d..719ff6a 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,38 +25,23 @@
 #  include <pwd.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 */
@@ -64,11 +49,11 @@
 {
   char *home;
 
-  home = GetEnv("CURL_HOME", FALSE);
+  home = GetEnv("CURL_HOME");
   if(home)
     return home;
 
-  home = GetEnv("HOME", FALSE);
+  home = GetEnv("HOME");
   if(home)
     return home;
 
@@ -86,10 +71,18 @@
  }
 #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 98d94b8..1f9d54a 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 - 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_hugehelp.c b/src/tool_hugehelp.c
index 1a4c498..d0f091a 100644
--- a/src/tool_hugehelp.c
+++ b/src/tool_hugehelp.c
@@ -173,8 +173,8 @@
 "              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"
@@ -187,7 +187,7 @@
 "              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"
+"              from all the files but the last one will be used for saving.\n"
 "\n"
 "              Added in 7.64.1.\n"
 "\n"
@@ -630,6 +630,7 @@
 "              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"
+"              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"
@@ -638,9 +639,9 @@
 "\n"
 "              (SMTP added in 7.40.0)\n"
 "\n"
-"       --crlfile <file>\n"
 , stdout);
  fputs(
+"       --crlfile <file>\n"
 "              (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"
@@ -653,9 +654,9 @@
 "              (HTTP) This is just an alias for -d, --data.\n"
 "\n"
 "       --data-binary <data>\n"
-"              (HTTP)  This  posts data exactly as specified with no extra pro-\n"
 , stdout);
  fputs(
+"              (HTTP)  This  posts data exactly as specified with no extra pro-\n"
 "              cessing whatsoever.\n"
 "\n"
 "              If you start the data with the letter @, the rest  should  be  a\n"
@@ -664,9 +665,9 @@
 "              and conversions are never done.\n"
 "\n"
 "              Like  -d,  --data the default content-type sent to the server is\n"
-"              application/x-www-form-urlencoded. If you want the  data  to  be\n"
 , stdout);
  fputs(
+"              application/x-www-form-urlencoded. If you want the  data  to  be\n"
 "              treated as arbitrary binary data by the server then set the con-\n"
 "              tent-type to octet-stream: -H \"Content-Type:  application/octet-\n"
 "              stream\".\n"
@@ -675,11 +676,11 @@
 "              first will append data as described in -d, --data.\n"
 "\n"
 "       --data-raw <data>\n"
+, stdout);
+ fputs(
 "              (HTTP) This posts data similarly to -d, --data but  without  the\n"
 "              special interpretation of the @ character.\n"
 "\n"
-, stdout);
- fputs(
 "              See also -d, --data. Added in 7.43.0.\n"
 "\n"
 "       --data-urlencode <data>\n"
@@ -687,23 +688,23 @@
 "              with the exception that this performs URL-encoding.\n"
 "\n"
 "              To be CGI-compliant, the <data> part should begin  with  a  name\n"
+, stdout);
+ fputs(
 "              followed  by a separator and a content specification. The <data>\n"
 "              part can be passed to curl using one of the following syntaxes:\n"
 "\n"
 "              content\n"
-, stdout);
- fputs(
 "                     This will make curl URL-encode the content and pass  that\n"
 "                     on.  Just  be careful so that the content doesn't contain\n"
 "                     any = or @ symbols, as that will  then  make  the  syntax\n"
 "                     match one of the other cases below!\n"
 "\n"
 "              =content\n"
+, stdout);
+ fputs(
 "                     This  will make curl URL-encode the content and pass that\n"
 "                     on. The preceding = symbol is not included in the data.\n"
 "\n"
-, stdout);
- fputs(
 "              name=content\n"
 "                     This will make curl URL-encode the content part and  pass\n"
 "                     that  on.  Note that the name part is expected to be URL-\n"
@@ -711,213 +712,214 @@
 "\n"
 "              @filename\n"
 "                     This will make curl load data from the  given  file  (in-\n"
+, stdout);
+ fputs(
 "                     cluding  any  newlines), URL-encode that data and pass it\n"
 "                     on in the POST.\n"
 "\n"
 "              name@filename\n"
-, stdout);
- fputs(
 "                     This will make curl load data from the  given  file  (in-\n"
 "                     cluding  any  newlines), URL-encode that data and pass it\n"
 "                     on in the POST. The name part  gets  an  equal  sign  ap-\n"
 "                     pended,  resulting  in name=urlencoded-file-content. Note\n"
+, stdout);
+ fputs(
 "                     that the name is expected to be URL-encoded already.\n"
 "       See also -d, --data and --data-raw. Added in 7.18.0.\n"
 "\n"
 "       -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"
 "              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"
+, stdout);
+ fputs(
 "              application/x-www-form-urlencoded.  Compare to -F, --form.\n"
 "\n"
 "              --data-raw is almost the same but does not have a special inter-\n"
-, stdout);
- fputs(
 "              pretation  of  the  @ character. To post data purely binary, you\n"
 "              should instead use the --data-binary option.  To URL-encode  the\n"
 "              value of a form field you may use --data-urlencode.\n"
 "\n"
 "              If  any of these options is used more than once on the same com-\n"
-"              mand line, the data pieces specified  will  be  merged  together\n"
-"              with  a  separating  &-symbol.  Thus,  using  '-d name=daniel -d\n"
 , stdout);
  fputs(
+"              mand line, the data pieces specified  will  be  merged  together\n"
+"              with  a  separating  &-symbol.  Thus,  using  '-d name=daniel -d\n"
 "              skill=lousy'  would  generate  a  post  chunk  that  looks  like\n"
 "              'name=daniel&skill=lousy'.\n"
 "\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"
 , 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"
+"              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"
+"              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"
+, stdout);
+ fputs(
+"              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"
+, stdout);
+ fputs(
 "                     realm policy.\n"
 "\n"
 "              always Unconditionally allow the server to delegate.\n"
 "\n"
 "       --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"
-"              used.\n"
-"\n"
-"              See  also  -u, --user and --proxy-digest and --anyauth. This op-\n"
+"              If  this  option  is  used  several times, only the first one is\n"
 , stdout);
  fputs(
+"              used.\n"
+"\n"
+"              See also -u, --user and --proxy-digest and --anyauth.  This  op-\n"
 "              tion 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"
 , stdout);
  fputs(
+"              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"
 "              servers, but they enable more functionality in a better way than\n"
 "              the traditional PORT command.\n"
 "\n"
 "              --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"
-"              effect as EPRT is necessary then.\n"
-"\n"
-"              Disabling EPRT only changes the active behavior. If you want  to\n"
+"              If the server is accessed using IPv6, this option will  have  no\n"
 , stdout);
  fputs(
-"              switch  to  passive  mode  you need to not use -P, --ftp-port or\n"
+"              effect as EPRT is necessary then.\n"
+"\n"
+"              Disabling  EPRT only changes the active behavior. If you want to\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"
+, stdout);
+ fputs(
+"              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"
-, stdout);
- 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"
+, stdout);
+ fputs(
 "              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"
-, stdout);
- fputs(
+"              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"
 "              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"
 , stdout);
  fputs(
-"              not  affect  DNS). The supplied string must be an interface name\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"
+"              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"
+, stdout);
+ fputs(
 "\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"
-, stdout);
- fputs(
+"              quests, so that the DNS requests originate  from  this  address.\n"
 "              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"
 , stdout);
  fputs(
+"              (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"
 "              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"
 , stdout);
  fputs(
+"              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"
 "              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"
-"              mechanism. The URL must be HTTPS.\n"
-"\n"
 , stdout);
  fputs(
+"              (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"
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "              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"
 , stdout);
  fputs(
-"              --cookie option! The -c, --cookie-jar option is a better way  to\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"
+"              --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"
+, stdout);
+ fputs(
+"              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"
@@ -925,216 +927,254 @@
 "              See also -o, --output.\n"
 "\n"
 "       --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"
+, stdout);
+ fputs(
 "              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"
-, stdout);
- fputs(
+"              engines. Note that not all (or  none)  of  the  engines  may  be\n"
 "              available at run-time.\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"
+"       --etag-compare <file>\n"
+"              (HTTP) This option makes a conditional HTTP request for the spe-\n"
+, stdout);
+ fputs(
+"              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"
+"              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"
+, stdout);
+ fputs(
+"              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"
+"              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"
+, stdout);
+ fputs(
+"              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"
+"              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"
 , stdout);
  fputs(
+"       --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"
 "              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"
-"              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(
+"              Fail and exit on the first detected transfer error.\n"
+"\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"
 "              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"
+, stdout);
+ fputs(
+"              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"
 "              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"
+, stdout);
+ fputs(
+"              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"
 "              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"
 , 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"
+"              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"
 , stdout);
  fputs(
-"              This is currently only implemented in the NSS and Secure  Trans-\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"
+"              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"
 , stdout);
  fputs(
+"       --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"
 "              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"
+, stdout);
+ fputs(
 "              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"
+, stdout);
+ fputs(
 "              field from a file.\n"
 "\n"
-"              Tell curl to read content from stdin instead of a file by  using\n"
-, stdout);
- fputs(
+"              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"
-"               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"
-"\n"
 , stdout);
  fputs(
+"               curl -F profile=@portrait.jpg https://example.com/upload.cgi\n"
+"\n"
+"              Example:  send your name and shoe size in two text fields to the\n"
+"              server:\n"
+"\n"
 "               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"
+, stdout);
+ fputs(
 "                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"
+"              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 +1184,75 @@
 "                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 +1261,41 @@
 "       --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 +1303,17 @@
 "              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 +1324,20 @@
 "              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 +1345,28 @@
 , 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 +1376,9 @@
 "              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 +1386,9 @@
 "              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 +1396,44 @@
 "       -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 +1441,51 @@
 "              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,23 +1499,23 @@
 "\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"
+"              Usage help. This lists all current command line options  with  a\n"
 "              short description.\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"
+"              (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"
@@ -1486,8 +1526,8 @@
  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"
+"              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"
@@ -1496,7 +1536,7 @@
 "       -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"
@@ -1504,16 +1544,16 @@
 "       --http1.1\n"
 "              (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"
 , 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"
+"              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"
 "              version in the TLS handshake.\n"
 "\n"
 "              --http2-prior-knowledge requires that the underlying libcurl was\n"
@@ -1527,25 +1567,25 @@
 "\n"
 "              See also --http1.1 and --http3. --http2 requires that the under-\n"
 "              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"
 , stdout);
  fputs(
-"              Tells curl to use HTTP version 3 directly to the host  and  port\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"
-"              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"
+"              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"
+"              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"
@@ -1554,19 +1594,19 @@
 "              edge. Added in 7.66.0.\n"
 "\n"
 "       --ignore-content-length\n"
-"              (FTP  HTTP)  For HTTP, Ignore the Content-Length header. This is\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"
+"              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"
+"              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"
+"              Include the HTTP response headers in the output.  The  HTTP  re-\n"
+"              sponse  headers  can  include  things like server name, cookies,\n"
 , stdout);
  fputs(
 "              date of the document, HTTP version and more...\n"
@@ -1577,13 +1617,13 @@
 "\n"
 "       -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"
 "              See this online resource for further details:\n"
@@ -1592,18 +1632,18 @@
 "\n"
 "       --interface <name>\n"
 "\n"
-"              Perform  an operation using a specified interface. You can enter\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"
+"              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"
+"              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(
 "              tion/networking/vrf.txt\n"
@@ -1611,26 +1651,26 @@
 "              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"
 "              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"
 "              (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);
@@ -1638,11 +1678,11 @@
 "              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"
+"              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"
+"              (meaning  Linux, recent AIX, HP-UX and more). This option has no\n"
 , stdout);
  fputs(
 "              effect if --no-keepalive is used.\n"
@@ -1653,8 +1693,8 @@
 "              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);
@@ -1663,18 +1703,18 @@
 "\n"
 "       --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"
 , 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);
@@ -1682,23 +1722,23 @@
 "              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"
+"              (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"
+"              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);
@@ -1706,19 +1746,19 @@
 "              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"
 "              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"
 , 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"
+"              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"
@@ -1727,89 +1767,92 @@
 "              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"
+"              (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"
 , stdout);
  fputs(
 "              to the server instead of LIST.\n"
 "\n"
-"              Note:  Some  FTP  servers  list  only files in their response to\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"
+"              (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"
 , stdout);
  fputs(
 "              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"
 "              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"
 "\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"
 , 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"
+"              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"
 "              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"
 , 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"
+"              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"
 , 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"
+"              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"
 , stdout);
  fputs(
-"              tion-trusted on how to change this. You can limit the amount  of\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"
-"              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"
+"              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"
 , stdout);
  fputs(
-"              quest using the same unmodified method.\n"
+"              You can tell curl to not change POST requests to GET after a 30x\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"
 "              authentication.\n"
 "\n"
-"              You can use the login options to specify protocol  specific  op-\n"
 , stdout);
  fputs(
+"              You can use the login options to specify protocol  specific  op-\n"
 "              tions  that  may  be used during authentication. At present only\n"
 "              IMAP, POP3 and SMTP support login options. For more  information\n"
 "              about  the  login options please see RFC 2384, RFC 5092 and IETF\n"
@@ -1819,9 +1862,9 @@
 "\n"
 "              Added in 7.34.0.\n"
 "\n"
-"       --mail-auth <address>\n"
 , stdout);
  fputs(
+"       --mail-auth <address>\n"
 "              (SMTP) Specify a single address. This will be  used  to  specify\n"
 "              the  authentication  address  (identity)  of a submitted message\n"
 "              that is being relayed to another server.\n"
@@ -1832,23 +1875,40 @@
 "              (SMTP) Specify a single address that the given mail  should  get\n"
 "              sent from.\n"
 "\n"
-"              See also --mail-rcpt and --mail-auth. Added in 7.20.0.\n"
-"\n"
 , stdout);
  fputs(
+"              See also --mail-rcpt and --mail-auth. Added in 7.20.0.\n"
+"\n"
+"       --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"
+, stdout);
+ fputs(
+"              and proceed with the remaining valid recipients.\n"
+"\n"
+"              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"
+, stdout);
+ fputs(
 "              When performing a mail transfer, the recipient should specify  a\n"
 "              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"
+, stdout);
+ fputs(
 "              ient should be specified using the mailing list  name,  such  as\n"
 "              \"Friends\" or \"London-Office\".  (Added in 7.34.0)\n"
 "\n"
@@ -1858,21 +1918,21 @@
 "              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 +1940,21 @@
 "\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,57 +1963,57 @@
 "              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"
@@ -1961,12 +2021,12 @@
 "       --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 +2035,22 @@
 "              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 +2058,20 @@
 "              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 +2081,10 @@
 "\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 +2092,10 @@
 "\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 +2103,66 @@
 "              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 +2170,22 @@
 "       --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,30 +2193,28 @@
 "              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"
 "       -o, --output <file>\n"
+, stdout);
+ fputs(
 "              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"
-, stdout);
- fputs(
 "              with the current string for the URL being fetched. Like in:\n"
 "\n"
 "               curl http://{one,two}.example.com -o \"file_#1.txt\"\n"
@@ -2165,32 +2223,44 @@
 "\n"
 "               curl http://{site,host}.host[1-5].com -o \"#1_#2\"\n"
 "\n"
+, stdout);
+ fputs(
 "              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(
 "                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"
 "              just  that  the  first -o is for the first URL and so on, so the\n"
 "              above command line can also be written as\n"
 "\n"
+, stdout);
+ fputs(
 "                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(
 "              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"
 "\n"
+"       --parallel-immediate\n"
+"              When  doing  parallel  transfers, this option will instruct curl\n"
+, stdout);
+ fputs(
+"              that it should rather prefer opening up more connections in par-\n"
+"              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"
+, stdout);
+ fputs(
 "              ously.\n"
 "\n"
 "              The default is 50.\n"
@@ -2198,9 +2268,7 @@
 "              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,144 +2279,146 @@
 "              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"
 , stdout);
  fputs(
+"              Tell  curl  to  not handle sequences of /../ or /./ in the given\n"
+"              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"
+, stdout);
+ fputs(
 "              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"
 "              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"
 , 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"
+"              lic key provided to this option, curl will abort the  connection\n"
 "              before sending or receiving any data.\n"
 "\n"
 "              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"
 "\n"
+, stdout);
+ fputs(
 "              If this option is used several times, the last one will be used.\n"
 "\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"
+"              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(
+"              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"
+"              7.17.1.\n"
+"\n"
+"       --post302\n"
+"              (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"
+, stdout);
+ fputs(
 "              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"
-"              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"
-, stdout);
- fputs(
-"              See  also  --post301  and --post303 and -L, --location. Added in\n"
+"              See also --post301 and --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"
+, stdout);
+ fputs(
+"              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"
+"              See also --post302 and --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"
+"              Use  the  specified  SOCKS proxy before connecting to an HTTP or\n"
+, stdout);
+ fputs(
+"              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"
+"              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"
 , stdout);
  fputs(
-"              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"
+"              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"
+"              If the port number is not specified in the proxy string,  it  is\n"
 "              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"
+"              ters such as @ by using %40 or pass in a colon with %3a.\n"
+"\n"
 , stdout);
  fputs(
-"              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"
-"              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"
 "\n"
 "              Added in 7.52.0.\n"
 "\n"
 "       -#, --progress-bar\n"
 "              Make curl display transfer progress as a simple progress bar in-\n"
-, stdout);
- 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"
+, stdout);
+ fputs(
+"              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"
-, stdout);
- fputs(
 "              Tells curl to use protocol for any URL missing a scheme name.\n"
 "\n"
 "              Example:\n"
 "\n"
 "               curl --proto-default https ftp.mozilla.org\n"
 "\n"
-"              An  unknown  or  unsupported  protocol causes error CURLE_UNSUP-\n"
+, stdout);
+ fputs(
+"              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);
- fputs(
 "              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"
+, stdout);
+ fputs(
+"              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"
@@ -2356,34 +2426,34 @@
 "               curl --proto-redir -all,http,https http://example.com\n"
 "\n"
 "              By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect\n"
+"              (7.65.2).  Older versions of curl allowed all protocols on redi-\n"
 , 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"
 "\n"
 "       --proto <protocols>\n"
+"              Tells  curl  to limit what protocols it may use in the transfer.\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"
+"              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"
 "                 ted (this is the default if no modifier is used).\n"
 "\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"
+, stdout);
+ fputs(
+"              =  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"
@@ -2391,39 +2461,39 @@
 "              --proto -ftps  uses the default protocols, but disables ftps\n"
 "\n"
 "              --proto -all,https,+http\n"
-, stdout);
- fputs(
 "                             only enables http and https\n"
 "\n"
 "              --proto =http,https\n"
+, stdout);
+ fputs(
 "                             also only enables http and https\n"
 "\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"
-, stdout);
- fputs(
 "       same as concatenating the protocols into one instance of the option.\n"
 "\n"
+, stdout);
+ fputs(
 "       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"
 "\n"
 "       --proxy-basic\n"
+"              Tells  curl  to use HTTP Basic authentication when communicating\n"
 , stdout);
  fputs(
-"              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"
@@ -2431,15 +2501,15 @@
 "       --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"
+"              See also  --proxy-capath  and  --cacert  and  --capath  and  -x,\n"
 "              --proxy. Added in 7.52.0.\n"
 "\n"
+, stdout);
+ fputs(
 "       --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 and -x, --proxy and --capath. Added in\n"
 "              7.52.0.\n"
 "\n"
 "       --proxy-cert-type <type>\n"
@@ -2448,13 +2518,13 @@
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-cert <cert[:passwd]>\n"
-, stdout);
- fputs(
 "              Same as -E, --cert but used in HTTPS proxy context.\n"
 "\n"
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-ciphers <list>\n"
+, stdout);
+ fputs(
 "              Same as --ciphers but used in HTTPS proxy context.\n"
 "\n"
 "              Added in 7.52.0.\n"
@@ -2465,45 +2535,45 @@
 "              Added in 7.52.0.\n"
 "\n"
 "       --proxy-digest\n"
-"              Tells  curl to use HTTP Digest authentication when communicating\n"
-, stdout);
- fputs(
+"              Tells curl to use HTTP Digest authentication when  communicating\n"
 "              with the given proxy. Use --digest for enabling HTTP Digest with\n"
 "              a remote host.\n"
 "\n"
+, stdout);
+ fputs(
 "              See also -x, --proxy and --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"
+"              cation  only  like  in CONNECT requests when you want a separate\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"
+"              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"
+"              Headers specified with this option will not be included  in  re-\n"
 , stdout);
  fputs(
-"              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);
- fputs(
 "              Added in 7.37.0.\n"
 "       --proxy-insecure\n"
+, stdout);
+ fputs(
 "              Same as -k, --insecure but used in HTTPS proxy context.\n"
 "\n"
 "              Added in 7.52.0.\n"
@@ -2517,7 +2587,7 @@
 "              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 +2596,7 @@
 "              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 +2610,18 @@
 "              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 +2629,7 @@
 , 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 +2640,18 @@
 "              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 +2681,20 @@
 "              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 +2704,7 @@
 "       -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 +2712,62 @@
 "              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,53 +2780,53 @@
  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"
 "              chgrp group file\n"
-"                     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"
+"                     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"
+"                     The  chmod  command  modifies  the  file mode bits of the\n"
 , stdout);
  fputs(
 "                     specified file. The mode operand is an octal integer mode\n"
@@ -2764,18 +2834,18 @@
 "\n"
 "              chown user file\n"
 "                     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"
+"                     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"
+"                     target_file location pointing to  the  source_file  loca-\n"
 "                     tion.\n"
 "\n"
 "              mkdir directory_name\n"
-"                     The mkdir command creates the directory named by the  di-\n"
+"                     The  mkdir command creates the directory named by the di-\n"
 "                     rectory_name operand.\n"
 "\n"
 "              pwd    The pwd command returns the absolute pathname of the cur-\n"
@@ -2785,7 +2855,7 @@
 , 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"
@@ -2793,7 +2863,7 @@
 "                     erand.\n"
 "\n"
 "              rmdir directory\n"
-"                     The  rmdir  command removes the directory entry specified\n"
+"                     The rmdir command removes the directory  entry  specified\n"
 , stdout);
  fputs(
 "                     by the directory operand, provided it is empty.\n"
@@ -2803,14 +2873,14 @@
 "\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"
 "              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"
@@ -2828,30 +2898,30 @@
 "              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"
+"              fields  of the 'start-stop' range syntax. If a non-digit charac-\n"
 , stdout);
  fputs(
 "              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"
+"              FTP  and  SFTP  range  downloads only support the simple 'start-\n"
 , stdout);
  fputs(
-"              stop'  syntax  (optionally with one of the numbers omitted). FTP\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"
 "              Added in 7.16.2.\n"
@@ -2861,9 +2931,9 @@
  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  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"
 , stdout);
@@ -2874,29 +2944,29 @@
 "\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"
+"              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"
+"              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"
+"              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"
+"              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);
@@ -2906,76 +2976,76 @@
 "              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"
+"              want the file saved in a  different  directory,  make  sure  you\n"
 , stdout);
  fputs(
-"              change the current working directory before invoking  curl  with\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"
+"              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"
 , stdout);
  fputs(
-"              addition  to  this option. If the server chooses a file name and\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"
 "              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"
+"              when wanting to issue HTTP requests  without  leading  slash  or\n"
 , stdout);
  fputs(
-"              other data that doesn't follow the  regular  URL  pattern,  like\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"
+"              GET).  Read  the HTTP 1.1 specification for details and explana-\n"
 , stdout);
  fputs(
-"              tions.  Common  additional HTTP requests include PUT and DELETE,\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"
+"              This option only changes the actual word used in  the  HTTP  re-\n"
 , stdout);
  fputs(
 "              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"
+"              cause  unintended  side-effects when curl doesn't change request\n"
 , stdout);
  fputs(
 "              method according to the HTTP 30x response codes - and similar.\n"
@@ -2986,7 +3056,7 @@
 "              (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"
+"              (IMAP) Specifies a custom IMAP command to use instead  of  LIST.\n"
 "              (Added in 7.30.0)\n"
 "\n"
 , stdout);
@@ -2997,22 +3067,22 @@
 "              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"
+"              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"
 , 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"
+"              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"
+"              By  specifying '*' as host you can tell curl to resolve any host\n"
 , stdout);
  fputs(
 "              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"
@@ -3022,7 +3092,7 @@
 "\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"
@@ -3033,8 +3103,8 @@
 "              Added in 7.21.3.\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"
+"              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"
@@ -3042,10 +3112,10 @@
 "              Added in 7.52.0.\n"
 "\n"
 "       --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"
-"              fault  backoff  time  algorithm between retries). This option is\n"
-"              only interesting if --retry is also used. Setting this delay  to\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"
+"              fault backoff time algorithm between retries).  This  option  is\n"
+"              only  interesting if --retry is also used. Setting this delay to\n"
 "              zero will make curl use the default backoff time.\n"
 "\n"
 , stdout);
@@ -3055,13 +3125,13 @@
 "              Added in 7.12.3.\n"
 "\n"
 "       --retry-max-time <seconds>\n"
-"              The  retry timer is reset before the first transfer attempt. Re-\n"
-"              tries will be done as usual (see --retry) as long as  the  timer\n"
+"              The retry timer is reset before the first transfer attempt.  Re-\n"
+"              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"
+"              reached  the  limit, the request will be made and while perform-\n"
 , stdout);
  fputs(
-"              ing,  it may take longer than this given time period. To limit a\n"
+"              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"
@@ -3070,25 +3140,25 @@
 "              Added in 7.12.3.\n"
 "\n"
 "       --retry <num>\n"
-"              If  a  transient  error is returned when curl tries to perform a\n"
+"              If a transient error is returned when curl tries  to  perform  a\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"
+"              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"
+"              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"
 , 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"
+"              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"
 "\n"
-"              Since curl 7.66.0, curl will comply with  the  Retry-After:  re-\n"
-"              sponse  header if one was present to know when to issue the next\n"
+"              Since  curl  7.66.0,  curl will comply with the Retry-After: re-\n"
+"              sponse header if one was present to know when to issue the  next\n"
 "              retry.\n"
 "\n"
 , stdout);
@@ -3099,15 +3169,15 @@
 "\n"
 "       --sasl-authzid\n"
 "              Use this authorisation identity (authzid), during SASL PLAIN au-\n"
-"              thentication,  in addition to the authentication identity (auth-\n"
+"              thentication, in addition to the authentication identity  (auth-\n"
 "              cid) as specified by -u, --user.\n"
 "\n"
-"              If the option isn't specified, the server will  derive  the  au-\n"
-"              thzid  from  the authcid, but if specified, and depending on the\n"
+"              If  the  option  isn't specified, the server will derive the au-\n"
+"              thzid from the authcid, but if specified, and depending  on  the\n"
 , stdout);
  fputs(
-"              server implementation, it may be used to access  another  user's\n"
-"              inbox,  that  the  user  has been granted access to, or a shared\n"
+"              server  implementation,  it may be used to access another user's\n"
+"              inbox, that the user has been granted access  to,  or  a  shared\n"
 "              mailbox for example.\n"
 "\n"
 "              Added in 7.66.0.\n"
@@ -3122,7 +3192,7 @@
 "\n"
 , stdout);
  fputs(
-"              Examples:   --negotiate   --service-name   sockd    would    use\n"
+"              Examples:    --negotiate    --service-name   sockd   would   use\n"
 "              sockd/server-name.\n"
 "\n"
 "              Added in 7.43.0.\n"
@@ -3130,14 +3200,14 @@
 "              When used with -s, --silent, it makes curl show an error message\n"
 "              if it fails.\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"
+"              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"
 , stdout);
  fputs(
 "              for, potentially even to the terminal/stdout unless you redirect\n"
 "              it.\n"
 "\n"
-"              Use  -S,  --show-error  in  addition  to  this option to disable\n"
+"              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"
@@ -3148,13 +3218,13 @@
 "\n"
 , stdout);
  fputs(
-"              This  option  overrides any previous use of -x, --proxy, as they\n"
+"              This option overrides any previous use of -x, --proxy,  as  they\n"
 "              are mutually exclusive.\n"
 "\n"
 "              Since 7.21.7, this option is superfluous since you can specify a\n"
 "              socks4 proxy with -x, --proxy using a socks4:// protocol prefix.\n"
 "              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
-"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
+"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
 , stdout);
  fputs(
 "              such a case curl first connects to the SOCKS proxy and then con-\n"
@@ -3168,17 +3238,17 @@
 "              Use the specified SOCKS4a proxy. If the port number is not spec-\n"
 "              ified, it is assumed at port 1080.\n"
 "\n"
-"              This  option  overrides any previous use of -x, --proxy, as they\n"
+"              This option overrides any previous use of -x, --proxy,  as  they\n"
 , stdout);
  fputs(
 "              are mutually exclusive.\n"
 "\n"
 "              Since 7.21.7, this option is superfluous since you can specify a\n"
-"              socks4a  proxy with -x, --proxy using a socks4a:// protocol pre-\n"
+"              socks4a proxy with -x, --proxy using a socks4a:// protocol  pre-\n"
 "              fix.\n"
 "\n"
 "              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
-"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
+"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
 "              such a case curl first connects to the SOCKS proxy and then con-\n"
 , stdout);
  fputs(
@@ -3190,8 +3260,8 @@
 "\n"
 "       --socks5-basic\n"
 "              Tells curl to use username/password authentication when connect-\n"
-"              ing to a SOCKS5 proxy.  The username/password authentication  is\n"
-"              enabled  by  default.   Use --socks5-gssapi to force GSS-API au-\n"
+"              ing  to a SOCKS5 proxy.  The username/password authentication is\n"
+"              enabled by default.  Use --socks5-gssapi to  force  GSS-API  au-\n"
 "              thentication to SOCKS5 proxies.\n"
 "\n"
 , stdout);
@@ -3199,10 +3269,10 @@
 "              Added in 7.55.0.\n"
 "\n"
 "       --socks5-gssapi-nec\n"
-"              As part of the GSS-API negotiation a protection mode is  negoti-\n"
-"              ated.  RFC  1961 says in section 4.3/4.4 it should be protected,\n"
-"              but the NEC  reference  implementation  does  not.   The  option\n"
-"              --socks5-gssapi-nec  allows the unprotected exchange of the pro-\n"
+"              As  part of the GSS-API negotiation a protection mode is negoti-\n"
+"              ated. RFC 1961 says in section 4.3/4.4 it should  be  protected,\n"
+"              but  the  NEC  reference  implementation  does  not.  The option\n"
+"              --socks5-gssapi-nec allows the unprotected exchange of the  pro-\n"
 "              tection mode negotiation.\n"
 "\n"
 "              Added in 7.19.4.\n"
@@ -3213,9 +3283,9 @@
 "              The default service name for a socks server is rcmd/server-fqdn.\n"
 "              This option allows you to change it.\n"
 "\n"
-"              Examples:   --socks5  proxy-name  --socks5-gssapi-service  sockd\n"
-"              would use sockd/proxy-name --socks5 proxy-name  --socks5-gssapi-\n"
-"              service  sockd/real-name  would  use  sockd/real-name  for cases\n"
+"              Examples:  --socks5  proxy-name  --socks5-gssapi-service   sockd\n"
+"              would  use sockd/proxy-name --socks5 proxy-name --socks5-gssapi-\n"
+"              service sockd/real-name  would  use  sockd/real-name  for  cases\n"
 "              where the proxy-name does not match the principal name.\n"
 "\n"
 "              Added in 7.19.4.\n"
@@ -3223,21 +3293,21 @@
 "       --socks5-gssapi\n"
 , stdout);
  fputs(
-"              Tells curl to use GSS-API authentication when  connecting  to  a\n"
-"              SOCKS5  proxy.  The GSS-API authentication is enabled by default\n"
-"              (if curl is compiled with GSS-API support).  Use  --socks5-basic\n"
+"              Tells  curl  to  use GSS-API authentication when connecting to a\n"
+"              SOCKS5 proxy.  The GSS-API authentication is enabled by  default\n"
+"              (if  curl is compiled with GSS-API support).  Use --socks5-basic\n"
 "              to force username/password authentication to SOCKS5 proxies.\n"
 "\n"
 "              Added in 7.55.0.\n"
 "\n"
 "       --socks5-hostname <host[:port]>\n"
-"              Use  the  specified  SOCKS5 proxy (and let the proxy resolve the\n"
+"              Use the specified SOCKS5 proxy (and let the  proxy  resolve  the\n"
 , stdout);
  fputs(
-"              host name). If the port number is not specified, it  is  assumed\n"
+"              host  name).  If the port number is not specified, it is assumed\n"
 "              at port 1080.\n"
 "\n"
-"              This  option  overrides any previous use of -x, --proxy, as they\n"
+"              This option overrides any previous use of -x, --proxy,  as  they\n"
 "              are mutually exclusive.\n"
 "\n"
 "              Since 7.21.7, this option is superfluous since you can specify a\n"
@@ -3247,7 +3317,7 @@
 "              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
 , stdout);
  fputs(
-"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
+"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
 "              such a case curl first connects to the SOCKS proxy and then con-\n"
 "              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
 "\n"
@@ -3256,13 +3326,13 @@
 "              Added in 7.18.0.\n"
 "\n"
 "       --socks5 <host[:port]>\n"
-"              Use  the  specified SOCKS5 proxy - but resolve the host name lo-\n"
+"              Use the specified SOCKS5 proxy - but resolve the host  name  lo-\n"
 , stdout);
  fputs(
-"              cally. If the port number is not specified,  it  is  assumed  at\n"
+"              cally.  If  the  port  number is not specified, it is assumed at\n"
 "              port 1080.\n"
 "\n"
-"              This  option  overrides any previous use of -x, --proxy, as they\n"
+"              This option overrides any previous use of -x, --proxy,  as  they\n"
 "              are mutually exclusive.\n"
 "\n"
 "              Since 7.21.7, this option is superfluous since you can specify a\n"
@@ -3270,12 +3340,12 @@
 "              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
 , stdout);
  fputs(
-"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
+"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
 "              such a case curl first connects to the SOCKS proxy and then con-\n"
 "              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
-"              This option (as well as --socks4) does not work with IPV6,  FTPS\n"
+"              This  option (as well as --socks4) does not work with IPV6, FTPS\n"
 "              or LDAP.\n"
 "\n"
 "              Added in 7.18.0.\n"
@@ -3284,7 +3354,7 @@
 , stdout);
  fputs(
 "              If a download is slower than this given speed (in bytes per sec-\n"
-"              ond) for speed-time seconds it gets aborted. speed-time  is  set\n"
+"              ond)  for  speed-time seconds it gets aborted. speed-time is set\n"
 "              with -y, --speed-time and is 30 if not set.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
@@ -3294,11 +3364,11 @@
 "              a speed-time period, the download gets aborted. If speed-time is\n"
 , stdout);
  fputs(
-"              used,  the  default  speed-limit  will  be 1 unless set with -Y,\n"
+"              used, the default speed-limit will be  1  unless  set  with  -Y,\n"
 "              --speed-limit.\n"
 "\n"
-"              This option controls transfers and thus  will  not  affect  slow\n"
-"              connects  etc.  If this is a concern for you, try the --connect-\n"
+"              This  option  controls  transfers  and thus will not affect slow\n"
+"              connects etc. If this is a concern for you, try  the  --connect-\n"
 "              timeout option.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
@@ -3307,8 +3377,8 @@
 "              This option tells curl to not work around a security flaw in the\n"
 , stdout);
  fputs(
-"              SSL3  and TLS1.0 protocols known as BEAST.  If this option isn't\n"
-"              used, the SSL layer may use workarounds known to cause  interop-\n"
+"              SSL3 and TLS1.0 protocols known as BEAST.  If this option  isn't\n"
+"              used,  the SSL layer may use workarounds known to cause interop-\n"
 "              erability problems with some older SSL implementations. WARNING:\n"
 "              this option loosens the SSL security, and by using this flag you\n"
 "              ask for exactly that.\n"
@@ -3335,12 +3405,12 @@
 , stdout);
  fputs(
 "       --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"
+"              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"
 "              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"
+"              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);
@@ -3348,29 +3418,29 @@
 "              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"
+"              (SSL) Forces curl to use SSL version 2 when negotiating  with  a\n"
+"              remote  SSL  server.  Sometimes curl is built without SSLv2 sup-\n"
 "              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"
+"              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"
+"              (SSL) Forces curl to use SSL version 3 when negotiating  with  a\n"
+"              remote  SSL  server.  Sometimes curl is built without SSLv3 sup-\n"
 "              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"
+"              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"
+"              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"
 "              If this option is used several times, the last one will be used.\n"
@@ -3378,22 +3448,22 @@
 "              See also -v, --verbose and -s, --silent.\n"
 "\n"
 "       --styled-output\n"
-"              Enables the automatic use of bold font styles when writing  HTTP\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"
+"              headers to the terminal. Use --no-styled-output to  switch  them\n"
 "              off.\n"
 "\n"
 "              Added in 7.61.0.\n"
 "\n"
 "       --suppress-connect-headers\n"
-"              When -p, --proxytunnel is used and a  CONNECT  request  is  made\n"
-"              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"
+"              When  -p,  --proxytunnel  is  used and a CONNECT request is made\n"
+"              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"
+"              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"
@@ -3405,12 +3475,12 @@
 "              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"
@@ -3440,25 +3510,25 @@
 "\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"
+"              (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"
+"              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"
+"              a document that is older than the given date/time, default is  a\n"
 , stdout);
  fputs(
 "              document that is newer than the specified date/time.\n"
@@ -3467,7 +3537,7 @@
 "\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"
 "              tlsv1.3.\n"
 "\n"
 "              default\n"
@@ -3485,16 +3555,16 @@
 "       7.54.0.\n"
 "\n"
 "       --tls13-ciphers <list of TLS 1.3 ciphersuites>\n"
-"              (TLS) Specifies which cipher suites to use in the connection  if\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"
+"              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"
-"              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 --ciphers\n"
 "              option.\n"
@@ -3504,131 +3574,135 @@
 "              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"
+"              Set  TLS  authentication type. Currently, the only supported op-\n"
 "              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"
+"              --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"
+"              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"
-"              Set  password  for use with the TLS authentication method speci-\n"
+"              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  username  for use with the TLS authentication method speci-\n"
+"              fied with --tlsauthtype. Requires  that  --tlspassword  also  is\n"
 "              set.\n"
 "\n"
+"              This doesn't work with TLS 1.3.\n"
+"\n"
 "              Added in 7.21.4.\n"
 "\n"
 "       --tlsv1.0\n"
-"              (TLS) Forces curl to use TLS version 1.0 or later when  connect-\n"
+"              (TLS)  Forces curl to use TLS version 1.0 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.0, but behavior was inconsistent depending  on  the\n"
+"              In old versions of curl this  option  was  documented  to  allow\n"
 , stdout);
  fputs(
+"              _only_  TLS  1.0, but behavior was inconsistent depending on the\n"
 "              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"
-"              (TLS) Forces curl to use TLS version 1.1 or later when  connect-\n"
+"              (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"
+"              In old versions of curl this  option  was  documented  to  allow\n"
 , stdout);
  fputs(
+"              _only_  TLS  1.1, but behavior was inconsistent depending on the\n"
 "              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"
-"              (TLS) Forces curl to use TLS version 1.2 or later when  connect-\n"
+"              (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"
+"              In old versions of curl this  option  was  documented  to  allow\n"
 , stdout);
  fputs(
+"              _only_  TLS  1.2, but behavior was inconsistent depending on the\n"
 "              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"
-"              (TLS) Forces curl to use TLS version 1.3 or later when  connect-\n"
+"              (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(
+"              At the time of this writing, they are BoringSSL, NSS, and Secure\n"
 "              Transport (on iOS 11 or later, and macOS 10.13 or later).\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"
+"              (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"
+"              See also --http1.1 and --http2. -1, --tlsv1  requires  that  the\n"
 , stdout);
  fputs(
+"              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"
 "              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"
 "              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"
 "\n"
+, stdout);
+ fputs(
 "              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"
+"              cluding descriptive information, to the given output  file.  Use\n"
+"              \"-\"  as  filename  to have the output sent to stdout. Use \"%\" as\n"
 , stdout);
  fputs(
+"              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"
@@ -3640,12 +3714,12 @@
 "              Added in 7.40.0.\n"
 "\n"
 "       -T, --upload-file <file>\n"
-"              This transfers the specified local file to the  remote  URL.  If\n"
+"              This  transfers  the  specified local file to the remote URL. If\n"
 , stdout);
  fputs(
 "              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"
 "              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"
@@ -3653,19 +3727,19 @@
 "\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"
+"              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"
+"              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"
+"              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"
 "               curl --upload-file \"{file1,file2}\" http://www.example.com\n"
@@ -3676,41 +3750,41 @@
 "\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"
+"              Specify a URL to fetch. This option is  mostly  handy  when  you\n"
 "              want to specify URL(s) in a config file.\n"
 "\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"
+"              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"
 "       -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"
+"              (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"
-"              quote  marks.  This header can also be set with the -H, --header\n"
+"              To  encode blanks in the string, surround the string with single\n"
+"              quote marks. This header can also be set with the  -H,  --header\n"
 "              or the --proxy-header options.\n"
 "\n"
 "              If this option is used several times, the last one will be used.\n"
@@ -3721,41 +3795,41 @@
  fputs(
 "              tion. Overrides -n, --netrc and --netrc-optional.\n"
 "\n"
-"              If  you  simply  specify  the  user name, curl will prompt for a\n"
+"              If you simply specify the user name,  curl  will  prompt  for  a\n"
 "              password.\n"
 "\n"
-"              The user name and passwords are split up  on  the  first  colon,\n"
-"              which  makes  it impossible to use a colon in the user name with\n"
+"              The  user  name  and  passwords are split up on the first colon,\n"
+"              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(
-"              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"
 "              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"
+"              When using Kerberos V5 with a Windows based  server  you  should\n"
 , stdout);
  fputs(
-"              include the Windows domain name in the user name, in  order  for\n"
-"              the  server  to  successfully  obtain  a Kerberos Ticket. If you\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"
+"              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(
-"              To specify the domain name use either Down-Level Logon  Name  or\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"
 "\n"
-"              If you use a Windows SSPI-enabled curl binary and  perform  Ker-\n"
-"              beros  V5, Negotiate, NTLM or Digest authentication then you can\n"
-"              tell curl to select the user name and password from  your  envi-\n"
+"              If  you  use a Windows SSPI-enabled curl binary and perform Ker-\n"
+"              beros V5, Negotiate, NTLM or Digest authentication then you  can\n"
+"              tell  curl  to select the user name and password from your envi-\n"
 , stdout);
  fputs(
 "              ronment by specifying a single colon with this option: \"-u :\".\n"
@@ -3763,10 +3837,10 @@
 "              If this option is used several times, the last one will be used.\n"
 "\n"
 "       -v, --verbose\n"
-"              Makes  curl  verbose  during the operation. Useful for debugging\n"
-"              and seeing what's going on \"under the  hood\".  A  line  starting\n"
-"              with  '>'  means  \"header  data\" sent by curl, '<' means \"header\n"
-"              data\" received by curl that is hidden in  normal  cases,  and  a\n"
+"              Makes curl verbose during the operation.  Useful  for  debugging\n"
+"              and  seeing  what's  going  on \"under the hood\". A line starting\n"
+"              with '>' means \"header data\" sent by  curl,  '<'  means  \"header\n"
+"              data\"  received  by  curl  that is hidden in normal cases, and a\n"
 , stdout);
  fputs(
 "              line starting with '*' means additional info provided by curl.\n"
@@ -3774,22 +3848,22 @@
 "              If you only want HTTP headers in the output, -i, --include might\n"
 "              be the option you're looking for.\n"
 "\n"
-"              If you think this option still doesn't give you enough  details,\n"
+"              If  you think this option still doesn't give you enough details,\n"
 "              consider using --trace or --trace-ascii instead.\n"
 "\n"
 "              Use -s, --silent to make curl really quiet.\n"
 "\n"
-"              See  also  -i,  --include.  This  option  overrides  --trace and\n"
+"              See also  -i,  --include.  This  option  overrides  --trace  and\n"
 , stdout);
  fputs(
 "              --trace-ascii.\n"
 "\n"
 "       -V, --version\n"
 "              Displays information about curl and the libcurl version it uses.\n"
-"              The first line includes the full version of  curl,  libcurl  and\n"
+"              The  first  line  includes the full version of curl, libcurl and\n"
 "              other 3rd party libraries linked with the executable.\n"
 "\n"
-"              The  second  line (starts with \"Protocols:\") shows all protocols\n"
+"              The second line (starts with \"Protocols:\") shows  all  protocols\n"
 "              that libcurl reports to support.\n"
 "\n"
 "              The third line (starts with \"Features:\") shows specific features\n"
@@ -3801,23 +3875,23 @@
 "\n"
 "              krb4   Krb4 for FTP is supported.\n"
 "\n"
-"              SSL    SSL  versions of various protocols are supported, such as\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"
+"              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"
+"              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"
 "              AsynchDNS\n"
-"                     This  curl  uses asynchronous name resolves. Asynchronous\n"
-"                     name resolves can be done using either the c-ares or  the\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"
@@ -3836,7 +3910,7 @@
 "              SSPI   SSPI is supported.\n"
 "\n"
 "              TLS-SRP\n"
-"                     SRP (Secure Remote Password) authentication is  supported\n"
+"                     SRP  (Secure Remote Password) authentication is supported\n"
 "                     for TLS.\n"
 "\n"
 , stdout);
@@ -3850,15 +3924,15 @@
 "                     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"
+"                     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"
 , stdout);
  fputs(
 "                     file or server not being available).\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"
+"              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"
@@ -3868,42 +3942,42 @@
 "              Make curl display information on stdout after a completed trans-\n"
 , stdout);
  fputs(
-"              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"
+"              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"
+"              The variables present in the output format will  be  substituted\n"
 , stdout);
  fputs(
-"              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"
+"              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"
+"              The output will be written to standard output, but this  can  be\n"
 "              switched to standard error by using %{stderr}.\n"
 "\n"
 , stdout);
  fputs(
 "              NOTE: The %-symbol is a special symbol in the win32-environment,\n"
-"              where  all  occurrences of % must be doubled when using this op-\n"
+"              where all occurrences of % must be doubled when using  this  op-\n"
 "              tion.\n"
 "\n"
 "              The variables available are:\n"
 "\n"
-"              content_type   The Content-Type of the  requested  document,  if\n"
+"              content_type   The  Content-Type  of  the requested document, if\n"
 "                             there was any.\n"
 "\n"
 "              filename_effective\n"
-"                             The  ultimate  filename  that curl writes out to.\n"
+"                             The ultimate filename that curl  writes  out  to.\n"
 , stdout);
  fputs(
-"                             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"
+"                             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"
@@ -3912,29 +3986,29 @@
 "                             to the remote FTP server. (Added in 7.15.4)\n"
 "\n"
 "              http_code      The numerical response code that was found in the\n"
-"                             last retrieved HTTP(S)  or  FTP(s)  transfer.  In\n"
-"                             7.18.2  the alias response_code was added to show\n"
+"                             last  retrieved  HTTP(S)  or  FTP(s) transfer. In\n"
+"                             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(
-"                             sponse  (from a proxy) to a curl CONNECT request.\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"
-"              local_ip       The  IP  address of the local end of the most re-\n"
-"                             cently done connection - can be  either  IPv4  or\n"
+"              local_ip       The IP address of the local end of the  most  re-\n"
+"                             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"
+"              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"
+"              num_connects   Number  of new connects made in the recent trans-\n"
 "                             fer. (Added in 7.12.3)\n"
 "\n"
 "              num_redirects  Number of redirects that were followed in the re-\n"
@@ -3948,20 +4022,20 @@
 "                             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"
+"              scheme         The  URL  scheme (sometimes called protocol) that\n"
 , stdout);
  fputs(
 "                             was effectively used (Added in 7.52.0)\n"
@@ -3971,7 +4045,7 @@
 "              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"
+"              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"
@@ -3981,45 +4055,45 @@
 "              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"
+"                             The result of the SSL peer certificate  verifica-\n"
 "                             tion that was requested. 0 means the verification\n"
 , stdout);
  fputs(
 "                             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         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(
 "                             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"
 "                             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"
+"                             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(
@@ -4028,27 +4102,27 @@
 "\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"
+"                             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"
+"                             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"
+"                             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"
 , stdout);
  fputs(
 "                             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"
+"                             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"
@@ -4056,11 +4130,11 @@
 "       --xattr\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"
+"              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"
@@ -4074,7 +4148,7 @@
 "       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"
+"       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"
@@ -4085,44 +4159,44 @@
 "              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"
+"              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"
+"              Sets the proxy server to use if no  protocol-specific  proxy  is\n"
 , stdout);
  fputs(
 "              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"
 "              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"
 , stdout);
  fputs(
-"              specified with the -x,  --proxy  option.  That  is  NO_PROXY=di-\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"
-"              NO_PROXY=direct.example.com   curl  -x  http://proxy.example.com\n"
+"              rect.example.com   accesses   the   target   URL  directly,  and\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"
 , stdout);
  fputs(
-"              dresses, and IPv6 versions should then be given without  enclos-\n"
+"              dresses,  and IPv6 versions should then be given without enclos-\n"
 "              ing brackets.\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);
@@ -4130,7 +4204,7 @@
 "       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"
+"              Makes  it use it as an HTTP proxy. The default if no scheme pre-\n"
 "              fix is used.\n"
 "\n"
 "       https://\n"
@@ -4151,7 +4225,7 @@
 "              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"
+"       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"
@@ -4164,12 +4238,12 @@
 "\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"
+"       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"
 "              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"
@@ -4180,59 +4254,59 @@
  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"
+"       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"
+"       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(
 "              the control connection or similar.\n"
 "\n"
-"       11     FTP  weird PASS reply. Curl couldn't parse the reply sent to the\n"
+"       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"
+"       14     FTP  weird  227  format.  Curl  couldn't  parse the 227-line the\n"
 , stdout);
  fputs(
 "              server sent.\n"
 "\n"
-"       15     FTP  can't  get host. Couldn't resolve the host IP we got in the\n"
+"       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"
+"       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 +4318,11 @@
 "\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 +4333,7 @@
  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 +4351,14 @@
 "\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 +4367,7 @@
 "\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 +4384,7 @@
 "\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 +4401,7 @@
 "\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 +4432,7 @@
 "\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"
@@ -4389,7 +4463,7 @@
 "              ing ones are meant to never change.\n"
 "\n"
 "AUTHORS / CONTRIBUTORS\n"
-"       Daniel  Stenberg is the main author, but the whole list of contributors\n"
+"       Daniel Stenberg is the main author, but the whole list of  contributors\n"
 "       is found in the separate THANKS file.\n"
 "\n"
 "WWW\n"
@@ -4415,3984 +4489,4052 @@
 #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 173066
+     to 48513 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,
+  0x39, 0x24, 0x77, 0x66, 0x86, 0x17, 0xdd, 0x2c, 0x46, 0xce, 0x36, 0x2d,
   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,
+  0x30, 0x33, 0x20, 0x89, 0x68, 0x06, 0x98, 0x00, 0x18, 0x5e, 0x92, 0x9d,
+  0xf3, 0xdb, 0xdf, 0xae, 0xa7, 0xaa, 0xba, 0x1b, 0xe8, 0xc6, 0x90, 0x76,
+  0x2c, 0x9f, 0xdb, 0x9b, 0xbd, 0xb6, 0x25, 0x91, 0x40, 0xa3, 0x2f, 0xd5,
+  0x75, 0xaf, 0xa7, 0x92, 0xe4, 0xbe, 0xff, 0x7d, 0xc0, 0xff, 0x7f, 0x30,
+  0xff, 0x33, 0x7f, 0x7e, 0x96, 0x24, 0x67, 0x55, 0xf9, 0xd7, 0x6c, 0xda,
+  0xc4, 0x9f, 0xfd, 0xf0, 0xe1, 0xbf, 0x12, 0xfe, 0x3f, 0xf3, 0xce, 0x8f,
+  0xe6, 0xcf, 0xcf, 0xd6, 0x8e, 0xbd, 0x93, 0xb8, 0x17, 0xfe, 0xeb, 0xc3,
+  0x76, 0x72, 0xdf, 0x0b, 0xff, 0x95, 0x6c, 0xe1, 0x85, 0x0f, 0xf2, 0x85,
+  0x17, 0xf4, 0xf7, 0x0f, 0x1f, 0xd6, 0x7f, 0xe4, 0x47, 0x9a, 0x15, 0xfd,
+  0x67, 0x87, 0xde, 0xfb, 0xf1, 0x03, 0xfd, 0xd5, 0xfc, 0xe4, 0xb3, 0xcf,
+  0xde, 0x1e, 0xbe, 0x39, 0xd2, 0x57, 0xa7, 0xab, 0x6a, 0x9e, 0x0c, 0x93,
+  0xa6, 0x4a, 0x8b, 0xfa, 0x22, 0xab, 0x92, 0x34, 0x79, 0xff, 0xee, 0xe4,
+  0xb3, 0xcf, 0xc6, 0x7f, 0x7e, 0x7b, 0x7a, 0x36, 0x3e, 0x1e, 0xb7, 0x1e,
+  0xfb, 0x4b, 0xb9, 0x6c, 0xf2, 0xb2, 0xa8, 0xcd, 0xf4, 0xcd, 0x43, 0xf5,
+  0x4f, 0x9f, 0x7d, 0xf6, 0xea, 0x68, 0xfc, 0xf2, 0xdd, 0xf1, 0xd9, 0xf9,
+  0xf1, 0xe9, 0xdb, 0xd6, 0x93, 0x49, 0x5e, 0x27, 0x66, 0xa8, 0xa6, 0x2c,
+  0xe7, 0xe6, 0x3f, 0x6e, 0xf4, 0x59, 0xda, 0xa4, 0xc9, 0x45, 0x55, 0x2e,
+  0x92, 0xb2, 0xa2, 0x5f, 0xa4, 0x49, 0x9d, 0x55, 0xd7, 0x59, 0x35, 0x48,
+  0x56, 0x75, 0x5e, 0x5c, 0x26, 0x65, 0x91, 0x25, 0xe5, 0x45, 0xd2, 0x5c,
+  0x65, 0x3a, 0x5c, 0xbd, 0x5a, 0x2e, 0xcb, 0xaa, 0xc9, 0x66, 0xc9, 0xb2,
+  0x2a, 0x9b, 0x72, 0x5a, 0xce, 0xeb, 0x64, 0xeb, 0xd5, 0xf1, 0xcb, 0xf3,
+  0x41, 0xf2, 0xfa, 0xf8, 0xe4, 0xc8, 0xfc, 0xf7, 0xfc, 0x0c, 0xff, 0x19,
+  0x0f, 0x92, 0xaf, 0x4f, 0xcf, 0xbe, 0x39, 0x7a, 0x37, 0x48, 0xbe, 0x39,
+  0xa7, 0x9f, 0xd1, 0x7f, 0xcd, 0x0f, 0x93, 0xe3, 0x37, 0x87, 0x67, 0x03,
+  0x1d, 0x8e, 0xfe, 0x41, 0x3f, 0x3c, 0x79, 0x65, 0x7e, 0xc8, 0x7f, 0xd0,
+  0x3f, 0xcf, 0x4e, 0xcf, 0x1e, 0xc9, 0x1f, 0xf4, 0xcf, 0x77, 0xe7, 0x6f,
+  0xcc, 0x6f, 0xdf, 0x9d, 0x8f, 0xcd, 0x7f, 0xc7, 0x2f, 0xe9, 0x3f, 0xf8,
+  0xca, 0xf8, 0xcd, 0x57, 0xf8, 0xcf, 0xd8, 0x0e, 0x37, 0x7e, 0xc3, 0x3f,
+  0xc7, 0x97, 0xce, 0x8f, 0x4e, 0xde, 0x1e, 0x9d, 0x27, 0x69, 0x31, 0x4b,
+  0xce, 0xcd, 0xf3, 0xdb, 0xa3, 0xe4, 0xfc, 0x2a, 0x4b, 0xa6, 0xe5, 0x62,
+  0x41, 0x3f, 0x32, 0x3b, 0x32, 0xcb, 0xea, 0xfc, 0xb2, 0x30, 0x4b, 0x31,
+  0x2b, 0xbf, 0x29, 0xab, 0x8f, 0x49, 0x72, 0x93, 0x37, 0x57, 0xe5, 0xaa,
+  0xd1, 0xe1, 0x56, 0x66, 0x37, 0x92, 0xbc, 0x68, 0xb2, 0x2a, 0x9d, 0xd2,
+  0x4e, 0x8f, 0x3e, 0x6b, 0xed, 0x6a, 0x79, 0x61, 0xf6, 0xb0, 0x36, 0x9b,
+  0x36, 0x59, 0xd5, 0xf3, 0x32, 0x9d, 0xd1, 0x56, 0x99, 0x57, 0x2e, 0x56,
+  0x66, 0x93, 0xab, 0x7c, 0xfa, 0xb1, 0x4e, 0xe6, 0xf9, 0xc7, 0x8c, 0x36,
+  0xea, 0xf6, 0x4e, 0x37, 0x6e, 0xc0, 0x83, 0xa6, 0x2b, 0xb3, 0xa7, 0xc5,
+  0x50, 0x87, 0x6b, 0xf2, 0x69, 0x4a, 0x1f, 0xc0, 0xce, 0x25, 0xab, 0x25,
+  0x8d, 0xc6, 0x3b, 0x96, 0x2c, 0xcb, 0xda, 0xbc, 0x34, 0x1e, 0x9f, 0x98,
+  0x99, 0x17, 0x45, 0x86, 0x79, 0xd4, 0x03, 0xf3, 0x8f, 0xf2, 0x63, 0x9e,
+  0x99, 0xbf, 0x5c, 0xe4, 0xf3, 0x2c, 0xe1, 0x13, 0xb5, 0xc3, 0xd1, 0xd1,
+  0x26, 0x55, 0x56, 0xaf, 0x16, 0x99, 0xd9, 0xbd, 0x37, 0x59, 0x93, 0xce,
+  0xf3, 0xe2, 0xa3, 0xf9, 0x2b, 0x2d, 0x7c, 0x51, 0x56, 0xd9, 0x28, 0x39,
+  0xac, 0x93, 0xbb, 0x72, 0x65, 0x16, 0x3c, 0x9f, 0x9b, 0x33, 0xcf, 0x92,
+  0x49, 0x36, 0x2f, 0x6f, 0x06, 0x74, 0xd2, 0x49, 0xb1, 0x5a, 0x4c, 0xcc,
+  0x00, 0xe5, 0x85, 0x1b, 0x2e, 0x6d, 0x56, 0x66, 0x38, 0x7e, 0x7a, 0x91,
+  0x9a, 0x35, 0x99, 0x77, 0xab, 0xe4, 0x2a, 0x33, 0x6b, 0xae, 0x97, 0x79,
+  0xf1, 0x6f, 0xed, 0x7d, 0x31, 0x5b, 0xbb, 0x2c, 0x6f, 0xb2, 0xca, 0xec,
+  0xec, 0xe4, 0x2e, 0x31, 0x9b, 0x30, 0x61, 0x22, 0xbc, 0x30, 0x44, 0x96,
+  0xa4, 0x66, 0x08, 0x4b, 0x80, 0xc3, 0x2a, 0x9b, 0xa7, 0x44, 0x4c, 0xf6,
+  0x1b, 0x23, 0x73, 0x88, 0x99, 0xa5, 0x36, 0x79, 0x75, 0xeb, 0xd1, 0x36,
+  0x5e, 0x9e, 0x99, 0x95, 0xe4, 0xf3, 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,
+  0xbc, 0xd0, 0xe6, 0x70, 0x96, 0x2d, 0xb3, 0x62, 0x96, 0x15, 0xcd, 0x28,
+  0xf9, 0x73, 0xb9, 0xda, 0x34, 0xdf, 0xbe, 0xc8, 0xcd, 0x1e, 0xa4, 0x32,
+  0x94, 0xf9, 0xb2, 0x21, 0x82, 0x69, 0x95, 0x2f, 0xbd, 0xa3, 0x28, 0x0b,
+  0x73, 0xe6, 0xc9, 0xbb, 0xd7, 0x2f, 0x93, 0x47, 0xcf, 0x3f, 0x7f, 0xea,
+  0xce, 0xdc, 0x0c, 0x90, 0x4c, 0xd3, 0xc2, 0xac, 0x38, 0x9b, 0xe6, 0x17,
+  0x77, 0xc9, 0x62, 0x35, 0x6f, 0xf2, 0xa5, 0xd9, 0x7d, 0xba, 0x7c, 0x74,
+  0x81, 0x96, 0x69, 0xd5, 0xd4, 0x44, 0x04, 0xf8, 0x01, 0xd6, 0x7e, 0x53,
+  0xe5, 0x0d, 0x5d, 0x24, 0xfc, 0xce, 0xcc, 0x30, 0x6b, 0x6a, 0x1d, 0x8e,
+  0x68, 0xcd, 0x7c, 0x67, 0x62, 0x68, 0xcb, 0x6c, 0x6d, 0x5a, 0x9b, 0x8f,
+  0x1e, 0x7c, 0xe6, 0x38, 0xc8, 0x55, 0xd3, 0x2c, 0x0f, 0x76, 0x76, 0xea,
+  0xbc, 0xc9, 0x46, 0xff, 0x30, 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,
+  0x64, 0x62, 0x97, 0x59, 0x63, 0xbe, 0xf0, 0xb7, 0x55, 0x56, 0xd0, 0x88,
+  0x66, 0x1e, 0xe9, 0x7c, 0x79, 0x95, 0x9a, 0xe3, 0xcc, 0x0c, 0x35, 0xd2,
+  0xcd, 0x36, 0x04, 0x43, 0xb3, 0xe2, 0xbb, 0xfd, 0x97, 0x9f, 0xc2, 0x8f,
+  0x5e, 0xe0, 0x9b, 0xe6, 0xbf, 0xa3, 0xec, 0x36, 0x5d, 0x98, 0xb5, 0xd1,
+  0xa7, 0x76, 0x88, 0xc4, 0xfe, 0xb2, 0x37, 0xdc, 0xdb, 0xdd, 0xfd, 0x69,
+  0xd4, 0xdc, 0x36, 0x0f, 0x7b, 0x7e, 0x77, 0xd7, 0xbd, 0x41, 0x8f, 0x6e,
+  0xd1, 0x7a, 0x93, 0xb9, 0x21, 0x19, 0xfa, 0xf8, 0xdf, 0xb3, 0xaa, 0xac,
+  0xb7, 0x1f, 0x36, 0x52, 0x3a, 0xfc, 0x7b, 0xfb, 0xbb, 0x6f, 0xb3, 0x1a,
+  0x34, 0xe3, 0xd6, 0x9a, 0xa4, 0x95, 0xa1, 0xdb, 0xb2, 0x71, 0xec, 0x69,
+  0x60, 0x2e, 0x65, 0x63, 0x77, 0xc6, 0xdc, 0x39, 0xf3, 0xb4, 0x61, 0x6c,
+  0xe9, 0x9c, 0x78, 0x5a, 0x9d, 0x14, 0xd9, 0xad, 0xbd, 0xe5, 0xe6, 0xf6,
+  0x67, 0xe9, 0xf4, 0x2a, 0x29, 0x0d, 0xf1, 0x57, 0x91, 0x23, 0xf0, 0x27,
+  0x94, 0x56, 0xd3, 0xab, 0xfc, 0xda, 0xec, 0xc6, 0xf3, 0xe7, 0x4f, 0x87,
+  0xe6, 0x3f, 0xcf, 0x7f, 0xda, 0xb9, 0x2e, 0xe7, 0x66, 0x73, 0x1e, 0xff,
+  0xb4, 0x43, 0x47, 0xfc, 0x8f, 0x74, 0x30, 0x19, 0x4c, 0xff, 0x39, 0xba,
+  0x6a, 0x16, 0xf3, 0x5e, 0xc2, 0x49, 0x0b, 0xf3, 0xff, 0x8b, 0x72, 0x55,
   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,
+  0x95, 0x28, 0xf4, 0x03, 0x4c, 0x6c, 0x91, 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,
+  0x69, 0xde, 0x5a, 0x11, 0x5f, 0xc5, 0xb5, 0xa6, 0x61, 0x0c, 0x43, 0xb8,
+  0x34, 0xe7, 0x62, 0xce, 0x82, 0xa8, 0x98, 0x8e, 0xea, 0x2e, 0x79, 0x6b,
+  0x08, 0x86, 0x99, 0x91, 0x47, 0xec, 0xf3, 0xac, 0x69, 0xee, 0x3d, 0x26,
+  0x47, 0xb1, 0x07, 0x7b, 0x01, 0xd1, 0xf6, 0x3d, 0x6f, 0xe8, 0xec, 0x60,
+  0xbf, 0xfd, 0xf0, 0xf7, 0x86, 0x49, 0xbb, 0xeb, 0x62, 0xbe, 0xfe, 0x8f,
+  0x7f, 0x7a, 0x54, 0x77, 0x43, 0xbf, 0xcd, 0x8b, 0xeb, 0xf2, 0xa3, 0xd9,
+  0x22, 0x48, 0xd1, 0xb4, 0xbd, 0x9b, 0xc4, 0x87, 0x16, 0xcb, 0xc6, 0x8a,
+  0x27, 0x22, 0x47, 0xf3, 0xa3, 0x49, 0x3a, 0x99, 0xdf, 0x25, 0x57, 0xe9,
+  0x75, 0x46, 0xeb, 0x5d, 0x1a, 0x3a, 0xa5, 0x1d, 0x30, 0x62, 0x63, 0x0e,
+  0x3e, 0x26, 0x8c, 0x61, 0x56, 0xae, 0x26, 0x86, 0xb9, 0xfc, 0x6d, 0x55,
+  0x36, 0xbc, 0x31, 0xe9, 0x75, 0x99, 0xcf, 0x5a, 0xb2, 0xf8, 0x2a, 0x23,
+  0x86, 0x46, 0x1f, 0x86, 0x90, 0x32, 0x0c, 0x95, 0x66, 0x8a, 0x8b, 0x96,
+  0x37, 0x24, 0xee, 0x0c, 0x2b, 0x4c, 0xe7, 0x75, 0x99, 0x24, 0x97, 0x25,
+  0xdd, 0x12, 0x30, 0x60, 0x90, 0xb9, 0x39, 0x94, 0xab, 0x94, 0xa4, 0x9a,
+  0x11, 0x60, 0xf6, 0x1e, 0x54, 0x19, 0x78, 0x31, 0x4e, 0x2a, 0x9d, 0x0f,
+  0x58, 0x7a, 0xd1, 0x3b, 0xb2, 0x55, 0xc9, 0xe6, 0x7f, 0xdb, 0x1c, 0x24,
+  0x9b, 0xff, 0xb1, 0x09, 0x7a, 0xd8, 0xfc, 0xf7, 0x4d, 0x77, 0xce, 0x46,
+  0x19, 0xbb, 0xce, 0x67, 0x19, 0x93, 0xc4, 0xf1, 0xd9, 0xf5, 0xd3, 0xe4,
+  0xef, 0xa4, 0x3b, 0x18, 0x5e, 0x9b, 0xdd, 0x2a, 0x41, 0xea, 0xda, 0xcc,
+  0xdb, 0x89, 0x61, 0xba, 0xe9, 0x92, 0x94, 0x88, 0xac, 0x9a, 0x1a, 0xea,
+  0x4d, 0x2f, 0x0d, 0xbd, 0x1a, 0x59, 0xac, 0xc3, 0xd1, 0xf8, 0xf4, 0x0a,
+  0x2f, 0xcb, 0x30, 0xc8, 0xa4, 0x48, 0x17, 0xe6, 0x46, 0x9c, 0xd0, 0x8c,
+  0xf2, 0x22, 0x3c, 0xcc, 0xbf, 0x5c, 0x64, 0x9f, 0xef, 0x1e, 0x1c, 0x3c,
+  0xfa, 0xfd, 0xfe, 0x93, 0xac, 0xb9, 0xda, 0xfd, 0x69, 0xc7, 0x3e, 0x72,
+  0x7c, 0x81, 0x6d, 0x57, 0xf2, 0xd3, 0x49, 0x18, 0x29, 0x6f, 0xa5, 0x84,
+  0x79, 0xdf, 0xfc, 0x3d, 0xbb, 0xc8, 0x6f, 0x07, 0xaa, 0x2f, 0xf1, 0x9d,
+  0x4b, 0x0d, 0xa9, 0x99, 0xf3, 0x23, 0x16, 0xa1, 0xc3, 0x5d, 0xae, 0xb2,
+  0xda, 0xec, 0xe4, 0xcd, 0x55, 0xda, 0x24, 0x76, 0x00, 0x3e, 0xd9, 0x45,
+  0x7e, 0x79, 0xd5, 0x24, 0x37, 0x29, 0x09, 0x9b, 0xe3, 0x86, 0x87, 0x20,
+  0x29, 0x6f, 0x44, 0xcc, 0x45, 0x6a, 0x64, 0x05, 0x9d, 0x21, 0x44, 0xfa,
+  0xc4, 0x69, 0x18, 0x8d, 0x21, 0x73, 0x3e, 0x10, 0xa7, 0x4e, 0x4d, 0xd2,
+  0x9a, 0x2e, 0x6d, 0x61, 0x98, 0x43, 0x63, 0x74, 0x84, 0x15, 0xfd, 0xeb,
+  0xca, 0x68, 0x01, 0xd8, 0x03, 0x99, 0x28, 0x04, 0xe5, 0x6b, 0x3a, 0x4e,
+  0x3a, 0x1b, 0x2b, 0xbc, 0xcc, 0x21, 0x0d, 0xe4, 0x98, 0xed, 0x1b, 0xb5,
+  0xb9, 0x70, 0x86, 0x33, 0x59, 0xca, 0xd8, 0x20, 0x26, 0xbb, 0xc1, 0xeb,
+  0xc4, 0x1c, 0xd3, 0x9a, 0x14, 0x05, 0x56, 0x07, 0xcc, 0xe4, 0xbd, 0xc5,
+  0x9a, 0x4d, 0x4b, 0x3f, 0x92, 0x4a, 0xd2, 0x51, 0x7c, 0xf0, 0xda, 0xac,
+  0x34, 0x44, 0x66, 0x66, 0x6b, 0x98, 0x31, 0xad, 0x8c, 0x58, 0x2c, 0x76,
+  0x05, 0x44, 0x6e, 0xc6, 0xa4, 0x1f, 0xe6, 0x0d, 0xc9, 0x18, 0xe8, 0xb0,
+  0x66, 0xbe, 0x66, 0x53, 0xa0, 0x88, 0x1a, 0x46, 0xed, 0xad, 0x1f, 0xe2,
+  0xd1, 0x3c, 0x9b, 0x5c, 0x1b, 0x2d, 0xc5, 0x28, 0xa4, 0x99, 0x7d, 0x0b,
+  0xf2, 0x7c, 0x4a, 0xba, 0xd1, 0xdc, 0xdc, 0x97, 0x69, 0x59, 0x55, 0xa4,
+  0xef, 0xd3, 0x09, 0x4e, 0x98, 0x89, 0x2e, 0x32, 0xa3, 0x46, 0xf8, 0xdb,
+  0x99, 0x93, 0x40, 0x33, 0xfc, 0xc5, 0xe8, 0x25, 0xe0, 0x20, 0x46, 0x7f,
+  0x00, 0xcf, 0xc7, 0xc2, 0x31, 0x3b, 0x1a, 0x7b, 0x3a, 0xcd, 0x96, 0x4d,
+  0x1d, 0x5b, 0x93, 0x1e, 0xb8, 0x99, 0x4e, 0x95, 0xd1, 0xce, 0xfb, 0x4a,
+  0x17, 0xf6, 0xd5, 0x0a, 0x7d, 0xe8, 0x5d, 0xaa, 0xc7, 0x18, 0x3d, 0xac,
+  0xb6, 0xbb, 0xd6, 0x80, 0x36, 0x0c, 0x1b, 0xc3, 0x9e, 0x2f, 0x68, 0xa2,
+  0xf4, 0x70, 0xcd, 0x37, 0x15, 0xac, 0x99, 0x0e, 0x92, 0x35, 0x6d, 0xfe,
+  0x2e, 0x89, 0x2e, 0xb3, 0x9f, 0x76, 0x70, 0xf3, 0x55, 0x7b, 0xa6, 0xf4,
+  0x79, 0x52, 0xf1, 0x8d, 0x24, 0x9f, 0xd5, 0x57, 0x46, 0xf9, 0xaa, 0xe5,
+  0x66, 0xe7, 0x0b, 0x43, 0x33, 0xd7, 0x74, 0xbe, 0xcb, 0x2c, 0x9b, 0x8d,
+  0x92, 0xd3, 0x0b, 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,
+  0xe0, 0xe4, 0xa9, 0xf9, 0x89, 0x99, 0xed, 0xbc, 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,
+  0x19, 0xd2, 0xd6, 0x9e, 0xbd, 0x3b, 0xfd, 0xfa, 0xdd, 0xd1, 0x78, 0x9c,
+  0xbc, 0x39, 0x3a, 0x3f, 0x7a, 0xd7, 0xda, 0xe9, 0xa2, 0xac, 0x16, 0x38,
+  0xd1, 0x59, 0x5e, 0x2f, 0xe7, 0xe9, 0x1d, 0x1d, 0xb5, 0x59, 0xc9, 0x65,
+  0x45, 0x37, 0x6b, 0x91, 0x91, 0x54, 0x98, 0xad, 0xc0, 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,
+  0x02, 0xcc, 0xce, 0xfc, 0xe9, 0xb4, 0xcd, 0xec, 0xc2, 0xa8, 0xda, 0x46,
+  0xba, 0xb2, 0xa5, 0xd0, 0x9d, 0x93, 0xce, 0xd6, 0xea, 0xc7, 0x86, 0x0c,
+  0x89, 0x35, 0xd3, 0x80, 0x3c, 0x15, 0xfe, 0x82, 0x65, 0x62, 0x46, 0x27,
+  0x21, 0xde, 0x27, 0x8f, 0x2d, 0x69, 0x0a, 0x99, 0x39, 0xd9, 0x19, 0x0f,
+  0x5f, 0xaf, 0x2e, 0x70, 0x91, 0x93, 0x2d, 0xa3, 0x99, 0xbf, 0x31, 0xd6,
+  0x92, 0xb1, 0x58, 0x06, 0xc9, 0xd9, 0x36, 0xde, 0xdb, 0xdb, 0xdd, 0x7f,
+  0xcc, 0x8c, 0x60, 0xa4, 0xc3, 0xbd, 0xf6, 0x18, 0xf1, 0xde, 0x47, 0x3a,
+  0x5e, 0x7e, 0x88, 0x06, 0x1f, 0x25, 0x7b, 0x6f, 0xf8, 0x27, 0x8f, 0x3f,
+  0x7f, 0xf2, 0xec, 0xa9, 0xfc, 0xb0, 0x4d, 0xe0, 0x76, 0xfe, 0xa0, 0x0e,
+  0x58, 0x7e, 0x64, 0x0a, 0x9a, 0x99, 0x98, 0xd5, 0x2d, 0xf2, 0xc2, 0x5c,
+  0x13, 0x73, 0xad, 0x84, 0x57, 0x11, 0x3d, 0x9b, 0xc9, 0x5f, 0x30, 0x67,
+  0x93, 0x73, 0x6d, 0x9b, 0x94, 0xe6, 0x65, 0x43, 0xb2, 0x86, 0x97, 0xdb,
+  0x43, 0x62, 0x35, 0xa1, 0xa1, 0x89, 0xa4, 0x13, 0x62, 0xb0, 0x64, 0x57,
+  0x19, 0x05, 0x38, 0x8b, 0x7e, 0xcd, 0x4a, 0x45, 0xf3, 0x86, 0x99, 0x9b,
+  0x91, 0x89, 0x24, 0xe6, 0xc2, 0x7d, 0x37, 0xac, 0x00, 0x1c, 0xf2, 0x26,
+  0xaf, 0xc1, 0x1a, 0x6e, 0xca, 0xd5, 0xdc, 0x58, 0x31, 0xf4, 0xc0, 0x6a,
+  0x89, 0x17, 0xcc, 0xa7, 0x96, 0x8e, 0x07, 0x18, 0x8d, 0x85, 0x68, 0xa7,
+  0x3b, 0x8a, 0x99, 0x9a, 0xf9, 0xe7, 0xd2, 0x90, 0x12, 0x4f, 0x67, 0xd4,
+  0x95, 0x10, 0xe0, 0x7d, 0x01, 0x25, 0xd2, 0x9d, 0x07, 0xd3, 0x3e, 0x3b,
+  0x1d, 0x9f, 0x93, 0x06, 0x70, 0xf6, 0xfe, 0xdc, 0x0c, 0x64, 0x54, 0x80,
+  0xba, 0x31, 0x44, 0x49, 0x2f, 0x16, 0x19, 0x4c, 0x48, 0x1d, 0xce, 0xd0,
+  0x5e, 0x0e, 0x46, 0x05, 0xb5, 0x46, 0x3f, 0xc9, 0x73, 0x64, 0x1b, 0x9b,
+  0xae, 0xa0, 0x5a, 0xd8, 0x2c, 0xc3, 0xed, 0x3b, 0xc9, 0xd6, 0x9f, 0xb6,
+  0x0d, 0xcd, 0x0e, 0x4b, 0xbb, 0x3b, 0xc3, 0xa1, 0xbc, 0x6a, 0xbe, 0x5d,
+  0xe7, 0x8b, 0x7c, 0x9e, 0x56, 0xde, 0xd4, 0x99, 0xa3, 0xd2, 0xfd, 0xb4,
+  0x7c, 0x65, 0x6a, 0xa8, 0x06, 0xd3, 0x76, 0xa6, 0x24, 0xed, 0x21, 0xb8,
+  0x92, 0x3b, 0xaa, 0x19, 0x29, 0x04, 0xd0, 0x98, 0x97, 0xb9, 0xdd, 0x3a,
+  0x3a, 0x33, 0x62, 0x57, 0xad, 0x8d, 0xea, 0x9e, 0x5b, 0xb0, 0x71, 0x24,
+  0x91, 0xe0, 0xa9, 0xb0, 0x5b, 0x97, 0x6c, 0x4c, 0xd2, 0x6a, 0x23, 0xb1,
+  0xbc, 0x98, 0xef, 0x26, 0xdd, 0x90, 0x2a, 0xbb, 0x5c, 0x99, 0x15, 0x24,
+  0xbc, 0xbb, 0xb4, 0xd2, 0xdf, 0x79, 0x2b, 0xd5, 0x01, 0x86, 0x13, 0x7a,
+  0x24, 0xaf, 0xd9, 0xcc, 0xbc, 0x30, 0x76, 0x0b, 0x5d, 0x1a, 0xd5, 0x5f,
+  0xa1, 0xd1, 0x08, 0xc5, 0x44, 0x08, 0xc6, 0xd3, 0x6b, 0xcd, 0x55, 0x69,
+  0x32, 0xc3, 0x68, 0xc0, 0xfe, 0xe9, 0xc9, 0xa1, 0x39, 0xb2, 0xe1, 0xb0,
+  0x36, 0xfb, 0x4f, 0xba, 0xf7, 0x52, 0x6c, 0xfa, 0x53, 0x38, 0x4c, 0xac,
+  0x6f, 0xe5, 0x54, 0x74, 0x60, 0x88, 0x4d, 0x7e, 0x17, 0x2c, 0xd4, 0x28,
+  0xaa, 0x37, 0xe6, 0xc3, 0xa9, 0x39, 0x32, 0x73, 0xe1, 0xde, 0xd0, 0x46,
+  0xb1, 0x6f, 0x24, 0xb1, 0x6a, 0x33, 0x28, 0x23, 0xa7, 0x7b, 0x9f, 0x3a,
+  0x5d, 0x66, 0x36, 0xcb, 0xe9, 0xb7, 0xe6, 0x7e, 0x19, 0x09, 0xb7, 0xca,
+  0x60, 0x7b, 0xc8, 0xa6, 0x2e, 0xdc, 0x66, 0xc2, 0x8c, 0xad, 0xaf, 0x4a,
+  0x32, 0x13, 0x37, 0x98, 0x17, 0x0f, 0xe9, 0x5b, 0x1b, 0x90, 0xe7, 0x8b,
+  0x44, 0xbf, 0x25, 0x9f, 0x32, 0xeb, 0x98, 0xf9, 0xba, 0xd9, 0xc0, 0x08,
+  0x9a, 0x3b, 0xcf, 0x48, 0x00, 0xaf, 0xe6, 0xb9, 0x57, 0x56, 0xe1, 0x31,
+  0x22, 0x75, 0x49, 0xca, 0x94, 0xf0, 0x70, 0x08, 0x43, 0x5c, 0xd9, 0x9a,
+  0xa7, 0x36, 0x30, 0x7b, 0x4b, 0x4f, 0x5e, 0x5e, 0xe9, 0xa3, 0x9e, 0x60,
+  0x4d, 0xcd, 0xe2, 0x48, 0x38, 0x90, 0x3d, 0x3d, 0x53, 0xbe, 0x5f, 0x56,
+  0xcc, 0xcc, 0xe6, 0xa5, 0xa1, 0xe5, 0x0d, 0x56, 0x59, 0x65, 0xda, 0x34,
+  0x6b, 0x9a, 0x25, 0xed, 0x38, 0xfb, 0x99, 0x4a, 0x7b, 0x36, 0x76, 0xd2,
+  0xb2, 0x5f, 0xf5, 0xbd, 0x53, 0x73, 0x1b, 0x35, 0xc6, 0x1e, 0x19, 0xd1,
+  0x59, 0x13, 0x1d, 0xeb, 0xce, 0x83, 0xbc, 0x8d, 0xa8, 0xdb, 0x6c, 0xf8,
+  0x3e, 0xc2, 0xc6, 0xea, 0xec, 0x7c, 0x0d, 0xf2, 0x11, 0x41, 0x66, 0x57,
+  0x66, 0x56, 0x34, 0xcb, 0x53, 0xd0, 0x09, 0x1f, 0x0d, 0x94, 0x11, 0x67,
+  0x11, 0x46, 0xf4, 0xe0, 0xbb, 0xae, 0x41, 0x37, 0x9f, 0xfb, 0x22, 0x49,
+  0xe7, 0x34, 0x3c, 0x35, 0x6b, 0x3f, 0xc1, 0x3a, 0x86, 0xd7, 0x09, 0x5d,
+  0x3f, 0x63, 0x36, 0xd0, 0x5d, 0x1c, 0x9e, 0x9e, 0x5c, 0x7b, 0xd7, 0x88,
+  0x2c, 0xf7, 0x82, 0xf4, 0x94, 0x01, 0xbc, 0x23, 0x93, 0xb2, 0x34, 0x66,
+  0xb2, 0x5b, 0x1a, 0xc9, 0x83, 0xac, 0x20, 0x6a, 0x97, 0x13, 0x35, 0x2c,
+  0x61, 0x69, 0xf9, 0xed, 0x9d, 0x31, 0x97, 0xd2, 0xcb, 0x34, 0xb7, 0xf4,
+  0x26, 0x37, 0x63, 0x96, 0xe8, 0xc3, 0x45, 0x29, 0xcf, 0xd3, 0x51, 0x91,
+  0x0a, 0x24, 0x7c, 0x6b, 0x55, 0xf3, 0xf5, 0x31, 0xab, 0x32, 0x9c, 0x07,
+  0xbc, 0x43, 0xc6, 0x25, 0xb5, 0x51, 0x87, 0x9b, 0x40, 0x51, 0x26, 0x9d,
+  0x13, 0xcc, 0x17, 0x1a, 0xa4, 0x19, 0x71, 0x63, 0x94, 0x7c, 0x53, 0xde,
+  0x64, 0xf0, 0x15, 0x42, 0xbf, 0xcf, 0xc9, 0xdb, 0x65, 0x54, 0xc1, 0x9b,
+  0x2c, 0x59, 0x18, 0xd5, 0xd3, 0xec, 0x26, 0xb4, 0x0f, 0xfc, 0xcc, 0x33,
+  0x0f, 0x0d, 0x85, 0xdf, 0xf0, 0x2e, 0xd9, 0x55, 0xd8, 0xa3, 0xbc, 0xe0,
+  0x2b, 0x91, 0x6c, 0x41, 0xbd, 0x99, 0xd2, 0x6e, 0x2d, 0x1b, 0xb7, 0x0a,
+  0xbb, 0x21, 0x37, 0x69, 0xed, 0x5d, 0xae, 0x0c, 0xa6, 0xe9, 0xb3, 0xd1,
+  0xde, 0xf3, 0xd1, 0xee, 0xc8, 0x18, 0x22, 0xd9, 0x75, 0x5e, 0xae, 0x6a,
+  0xf3, 0x69, 0x9a, 0x86, 0x7b, 0x27, 0xa3, 0x5b, 0xd9, 0x94, 0x97, 0x97,
+  0x73, 0xd6, 0x79, 0x76, 0xca, 0x8b, 0x0b, 0xd6, 0x7d, 0x8c, 0xa6, 0x67,
+  0xf5, 0x67, 0xb6, 0x80, 0x68, 0x67, 0xe4, 0xba, 0x31, 0x4b, 0x0d, 0x4d,
+  0xe4, 0x91, 0x73, 0x5e, 0x0c, 0x87, 0xe9, 0xa4, 0x6e, 0xc8, 0x98, 0x1a,
+  0xae, 0x8a, 0xfc, 0x76, 0x58, 0x97, 0xd3, 0x8f, 0xe6, 0x50, 0x5e, 0x2c,
+  0xd3, 0xe6, 0xea, 0x4f, 0x1d, 0x97, 0xf0, 0x16, 0xc9, 0x92, 0xed, 0x24,
+  0x79, 0xc9, 0x6a, 0x25, 0xed, 0x44, 0xc5, 0xf7, 0xcd, 0x9c, 0xa6, 0x8c,
+  0x92, 0xbc, 0x37, 0xa3, 0x18, 0x5a, 0x5e, 0x98, 0x43, 0x4d, 0x78, 0xb0,
+  0x81, 0xb2, 0xd2, 0xce, 0x70, 0x70, 0x38, 0x92, 0x18, 0x81, 0xdf, 0xce,
+  0x5c, 0x9d, 0xb2, 0xfa, 0x68, 0x14, 0xed, 0xb7, 0xc6, 0x64, 0x3c, 0xa0,
+  0x7f, 0x1b, 0x16, 0xd6, 0x60, 0xcb, 0x45, 0xb2, 0x9a, 0x19, 0x31, 0x33,
+  0x26, 0x8b, 0x3c, 0x9d, 0x0c, 0x3b, 0xc3, 0xc9, 0xf7, 0xe5, 0xa3, 0x89,
+  0xda, 0x1a, 0x4a, 0x4a, 0xc9, 0xe6, 0x97, 0xc6, 0xfe, 0xbb, 0xe2, 0x63,
+  0xc7, 0x80, 0xbc, 0x46, 0x43, 0xa1, 0x97, 0xc6, 0x82, 0x28, 0x9a, 0xee,
+  0x70, 0x57, 0x10, 0xd5, 0x24, 0x65, 0xd8, 0xd8, 0x05, 0x91, 0x88, 0x07,
+  0xc8, 0xda, 0x9f, 0xa3, 0xcf, 0x3a, 0xaf, 0x1d, 0xba, 0x33, 0x7d, 0xf2,
+  0xc8, 0x9c, 0xa9, 0xbf, 0xd1, 0xf3, 0x66, 0x58, 0x5f, 0x4f, 0x93, 0x17,
+  0xd0, 0xbe, 0x89, 0x4c, 0xa3, 0x1b, 0x3c, 0xde, 0x4e, 0xbe, 0x3f, 0x7c,
+  0xf7, 0xf6, 0xf8, 0xed, 0xd7, 0x07, 0xfc, 0x51, 0xa1, 0x34, 0xf3, 0xb7,
+  0xec, 0xd6, 0x88, 0xc0, 0x9c, 0x26, 0x6b, 0x24, 0x59, 0xf2, 0xaa, 0xc4,
+  0xec, 0xe8, 0xbc, 0xcd, 0xf7, 0x8c, 0x1c, 0xe9, 0xee, 0xc8, 0x6c, 0xd5,
+  0x71, 0xfc, 0x5a, 0x6e, 0xed, 0x46, 0xe5, 0xbb, 0xc9, 0x3b, 0xac, 0x13,
+  0x34, 0xcc, 0x91, 0x7d, 0xc7, 0x50, 0x96, 0x46, 0x24, 0x2a, 0x61, 0xe3,
+  0xeb, 0xb4, 0x3b, 0xc3, 0x2d, 0x4b, 0x63, 0xe9, 0xb2, 0x91, 0x6f, 0xc6,
+  0xbb, 0x35, 0x77, 0x86, 0xb6, 0x48, 0x07, 0x9b, 0x1a, 0x5e, 0x94, 0x89,
+  0xd6, 0x00, 0x3e, 0x07, 0x9b, 0x41, 0xf8, 0xd8, 0x28, 0x39, 0xbc, 0xe8,
+  0xce, 0x9a, 0x14, 0x17, 0x52, 0xe9, 0x55, 0x04, 0xce, 0x9c, 0x16, 0xcc,
+  0x2e, 0x5e, 0x1e, 0x51, 0x87, 0xa9, 0xcd, 0xe1, 0xcc, 0x54, 0xcc, 0xd3,
+  0x67, 0x3a, 0xc3, 0xc1, 0xee, 0x04, 0x8f, 0x21, 0x8d, 0x30, 0xa7, 0xd3,
+  0x24, 0xbb, 0xcf, 0x70, 0xe9, 0x45, 0x39, 0x83, 0x11, 0x11, 0xec, 0xcf,
+  0xd8, 0x7a, 0x7b, 0x36, 0x36, 0xdc, 0xaa, 0x93, 0x2d, 0xf2, 0xfb, 0x19,
+  0x12, 0x28, 0x2e, 0x9b, 0xab, 0x6d, 0xe7, 0xd3, 0x20, 0x1d, 0xc5, 0x2c,
+  0x78, 0xc7, 0x4c, 0x04, 0xeb, 0x2e, 0xba, 0x74, 0x0e, 0x9f, 0x33, 0xd4,
+  0xce, 0xbf, 0xae, 0xea, 0x06, 0xa6, 0x90, 0xc8, 0x7e, 0x5e, 0x89, 0x99,
+  0xd9, 0x22, 0x5b, 0x94, 0xd5, 0x5d, 0x30, 0x91, 0x63, 0x68, 0x1e, 0x64,
+  0x75, 0xca, 0x69, 0x11, 0x11, 0x40, 0x38, 0xaa, 0x3f, 0x90, 0x2c, 0x00,
+  0x72, 0xa8, 0x5b, 0x23, 0x10, 0x1a, 0x93, 0xe1, 0x3e, 0xc6, 0xf8, 0x76,
+  0xde, 0x5a, 0xb5, 0x9e, 0xe0, 0xe5, 0x61, 0xc3, 0x5e, 0x4c, 0xa9, 0x89,
+  0xf8, 0x6f, 0xe6, 0x29, 0xb1, 0x9b, 0x22, 0x6b, 0x9d, 0x0e, 0xc4, 0x06,
+  0x2f, 0x6b, 0x1d, 0x9d, 0x3f, 0x7d, 0x3c, 0xda, 0x6b, 0xd1, 0x79, 0x71,
+  0x47, 0x11, 0x82, 0x38, 0xf3, 0x38, 0x37, 0x1a, 0x63, 0xcd, 0xf3, 0x35,
+  0x3b, 0x78, 0x91, 0x5f, 0xae, 0xaa, 0x8c, 0x55, 0x37, 0x04, 0x15, 0x34,
+  0x96, 0x40, 0xda, 0xd0, 0x55, 0x09, 0x17, 0xbc, 0x91, 0xa2, 0xd9, 0xfc,
+  0x62, 0xd0, 0x19, 0x0e, 0x76, 0x0b, 0x91, 0x3e, 0xa6, 0x0f, 0x6e, 0x69,
+  0xec, 0x13, 0x0c, 0x56, 0x64, 0xa2, 0xbd, 0x2e, 0x0c, 0x27, 0x49, 0xc8,
+  0x07, 0x9d, 0x4c, 0xe7, 0x69, 0xbe, 0x00, 0x89, 0x8a, 0x8f, 0x75, 0x14,
+  0xbb, 0x12, 0x64, 0x59, 0xd0, 0xdb, 0x13, 0xb2, 0x79, 0xab, 0x9a, 0x44,
+  0x32, 0x4e, 0x54, 0x55, 0x66, 0xb6, 0x28, 0xaf, 0xb2, 0xe9, 0x47, 0xe5,
+  0x5a, 0xaa, 0x6b, 0x76, 0x69, 0x98, 0x82, 0x0b, 0x30, 0xac, 0xcd, 0x53,
+  0xab, 0x9a, 0xae, 0x48, 0x5d, 0xe7, 0xe4, 0x37, 0x23, 0x3b, 0x70, 0x35,
+  0x85, 0x79, 0x88, 0xcb, 0x62, 0x28, 0x5b, 0x59, 0x5f, 0x62, 0x78, 0x69,
+  0x31, 0x1b, 0x36, 0x55, 0xbe, 0xec, 0x9b, 0x1d, 0x9f, 0x4a, 0x5b, 0x33,
+  0xad, 0xc5, 0x54, 0x87, 0x15, 0xcc, 0x76, 0xf1, 0x34, 0xe9, 0xec, 0x66,
+  0x97, 0x20, 0xb1, 0xb7, 0x03, 0x72, 0x04, 0xe5, 0x46, 0x51, 0x60, 0x2b,
+  0x09, 0x7e, 0x4e, 0x63, 0x13, 0x89, 0xc4, 0x32, 0xe6, 0x5b, 0x3e, 0x85,
+  0xf6, 0x93, 0x5f, 0x66, 0x14, 0xc4, 0x31, 0x42, 0xac, 0x99, 0x1b, 0x9d,
+  0x28, 0xa4, 0x6f, 0xf3, 0x9b, 0xec, 0xb2, 0x6c, 0x48, 0x0d, 0x09, 0xc8,
+  0xe4, 0x3d, 0x18, 0xbc, 0xa5, 0x09, 0xd5, 0xf7, 0x7d, 0x65, 0x2c, 0x67,
+  0x45, 0xdc, 0x7c, 0x9a, 0xf5, 0x7d, 0x71, 0x35, 0xd4, 0x8d, 0xb9, 0x55,
+  0xdd, 0x53, 0x37, 0xa3, 0x4d, 0x33, 0x18, 0x5d, 0xd0, 0x18, 0x55, 0x61,
+  0x55, 0x4d, 0x9f, 0xd8, 0x01, 0x29, 0xc7, 0xcd, 0x4d, 0x3e, 0xcd, 0xd4,
+  0x0f, 0x27, 0xce, 0xe9, 0x79, 0x1e, 0xf2, 0xf8, 0x05, 0xdd, 0x47, 0xf3,
+  0x12, 0x2b, 0xe3, 0xe4, 0x36, 0xb9, 0xc9, 0x49, 0x59, 0x17, 0x86, 0x07,
+  0x5d, 0x4c, 0xe4, 0x40, 0x5a, 0xe5, 0xf0, 0x11, 0x99, 0xe1, 0x64, 0x9e,
+  0x9e, 0x29, 0xef, 0xdf, 0x2f, 0x9e, 0x37, 0xde, 0x17, 0xfb, 0xc5, 0xd9,
+  0x2d, 0xb8, 0x5c, 0x17, 0x69, 0x3e, 0x8f, 0xec, 0x13, 0x98, 0xd8, 0x65,
+  0x06, 0x77, 0x1a, 0x9f, 0xc1, 0x8a, 0x36, 0x9d, 0x02, 0x6e, 0x21, 0x83,
+  0xca, 0x32, 0x36, 0x24, 0x60, 0x75, 0xdc, 0xde, 0xd9, 0xed, 0x85, 0xb6,
+  0xc6, 0x67, 0x27, 0x7f, 0xe7, 0xe3, 0xf3, 0xae, 0x67, 0x4a, 0xa3, 0xa6,
+  0x4b, 0x8a, 0x2c, 0x75, 0x6f, 0x28, 0xd9, 0x5c, 0x14, 0x9c, 0xdc, 0x56,
+  0xd7, 0x71, 0x26, 0x8e, 0x73, 0x1b, 0xd4, 0x03, 0x33, 0x22, 0x7e, 0x26,
+  0x57, 0x98, 0xc7, 0x11, 0xee, 0xdb, 0xe5, 0xe3, 0x46, 0xb0, 0x1a, 0x39,
+  0x0c, 0xfe, 0xd9, 0xa2, 0xd8, 0xd2, 0xb0, 0x2e, 0x1b, 0x5a, 0x22, 0x57,
+  0xaf, 0xf0, 0x39, 0x58, 0x58, 0xb8, 0xb3, 0x31, 0x3e, 0x4e, 0x36, 0x1f,
+  0x29, 0xc8, 0x2c, 0x61, 0x06, 0x09, 0x2b, 0x74, 0xcc, 0xac, 0xa6, 0xec,
+  0xfc, 0x15, 0xe5, 0x81, 0xc5, 0x0c, 0xa6, 0x7a, 0x31, 0x4f, 0x2f, 0xe1,
+  0x57, 0xbb, 0xec, 0xde, 0xd0, 0xa2, 0x94, 0x08, 0x5f, 0x5d, 0x1a, 0xd6,
+  0x4e, 0xab, 0x16, 0x9f, 0x56, 0x9d, 0x6c, 0x19, 0x22, 0x9b, 0xaf, 0x20,
+  0xe7, 0x4f, 0xcd, 0xf2, 0xc6, 0xe3, 0x6f, 0xb6, 0x7d, 0xf6, 0x86, 0xdd,
+  0x7d, 0x08, 0x73, 0x23, 0xee, 0x04, 0xeb, 0xfb, 0x2b, 0x3e, 0x8f, 0x36,
+  0x83, 0xb3, 0x66, 0x9d, 0xaf, 0xc2, 0x29, 0x5d, 0xd2, 0x2a, 0xc8, 0x07,
+  0x3a, 0xb2, 0x57, 0x9f, 0x9e, 0x54, 0x57, 0x2c, 0x13, 0x76, 0x4b, 0x33,
+  0x58, 0xd5, 0x2b, 0x78, 0xa5, 0x20, 0x8b, 0xbb, 0xc3, 0x19, 0x46, 0x6f,
+  0x58, 0xd1, 0xaa, 0xa0, 0x3f, 0xad, 0xf2, 0x9c, 0xc3, 0x8c, 0xa3, 0xb3,
+  0xa8, 0xc8, 0xf7, 0x4d, 0x06, 0xb0, 0x55, 0x3e, 0x0d, 0x4f, 0xd1, 0xb1,
+  0x69, 0x2f, 0xbb, 0x97, 0xd0, 0xa8, 0x66, 0x60, 0x37, 0x46, 0x7c, 0x1a,
+  0xa1, 0x4c, 0x17, 0xae, 0x87, 0x7b, 0x6f, 0xd5, 0x2b, 0xc3, 0x5f, 0xc8,
+  0x66, 0x10, 0xe6, 0x41, 0xf4, 0xd8, 0x9d, 0x1d, 0xb3, 0x17, 0x23, 0x69,
+  0x3c, 0x3e, 0xb2, 0xfd, 0x6b, 0x5f, 0x10, 0x1c, 0x9a, 0x7f, 0x8a, 0x46,
+  0xf4, 0x66, 0xc6, 0x12, 0x83, 0x2e, 0x16, 0xa8, 0x61, 0xe7, 0x27, 0xe3,
+  0xd8, 0x61, 0xb6, 0x03, 0x53, 0xf4, 0x3e, 0x31, 0x5b, 0xf2, 0x1f, 0xb2,
+  0x3f, 0xb5, 0x24, 0x6b, 0xc0, 0x0b, 0x4e, 0xf9, 0x8e, 0xbe, 0x65, 0x46,
+  0x51, 0x2c, 0x36, 0x94, 0x39, 0xea, 0x4d, 0x0c, 0x8c, 0x04, 0x35, 0x69,
+  0x26, 0xd6, 0x77, 0xfa, 0xf2, 0xd0, 0x1f, 0x17, 0xce, 0xd2, 0xee, 0x45,
+  0xf0, 0x7e, 0xbf, 0x55, 0x6f, 0x5b, 0x1e, 0x66, 0x46, 0x39, 0x3b, 0x7a,
+  0x03, 0xc3, 0x35, 0x35, 0x74, 0xf3, 0x56, 0xfd, 0x94, 0x1a, 0xd4, 0x9e,
+  0xac, 0xf2, 0x79, 0x2b, 0x18, 0xe0, 0x6c, 0x6d, 0x44, 0x94, 0x99, 0xb4,
+  0x30, 0x35, 0x0e, 0x6b, 0xe5, 0xf0, 0x0b, 0x77, 0x09, 0xad, 0xb9, 0x5b,
+  0x8a, 0x4b, 0x7b, 0x55, 0xb7, 0x3c, 0x47, 0x2a, 0x97, 0xe7, 0x0d, 0xd4,
+  0x6b, 0x32, 0x68, 0xbd, 0x31, 0x83, 0x13, 0xc2, 0xb4, 0x48, 0x0c, 0x5c,
+  0x16, 0xf9, 0xdf, 0x45, 0xff, 0xcc, 0x8a, 0xeb, 0xbc, 0x2a, 0x0b, 0xd2,
+  0x6f, 0x8d, 0xcd, 0x5b, 0xe5, 0x60, 0xcb, 0xa4, 0x7a, 0x19, 0xc6, 0xb1,
+  0xf9, 0xf2, 0xfd, 0xbb, 0x93, 0x0f, 0x2f, 0x0f, 0x3f, 0x7c, 0xf5, 0xfe,
+  0xed, 0xab, 0x93, 0xa3, 0xcd, 0xce, 0x70, 0xe4, 0xec, 0xcb, 0xc5, 0x43,
+  0x5f, 0x93, 0xc9, 0x81, 0x4b, 0x62, 0xa6, 0xc8, 0x23, 0x5f, 0xe6, 0xd7,
+  0x86, 0xa1, 0xc1, 0x82, 0x80, 0x73, 0x1e, 0x7f, 0x83, 0x3b, 0x4b, 0x36,
+  0xbc, 0x33, 0xdc, 0x64, 0x45, 0x3a, 0xda, 0xa8, 0xa5, 0x29, 0xeb, 0x55,
+  0x11, 0x73, 0x5d, 0x27, 0x18, 0xd1, 0xae, 0x49, 0x8b, 0x2a, 0x66, 0x64,
+  0xb7, 0x78, 0xd6, 0xa1, 0xe7, 0xa7, 0x5f, 0x35, 0xc6, 0x3c, 0xd2, 0xc8,
+  0x80, 0xd1, 0xd8, 0xca, 0x8f, 0x9a, 0x5e, 0x60, 0x6c, 0xab, 0xc3, 0xc8,
+  0x71, 0xd7, 0x4e, 0x0b, 0x9d, 0x25, 0x9b, 0x34, 0x92, 0xa1, 0xdf, 0xa1,
+  0x4c, 0x72, 0x5a, 0x35, 0xc6, 0xb0, 0xc9, 0x72, 0x5c, 0x0c, 0x0d, 0x9f,
+  0x92, 0xbe, 0x0a, 0xaf, 0x5c, 0xa0, 0x5d, 0x1b, 0x3d, 0x93, 0xf6, 0x00,
+  0x9a, 0x7d, 0x76, 0x9b, 0xe1, 0xe6, 0xc9, 0x5b, 0x2f, 0x57, 0x15, 0x6e,
+  0xf3, 0xf7, 0x46, 0x1b, 0x21, 0xee, 0xf7, 0x0a, 0x6e, 0x3d, 0xf3, 0x82,
+  0x3e, 0x64, 0xc4, 0x4c, 0x57, 0xe4, 0x95, 0x73, 0x0a, 0xa8, 0xa6, 0x70,
+  0xa1, 0xc0, 0xe1, 0x75, 0x76, 0x78, 0xfe, 0x4d, 0x54, 0x91, 0x75, 0xb9,
+  0x3c, 0x42, 0x8a, 0x50, 0xca, 0xeb, 0x46, 0x2e, 0xc8, 0xdb, 0xf1, 0x38,
+  0x41, 0xa6, 0xc8, 0x3c, 0x9f, 0x54, 0x29, 0x7d, 0x93, 0x7e, 0x4c, 0x3f,
+  0x35, 0x64, 0xdd, 0x19, 0xee, 0xec, 0xdb, 0x97, 0xe3, 0xdf, 0xed, 0xed,
+  0x91, 0x06, 0xbf, 0x32, 0xfb, 0xb2, 0x65, 0x5e, 0x29, 0x6a, 0x73, 0x33,
+  0x17, 0xa3, 0xba, 0xdc, 0x86, 0xd8, 0xae, 0x45, 0x1d, 0x48, 0xaf, 0x8d,
+  0xb4, 0x05, 0x1d, 0x29, 0x51, 0x9b, 0xe3, 0x0c, 0xf6, 0x04, 0x8c, 0x4e,
+  0xd2, 0x68, 0x0c, 0xbf, 0x30, 0xf2, 0x7a, 0x1e, 0x2a, 0xe3, 0x5b, 0xf9,
+  0xe9, 0x58, 0x92, 0x50, 0xd2, 0xa9, 0xf9, 0x2b, 0x79, 0x08, 0xb6, 0x69,
+  0x65, 0xed, 0x1b, 0xa6, 0xab, 0x1a, 0xb3, 0x36, 0x7a, 0x4e, 0xa6, 0x0b,
+  0x72, 0x67, 0x42, 0xae, 0x50, 0x74, 0x2f, 0x97, 0xcb, 0x4f, 0x02, 0x39,
+  0x4c, 0xd2, 0xe9, 0xc7, 0x9b, 0xb4, 0x9a, 0xb1, 0x2d, 0x64, 0x28, 0x66,
+  0x92, 0xcf, 0xf3, 0xe6, 0x8e, 0x0d, 0xda, 0xae, 0x31, 0xcd, 0x81, 0x51,
+  0xda, 0x40, 0x73, 0x8f, 0x2e, 0x8d, 0xad, 0x4f, 0xda, 0x27, 0xa9, 0xf7,
+  0x79, 0xe3, 0xdb, 0xb2, 0x50, 0x91, 0x1a, 0xab, 0xe2, 0xd8, 0x6f, 0x07,
+  0xe2, 0xb1, 0xe1, 0x7b, 0x84, 0x69, 0x3a, 0xda, 0x55, 0x36, 0xe8, 0x33,
+  0x29, 0x25, 0x9f, 0xa4, 0xbe, 0x33, 0x52, 0x7e, 0x91, 0x44, 0x54, 0x44,
+  0xa4, 0x0d, 0x25, 0xdf, 0x66, 0x77, 0xc6, 0x70, 0xce, 0x0b, 0xc7, 0x29,
+  0xd9, 0xb0, 0xcf, 0xc8, 0xb2, 0x63, 0x5d, 0x34, 0x57, 0x2f, 0x7a, 0x26,
+  0x81, 0x10, 0x96, 0x24, 0xa1, 0xe7, 0x80, 0xdf, 0x57, 0x3d, 0x9c, 0x86,
+  0xd8, 0xac, 0x5b, 0x2c, 0x19, 0x5f, 0x0a, 0x0f, 0x71, 0x6c, 0x7e, 0x5e,
+  0x14, 0xd9, 0x5c, 0x8e, 0xef, 0x7c, 0xdd, 0x01, 0xd8, 0x67, 0xcd, 0x94,
+  0xbf, 0xe7, 0x1b, 0xdd, 0x19, 0xee, 0x19, 0x47, 0xf5, 0xd3, 0x46, 0x65,
+  0x92, 0xa6, 0x0b, 0x19, 0xab, 0x68, 0xd7, 0xfe, 0x6a, 0xd4, 0xfb, 0x99,
+  0xe0, 0x36, 0x55, 0xee, 0xd0, 0xdb, 0x67, 0xce, 0xde, 0x50, 0x1c, 0x32,
+  0x9d, 0xb1, 0x1c, 0xf1, 0x1f, 0xad, 0x66, 0x85, 0xc8, 0x45, 0x67, 0x38,
+  0x5f, 0xcb, 0x56, 0x19, 0x26, 0xeb, 0xd8, 0x34, 0x7a, 0x6a, 0x59, 0xc1,
+  0x51, 0x54, 0x95, 0xe6, 0xac, 0x5b, 0xe7, 0xb9, 0xc5, 0xca, 0x46, 0xf7,
+  0x9a, 0x08, 0x37, 0xf7, 0x36, 0x66, 0x3b, 0x76, 0xd1, 0x03, 0xcd, 0x24,
+  0x34, 0x57, 0x7b, 0x2d, 0xce, 0xb6, 0x84, 0x06, 0x97, 0x7e, 0x61, 0xd8,
+  0xd8, 0xbf, 0x2e, 0xa0, 0x99, 0x19, 0x82, 0xf9, 0x85, 0x32, 0x4b, 0x68,
+  0xb1, 0x25, 0xa8, 0xdf, 0xa8, 0x44, 0xa6, 0x49, 0x58, 0xdf, 0xeb, 0x92,
+  0x33, 0x05, 0x58, 0x71, 0x64, 0x27, 0x72, 0x68, 0x06, 0x90, 0x1f, 0x50,
+  0x7c, 0x8d, 0x07, 0x1b, 0xc9, 0x56, 0x36, 0xba, 0x34, 0xe3, 0x6d, 0xd0,
+  0x38, 0x7b, 0x07, 0xf4, 0xdf, 0x7d, 0xfc, 0xf7, 0xd1, 0x86, 0xe6, 0xf4,
+  0xf9, 0x5b, 0x4f, 0xd2, 0xbc, 0x2b, 0x8b, 0x38, 0x10, 0xe7, 0x84, 0xfb,
+  0x80, 0x9d, 0xcb, 0x7d, 0x8c, 0x87, 0x75, 0xd6, 0x13, 0xde, 0xe5, 0x50,
+  0xdd, 0xd2, 0x6d, 0x58, 0xb0, 0x2f, 0xe2, 0x3a, 0x63, 0x67, 0x88, 0x59,
+  0xd9, 0xd4, 0xa8, 0x87, 0xf0, 0x1f, 0xea, 0xad, 0x9a, 0x7e, 0xa8, 0xb2,
+  0xab, 0xb4, 0xbe, 0x4a, 0x56, 0x0d, 0x13, 0xa1, 0xa1, 0xdb, 0xee, 0x70,
+  0xcb, 0x79, 0xee, 0x5c, 0x6c, 0xf2, 0xe9, 0x91, 0xda, 0x7d, 0xee, 0x14,
+  0x39, 0xf4, 0x31, 0x2f, 0x6f, 0xf4, 0x99, 0xa1, 0x24, 0xd9, 0xc5, 0xd4,
+  0x02, 0x73, 0x9a, 0xf0, 0x99, 0xd0, 0x63, 0x7e, 0x08, 0x7b, 0x41, 0xda,
+  0x24, 0x65, 0x00, 0x1a, 0x16, 0x77, 0x61, 0x76, 0x8c, 0x2c, 0xba, 0x39,
+  0xce, 0x8d, 0x6c, 0x57, 0xcc, 0x3b, 0x30, 0x4d, 0x45, 0xcf, 0xcb, 0x2f,
+  0xc4, 0x6d, 0x2b, 0xff, 0x86, 0x3c, 0x15, 0xed, 0xab, 0xe6, 0x30, 0x77,
+  0x57, 0xf5, 0xba, 0x9f, 0xb4, 0x95, 0x41, 0x5a, 0x4d, 0x47, 0x16, 0xcb,
+  0x91, 0x12, 0xa5, 0xeb, 0xfc, 0x12, 0xb6, 0x46, 0xcc, 0x81, 0xc1, 0x0e,
+  0xa9, 0x7f, 0xe9, 0x92, 0x98, 0x19, 0x0f, 0xc9, 0x51, 0xba, 0xaa, 0x1f,
+  0x70, 0x47, 0x3c, 0xa6, 0xcb, 0xef, 0x58, 0x47, 0x31, 0x87, 0xf3, 0xfd,
+  0x0d, 0xe8, 0x52, 0xe1, 0x9d, 0x47, 0x18, 0x2f, 0xbd, 0x9b, 0x35, 0xe6,
+  0x81, 0xde, 0x89, 0x8b, 0x64, 0x2b, 0xfd, 0x98, 0x8e, 0x92, 0xd3, 0x97,
+  0xe3, 0x33, 0xfa, 0x84, 0xa1, 0x8e, 0xe2, 0xd2, 0xcc, 0xe2, 0x64, 0xdc,
+  0x19, 0x2e, 0xbb, 0x6d, 0xb2, 0xa2, 0x8e, 0x39, 0x27, 0xc3, 0x6d, 0xd6,
+  0xf0, 0x81, 0xe6, 0xd5, 0xc8, 0x64, 0x8d, 0xa5, 0x8f, 0x80, 0x38, 0xc5,
+  0x77, 0x29, 0xf9, 0x22, 0xe1, 0xab, 0x16, 0x7c, 0x68, 0x69, 0x6e, 0xfe,
+  0x6c, 0xdb, 0xba, 0x6a, 0x06, 0x4a, 0x0b, 0x36, 0x4e, 0x58, 0xaf, 0x2e,
+  0xc9, 0x06, 0xa9, 0xd5, 0x6e, 0xb4, 0x5f, 0x30, 0xbb, 0x11, 0xaa, 0x0a,
+  0xb2, 0x6c, 0xeb, 0x45, 0x34, 0x56, 0x13, 0xa5, 0x50, 0x41, 0x45, 0x2a,
+  0x4a, 0x37, 0x2a, 0xa5, 0x51, 0x20, 0x5d, 0x34, 0x47, 0x64, 0x6d, 0x9a,
+  0x19, 0x15, 0x74, 0x16, 0x51, 0x02, 0xf8, 0x50, 0xd4, 0x70, 0xba, 0x90,
+  0x14, 0xd1, 0x88, 0xff, 0x07, 0x03, 0x4d, 0x59, 0x45, 0x23, 0xaa, 0x47,
+  0x84, 0x22, 0x27, 0x1f, 0x29, 0x29, 0xcc, 0x6c, 0xaa, 0xd3, 0x78, 0xf6,
+  0xfe, 0x7f, 0x5d, 0xac, 0xcc, 0xc6, 0x47, 0xa4, 0x31, 0x29, 0x55, 0x24,
+  0x66, 0x68, 0x03, 0xd7, 0x39, 0xf6, 0x1e, 0xef, 0xb5, 0x1d, 0xd8, 0x20,
+  0x36, 0x63, 0x00, 0x64, 0xc9, 0x0b, 0xfa, 0xef, 0xbd, 0x5c, 0x19, 0x39,
+  0x2b, 0x78, 0x5e, 0x02, 0x9d, 0xcc, 0x3b, 0xc5, 0x17, 0x93, 0xb4, 0x19,
+  0x74, 0x20, 0xbd, 0x40, 0x6e, 0x23, 0xe2, 0x7b, 0x83, 0xe4, 0x15, 0x65,
+  0x62, 0x1f, 0xbd, 0xfd, 0x1a, 0x34, 0x70, 0xb6, 0xb7, 0x8f, 0xb0, 0x92,
+  0xb5, 0x1e, 0x66, 0xf8, 0x48, 0xcd, 0x8e, 0x04, 0x0e, 0x0b, 0x87, 0x8a,
+  0x2f, 0x64, 0xc2, 0x00, 0x6c, 0x94, 0xe2, 0x81, 0x48, 0x1b, 0x9a, 0x7d,
+  0x3a, 0xf9, 0x15, 0x18, 0xa2, 0x47, 0x03, 0xd9, 0x41, 0x71, 0xcc, 0x7c,
+  0xcc, 0xee, 0xdc, 0xdf, 0xb0, 0xab, 0xde, 0x56, 0xbb, 0x87, 0x5f, 0x78,
+  0x9b, 0xf4, 0x97, 0x03, 0x4a, 0x4d, 0x32, 0x5a, 0xea, 0xec, 0xa7, 0x5f,
+  0x26, 0x11, 0xe3, 0x3b, 0x1f, 0x71, 0xb6, 0xc0, 0xcf, 0xa5, 0x49, 0x40,
+  0x1c, 0xf3, 0x67, 0x16, 0x2f, 0x79, 0xf0, 0x94, 0x22, 0x4f, 0x04, 0x9f,
+  0x16, 0x56, 0x25, 0x19, 0x72, 0xe6, 0x17, 0x32, 0xc1, 0xba, 0x7b, 0x3f,
+  0x2d, 0xe7, 0x81, 0xac, 0x6b, 0x19, 0xae, 0xd0, 0xe7, 0xf7, 0x45, 0xbe,
+  0xc1, 0x98, 0x63, 0x66, 0x23, 0x5a, 0x74, 0xf7, 0x3a, 0x58, 0x9d, 0x1a,
+  0xea, 0x97, 0x93, 0x8c, 0xf4, 0x26, 0xbf, 0x88, 0xf8, 0x36, 0xa6, 0xc6,
+  0x9a, 0xd2, 0x28, 0x71, 0x1a, 0x6f, 0x4c, 0xfd, 0x37, 0x67, 0xab, 0x7b,
+  0x6b, 0x0e, 0x9d, 0xfc, 0x4c, 0x76, 0xd7, 0x06, 0xbe, 0xa7, 0xc9, 0x30,
+  0xb9, 0x2a, 0x57, 0xfd, 0x5c, 0xb2, 0x48, 0xc3, 0xf8, 0x05, 0xa7, 0x1a,
+  0x88, 0x37, 0x4a, 0x52, 0xaa, 0x5a, 0x7e, 0x7c, 0x26, 0x3f, 0xb2, 0x44,
+  0x37, 0xbc, 0x2d, 0xd9, 0x88, 0x1d, 0x45, 0xc3, 0x51, 0x4f, 0xb9, 0x42,
+  0xf9, 0x35, 0x6d, 0x9d, 0xd2, 0x8e, 0x73, 0x6c, 0xb6, 0x55, 0xdf, 0xb2,
+  0xa0, 0x3f, 0x0b, 0xf2, 0x89, 0xfd, 0x5b, 0x84, 0x20, 0xa3, 0xb4, 0x48,
+  0xbe, 0x71, 0x89, 0x7b, 0x40, 0x81, 0xa1, 0xec, 0x47, 0x49, 0x3f, 0x9f,
+  0xdf, 0x3d, 0xc8, 0xa0, 0x53, 0x05, 0x44, 0xed, 0x36, 0xcf, 0x98, 0x0b,
+  0xac, 0x9d, 0x2e, 0x81, 0x18, 0x36, 0xde, 0x50, 0x2e, 0x09, 0xd3, 0x2e,
+  0xf9, 0x5e, 0xf3, 0xe9, 0x47, 0x44, 0x5d, 0x44, 0x42, 0xf9, 0xeb, 0xd3,
+  0x84, 0x3d, 0x4e, 0x35, 0x8d, 0x1c, 0x01, 0x6c, 0x49, 0x72, 0x0a, 0x13,
+  0x4d, 0x92, 0x74, 0xce, 0x0b, 0xd6, 0xd9, 0x7a, 0xbd, 0x0c, 0x66, 0xae,
+  0x1f, 0x5e, 0x1d, 0xbf, 0x4b, 0xb6, 0x48, 0x03, 0xef, 0x1a, 0xb9, 0x2a,
+  0xde, 0x77, 0xb2, 0x66, 0xba, 0xb3, 0xfc, 0x98, 0xef, 0x18, 0x63, 0x73,
+  0x36, 0xd9, 0xb6, 0x46, 0x14, 0x3e, 0x47, 0x54, 0x68, 0x0d, 0x53, 0xb5,
+  0x4c, 0x61, 0x9a, 0x06, 0xae, 0x47, 0x67, 0xaa, 0x72, 0x69, 0x8b, 0xb5,
+  0x51, 0x79, 0x9b, 0x98, 0xa0, 0x11, 0x9e, 0xe1, 0xb4, 0x08, 0x04, 0x75,
+  0x32, 0xf6, 0x4b, 0x1b, 0x1b, 0xbb, 0x7b, 0x57, 0x39, 0xed, 0x51, 0x1c,
+  0x39, 0xec, 0xc0, 0xd1, 0x5c, 0x3d, 0x11, 0x17, 0x4e, 0xfb, 0x1d, 0x50,
+  0x96, 0x25, 0x6d, 0xca, 0x92, 0x44, 0xd2, 0x8c, 0xdc, 0x80, 0xdd, 0xe1,
+  0xa0, 0xc9, 0x6d, 0x8c, 0x76, 0x36, 0x12, 0x9b, 0x57, 0x6a, 0x76, 0x99,
+  0x13, 0xa7, 0x6d, 0xd0, 0xcb, 0x90, 0xd8, 0xc5, 0xaa, 0xb6, 0x7e, 0xcc,
+  0xd4, 0x9e, 0xd7, 0x28, 0xc6, 0x50, 0xbd, 0xe3, 0xb4, 0x3a, 0x97, 0xd1,
+  0x8d, 0x71, 0xb3, 0x7c, 0x6b, 0x5d, 0x26, 0x85, 0xa3, 0xda, 0xf8, 0x71,
+  0x23, 0xf1, 0xf2, 0x12, 0x5b, 0xe9, 0x89, 0xb9, 0xcb, 0x1c, 0xf2, 0x84,
+  0x80, 0x91, 0xc8, 0xf6, 0x0e, 0xcf, 0xb2, 0x79, 0xbe, 0xc8, 0x61, 0x7b,
+  0xf9, 0x53, 0x18, 0xc6, 0x82, 0x83, 0x6e, 0x4a, 0x3f, 0x86, 0x53, 0xd2,
+  0x5c, 0xdf, 0x94, 0x7e, 0x6d, 0xa6, 0x04, 0x8f, 0x18, 0xa7, 0x62, 0xc6,
+  0xad, 0xe6, 0xf6, 0x84, 0x6c, 0xb6, 0xf0, 0x9a, 0x90, 0xb1, 0xbd, 0x4b,
+  0x7d, 0xaa, 0xbc, 0x73, 0x89, 0xe8, 0xa5, 0x67, 0xa6, 0x96, 0x2c, 0x3f,
+  0x4e, 0xeb, 0xbd, 0xbd, 0xae, 0xa0, 0xab, 0x1d, 0x45, 0x89, 0xfd, 0x9e,
+  0x5a, 0xc2, 0x7c, 0xff, 0xee, 0x38, 0xd9, 0xa2, 0xea, 0x90, 0x67, 0x4f,
+  0xf6, 0xf6, 0xb7, 0xfd, 0x94, 0x12, 0x65, 0x00, 0xa1, 0xdc, 0xbc, 0xe3,
+  0x70, 0xac, 0x77, 0x01, 0xe7, 0xe5, 0x34, 0x15, 0x8d, 0xc3, 0x0d, 0x3d,
+  0xcb, 0xae, 0xf3, 0x29, 0x15, 0xe7, 0x50, 0x24, 0x9e, 0x78, 0xf0, 0x24,
+  0x33, 0x93, 0x0c, 0x76, 0xdc, 0xa5, 0xf2, 0xf2, 0xec, 0x8d, 0x89, 0x64,
+  0x35, 0x65, 0x4a, 0x98, 0x36, 0x34, 0xd0, 0xc8, 0xde, 0xf9, 0xb3, 0x96,
+  0x28, 0x41, 0xda, 0xe3, 0x09, 0xa2, 0x75, 0x71, 0xe9, 0x0c, 0x74, 0x8c,
+  0x81, 0x0b, 0xfc, 0x0c, 0x87, 0xb2, 0x59, 0xc2, 0x7a, 0x6d, 0xdc, 0x98,
+  0x52, 0x4f, 0xba, 0x07, 0x28, 0x73, 0xda, 0x20, 0x41, 0x52, 0x40, 0xb8,
+  0xa7, 0x6e, 0x50, 0xbb, 0xfb, 0xbe, 0x26, 0xd4, 0x1e, 0x35, 0xf4, 0x94,
+  0x83, 0x70, 0x8c, 0xe6, 0x12, 0x1f, 0xf2, 0x37, 0x72, 0x32, 0xb5, 0xd9,
+  0xa7, 0x1c, 0x0f, 0x9d, 0xbd, 0x78, 0x0d, 0x27, 0xac, 0x28, 0x28, 0xbf,
+  0x4d, 0xf5, 0xf1, 0x40, 0x8e, 0x9b, 0xd7, 0x77, 0x54, 0x08, 0x41, 0x0a,
+  0xa9, 0xbf, 0x91, 0x3d, 0x3f, 0x86, 0x79, 0xc2, 0xd3, 0xf3, 0x51, 0x1c,
+  0x3d, 0x50, 0x8a, 0x6d, 0xee, 0x46, 0xe8, 0x2b, 0x56, 0xc1, 0x6f, 0x8e,
+  0x68, 0x5a, 0xce, 0x3a, 0x26, 0x3b, 0x6d, 0x82, 0x27, 0xf0, 0xc0, 0xfd,
+  0x38, 0x54, 0x09, 0x8e, 0x17, 0xf7, 0x64, 0x13, 0xa5, 0xb2, 0x7b, 0xfd,
+  0x67, 0xf1, 0xc0, 0x98, 0x47, 0x0d, 0x2c, 0xf0, 0x17, 0x71, 0xc0, 0x7b,
+  0x7c, 0x4e, 0x2f, 0x03, 0x89, 0x5d, 0x5b, 0x65, 0xc8, 0xe9, 0x6a, 0x94,
+  0x25, 0x9e, 0x60, 0xe3, 0x42, 0x8b, 0x86, 0xf2, 0x05, 0x91, 0x0e, 0x40,
+  0xc9, 0x5e, 0x9d, 0xbb, 0xc9, 0x8e, 0x1d, 0x73, 0x5d, 0xb6, 0x4e, 0x38,
+  0x48, 0x99, 0x9c, 0xbd, 0xfe, 0x41, 0xb9, 0x65, 0xcc, 0x80, 0x87, 0x23,
+  0xea, 0x8f, 0x36, 0x2d, 0xcc, 0x58, 0x14, 0x94, 0xa2, 0x96, 0x4b, 0xba,
+  0x27, 0xbb, 0x89, 0x10, 0x0e, 0xdf, 0x76, 0x59, 0x8c, 0xb4, 0xd5, 0x1b,
+  0x2f, 0xf0, 0xbb, 0x6e, 0xac, 0xa9, 0x64, 0x4b, 0xe6, 0x4f, 0x3f, 0xf2,
+  0xaf, 0x99, 0xc7, 0x9a, 0x7f, 0x35, 0x57, 0xab, 0xc5, 0xc4, 0x9c, 0x67,
+  0xd1, 0xfc, 0x69, 0x23, 0xe1, 0x60, 0xeb, 0x85, 0xec, 0xe7, 0x1a, 0xb3,
+  0x33, 0xd7, 0x42, 0x1d, 0xf5, 0x2d, 0xb6, 0x76, 0x8d, 0x67, 0xa7, 0x45,
+  0x03, 0x2e, 0x31, 0xcf, 0x1c, 0x1e, 0xfb, 0xb2, 0x03, 0x55, 0xef, 0xbd,
+  0x21, 0xcf, 0x1f, 0xdf, 0xfc, 0xf9, 0xc7, 0xe7, 0x8f, 0x1e, 0xa7, 0xcf,
+  0xd2, 0xe9, 0xd3, 0x8b, 0xcf, 0xd3, 0x27, 0xb3, 0x27, 0xcf, 0x9e, 0xef,
+  0x7f, 0xfe, 0x24, 0x7d, 0xf6, 0xf8, 0x22, 0x7d, 0xba, 0x97, 0xed, 0x3d,
+  0xbf, 0xd8, 0x7f, 0x34, 0x9b, 0x5d, 0x64, 0x9f, 0xcf, 0x9e, 0xa5, 0x1b,
+  0x23, 0x98, 0x5f, 0x3a, 0xf5, 0x90, 0xd5, 0x6a, 0xe0, 0x2d, 0x4d, 0xc6,
+  0xdf, 0x1c, 0x0e, 0xf7, 0x92, 0xab, 0xec, 0x56, 0x2f, 0x18, 0x7b, 0x34,
+  0x6d, 0xba, 0x5d, 0x26, 0x09, 0xd5, 0xfd, 0x8b, 0xd5, 0x0a, 0x41, 0x4a,
+  0x97, 0x26, 0x5f, 0x09, 0x34, 0x60, 0xde, 0x45, 0xdd, 0x56, 0x4e, 0xa8,
+  0xb3, 0xfe, 0xc3, 0x03, 0xf5, 0xd9, 0xd3, 0xba, 0xba, 0x97, 0xff, 0xc4,
+  0xbc, 0x33, 0x7f, 0x93, 0x4e, 0x8d, 0x92, 0x64, 0xf6, 0x44, 0x1e, 0x1c,
+  0x1b, 0xd3, 0xd6, 0xb0, 0xe9, 0x41, 0x22, 0x7f, 0x21, 0x2f, 0xb1, 0x37,
+  0xc6, 0xd7, 0x55, 0xb9, 0x5a, 0x9e, 0x95, 0xf3, 0x7c, 0x7a, 0xb7, 0x6e,
+  0x38, 0xff, 0xb1, 0xd6, 0x2f, 0x8e, 0x98, 0x85, 0xe7, 0x75, 0xf6, 0x1b,
+  0x9a, 0x56, 0x1e, 0x3b, 0x7e, 0x80, 0x6d, 0x35, 0x9c, 0xe6, 0xcb, 0x2b,
+  0x8a, 0xf3, 0xbe, 0x40, 0x7a, 0x1f, 0x85, 0x66, 0xf8, 0x07, 0x71, 0x9b,
+  0x6a, 0x2c, 0x37, 0xb2, 0x96, 0xf3, 0xd4, 0xb7, 0x45, 0xe3, 0xca, 0xb5,
+  0xf6, 0x4d, 0xdd, 0x54, 0x92, 0x52, 0x9a, 0x07, 0x7e, 0x3c, 0xf7, 0x21,
+  0xbe, 0xed, 0xaa, 0x6d, 0xb3, 0xf3, 0x42, 0x7e, 0x35, 0x4a, 0xde, 0x21,
+  0x4e, 0xbe, 0x5a, 0xb2, 0x79, 0x01, 0x7f, 0x3e, 0xff, 0xae, 0x7b, 0xd1,
+  0x68, 0xf2, 0x42, 0x31, 0x5c, 0x81, 0x67, 0x76, 0xf4, 0xfd, 0xbb, 0x93,
+  0x83, 0xee, 0x3e, 0xa1, 0xca, 0xa8, 0x3e, 0xd8, 0xd9, 0x41, 0xc8, 0xe7,
+  0x2a, 0xbd, 0xbd, 0x1d, 0xd5, 0xd9, 0xce, 0xac, 0x9c, 0xd6, 0x3b, 0x75,
+  0x3d, 0xd7, 0xdd, 0x68, 0x17, 0xfd, 0x7d, 0x02, 0x6f, 0x6e, 0xb9, 0x00,
+  0xdb, 0xca, 0x66, 0xc3, 0xba, 0x0e, 0x72, 0x83, 0xc6, 0x2f, 0x35, 0xf3,
+  0xe0, 0x48, 0xf2, 0xd1, 0x20, 0xe7, 0x86, 0x66, 0x77, 0xc7, 0xe3, 0x6f,
+  0x12, 0x7d, 0x19, 0xdb, 0x6b, 0x43, 0xe2, 0x36, 0x2f, 0x67, 0x10, 0x51,
+  0xc3, 0x52, 0x61, 0xd8, 0x7f, 0xf4, 0x1d, 0x3a, 0xa4, 0x4e, 0x97, 0xfc,
+  0x87, 0x14, 0xad, 0xe4, 0xcd, 0xda, 0x0c, 0xbe, 0xa7, 0x1d, 0x07, 0x88,
+  0x5d, 0x44, 0x3c, 0xfe, 0xaf, 0x4e, 0xb0, 0x34, 0x71, 0x4f, 0x3a, 0x8f,
+  0x50, 0xb7, 0x2a, 0xdd, 0x50, 0xef, 0x65, 0x59, 0x19, 0xe1, 0xb1, 0xa8,
+  0x63, 0x5e, 0x50, 0xbd, 0xe5, 0x35, 0xab, 0x7d, 0x35, 0x27, 0x21, 0x9a,
+  0x61, 0x0a, 0x6f, 0x70, 0x73, 0x8c, 0x48, 0x5e, 0x1c, 0xf9, 0x87, 0x15,
+  0x8d, 0x6f, 0xe9, 0xe1, 0xf5, 0x79, 0xd1, 0x56, 0x85, 0x0b, 0x7e, 0x40,
+  0x1c, 0x9b, 0xc9, 0x4a, 0x45, 0x59, 0x60, 0x21, 0x20, 0xe9, 0x1f, 0x62,
+  0x82, 0x74, 0x88, 0xaa, 0x2a, 0x3d, 0xa5, 0x76, 0xf8, 0x2d, 0x8c, 0x4b,
+  0x23, 0x1d, 0xf3, 0x4b, 0x0d, 0xaf, 0xf7, 0xe4, 0xd7, 0x91, 0xe8, 0x6a,
+  0x90, 0xb4, 0x2c, 0x75, 0xe0, 0x24, 0x14, 0x28, 0x7d, 0x0d, 0xa9, 0x25,
+  0x92, 0x96, 0xc9, 0xe9, 0x40, 0xad, 0xf2, 0xf7, 0xe0, 0x26, 0x50, 0xb1,
+  0x8f, 0x7b, 0x9c, 0xd2, 0xa8, 0xf4, 0x5e, 0x62, 0x78, 0x71, 0x5f, 0x78,
+  0x89, 0x6d, 0xa4, 0x95, 0xc1, 0xcd, 0x60, 0x9e, 0xe9, 0x5a, 0x7b, 0x48,
+  0xb6, 0xb5, 0x3a, 0x5f, 0xac, 0xb6, 0xb5, 0xbb, 0x1e, 0xcd, 0xb9, 0xd7,
+  0xbd, 0xcd, 0x51, 0x4d, 0x9d, 0x22, 0xa1, 0x3f, 0x26, 0xda, 0x4b, 0x2f,
+  0x48, 0x4b, 0x03, 0x86, 0x32, 0xaf, 0xb1, 0x29, 0x93, 0x5a, 0xa2, 0x04,
+  0x85, 0xc0, 0x70, 0x20, 0x23, 0xf6, 0x28, 0xd5, 0x9c, 0x6a, 0xe8, 0xe7,
+  0xa5, 0x53, 0xb0, 0x0c, 0xe1, 0x19, 0x5e, 0x88, 0x32, 0xc4, 0x51, 0xc0,
+  0xb7, 0xb9, 0x18, 0x89, 0x13, 0x08, 0xb9, 0xa8, 0x8e, 0xb3, 0xbd, 0xf8,
+  0x67, 0x10, 0x5f, 0x13, 0x8d, 0x91, 0x3b, 0x7e, 0x46, 0xe7, 0x17, 0x73,
+  0x0d, 0x49, 0x3a, 0x3e, 0x57, 0x38, 0xe6, 0xa8, 0xdd, 0x95, 0x6a, 0x4f,
+  0xae, 0x2e, 0x50, 0xcf, 0x76, 0x5d, 0x4a, 0xba, 0x26, 0x4d, 0x94, 0xe6,
+  0xc9, 0x73, 0xec, 0x92, 0xba, 0xad, 0xe4, 0x6c, 0x19, 0x23, 0x69, 0xed,
+  0x92, 0xf4, 0xeb, 0x30, 0x5a, 0xe9, 0x36, 0x33, 0x66, 0xbd, 0x06, 0x05,
+  0x0f, 0x98, 0x48, 0x95, 0xe9, 0x17, 0x8a, 0xb2, 0x3b, 0x29, 0x9d, 0x47,
+  0x2c, 0x17, 0x55, 0x93, 0xfa, 0xbd, 0x09, 0x68, 0x72, 0xbf, 0x3d, 0xe5,
+  0x9e, 0xcc, 0xcd, 0x2c, 0x71, 0x8f, 0x24, 0xce, 0xce, 0x74, 0xc7, 0x08,
+  0x7f, 0x03, 0x4a, 0x35, 0x6a, 0x9e, 0xfa, 0x01, 0xcd, 0xe9, 0x8b, 0xed,
+  0x98, 0x9f, 0xd8, 0x8d, 0xa4, 0x14, 0x45, 0xf7, 0x74, 0x5e, 0xd6, 0x1a,
+  0x7f, 0x21, 0xe5, 0x82, 0x0b, 0x6e, 0x0d, 0x37, 0xf8, 0x5e, 0x7e, 0xc0,
+  0x47, 0xd3, 0x19, 0x8e, 0x9f, 0x1a, 0xc8, 0x14, 0x2f, 0x9c, 0xb2, 0x21,
+  0xb6, 0xaa, 0xab, 0x12, 0x26, 0x6d, 0xc3, 0x5a, 0x93, 0x07, 0xc9, 0x8f,
+  0x3f, 0x0e, 0x12, 0x63, 0x24, 0x77, 0x86, 0xfb, 0xb1, 0x31, 0x3f, 0x35,
+  0xb4, 0xf8, 0x23, 0x57, 0x2a, 0xfd, 0x78, 0x4d, 0x46, 0x20, 0x39, 0x98,
+  0xeb, 0x39, 0x45, 0x8f, 0x58, 0xcd, 0x6e, 0x7b, 0xe5, 0xb8, 0x10, 0x7a,
+  0x4d, 0x6a, 0x96, 0xb3, 0xdb, 0x39, 0x15, 0xd3, 0x1c, 0xd8, 0x6a, 0x51,
+  0x88, 0x75, 0xc2, 0xc4, 0x89, 0x7b, 0x0f, 0x39, 0xb0, 0xf9, 0xbb, 0x4d,
+  0x47, 0x48, 0xb1, 0xbd, 0xab, 0x32, 0x96, 0xf4, 0x10, 0x55, 0xb9, 0x27,
+  0xa6, 0xb4, 0x6c, 0x18, 0xe6, 0x66, 0xc2, 0xe1, 0x52, 0x62, 0xa6, 0xa7,
+  0xe4, 0x5c, 0xe7, 0xfa, 0xaf, 0xae, 0x18, 0x77, 0xa6, 0x24, 0x15, 0xc5,
+  0x2d, 0xaf, 0xee, 0x6a, 0xca, 0xe4, 0x90, 0xd9, 0x04, 0xb7, 0xa7, 0x37,
+  0xb9, 0x58, 0xf6, 0x9e, 0xaa, 0x79, 0x88, 0x0f, 0x10, 0xf3, 0x6b, 0xb1,
+  0x4e, 0x33, 0xa3, 0xcd, 0xe1, 0xa6, 0x8d, 0x85, 0x49, 0xbe, 0x4c, 0x90,
+  0x44, 0x6f, 0x13, 0xb3, 0x5d, 0xf2, 0x61, 0xf0, 0x49, 0x2f, 0x29, 0xae,
+  0xf4, 0xd3, 0x1d, 0x5d, 0x55, 0x3b, 0x95, 0xa5, 0x6a, 0x14, 0x5f, 0xbe,
+  0x2f, 0xfc, 0x27, 0xe2, 0x70, 0x42, 0x5a, 0x24, 0x4c, 0x0f, 0x1d, 0x00,
+  0xde, 0x10, 0x17, 0x1e, 0x1a, 0x0e, 0x01, 0x30, 0xb2, 0x64, 0x50, 0x10,
+  0x22, 0x09, 0x64, 0x1e, 0xdc, 0x51, 0x09, 0xd8, 0x72, 0x1e, 0xf0, 0x5b,
+  0x49, 0x05, 0xd4, 0x2a, 0x6b, 0xba, 0xe0, 0x84, 0x44, 0x71, 0x53, 0x08,
+  0x92, 0xc0, 0xb8, 0x84, 0x57, 0x66, 0x8a, 0x1c, 0x06, 0x49, 0x97, 0x91,
+  0x62, 0xb2, 0x88, 0x15, 0x48, 0x32, 0x30, 0xd0, 0x81, 0x68, 0x3e, 0x5f,
+  0x24, 0x1b, 0xfd, 0x9a, 0xd0, 0x46, 0xf7, 0x0d, 0x64, 0x40, 0x3a, 0x17,
+  0xa7, 0x14, 0xca, 0x63, 0x22, 0x5b, 0x92, 0x49, 0x37, 0xfc, 0x1b, 0x27,
+  0xb4, 0x71, 0x2d, 0x97, 0xc8, 0xd7, 0x6d, 0x4e, 0x10, 0xae, 0x23, 0x91,
+  0x7d, 0x97, 0x65, 0xe5, 0xd1, 0x87, 0xcb, 0x53, 0xca, 0xe1, 0xbe, 0x86,
+  0xf4, 0x62, 0x69, 0xe7, 0x3d, 0x1d, 0x84, 0xe2, 0xf5, 0x6d, 0x2a, 0x35,
+  0xa1, 0xef, 0x89, 0x4b, 0x5a, 0x45, 0x87, 0xbd, 0xd1, 0xcb, 0x39, 0x00,
+  0x3a, 0xb4, 0xc8, 0x05, 0x2a, 0x51, 0xb0, 0x3b, 0x7b, 0xdb, 0xb6, 0x2c,
+  0x12, 0x28, 0x1b, 0x9c, 0x99, 0x2d, 0x7a, 0xc2, 0xc6, 0x55, 0xc9, 0xb9,
+  0x44, 0x1b, 0x07, 0x54, 0xb1, 0x27, 0xb7, 0x11, 0x6b, 0x54, 0xfc, 0x83,
+  0xce, 0x70, 0xc8, 0xd4, 0xfa, 0xe6, 0xf4, 0xcd, 0x51, 0x3b, 0x03, 0x17,
+  0x3f, 0x89, 0x39, 0x5f, 0x0d, 0xbb, 0x7a, 0x6d, 0x38, 0x0c, 0xd3, 0x40,
+  0x1a, 0x68, 0x73, 0x4c, 0x5b, 0x66, 0x5a, 0x97, 0x59, 0xb3, 0xbc, 0x59,
+  0xe5, 0xb3, 0xad, 0x6d, 0xa2, 0x11, 0xaa, 0x33, 0x19, 0xa2, 0xb8, 0x89,
+  0x4d, 0xc3, 0x3a, 0xd9, 0x62, 0x05, 0xbd, 0xca, 0x9a, 0x55, 0x55, 0xb0,
+  0xc3, 0x9c, 0xe6, 0xde, 0x35, 0xb2, 0x8c, 0x74, 0x66, 0x51, 0xe7, 0x3b,
+  0x07, 0x04, 0x2c, 0x87, 0x53, 0x98, 0x78, 0x40, 0x63, 0xee, 0x9e, 0xda,
+  0xbc, 0x0f, 0x1c, 0x3c, 0xd6, 0x12, 0xc8, 0x2f, 0x7f, 0x27, 0x92, 0xc3,
+  0xb3, 0xb3, 0x57, 0x87, 0xe7, 0x87, 0x76, 0x6d, 0x10, 0xd0, 0x60, 0x2e,
+  0xd0, 0x90, 0x0d, 0x1f, 0x22, 0xad, 0x89, 0x9e, 0xdc, 0xfc, 0xfd, 0xfb,
+  0xf1, 0xd1, 0xbb, 0xee, 0xc1, 0x9e, 0xbd, 0x3b, 0x25, 0x24, 0xa2, 0xdf,
+  0xff, 0x78, 0xb8, 0x5c, 0xce, 0x35, 0x28, 0xf8, 0x2a, 0x6d, 0xd2, 0xcd,
+  0xe0, 0x56, 0xef, 0x6f, 0xd3, 0xfc, 0x6e, 0xec, 0xfc, 0x2e, 0x44, 0xc8,
+  0xc1, 0xd4, 0x4f, 0x46, 0x74, 0xa0, 0xd5, 0x54, 0xd3, 0x6f, 0xed, 0x6e,
+  0x60, 0x03, 0x90, 0x3d, 0xdb, 0xbf, 0x90, 0xd2, 0x71, 0x32, 0x4d, 0x24,
+  0xd3, 0xcd, 0x9a, 0x1b, 0x23, 0x3b, 0x9b, 0xae, 0x1a, 0x25, 0x79, 0xd0,
+  0x17, 0x95, 0x6f, 0x77, 0xf7, 0x25, 0x38, 0x1e, 0x17, 0x46, 0x61, 0x2e,
+  0x00, 0xf4, 0x00, 0x43, 0x68, 0x48, 0x91, 0xd6, 0xd9, 0x32, 0x17, 0x8b,
+  0xd0, 0xd4, 0x2c, 0xe3, 0xb0, 0x0a, 0xd0, 0x04, 0x78, 0x4a, 0xc1, 0x86,
+  0xfc, 0xce, 0xdc, 0xc6, 0x61, 0x72, 0x24, 0x65, 0x6e, 0x58, 0xb8, 0xf9,
+  0x41, 0xf0, 0x50, 0x63, 0xcd, 0x07, 0x61, 0xf7, 0x71, 0x5e, 0xe1, 0x21,
+  0x6c, 0x6c, 0x74, 0x45, 0x00, 0xd7, 0xb4, 0x9a, 0x87, 0x68, 0xda, 0xb4,
+  0xe9, 0xb0, 0x9e, 0x36, 0x22, 0x49, 0x4f, 0xc3, 0xf4, 0x92, 0xc8, 0xcb,
+  0x3c, 0x6a, 0xb4, 0x6b, 0x63, 0x34, 0xd1, 0xbf, 0x76, 0xf6, 0x46, 0xbb,
+  0x1b, 0xe1, 0xe4, 0xe9, 0xb2, 0x00, 0x1d, 0xc5, 0x46, 0xd5, 0x88, 0x1b,
+  0x36, 0x65, 0x79, 0xef, 0xfc, 0x98, 0x85, 0x19, 0xfd, 0x74, 0x69, 0xc6,
+  0x8f, 0x4e, 0x65, 0x78, 0x1a, 0x64, 0x81, 0x50, 0xe6, 0x6e, 0xa5, 0x4c,
+  0xd1, 0xf0, 0xc4, 0xa2, 0xbc, 0xa1, 0x95, 0x18, 0x52, 0x9b, 0xcf, 0x5b,
+  0x30, 0x36, 0x1b, 0xf1, 0x6d, 0x2e, 0x80, 0x18, 0x95, 0x75, 0x77, 0x3b,
+  0x1a, 0xb9, 0x56, 0xe5, 0xd3, 0xd7, 0xf0, 0x6c, 0xca, 0x2b, 0xac, 0x48,
+  0x4b, 0x09, 0x3e, 0x8a, 0x80, 0xe1, 0x72, 0x01, 0xdf, 0x9b, 0xfb, 0x99,
+  0x19, 0x43, 0x4d, 0x0f, 0x19, 0xd2, 0x20, 0xa4, 0x95, 0xbe, 0xe0, 0x22,
+  0xf5, 0xc0, 0x96, 0x7f, 0x93, 0xde, 0xe6, 0x8b, 0xd5, 0x02, 0x1f, 0x23,
+  0xda, 0x96, 0xc7, 0x24, 0x9e, 0x00, 0xaf, 0x22, 0xa7, 0xa7, 0x80, 0xc8,
+  0x37, 0xeb, 0xc4, 0xb3, 0xe8, 0x63, 0x42, 0xc6, 0x88, 0xe4, 0x91, 0x5b,
+  0x1e, 0x94, 0x05, 0x04, 0x1c, 0xea, 0x8e, 0x37, 0xc0, 0xe8, 0x07, 0x29,
+  0xe5, 0x1c, 0xd4, 0xa5, 0x4d, 0xd8, 0x89, 0xb0, 0x73, 0x46, 0x49, 0x10,
+  0x1d, 0xce, 0xcb, 0x57, 0xcd, 0xaa, 0xbc, 0x9c, 0xd9, 0x7b, 0x43, 0xfa,
+  0x63, 0x5e, 0xac, 0xcc, 0x3e, 0xb3, 0x2f, 0x99, 0x83, 0x10, 0xf4, 0xab,
+  0xc0, 0x43, 0x88, 0xac, 0xfa, 0x31, 0x8a, 0x25, 0x34, 0x05, 0xf5, 0xd9,
+  0xe8, 0xd1, 0xfe, 0x68, 0x77, 0xd0, 0x32, 0xe8, 0x05, 0x4c, 0xc2, 0xdc,
+  0xae, 0x69, 0xbe, 0xb0, 0x85, 0xa6, 0xa3, 0xdf, 0xcc, 0x71, 0x83, 0x8c,
+  0xf0, 0x45, 0x7a, 0x8b, 0xe3, 0x8b, 0x1e, 0x6b, 0x99, 0xbc, 0xf8, 0xe6,
+  0x74, 0x7c, 0xbe, 0x77, 0x70, 0x76, 0xfa, 0xce, 0xfc, 0x97, 0xfe, 0xbe,
+  0x8f, 0xbf, 0xef, 0x07, 0x56, 0xe5, 0x6b, 0xc9, 0xa0, 0xd5, 0x62, 0x1d,
+  0x68, 0x28, 0xd0, 0x68, 0x78, 0x37, 0x13, 0x6f, 0x20, 0xd2, 0xcb, 0xc1,
+  0x06, 0xa7, 0xb6, 0x94, 0xb1, 0x7b, 0xc4, 0xde, 0xa7, 0x34, 0xc9, 0x6e,
+  0x94, 0x84, 0x89, 0x7c, 0x79, 0xa3, 0xda, 0x94, 0x14, 0xc1, 0x6b, 0x79,
+  0x7d, 0xd7, 0xd7, 0xcd, 0x05, 0xcc, 0x52, 0x9f, 0xa3, 0x40, 0x75, 0xc8,
+  0x0d, 0x6b, 0xff, 0x6a, 0x3a, 0x37, 0xda, 0x7d, 0x46, 0xb9, 0x24, 0xb3,
+  0x8c, 0x03, 0x2c, 0xf4, 0x93, 0x98, 0x61, 0x62, 0xae, 0x9f, 0x94, 0x2c,
+  0x04, 0x09, 0x86, 0xa0, 0x48, 0x8d, 0xea, 0x98, 0xd9, 0x98, 0x39, 0xe6,
+  0x46, 0x13, 0xe7, 0xed, 0x28, 0xb2, 0xa0, 0x42, 0x80, 0x01, 0xe4, 0x7c,
+  0x27, 0x16, 0xaa, 0xf3, 0x51, 0x67, 0xff, 0xf6, 0xf4, 0x3c, 0x49, 0x2f,
+  0x2e, 0x14, 0x14, 0x80, 0xca, 0x12, 0x48, 0x63, 0xdd, 0x59, 0xb2, 0x24,
+  0x4b, 0x9b, 0x58, 0xea, 0x86, 0xe8, 0x23, 0xe7, 0x27, 0xe3, 0x1d, 0x72,
+  0x61, 0x71, 0x12, 0xdc, 0xf8, 0xed, 0xf1, 0xa0, 0xe5, 0xab, 0xf6, 0x53,
+  0x5f, 0xb6, 0x49, 0x52, 0xc6, 0x15, 0x8a, 0xd4, 0x93, 0x85, 0x0e, 0x6a,
+  0x86, 0x92, 0xea, 0x70, 0xa4, 0x1b, 0x52, 0x0d, 0xb6, 0x81, 0xa3, 0xdd,
+  0x48, 0x34, 0x6a, 0x0a, 0xbb, 0x78, 0xb1, 0x6c, 0xee, 0xc2, 0x42, 0x51,
+  0xf8, 0x36, 0x08, 0x80, 0x85, 0x94, 0x8e, 0x0d, 0x32, 0x4b, 0x68, 0x59,
+  0x58, 0xd2, 0xc6, 0x88, 0x87, 0xdd, 0xdf, 0xc0, 0xa8, 0x18, 0xd4, 0xfc,
+  0x9d, 0xc6, 0x04, 0xd1, 0x4e, 0xb2, 0x58, 0x7a, 0x3f, 0x7f, 0xc8, 0x1b,
+  0x3c, 0xb1, 0xc3, 0x9b, 0x89, 0xd9, 0x3a, 0x35, 0xa5, 0x0e, 0x62, 0x30,
+  0x65, 0x95, 0x5f, 0x52, 0x9e, 0x40, 0xb7, 0x74, 0xcc, 0x4d, 0x24, 0xf0,
+  0x4c, 0x91, 0x32, 0x56, 0x37, 0x1b, 0x9e, 0x2b, 0xa1, 0x09, 0x12, 0xf4,
+  0x91, 0x36, 0x5a, 0xa9, 0x49, 0xa3, 0xd3, 0x21, 0xfe, 0xd3, 0x44, 0xf4,
+  0x78, 0x56, 0xf6, 0xcc, 0xea, 0x48, 0xee, 0xb8, 0x20, 0x90, 0x96, 0xfe,
+  0xe8, 0x5d, 0x02, 0x04, 0xce, 0x71, 0xa3, 0x0c, 0x9c, 0xc3, 0x46, 0xdd,
+  0xe1, 0x18, 0xaa, 0xcd, 0x70, 0x04, 0xad, 0xfa, 0xd8, 0xd8, 0xdb, 0x7f,
+  0x36, 0xda, 0x35, 0xff, 0x67, 0x0e, 0x45, 0xf4, 0x23, 0xe0, 0x44, 0x39,
+  0x3c, 0x20, 0xfb, 0x64, 0x76, 0xdb, 0x25, 0x49, 0x16, 0x40, 0x65, 0x75,
+  0xb9, 0xb1, 0xb6, 0x7e, 0xb5, 0x25, 0x52, 0xe8, 0x20, 0xad, 0x38, 0x49,
+  0x67, 0xf2, 0x13, 0xbd, 0xe3, 0xd5, 0x6a, 0x1e, 0x49, 0xeb, 0xf3, 0xdc,
+  0xc8, 0xa4, 0x9d, 0xcd, 0xaf, 0xc5, 0x89, 0xfc, 0x0d, 0xf1, 0x26, 0xae,
+  0xe3, 0x1b, 0xb5, 0x92, 0xa2, 0x9e, 0xb7, 0x7c, 0x82, 0x2f, 0xc5, 0x64,
+  0x03, 0x67, 0x1e, 0x9a, 0xcb, 0xf0, 0xa2, 0xbc, 0xb8, 0xa8, 0xb3, 0xa6,
+  0x2b, 0x80, 0x5e, 0xca, 0x23, 0x3b, 0xef, 0x80, 0x6c, 0x08, 0x4e, 0xa5,
+  0x15, 0x37, 0x49, 0x1b, 0x8f, 0x27, 0x91, 0x2c, 0x34, 0x66, 0x5b, 0x3c,
+  0xdc, 0x28, 0x52, 0x64, 0xe0, 0xff, 0x5e, 0x33, 0x44, 0xb8, 0x1c, 0x5e,
+  0x51, 0x5e, 0x50, 0x6e, 0xc5, 0x00, 0x2e, 0x22, 0xe9, 0xba, 0x70, 0x6c,
+  0x7a, 0x25, 0x3e, 0xe6, 0xcb, 0x25, 0x99, 0x37, 0x0c, 0x6d, 0x06, 0xb2,
+  0xb5, 0x01, 0x34, 0xc4, 0x71, 0x41, 0xca, 0x9a, 0x2d, 0x68, 0x94, 0xe4,
+  0xa9, 0xc8, 0xfc, 0x49, 0x76, 0x11, 0x06, 0x81, 0x38, 0xa9, 0xd1, 0xc7,
+  0xb3, 0x91, 0xfa, 0xdc, 0x19, 0x61, 0xd7, 0x14, 0xa9, 0xb2, 0x98, 0x0b,
+  0x0f, 0xe9, 0x41, 0x8a, 0xff, 0x06, 0x91, 0xfb, 0xef, 0x8a, 0xb3, 0xac,
+  0x1f, 0x6e, 0x7c, 0xfc, 0x3f, 0x8e, 0x1c, 0xfa, 0x90, 0x85, 0xf7, 0xe1,
+  0x72, 0x97, 0x58, 0xf1, 0x90, 0xb9, 0x85, 0xc3, 0x97, 0xe6, 0xbc, 0x36,
+  0x30, 0x15, 0x97, 0x6a, 0x52, 0x76, 0xca, 0x31, 0x60, 0xf7, 0x90, 0x26,
+  0x01, 0x6d, 0x68, 0x87, 0x0a, 0xfe, 0x03, 0xd1, 0xc0, 0xe0, 0x94, 0xec,
+  0x5f, 0x94, 0x35, 0xe2, 0x76, 0x34, 0x52, 0x35, 0xe7, 0xd7, 0x9c, 0x88,
+  0xb2, 0xb8, 0x93, 0x17, 0xa4, 0x32, 0xb2, 0x02, 0x13, 0x94, 0x64, 0x68,
+  0x1d, 0x2c, 0xc3, 0x9c, 0xac, 0x9a, 0xdf, 0x30, 0x76, 0x52, 0x11, 0xfd,
+  0x02, 0xbf, 0xce, 0x23, 0xea, 0x29, 0x13, 0x35, 0x81, 0x74, 0x0e, 0xff,
+  0x6a, 0xac, 0xec, 0x17, 0xea, 0xa6, 0xe8, 0x43, 0x04, 0x50, 0xa7, 0x06,
+  0x15, 0x51, 0xc0, 0x08, 0x03, 0x6d, 0x58, 0x60, 0x1a, 0xdd, 0x6a, 0xc6,
+  0xd3, 0x49, 0xa1, 0xcb, 0x00, 0x01, 0xb4, 0x7b, 0xe7, 0x2f, 0x80, 0x76,
+  0xe3, 0x95, 0x7e, 0xdb, 0xda, 0xc9, 0x11, 0x45, 0xa9, 0xe6, 0x3c, 0x42,
+  0xcd, 0x89, 0x95, 0x32, 0x86, 0x1a, 0x0d, 0x79, 0x20, 0x73, 0xf3, 0x62,
+  0xc8, 0x85, 0xd5, 0xfa, 0x2c, 0x82, 0x69, 0x04, 0xd7, 0x26, 0xe4, 0xc8,
+  0x47, 0xc4, 0x66, 0x78, 0x23, 0x89, 0x15, 0x50, 0x6b, 0xf1, 0xd9, 0x98,
+  0x1b, 0x9d, 0x7d, 0x91, 0x70, 0x20, 0xf2, 0xc7, 0xc9, 0x41, 0xf6, 0xd1,
+  0xe8, 0xce, 0xc5, 0x80, 0x7e, 0x8a, 0x42, 0x54, 0x7b, 0xc9, 0xd8, 0xb7,
+  0xd1, 0x64, 0x1c, 0xb4, 0xc8, 0x22, 0xba, 0xac, 0xf7, 0xac, 0x3c, 0xea,
+  0xb9, 0x51, 0xde, 0x66, 0x8d, 0xa4, 0x8e, 0xf0, 0xe4, 0xb5, 0x36, 0x0b,
+  0xf5, 0x5d, 0xc7, 0x17, 0x9d, 0xe1, 0x80, 0x13, 0x97, 0x35, 0xed, 0x4a,
+  0x7d, 0x89, 0xe1, 0x32, 0x38, 0x16, 0xf9, 0x42, 0x07, 0xe6, 0x1a, 0x6c,
+  0xa8, 0x5f, 0x96, 0x57, 0x10, 0x4f, 0x5d, 0xd0, 0xe9, 0x90, 0x9b, 0xa8,
+  0x99, 0xc5, 0x68, 0x92, 0x75, 0x5f, 0xbd, 0x90, 0x82, 0x19, 0xe8, 0xa7,
+  0x43, 0x10, 0xfa, 0x19, 0xa2, 0xf7, 0xee, 0x6b, 0x9a, 0xb8, 0x12, 0xa9,
+  0x2a, 0xf4, 0xaa, 0x4a, 0x29, 0x85, 0xa6, 0x9a, 0xa9, 0x67, 0x44, 0x27,
+  0x6a, 0xb8, 0xb0, 0xd8, 0x45, 0x37, 0x29, 0x28, 0xcd, 0x8e, 0x1f, 0xab,
+  0x7d, 0xf0, 0xf2, 0x1f, 0x87, 0x13, 0x47, 0xce, 0x0e, 0x37, 0x27, 0x9a,
+  0xa6, 0x24, 0x0f, 0x11, 0xcd, 0x1b, 0xc1, 0xb2, 0xd9, 0x78, 0xc5, 0xa5,
+  0x80, 0xa2, 0xb1, 0x9b, 0xc2, 0x5b, 0x78, 0x73, 0x55, 0xce, 0xb3, 0x58,
+  0x88, 0xc4, 0x2b, 0xf9, 0x05, 0xaa, 0x0b, 0xa5, 0xf5, 0xc2, 0xdb, 0x7c,
+  0x8d, 0x8c, 0xe1, 0x56, 0xe8, 0xc4, 0xe8, 0x77, 0x59, 0x4a, 0x05, 0x47,
+  0x36, 0x69, 0xfe, 0x7a, 0x10, 0xa4, 0xb1, 0x9b, 0x7b, 0x3e, 0x29, 0x6b,
+  0x4b, 0x2f, 0x54, 0x58, 0x4b, 0x12, 0xe4, 0x26, 0xad, 0xc0, 0x98, 0x05,
+  0x1e, 0x4b, 0x91, 0x43, 0xfd, 0x9c, 0x41, 0x52, 0x05, 0xbb, 0xf5, 0x0e,
+  0x39, 0x15, 0xa3, 0x1b, 0x32, 0x31, 0x0a, 0x00, 0xb9, 0x69, 0x41, 0x3b,
+  0x34, 0xa4, 0x00, 0x5f, 0x5d, 0x01, 0x03, 0x57, 0x2a, 0xd6, 0xcd, 0x3d,
+  0xbc, 0x22, 0x99, 0x9e, 0x37, 0xab, 0xb4, 0x79, 0x58, 0xc2, 0x76, 0x1f,
+  0x6f, 0x62, 0xe6, 0xe4, 0xe7, 0xa3, 0xf6, 0xe1, 0x35, 0xf4, 0x44, 0x11,
+  0xfd, 0x83, 0x7c, 0x41, 0x77, 0xed, 0xbf, 0xee, 0x61, 0x4c, 0x67, 0x80,
+  0xf2, 0xbb, 0x6a, 0x63, 0x41, 0xa1, 0x26, 0x57, 0xe4, 0x89, 0x56, 0xbe,
+  0xf1, 0x98, 0x2a, 0xee, 0x8f, 0x23, 0x81, 0x7e, 0x44, 0xc7, 0xcc, 0x74,
+  0xe6, 0x77, 0x6e, 0x40, 0xaf, 0x64, 0x56, 0x33, 0xbc, 0x3d, 0x9c, 0x3c,
+  0xfb, 0x85, 0x20, 0x6b, 0x69, 0x63, 0x6c, 0x54, 0x70, 0xfe, 0xe6, 0xc1,
+  0x86, 0xc2, 0x8e, 0x5a, 0x1c, 0x25, 0xe1, 0x22, 0x52, 0xb4, 0xa5, 0xf5,
+  0x1f, 0xea, 0xab, 0xa7, 0xeb, 0xdf, 0x1d, 0x8e, 0x30, 0xb8, 0xf7, 0xbe,
+  0xf8, 0xee, 0xf0, 0xe4, 0xfd, 0xd1, 0xde, 0x1f, 0x13, 0xfa, 0xd7, 0x3e,
+  0xff, 0x6b, 0x7f, 0x23, 0x76, 0x5c, 0x86, 0x51, 0x6d, 0x7e, 0xb1, 0x99,
+  0xd4, 0x77, 0x8b, 0x49, 0x39, 0xb7, 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, 0x87, 0xe5, 0xec, 0x33, 0x8c, 0x30, 0xdb,
+  0xcc, 0x70, 0x27, 0x5c, 0x29, 0x0b, 0x38, 0xcd, 0xaf, 0x8b, 0x81, 0x40,
+  0x48, 0x1c, 0x77, 0x82, 0x3f, 0xb0, 0x59, 0x65, 0x96, 0xf5, 0x62, 0xd5,
+  0xf4, 0x6e, 0x77, 0xb8, 0x89, 0xe8, 0x2e, 0x1e, 0x26, 0xd7, 0x09, 0xc1,
+  0x80, 0x0d, 0x35, 0x3d, 0xc3, 0xb9, 0x3a, 0xc8, 0x18, 0x9d, 0x91, 0x66,
+  0xad, 0xfe, 0x8c, 0xc4, 0x43, 0x7d, 0xb6, 0xf8, 0x91, 0x02, 0xc0, 0x98,
+  0xb4, 0x42, 0x82, 0xec, 0x6b, 0x0e, 0x61, 0x57, 0x18, 0x01, 0xc6, 0x6c,
+  0x0e, 0xd2, 0x4d, 0x16, 0x41, 0x76, 0x56, 0x61, 0x34, 0xc9, 0x2d, 0xc3,
+  0xde, 0xb7, 0x7d, 0x3c, 0x10, 0x3d, 0x3e, 0x71, 0x4b, 0x34, 0x36, 0xa2,
+  0xda, 0x13, 0x2b, 0x38, 0xbf, 0x6a, 0x09, 0x1a, 0x55, 0xf9, 0xb4, 0xc0,
+  0x99, 0xe3, 0xb3, 0x22, 0x39, 0x78, 0x18, 0x26, 0x53, 0xca, 0xde, 0x9c,
+  0x7b, 0x40, 0x4e, 0x6a, 0x45, 0xd3, 0x5d, 0x53, 0x38, 0x0c, 0x0a, 0xf4,
+  0x5b, 0xc2, 0x37, 0xdf, 0xbf, 0x9b, 0x67, 0xdb, 0x6a, 0x18, 0xa8, 0xb0,
+  0xdb, 0x79, 0x53, 0xfe, 0xdd, 0xcc, 0x3b, 0x95, 0x8f, 0xc4, 0x64, 0xa6,
+  0x88, 0xc0, 0xde, 0x99, 0x3b, 0xfe, 0xc2, 0x65, 0xe2, 0x3e, 0xd7, 0x68,
+  0xd9, 0xc6, 0x08, 0x02, 0x93, 0x5e, 0x86, 0x54, 0xed, 0x80, 0x74, 0x44,
+  0xbb, 0x08, 0x24, 0xb4, 0x87, 0x35, 0x63, 0x48, 0xb9, 0x94, 0x0c, 0x1d,
+  0x4b, 0x62, 0x22, 0x76, 0xba, 0x2c, 0xbc, 0xab, 0x53, 0xf5, 0x08, 0xa2,
+  0xa3, 0xdb, 0xac, 0x9a, 0x12, 0xd4, 0xc4, 0xd4, 0xe8, 0xa5, 0xe0, 0xa7,
+  0x17, 0xe2, 0x9e, 0xa2, 0x5c, 0x2a, 0xc9, 0x8a, 0x6f, 0x63, 0xc2, 0x40,
+  0xfc, 0x2a, 0x9d, 0xf5, 0x92, 0x18, 0x72, 0x1f, 0xa6, 0x86, 0x30, 0x46,
+  0x16, 0xfb, 0x4e, 0x05, 0x64, 0x9b, 0x7d, 0x68, 0x91, 0x19, 0xc2, 0x09,
+  0x41, 0xc6, 0x1e, 0x76, 0x58, 0x5f, 0xf4, 0x4e, 0x53, 0xc8, 0x05, 0x73,
+  0x61, 0x24, 0x33, 0x17, 0x1d, 0x22, 0xa8, 0x00, 0x00, 0x42, 0xf5, 0xa7,
+  0x27, 0xda, 0xd3, 0x01, 0x7e, 0x07, 0xa2, 0x25, 0xc5, 0x9d, 0xc2, 0x48,
+  0x6d, 0x41, 0x6c, 0xb2, 0x72, 0xa8, 0x60, 0x83, 0xd0, 0xbc, 0xc2, 0x62,
+  0xe4, 0x79, 0x79, 0x43, 0x31, 0x98, 0x36, 0xf4, 0xa7, 0x02, 0xfd, 0x70,
+  0x4e, 0x1d, 0xf3, 0xe5, 0x21, 0xe9, 0x4a, 0xfc, 0xd9, 0x91, 0x46, 0x6b,
+  0xa3, 0x14, 0xa0, 0xe5, 0xb4, 0xdd, 0x4a, 0xa4, 0xd4, 0x65, 0x50, 0x34,
+  0xec, 0x4c, 0x66, 0xfd, 0xc2, 0x21, 0x6f, 0xc5, 0x04, 0x1b, 0x56, 0x3c,
+  0x29, 0x9b, 0x2b, 0x2f, 0x0f, 0x95, 0xd0, 0xfc, 0xc8, 0xcf, 0x73, 0xb1,
+  0x6a, 0x60, 0x04, 0xa8, 0x19, 0xd8, 0x48, 0xaa, 0xb1, 0x38, 0x8b, 0x82,
+  0xac, 0x87, 0x8f, 0x84, 0xfa, 0x46, 0x4b, 0xb4, 0xc8, 0xb5, 0x94, 0x40,
+  0x5b, 0x20, 0x53, 0x9c, 0xe8, 0xd2, 0x18, 0xc0, 0x00, 0x16, 0x34, 0xdf,
+  0xa4, 0x44, 0xa5, 0xba, 0x26, 0x10, 0x39, 0xa4, 0xa4, 0x9a, 0x8d, 0x0d,
+  0x20, 0x27, 0x00, 0x90, 0x54, 0xf8, 0x47, 0xba, 0xc5, 0xf0, 0x37, 0x0e,
+  0xb4, 0x89, 0x71, 0x31, 0xc8, 0x6a, 0x9f, 0xc8, 0xd1, 0xd4, 0xb8, 0xbf,
+  0x44, 0x0f, 0x11, 0xa7, 0x88, 0xd5, 0x5f, 0x7b, 0x2e, 0xec, 0xbf, 0x6c,
+  0xd4, 0x04, 0x46, 0x5e, 0x55, 0x33, 0x72, 0x2e, 0xb0, 0x87, 0x6d, 0x62,
+  0x3c, 0xb6, 0x3b, 0x64, 0x5c, 0xa9, 0x8b, 0xbf, 0xc5, 0xe2, 0xbc, 0xab,
+  0xe5, 0x0c, 0x6a, 0x9f, 0xbe, 0x03, 0x45, 0xc9, 0x43, 0xc0, 0xac, 0x4b,
+  0xb9, 0x8d, 0x18, 0x9e, 0x98, 0x8c, 0xe3, 0x32, 0x31, 0x90, 0x9c, 0xee,
+  0xfd, 0xf7, 0x03, 0x2c, 0x2d, 0x88, 0x36, 0xf6, 0xe1, 0x2c, 0x7c, 0xde,
+  0x60, 0x5e, 0x84, 0xf0, 0x1d, 0x1a, 0xda, 0xaf, 0x63, 0x81, 0x4a, 0x15,
+  0xe0, 0x86, 0xc3, 0xff, 0x75, 0x55, 0x4c, 0x3b, 0x32, 0xaa, 0x1c, 0x78,
+  0x40, 0x9c, 0x12, 0x95, 0xb5, 0x12, 0xa2, 0x4b, 0xf4, 0xf8, 0x90, 0xc0,
+  0xdf, 0x50, 0x45, 0x28, 0x55, 0x6f, 0x90, 0x78, 0x9b, 0x7b, 0x25, 0xb4,
+  0x57, 0xb9, 0x39, 0xa1, 0x6a, 0x7a, 0x05, 0x24, 0x01, 0xf8, 0x91, 0x32,
+  0x75, 0x8e, 0x06, 0x8a, 0xb0, 0x78, 0xfe, 0x31, 0xac, 0xe8, 0x62, 0x39,
+  0xb1, 0x23, 0x42, 0x0b, 0x29, 0x0b, 0x65, 0xd2, 0x7d, 0xf3, 0x0c, 0x33,
+  0xbb, 0xae, 0x68, 0xcf, 0xb3, 0x79, 0xed, 0x04, 0xa4, 0x7d, 0xc7, 0x49,
+  0x4a, 0x18, 0xe1, 0x05, 0x7c, 0xb2, 0x2c, 0x8a, 0xf3, 0xe8, 0x0d, 0xc7,
+  0x4c, 0x8c, 0x9a, 0x23, 0x93, 0x21, 0xbb, 0x92, 0xe8, 0xe4, 0x4e, 0x31,
+  0x66, 0x64, 0x84, 0x2e, 0xcc, 0x4c, 0x97, 0x90, 0x5f, 0x8a, 0x85, 0x80,
+  0xe1, 0x88, 0x4f, 0x2f, 0x8c, 0xb8, 0xe3, 0x75, 0x2d, 0xc8, 0x8b, 0xbb,
+  0xfb, 0xec, 0xc9, 0x2e, 0x5d, 0x71, 0x02, 0xd8, 0x63, 0xb1, 0x27, 0x82,
+  0x8a, 0x23, 0x63, 0x81, 0x6f, 0xa7, 0xb4, 0xc7, 0x20, 0x78, 0x38, 0xba,
+  0xf3, 0xb9, 0xe2, 0xb6, 0x33, 0xe5, 0x91, 0x5f, 0x84, 0xaa, 0xb1, 0xd1,
+  0x4f, 0x84, 0xc2, 0x69, 0xc3, 0xe1, 0x45, 0x13, 0x64, 0x7f, 0x79, 0xa4,
+  0xd3, 0xa6, 0xa8, 0xf9, 0x85, 0x40, 0xfe, 0xbc, 0x51, 0x54, 0xbf, 0x6b,
+  0x2a, 0x09, 0x4a, 0x4e, 0x5e, 0xb3, 0x53, 0xf0, 0xe5, 0x3b, 0xfa, 0x5b,
+  0x6e, 0x01, 0x8f, 0x50, 0xd6, 0x8b, 0x06, 0x21, 0x9c, 0x6f, 0xfb, 0xe6,
+  0xbb, 0x6e, 0x55, 0xe7, 0xd6, 0xe9, 0x78, 0xe7, 0xd1, 0xf3, 0xdd, 0xed,
+  0x48, 0x0a, 0xb4, 0xf9, 0x86, 0x8f, 0x77, 0xf8, 0x78, 0x77, 0xb4, 0xbb,
+  0xdd, 0x99, 0x0d, 0x6d, 0xc9, 0x1a, 0x3c, 0x16, 0x45, 0x69, 0xb7, 0x32,
+  0x08, 0xb9, 0xcd, 0xae, 0xf6, 0x4b, 0xd2, 0xb0, 0xfd, 0xda, 0xd4, 0x77,
+  0xd9, 0xb5, 0xa1, 0xdc, 0x68, 0x3a, 0xdc, 0x49, 0x5e, 0x8b, 0x9d, 0x44,
+  0x82, 0x51, 0x45, 0x15, 0x15, 0x7f, 0xb7, 0x53, 0x8c, 0xf1, 0x08, 0x9d,
+  0x29, 0xa7, 0x4e, 0x44, 0x82, 0x37, 0xb5, 0x99, 0x54, 0x85, 0x3c, 0x3f,
+  0xa4, 0x08, 0x7c, 0x72, 0xdf, 0xcd, 0x61, 0x0b, 0x35, 0xf2, 0x99, 0x7f,
+  0xa6, 0x64, 0x38, 0x0c, 0xd3, 0x7a, 0x9a, 0xe7, 0x6c, 0x1e, 0xf5, 0x58,
+  0x45, 0x9a, 0x40, 0x09, 0x38, 0x3a, 0x14, 0x66, 0xe7, 0x29, 0x47, 0x7e,
+  0x1d, 0xe0, 0x69, 0x30, 0x2c, 0xe9, 0xbe, 0x86, 0xc4, 0xd6, 0x8d, 0x2b,
+  0x2e, 0x01, 0x6a, 0xfa, 0x22, 0x18, 0xcd, 0x56, 0x5d, 0xad, 0xbb, 0x5a,
+  0x99, 0xb9, 0x5a, 0x8c, 0x7e, 0x16, 0xc1, 0x2d, 0x24, 0xb6, 0xc3, 0x09,
+  0xd4, 0x69, 0x53, 0x97, 0xb4, 0x4f, 0xb1, 0x4d, 0x85, 0xc3, 0x03, 0x28,
+  0xb7, 0xd6, 0x1e, 0xb3, 0xac, 0x44, 0xd2, 0x8b, 0xbe, 0x1c, 0xb8, 0xec,
+  0x9f, 0x96, 0x3d, 0x95, 0x46, 0xf4, 0x4a, 0x06, 0xe9, 0x4f, 0x10, 0x6d,
+  0xe7, 0xc2, 0x2c, 0x5a, 0x88, 0xb4, 0xaa, 0x80, 0x17, 0x85, 0x53, 0x4e,
+  0xa4, 0x51, 0x05, 0xa1, 0x1a, 0xd9, 0xdd, 0x8a, 0x60, 0x55, 0x0d, 0xcc,
+  0xfa, 0x00, 0x01, 0x0a, 0x0a, 0x2a, 0xb2, 0x1b, 0x62, 0xee, 0xb5, 0x68,
+  0x26, 0x55, 0x95, 0x93, 0x1b, 0xca, 0xe6, 0x2a, 0xb0, 0x76, 0x47, 0x49,
+  0x9d, 0x24, 0xeb, 0x67, 0x91, 0x52, 0xf1, 0x29, 0x6e, 0x67, 0x6d, 0x53,
+  0xc0, 0x0b, 0xc0, 0x58, 0x12, 0x5c, 0x5d, 0xb0, 0x37, 0xe8, 0x33, 0x80,
+  0xc9, 0x29, 0x78, 0x6d, 0xd3, 0xce, 0x26, 0x21, 0x23, 0x80, 0xd3, 0xa5,
+  0x19, 0x2d, 0xad, 0x6c, 0xd9, 0xab, 0x75, 0x7f, 0xf4, 0x65, 0xe7, 0x76,
+  0x78, 0x73, 0x73, 0x33, 0xa4, 0x0b, 0x47, 0x29, 0x3e, 0x52, 0xb5, 0x31,
+  0x6a, 0x81, 0x50, 0xc3, 0x4c, 0x65, 0x0b, 0x96, 0x98, 0x48, 0x18, 0x2e,
+  0xf1, 0x32, 0xae, 0xaa, 0x49, 0xde, 0xa0, 0x3c, 0x50, 0x88, 0x0b, 0xaf,
+  0x49, 0x99, 0x9e, 0x4c, 0x07, 0x0a, 0x93, 0xfa, 0xb5, 0x22, 0xb7, 0xcf,
+  0xad, 0x85, 0xd0, 0xac, 0xa6, 0x4d, 0x46, 0xe5, 0xf0, 0xe6, 0x13, 0x8b,
+  0x83, 0x64, 0xf8, 0x4d, 0xb2, 0xf1, 0x52, 0x56, 0x7b, 0x6e, 0x9e, 0x38,
+  0x68, 0xaf, 0x85, 0x1f, 0x0e, 0x63, 0x43, 0xe6, 0xdd, 0x8d, 0x87, 0x21,
+  0x31, 0xf6, 0x5e, 0x64, 0x74, 0x69, 0x71, 0x49, 0x38, 0x4d, 0xc4, 0xf7,
+  0x47, 0x59, 0x34, 0xec, 0x25, 0x63, 0x08, 0x35, 0x2c, 0x3d, 0xad, 0xa5,
+  0xa3, 0xcf, 0x84, 0x6f, 0xf8, 0x9a, 0xeb, 0x58, 0xa5, 0x37, 0xf7, 0xdf,
+  0x71, 0xef, 0x26, 0x0a, 0xf5, 0xce, 0xe1, 0x39, 0xf3, 0x70, 0x8d, 0xc9,
+  0x5d, 0x64, 0x73, 0x3a, 0x23, 0x33, 0x95, 0x7e, 0x1a, 0xae, 0x36, 0x8b,
+  0xed, 0x5c, 0x51, 0x73, 0xbf, 0x5c, 0x53, 0xd6, 0xe6, 0x7c, 0xcc, 0x6e,
+  0x15, 0xad, 0x40, 0x4a, 0x07, 0x1e, 0x15, 0xcb, 0xb2, 0x54, 0xf5, 0x00,
+  0x46, 0xe3, 0x56, 0x37, 0xb0, 0x97, 0x53, 0x68, 0x99, 0xfd, 0x84, 0xde,
+  0x32, 0x05, 0x49, 0x37, 0x96, 0x2d, 0xca, 0x61, 0x13, 0xba, 0xaa, 0x8a,
+  0x77, 0x26, 0x1e, 0xb0, 0xac, 0x22, 0x42, 0x47, 0x52, 0xfd, 0x50, 0x33,
+  0xa2, 0x43, 0xab, 0x13, 0x62, 0xe1, 0xe5, 0xd7, 0xc7, 0x48, 0x0e, 0x37,
+  0x8c, 0xb4, 0x10, 0x4c, 0x08, 0x9e, 0x3f, 0xb7, 0x4e, 0xb2, 0x36, 0xf2,
+  0x25, 0xb1, 0x12, 0xae, 0xb0, 0x4c, 0x93, 0x18, 0x96, 0xaa, 0x9a, 0x30,
+  0x89, 0xda, 0x2a, 0x92, 0x03, 0x2b, 0x26, 0x87, 0x5c, 0x5e, 0x1b, 0x2d,
+  0x4e, 0x5d, 0xc5, 0x41, 0x74, 0xbf, 0xf0, 0x75, 0xc5, 0x2e, 0x49, 0x6b,
+  0x09, 0x08, 0x43, 0xf7, 0x0b, 0xb2, 0xd1, 0x1d, 0xbd, 0x72, 0x2b, 0xaa,
+  0x2c, 0x4c, 0xa3, 0x93, 0xcf, 0xc7, 0x3b, 0xc5, 0xe1, 0x4c, 0x3a, 0x8e,
+  0x19, 0xbb, 0x75, 0x99, 0xef, 0x80, 0xe0, 0xd2, 0x2e, 0x72, 0xcd, 0xc5,
+  0x1c, 0xc1, 0x36, 0xcf, 0xd2, 0x30, 0xe3, 0xff, 0x24, 0x09, 0x05, 0xb9,
+  0x6b, 0x78, 0x1e, 0x69, 0x1e, 0x5a, 0x7e, 0xe9, 0x8f, 0xa6, 0xc8, 0x80,
+  0x92, 0x5f, 0x1b, 0x1f, 0x8e, 0xcc, 0xc9, 0x2f, 0x48, 0x5b, 0xfa, 0x52,
+  0xfc, 0x5e, 0x94, 0x56, 0x5f, 0x7b, 0xc6, 0x8d, 0xd4, 0xde, 0x62, 0xee,
+  0x5a, 0x72, 0x44, 0xdb, 0x10, 0x1f, 0x8e, 0x03, 0xa6, 0xde, 0xee, 0x31,
+  0xc5, 0x11, 0x7c, 0x7d, 0xcd, 0xed, 0xc8, 0xfe, 0xad, 0xbb, 0x79, 0x5f,
+  0xdc, 0xbf, 0x7b, 0x3f, 0x77, 0xfb, 0xd6, 0xef, 0x1e, 0xb7, 0x81, 0xd0,
+  0xdc, 0xdb, 0x2f, 0x3c, 0x7f, 0x1f, 0x72, 0x47, 0xd8, 0x98, 0xb3, 0x7e,
+  0xbf, 0x36, 0x97, 0xf1, 0x6c, 0xd6, 0x2f, 0x7e, 0xad, 0x53, 0x07, 0x31,
+  0xc2, 0x41, 0x40, 0x93, 0x8f, 0x0f, 0xc7, 0x51, 0x4a, 0x9c, 0xbd, 0x0f,
+  0xe5, 0x28, 0x6a, 0x3d, 0x46, 0x10, 0x1c, 0xe4, 0x69, 0xc3, 0xc4, 0x3c,
+  0x41, 0xd6, 0xe8, 0x30, 0x3e, 0x9c, 0xd6, 0x15, 0x8a, 0x5e, 0x1f, 0xac,
+  0xef, 0x4b, 0x15, 0xfc, 0x0f, 0x5f, 0x1c, 0xb2, 0x94, 0x5c, 0xeb, 0x41,
+  0x3f, 0xc1, 0x84, 0x23, 0x3a, 0x5b, 0xa1, 0x1b, 0x52, 0xaf, 0x8f, 0xa0,
+  0x4a, 0x72, 0x2b, 0x2a, 0x55, 0x09, 0xb6, 0x07, 0xed, 0x0d, 0x23, 0xe4,
+  0x3c, 0x08, 0x03, 0x3d, 0xe5, 0xbc, 0xf7, 0x8c, 0xf5, 0xec, 0xa8, 0xbd,
+  0x43, 0xf4, 0xec, 0xfe, 0x6f, 0x5a, 0x1f, 0xe8, 0xd9, 0x91, 0x01, 0x05,
+  0x2c, 0x6a, 0xc6, 0x02, 0x47, 0x0e, 0x7f, 0x82, 0xe2, 0x07, 0x12, 0xf1,
+  0x3d, 0xb3, 0x03, 0x98, 0x01, 0x29, 0x45, 0x14, 0xbe, 0x9d, 0x0b, 0xfa,
+  0x28, 0xc3, 0xc5, 0x7f, 0xe1, 0x94, 0x99, 0x21, 0x2d, 0x72, 0x28, 0x24,
+  0x3b, 0x02, 0x11, 0xae, 0xa1, 0x54, 0x4b, 0x99, 0x71, 0xa2, 0x0c, 0xc8,
+  0xaf, 0x5f, 0x34, 0x2a, 0x5c, 0xab, 0xc8, 0xf6, 0x96, 0xa4, 0xdc, 0xfb,
+  0xbc, 0x25, 0x29, 0xdd, 0x3b, 0xeb, 0x64, 0xe4, 0x38, 0xe3, 0xfc, 0x36,
+  0xdf, 0x1f, 0x8a, 0x97, 0xb8, 0x68, 0x9b, 0x1a, 0x82, 0x84, 0x99, 0x52,
+  0xf4, 0x6a, 0x50, 0xc3, 0xcc, 0xa9, 0x4a, 0x5e, 0x29, 0x26, 0xf2, 0xd5,
+  0x29, 0x08, 0x27, 0xd6, 0x51, 0x32, 0xa9, 0xca, 0x9b, 0x1a, 0xea, 0xa8,
+  0x1a, 0xa8, 0x29, 0x67, 0xd4, 0x5e, 0x05, 0x15, 0xd6, 0x66, 0x7b, 0xe7,
+  0x16, 0x56, 0xf6, 0x9b, 0xf3, 0x37, 0x27, 0xdc, 0x20, 0x82, 0x8b, 0x7d,
+  0xa9, 0xa6, 0x49, 0xe6, 0xbc, 0x9a, 0x2c, 0x8c, 0x61, 0x6e, 0xb4, 0x93,
+  0x86, 0x59, 0x99, 0x72, 0xc7, 0xa0, 0x22, 0x19, 0x11, 0x42, 0x89, 0x2f,
+  0x2f, 0x63, 0xe1, 0x1e, 0x51, 0x24, 0x3d, 0x58, 0x2b, 0x4f, 0x03, 0xfe,
+  0xf9, 0xba, 0xae, 0xb1, 0x93, 0x91, 0x60, 0x03, 0x3d, 0xea, 0x35, 0x1d,
+  0x05, 0x3d, 0x12, 0xdc, 0x3e, 0x4f, 0x4d, 0x43, 0x1f, 0x33, 0x20, 0x54,
+  0x5b, 0x87, 0x0f, 0x69, 0x5d, 0xb6, 0x89, 0x09, 0x40, 0xb8, 0xd2, 0xb6,
+  0xa6, 0x15, 0x54, 0xe9, 0x5a, 0xcd, 0xcb, 0xb5, 0x23, 0xf1, 0x95, 0x2f,
+  0xd2, 0x43, 0x48, 0x1f, 0x92, 0xb8, 0xd4, 0xaa, 0x22, 0xdf, 0x20, 0x6b,
+  0xd5, 0x83, 0x48, 0x0a, 0xbf, 0x28, 0x24, 0x1a, 0x1c, 0xb0, 0x91, 0xd2,
+  0x96, 0xa9, 0xa7, 0x7d, 0x17, 0x68, 0x6c, 0xef, 0x06, 0x47, 0x94, 0x44,
+  0x06, 0xbc, 0x42, 0x6d, 0x06, 0x4e, 0xd3, 0x10, 0x9b, 0x19, 0x1d, 0x6d,
+  0xc5, 0x52, 0xf8, 0xda, 0x03, 0xf5, 0x2e, 0xaa, 0x60, 0xbb, 0xa6, 0x24,
+  0xb5, 0xeb, 0x43, 0xa1, 0xf6, 0x32, 0x70, 0xbf, 0x80, 0xf4, 0x85, 0x46,
+  0x14, 0x65, 0xdb, 0x7d, 0x16, 0xba, 0x33, 0xc5, 0x9d, 0x36, 0xf0, 0xa2,
+  0x75, 0x39, 0x39, 0xb4, 0xfc, 0xf0, 0xa3, 0x0b, 0xd4, 0x2f, 0xb2, 0xea,
+  0x92, 0xab, 0x1a, 0x18, 0x61, 0x36, 0x0a, 0x8a, 0x91, 0x26, 0x1e, 0xe8,
+  0x5b, 0x92, 0xfc, 0xb7, 0x21, 0x4b, 0x54, 0x78, 0xbe, 0x56, 0x54, 0x4e,
+  0x23, 0xee, 0xf9, 0xcd, 0xe1, 0x8c, 0xd9, 0xca, 0x2c, 0x2d, 0xcc, 0x4e,
+  0x98, 0x1b, 0x1b, 0xa6, 0xdb, 0xcc, 0xe7, 0x5f, 0xcc, 0xcb, 0x55, 0x7d,
+  0xb7, 0x99, 0x48, 0x4f, 0x20, 0x69, 0xa3, 0xd1, 0x48, 0x6a, 0x10, 0x9d,
+  0xa5, 0x39, 0xdf, 0x55, 0xf1, 0x51, 0x85, 0x22, 0x15, 0x3e, 0xd4, 0xec,
+  0xf7, 0xed, 0x0c, 0xb7, 0xe9, 0x7d, 0xec, 0xbf, 0xf9, 0x63, 0x47, 0x77,
+  0x19, 0xd1, 0x04, 0x36, 0x9c, 0x1f, 0x66, 0x39, 0xbb, 0x08, 0x4f, 0xcc,
+  0x6c, 0x4e, 0x5a, 0x81, 0x3f, 0x3b, 0x20, 0x09, 0x0f, 0x46, 0xf5, 0xd5,
+  0x08, 0x86, 0xcb, 0x04, 0x01, 0xbf, 0xe9, 0xa9, 0x65, 0x11, 0xd3, 0x91,
+  0x53, 0x3a, 0x38, 0x44, 0x95, 0x24, 0x67, 0x25, 0xf7, 0x14, 0x70, 0x62,
+  0x29, 0x6d, 0x21, 0xa2, 0x5e, 0x94, 0xe5, 0x24, 0xad, 0x36, 0x83, 0xa4,
+  0x46, 0x9a, 0x36, 0x00, 0xd8, 0xcd, 0xdc, 0x67, 0xec, 0x58, 0x21, 0x5f,
+  0xad, 0x63, 0xa0, 0x5f, 0xf2, 0x9b, 0x23, 0xf6, 0xa2, 0xfa, 0x26, 0x73,
+  0x2c, 0xa3, 0x60, 0x3e, 0x73, 0x53, 0x4f, 0x5a, 0xf3, 0x40, 0xa2, 0x3b,
+  0x8a, 0x17, 0x9c, 0x71, 0xaf, 0xb6, 0x3d, 0xea, 0x5f, 0xb2, 0x9b, 0x61,
+  0xa4, 0x6a, 0xb1, 0x76, 0x51, 0x00, 0x82, 0x7d, 0x27, 0x9c, 0x11, 0xca,
+  0xb4, 0x50, 0x7b, 0x9a, 0xe3, 0x28, 0xd6, 0xaa, 0xf6, 0xee, 0x7b, 0x98,
+  0x93, 0x14, 0x63, 0x22, 0x8e, 0x69, 0x78, 0x57, 0x10, 0x1c, 0x49, 0xf2,
+  0x59, 0xd7, 0xe4, 0xc2, 0xf9, 0x8c, 0xc0, 0x13, 0x4d, 0xce, 0x3e, 0xeb,
+  0xca, 0xab, 0x7e, 0xe7, 0xaf, 0x03, 0xce, 0x75, 0xfc, 0x92, 0x5f, 0x3f,
+  0xc6, 0x7e, 0xa3, 0x13, 0x2f, 0x2b, 0x86, 0xc3, 0x73, 0xfc, 0x84, 0xfd,
+  0x8d, 0xc3, 0x08, 0xb5, 0xb5, 0x0c, 0xc6, 0x6c, 0x9e, 0x5d, 0xf2, 0xfa,
+  0x5e, 0x9c, 0x1c, 0x7d, 0x77, 0x74, 0x12, 0x48, 0xc2, 0xaf, 0xc7, 0xe3,
+  0x9d, 0x8f, 0x59, 0x35, 0x41, 0xbf, 0x56, 0x5a, 0x1e, 0x79, 0x37, 0xe9,
+  0x49, 0x9b, 0x04, 0xe6, 0x09, 0x08, 0xed, 0xb0, 0x07, 0x76, 0x0d, 0x23,
+  0x2c, 0x4c, 0x29, 0x91, 0x4f, 0x0a, 0x10, 0x3c, 0x8a, 0x92, 0x24, 0xdb,
+  0x10, 0xe2, 0x6e, 0x5a, 0x65, 0x33, 0x6e, 0x67, 0x1a, 0xe6, 0x19, 0x02,
+  0xfb, 0x23, 0x49, 0x5e, 0xe1, 0x4c, 0x39, 0xd7, 0x1c, 0x21, 0x2e, 0xbb,
+  0x88, 0xe0, 0x8d, 0x25, 0xea, 0xeb, 0x93, 0x57, 0xf2, 0xcd, 0x9a, 0x2e,
+  0x12, 0xed, 0x12, 0x03, 0xbf, 0xb1, 0xd9, 0x71, 0xfa, 0xed, 0xf0, 0x70,
+  0x3c, 0x7c, 0x75, 0x74, 0x72, 0xf4, 0xf5, 0xe1, 0xf9, 0x11, 0xe3, 0x9d,
+  0x2b, 0x08, 0x72, 0x5c, 0x6f, 0xb1, 0x62, 0xfc, 0x5b, 0xd9, 0x18, 0x16,
+  0xf1, 0x04, 0x98, 0x4f, 0x9d, 0x9c, 0xd1, 0xaf, 0xc5, 0x81, 0xb1, 0xa6,
+  0x64, 0xe9, 0x34, 0xad, 0x86, 0xca, 0xdd, 0x5c, 0x38, 0x23, 0xdb, 0x64,
+  0xaa, 0xc1, 0x0a, 0xd2, 0xf9, 0x0d, 0xf5, 0x6c, 0x7b, 0x5f, 0x50, 0xb2,
+  0x7d, 0x6e, 0x8b, 0x4d, 0x79, 0xf5, 0xbe, 0x93, 0xc7, 0xed, 0x6c, 0xeb,
+  0x80, 0x81, 0x5d, 0x1f, 0x57, 0x6f, 0xb4, 0x4e, 0x1c, 0x01, 0xe6, 0x57,
+  0x78, 0xb0, 0x03, 0x42, 0xee, 0xb0, 0xd3, 0xd1, 0x2f, 0x46, 0x7e, 0x17,
+  0x81, 0x34, 0x81, 0x54, 0xad, 0xa7, 0x57, 0xd9, 0xc2, 0x82, 0x75, 0x51,
+  0xfe, 0x02, 0x22, 0xe5, 0x5c, 0x78, 0x29, 0xa0, 0x42, 0xb8, 0xf1, 0x93,
+  0x0c, 0x26, 0x32, 0xa2, 0x76, 0xd7, 0x81, 0xa0, 0x40, 0x56, 0x10, 0xb5,
+  0x24, 0xa0, 0x60, 0x0c, 0xe5, 0xf5, 0xa0, 0x02, 0x79, 0x84, 0x0c, 0x44,
+  0x2f, 0xb1, 0x20, 0x4c, 0x24, 0x90, 0xc6, 0x82, 0x5d, 0x2d, 0xc2, 0x42,
+  0x9c, 0x5b, 0x3c, 0xf6, 0x12, 0xde, 0x30, 0xfc, 0x88, 0x5b, 0x9b, 0x88,
+  0x1a, 0x4d, 0x33, 0xfc, 0x39, 0x6e, 0xab, 0xae, 0xdf, 0x0a, 0x54, 0xe5,
+  0xea, 0x2d, 0x51, 0x03, 0x14, 0xcb, 0xeb, 0x5e, 0xc3, 0x34, 0xdc, 0x64,
+  0x99, 0x39, 0x30, 0xf4, 0xfa, 0x4c, 0x0e, 0x07, 0x3f, 0x92, 0x46, 0x05,
+  0x23, 0x57, 0x19, 0x12, 0xf5, 0xce, 0x7b, 0x2c, 0xa3, 0xd5, 0xcd, 0x80,
+  0x50, 0xe4, 0xf5, 0xaf, 0x61, 0xcf, 0x09, 0x5b, 0x8c, 0x37, 0xcc, 0x96,
+  0x01, 0xa4, 0xf7, 0xd6, 0x6b, 0x45, 0xe8, 0xb7, 0xea, 0xa2, 0xdf, 0x86,
+  0xcd, 0xeb, 0x9a, 0x74, 0x74, 0xf6, 0x8e, 0x1b, 0xaf, 0x9f, 0xd0, 0x5f,
+  0x24, 0x36, 0x57, 0xc7, 0x10, 0xf2, 0xa4, 0x3f, 0x08, 0xa5, 0xab, 0x64,
+  0x88, 0xc6, 0xd8, 0x70, 0xbb, 0xa6, 0x2b, 0x72, 0x86, 0xaa, 0x40, 0xb1,
+  0xcb, 0x75, 0xc0, 0x06, 0x07, 0xe5, 0x01, 0xb6, 0x59, 0x2b, 0xa6, 0x42,
+  0x73, 0x10, 0x10, 0x23, 0xcc, 0x82, 0xd3, 0x6c, 0x35, 0xe8, 0x71, 0x4a,
+  0xbf, 0x24, 0x1d, 0x52, 0xc8, 0xa7, 0x87, 0xf3, 0xba, 0x92, 0x2b, 0x1a,
+  0x92, 0xde, 0x4a, 0x2a, 0xb4, 0x79, 0x4d, 0xcd, 0x3c, 0x46, 0x6e, 0x9d,
+  0xfc, 0x09, 0xf6, 0x41, 0x03, 0x98, 0x33, 0x0c, 0x71, 0xa0, 0xbc, 0xdd,
+  0x9a, 0x09, 0x9a, 0xba, 0xce, 0xa9, 0xb9, 0x36, 0x25, 0x7f, 0x20, 0xc0,
+  0x45, 0x12, 0x95, 0xa6, 0x9a, 0x82, 0xb2, 0xf0, 0xfb, 0x8b, 0xb5, 0x4c,
+  0x8a, 0x5a, 0x73, 0xd5, 0xb2, 0x3b, 0x09, 0xac, 0xb3, 0x8e, 0x77, 0x21,
+  0x01, 0xcc, 0x14, 0x90, 0xb3, 0xb0, 0x56, 0x26, 0xac, 0x94, 0x20, 0xef,
+  0xef, 0x2a, 0x2d, 0x22, 0x77, 0xce, 0x6c, 0xbc, 0x6d, 0x97, 0x86, 0x85,
+  0xca, 0xb1, 0x45, 0xf4, 0x72, 0xa2, 0x8d, 0x2e, 0xf0, 0x95, 0xb1, 0xdd,
+  0x0c, 0x03, 0xcb, 0x29, 0x54, 0x21, 0x53, 0xe1, 0xcd, 0x41, 0xdb, 0x20,
+  0xa1, 0xb7, 0x32, 0x46, 0x55, 0xcc, 0x5d, 0xbc, 0x00, 0x4a, 0x8b, 0x04,
+  0xfb, 0xd2, 0x0c, 0xad, 0xab, 0x1d, 0x15, 0x38, 0x1e, 0xea, 0x2e, 0x35,
+  0x1f, 0x6e, 0x97, 0xe8, 0xb0, 0x8a, 0x0a, 0xe9, 0x6e, 0x76, 0xb5, 0x5b,
+  0xe8, 0xc3, 0x65, 0x19, 0xe6, 0xdb, 0x98, 0x2e, 0x79, 0x76, 0x6c, 0xcc,
+  0x96, 0x68, 0x27, 0xf8, 0xfe, 0x2b, 0x4c, 0x0e, 0x4a, 0x2a, 0xde, 0xc0,
+  0xa5, 0x27, 0x74, 0xa2, 0x4b, 0x6d, 0x01, 0xc5, 0xb4, 0x3c, 0xc9, 0xcc,
+  0x17, 0x73, 0xea, 0x8f, 0xd7, 0x72, 0xed, 0x77, 0xbf, 0x5f, 0x1b, 0xfa,
+  0x9b, 0x5e, 0xa9, 0xe5, 0x45, 0x2f, 0x22, 0xde, 0xe9, 0xf5, 0x95, 0x04,
+  0x25, 0x30, 0x32, 0xd3, 0xf0, 0x0c, 0xb2, 0x9d, 0x22, 0x94, 0xc8, 0x7f,
+  0x4c, 0xca, 0x2a, 0x2c, 0x92, 0x9d, 0x5a, 0x34, 0x26, 0x7d, 0x34, 0xad,
+  0xaf, 0xe3, 0x37, 0xbc, 0xbe, 0x8e, 0xde, 0x70, 0xfd, 0x03, 0x37, 0xdd,
+  0xeb, 0xf6, 0xd9, 0x77, 0xd7, 0xc7, 0xdf, 0xf5, 0xc0, 0x4a, 0x78, 0x37,
+  0x5c, 0x57, 0x07, 0x6a, 0xf7, 0xee, 0x38, 0x5f, 0x72, 0x39, 0x23, 0x7b,
+  0xcd, 0xe5, 0x9e, 0x47, 0x5d, 0xfe, 0x7e, 0x93, 0x5e, 0xbe, 0xe7, 0xe6,
+  0xfb, 0x72, 0xb9, 0xcf, 0x0e, 0xc7, 0xdf, 0x75, 0xae, 0xb5, 0x77, 0x91,
+  0x63, 0x20, 0x1c, 0x68, 0x9d, 0x59, 0x29, 0x32, 0x2f, 0x8d, 0x15, 0xa5,
+  0xf7, 0xfa, 0xfa, 0x21, 0xf4, 0x6e, 0x26, 0x12, 0xd0, 0x7b, 0xb0, 0xc7,
+  0xeb, 0xe8, 0xdd, 0x3f, 0xa8, 0x2e, 0x0c, 0x82, 0x47, 0xf1, 0x05, 0xb7,
+  0xd8, 0xa6, 0x22, 0x90, 0x08, 0xa9, 0x83, 0xd2, 0x29, 0x38, 0x08, 0xd2,
+  0x0e, 0x93, 0x0d, 0x31, 0xcf, 0x9f, 0x43, 0xe8, 0x78, 0x21, 0xa0, 0x73,
+  0x3d, 0xd1, 0x9f, 0x4d, 0xe8, 0x72, 0x41, 0x02, 0x3a, 0x87, 0x86, 0x7d,
+  0x36, 0xf0, 0x08, 0xdc, 0xa3, 0x5a, 0xbf, 0x50, 0x3c, 0xb2, 0x43, 0x16,
+  0x92, 0xc4, 0x89, 0x5f, 0x07, 0xf6, 0x10, 0x01, 0x20, 0x19, 0xd8, 0x6a,
+  0xdc, 0x6a, 0x1a, 0x7a, 0xe8, 0x6d, 0x6d, 0xb8, 0x5f, 0x1e, 0x01, 0x93,
+  0x45, 0x12, 0xaa, 0x67, 0x23, 0xc8, 0x6c, 0x18, 0xfc, 0x3e, 0xe2, 0x80,
+  0xdf, 0xe3, 0xb2, 0x8d, 0x48, 0xa5, 0x93, 0x88, 0xd5, 0xaf, 0xd7, 0x19,
+  0x65, 0x82, 0x00, 0xa8, 0xac, 0x7b, 0x4f, 0x49, 0xcd, 0x83, 0x3e, 0x40,
+  0x8a, 0xca, 0x30, 0x2f, 0x86, 0x61, 0xa2, 0x74, 0x3b, 0x72, 0xdc, 0x00,
+  0xbf, 0xd6, 0x33, 0x12, 0xa9, 0x92, 0x91, 0x54, 0x5d, 0x89, 0x5d, 0xa4,
+  0x89, 0x14, 0x50, 0x92, 0x9f, 0x1f, 0xa2, 0x37, 0x52, 0x72, 0x1b, 0xc5,
+  0x60, 0x6b, 0x37, 0x84, 0x69, 0xca, 0x96, 0x7f, 0xed, 0x69, 0x07, 0xe7,
+  0x78, 0x56, 0xd4, 0x43, 0xd7, 0xbc, 0xfd, 0x85, 0xfd, 0x6b, 0x60, 0x5f,
+  0xbc, 0x7a, 0x3b, 0xee, 0xa8, 0x14, 0x75, 0xc6, 0xe5, 0x23, 0x97, 0xe0,
+  0x1b, 0xe6, 0xf7, 0xb6, 0xe4, 0xab, 0x76, 0xed, 0x12, 0x65, 0xc8, 0x10,
+  0x5f, 0xdf, 0x7c, 0x62, 0xd4, 0xa9, 0x99, 0x95, 0x42, 0xe5, 0x15, 0xec,
+  0x39, 0x04, 0xbb, 0x69, 0x0d, 0x6e, 0x76, 0x52, 0xf4, 0x4e, 0xce, 0xa4,
+  0x18, 0x0a, 0x12, 0x0b, 0x08, 0x9a, 0xa7, 0xf6, 0x6d, 0x5e, 0x32, 0x62,
+  0xbb, 0x60, 0x94, 0xd9, 0x0e, 0x58, 0xa4, 0x1a, 0xda, 0x41, 0x63, 0x91,
+  0xa9, 0x2d, 0x41, 0x55, 0x92, 0xac, 0xb2, 0xed, 0xe8, 0x16, 0xf3, 0x1e,
+  0xeb, 0x16, 0x2e, 0xaf, 0x1f, 0x0f, 0xe9, 0xf1, 0x44, 0x8d, 0x45, 0xfe,
+  0xe1, 0x53, 0xfc, 0x70, 0xd4, 0xdd, 0xe8, 0xa0, 0xc8, 0x46, 0x9a, 0xab,
+  0x5a, 0x47, 0xeb, 0xaa, 0x98, 0x51, 0x63, 0x0e, 0x9a, 0xb6, 0xb6, 0x59,
+  0x20, 0x2c, 0x45, 0xd7, 0xd9, 0xc6, 0x42, 0x26, 0x19, 0x12, 0x0a, 0xca,
+  0xc9, 0x2a, 0x54, 0x10, 0xb8, 0x43, 0x7f, 0xf4, 0x28, 0x72, 0xe8, 0x76,
+  0xc6, 0x2f, 0x64, 0x99, 0x0f, 0x38, 0xf2, 0x49, 0xce, 0x1d, 0xb0, 0x5e,
+  0xe4, 0xcb, 0xa1, 0xbe, 0xc5, 0xc2, 0x63, 0x91, 0x7e, 0x14, 0xa1, 0xfe,
+  0x18, 0xa4, 0x10, 0x36, 0x7a, 0xd2, 0x4e, 0xcc, 0x7e, 0x58, 0x8b, 0x9f,
+  0x14, 0x9a, 0x11, 0x4d, 0xab, 0xc9, 0x5c, 0x69, 0x3c, 0x20, 0x63, 0xf9,
+  0x3b, 0xb1, 0xaa, 0x30, 0xcd, 0xdf, 0xf6, 0xdd, 0x36, 0x5a, 0x01, 0x82,
+  0x99, 0xd8, 0x77, 0xef, 0x3d, 0x3f, 0x47, 0x0f, 0xeb, 0xce, 0x4f, 0xf7,
+  0xec, 0x7f, 0x8f, 0xf3, 0x7b, 0xfa, 0x49, 0xce, 0xef, 0xe9, 0xff, 0x36,
+  0xe7, 0xf7, 0xf4, 0x5f, 0x3f, 0xbf, 0xc7, 0xdd, 0xf3, 0x7b, 0xfa, 0xbf,
+  0xcb, 0xf9, 0x69, 0x07, 0x36, 0x3d, 0xbd, 0x2c, 0x38, 0xbf, 0xb1, 0x64,
+  0x82, 0x28, 0x74, 0x1f, 0x6d, 0xb6, 0xbe, 0xc5, 0x71, 0x17, 0x49, 0x85,
+  0x64, 0xc7, 0xb6, 0x66, 0xe3, 0x32, 0x78, 0x64, 0x4f, 0x4b, 0x13, 0x69,
+  0xcb, 0xa5, 0x43, 0x1e, 0x9f, 0x25, 0xf6, 0xf3, 0xde, 0x21, 0x38, 0x20,
+  0x2e, 0xf1, 0x06, 0x47, 0xbd, 0xce, 0x66, 0x8d, 0x67, 0xb4, 0x01, 0x5c,
+  0x80, 0x59, 0xbb, 0xb2, 0xe1, 0x18, 0xd6, 0x96, 0xd9, 0xbc, 0x83, 0x17,
+  0xb4, 0x5f, 0x43, 0x7e, 0xfc, 0x4f, 0xd1, 0x72, 0x38, 0x34, 0x73, 0x76,
+  0x93, 0x8a, 0x45, 0x1a, 0xbc, 0xad, 0x7b, 0xf0, 0xb1, 0xf5, 0xf5, 0x03,
+  0xd3, 0x23, 0x9c, 0x0e, 0xef, 0x3f, 0xb2, 0xf2, 0x0a, 0x48, 0x3f, 0x2f,
+  0xde, 0xbf, 0x0b, 0x7d, 0x6f, 0x66, 0xa9, 0xb6, 0x30, 0xd0, 0xa1, 0x27,
+  0x9a, 0xf3, 0x1a, 0x92, 0x71, 0x3f, 0x04, 0x90, 0xbc, 0xb9, 0x8e, 0xa7,
+  0xdf, 0x6c, 0x7b, 0x5e, 0x20, 0x04, 0x22, 0xca, 0xc8, 0x45, 0xe3, 0xc2,
+  0x5c, 0xad, 0x3d, 0xaf, 0x07, 0xfe, 0x09, 0xbb, 0xac, 0xf8, 0xcc, 0x61,
+  0x75, 0xb3, 0x73, 0x24, 0x91, 0x92, 0xde, 0x2a, 0xe8, 0x80, 0x49, 0xca,
+  0x60, 0x5e, 0x0b, 0xae, 0x1c, 0x01, 0x6d, 0xa8, 0x24, 0xc4, 0xc4, 0x7e,
+  0xcb, 0x24, 0xbe, 0xa7, 0xfb, 0xad, 0x5d, 0x7d, 0x05, 0x5d, 0x71, 0xb5,
+  0x58, 0x4a, 0xf1, 0xf1, 0x3d, 0xc5, 0x97, 0x30, 0xc1, 0xb7, 0x93, 0xef,
+  0x51, 0x59, 0xc9, 0x2e, 0x7b, 0x29, 0x44, 0x52, 0xab, 0xdc, 0x56, 0x5f,
+  0x68, 0x3c, 0xac, 0x07, 0x3a, 0x2d, 0x8a, 0x56, 0xd5, 0xc1, 0x15, 0xe0,
+  0x8a, 0x19, 0xc5, 0x5f, 0x27, 0x1e, 0xe9, 0xe9, 0xcc, 0x52, 0x08, 0xc1,
+  0xe7, 0x20, 0x1f, 0x8d, 0xc2, 0x77, 0x93, 0xb2, 0xc1, 0x45, 0x58, 0x34,
+  0x69, 0x46, 0x20, 0x34, 0xaf, 0x9b, 0xa1, 0x46, 0x52, 0x89, 0x55, 0xbb,
+  0xe0, 0xb3, 0xce, 0x1e, 0xf0, 0x4f, 0xb1, 0xfa, 0x01, 0xd5, 0x6e, 0xe1,
+  0x29, 0x10, 0x60, 0x0f, 0x8b, 0xdc, 0x54, 0x5c, 0xdb, 0xca, 0x9c, 0xc9,
+  0x5d, 0x9b, 0x52, 0x86, 0x93, 0xb0, 0xcc, 0x4e, 0xf3, 0xb7, 0x79, 0xc5,
+  0xff, 0x06, 0xe2, 0xe8, 0xa9, 0xdc, 0x60, 0xcd, 0xcc, 0xf7, 0x4c, 0x04,
+  0x37, 0xc9, 0xaf, 0x0b, 0xe9, 0xa9, 0xc3, 0xd2, 0xd5, 0x49, 0x3f, 0x0b,
+  0x6e, 0x12, 0xd2, 0x36, 0x52, 0xdd, 0x01, 0x88, 0xa1, 0xc9, 0x09, 0xbd,
+  0x41, 0x8e, 0xa0, 0x40, 0x10, 0x44, 0x8f, 0x91, 0xd1, 0xac, 0xb4, 0x7b,
+  0x6c, 0xc2, 0x09, 0xc3, 0x57, 0x99, 0x5f, 0x59, 0x6d, 0x61, 0x2a, 0x25,
+  0x4f, 0x11, 0x53, 0x2f, 0x24, 0xb9, 0x35, 0x68, 0x49, 0x04, 0xdc, 0x04,
+  0x99, 0xfc, 0x86, 0xe0, 0x3c, 0xad, 0x04, 0x9c, 0x96, 0x1b, 0x32, 0x03,
+  0x16, 0xe7, 0xb7, 0xab, 0x63, 0xf6, 0x72, 0xc7, 0x7d, 0x16, 0x95, 0x5d,
+  0x72, 0x44, 0x7f, 0x5d, 0x62, 0xf1, 0xd8, 0xb5, 0x3d, 0x60, 0xa0, 0x6a,
+  0x0b, 0xc8, 0xc6, 0x84, 0x72, 0x54, 0x34, 0x55, 0xb9, 0x34, 0xd4, 0xf3,
+  0x75, 0x4a, 0xab, 0x02, 0x05, 0xbd, 0x4a, 0xb3, 0x45, 0x50, 0xbc, 0xc6,
+  0x9d, 0xc7, 0xb5, 0xcb, 0xa3, 0xf6, 0x21, 0xb7, 0x1e, 0x57, 0x98, 0x07,
+  0xbc, 0x35, 0x49, 0x65, 0xb6, 0xcc, 0x10, 0xb8, 0x94, 0x96, 0xa0, 0xa7,
+  0xd6, 0xf8, 0x24, 0xb4, 0xe5, 0xb4, 0xf5, 0xd1, 0x5a, 0xd4, 0x02, 0x0c,
+  0x35, 0xec, 0x46, 0x47, 0x64, 0xe8, 0x17, 0x51, 0xce, 0xc1, 0xeb, 0xce,
+  0xe6, 0x0a, 0xea, 0xa1, 0x40, 0xf3, 0xd3, 0xea, 0x6e, 0x49, 0xee, 0x01,
+  0xa9, 0xd2, 0xe5, 0x7b, 0x4e, 0xb3, 0x63, 0x94, 0xd8, 0x64, 0x6d, 0x61,
+  0xf4, 0xfb, 0xda, 0x43, 0x5b, 0x87, 0x34, 0x25, 0xc7, 0x10, 0xc1, 0x26,
+  0x13, 0xfc, 0x95, 0x48, 0x57, 0x12, 0x3b, 0x33, 0xe0, 0xbd, 0xf4, 0x76,
+  0x41, 0x93, 0xde, 0x66, 0x23, 0x2f, 0x03, 0x08, 0xb6, 0x87, 0xa1, 0x03,
+  0x82, 0x4b, 0x44, 0x24, 0x65, 0xdb, 0x8b, 0x83, 0xcb, 0xf3, 0x8c, 0xfb,
+  0x11, 0x26, 0x9c, 0xba, 0xf6, 0x0a, 0x29, 0x61, 0x40, 0x14, 0x01, 0xd8,
+  0x8c, 0xb1, 0x71, 0x2f, 0x87, 0x02, 0x9b, 0xd1, 0x43, 0x27, 0x5e, 0x4e,
+  0xa5, 0x90, 0x2e, 0x97, 0x2b, 0x23, 0x23, 0xcf, 0x3a, 0x1e, 0xc1, 0xd3,
+  0x34, 0xa9, 0x42, 0x11, 0xc1, 0x0c, 0xbb, 0x0d, 0x62, 0x0e, 0x00, 0x7a,
+  0x39, 0x3a, 0x4f, 0x2f, 0x99, 0x73, 0x59, 0x5e, 0xe7, 0xd5, 0xa3, 0xa3,
+  0xc1, 0x58, 0xc1, 0xa8, 0x89, 0x86, 0x99, 0x19, 0x5e, 0xb2, 0x30, 0xb7,
+  0x67, 0xf8, 0xd6, 0xac, 0x7d, 0x18, 0x60, 0x1b, 0x91, 0x6f, 0x42, 0xa4,
+  0x85, 0x4b, 0x73, 0x40, 0x7a, 0x35, 0x12, 0x52, 0xe8, 0x4b, 0xa3, 0x18,
+  0x5c, 0xce, 0xb4, 0xac, 0x04, 0xb3, 0x86, 0x32, 0x62, 0xcc, 0xcd, 0x43,
+  0x1a, 0x50, 0x6d, 0xa1, 0x08, 0x5c, 0xa8, 0xbc, 0xdd, 0x2f, 0x2b, 0x52,
+  0x53, 0x6c, 0x75, 0x54, 0x81, 0x57, 0x44, 0x2e, 0xfe, 0x2c, 0xab, 0xa9,
+  0xf9, 0x12, 0x4f, 0x20, 0x39, 0xf4, 0x59, 0x14, 0xc0, 0xc3, 0xa8, 0xcf,
+  0xbc, 0xb4, 0x49, 0xe8, 0xd2, 0x00, 0x1e, 0x8c, 0x4e, 0xfc, 0xbd, 0x05,
+  0x53, 0x51, 0xb6, 0x28, 0x47, 0x08, 0x84, 0x5c, 0x46, 0x53, 0x20, 0x17,
+  0x8a, 0x05, 0xcc, 0xc5, 0x46, 0x4b, 0xb4, 0x36, 0xa2, 0x59, 0x48, 0x57,
+  0x28, 0x8b, 0x55, 0xb7, 0xd2, 0x50, 0x8d, 0x8b, 0xb8, 0x28, 0x71, 0xb8,
+  0xcd, 0x65, 0x26, 0x47, 0x23, 0x87, 0xe0, 0xad, 0x29, 0x65, 0xaf, 0x30,
+  0x84, 0xa6, 0x85, 0x03, 0x0a, 0x31, 0x63, 0xdf, 0x9c, 0x1d, 0xbe, 0x3b,
+  0x1e, 0x9f, 0xbe, 0x3d, 0x00, 0xbb, 0x20, 0xb9, 0x09, 0xff, 0xfb, 0x3e,
+  0xf7, 0x32, 0x02, 0x5a, 0x34, 0xbe, 0x9a, 0xd7, 0x0c, 0x54, 0x4a, 0xdf,
+  0x32, 0x27, 0xf4, 0x7d, 0x96, 0x7e, 0x8c, 0x94, 0x17, 0x8d, 0x0d, 0x8b,
+  0xa2, 0x6e, 0x49, 0x2d, 0x1a, 0xe5, 0x8c, 0x24, 0xc1, 0x0f, 0x46, 0x49,
+  0x0c, 0x00, 0x61, 0x08, 0x0f, 0xd6, 0x8d, 0xbd, 0x56, 0x35, 0x69, 0x27,
+  0x1e, 0x79, 0xdb, 0xfc, 0xd0, 0x6b, 0x42, 0x0f, 0xd7, 0x9c, 0xea, 0x63,
+  0xee, 0x06, 0x4e, 0xc2, 0x31, 0xd6, 0x4e, 0x21, 0x78, 0xd7, 0x1a, 0x3a,
+  0x6a, 0x34, 0x98, 0xa9, 0x20, 0xeb, 0x92, 0xf9, 0x45, 0x37, 0x5f, 0x05,
+  0x27, 0x47, 0xd9, 0xb5, 0xb6, 0x4f, 0x77, 0x1b, 0x02, 0x2f, 0x1a, 0x75,
+  0x70, 0x80, 0xc7, 0x34, 0x19, 0x44, 0x48, 0x54, 0xf3, 0xcb, 0x8a, 0xeb,
+  0x6c, 0x5e, 0x2e, 0x79, 0x2c, 0x2e, 0x5a, 0x04, 0xac, 0x2d, 0xc3, 0xa5,
+  0x8e, 0xd6, 0x22, 0x9b, 0xc9, 0x65, 0xab, 0x55, 0x64, 0x60, 0xa1, 0x3e,
+  0x54, 0xae, 0x8c, 0xc5, 0xc8, 0xab, 0x91, 0x03, 0xe4, 0x8d, 0x22, 0x6f,
+  0x57, 0x21, 0x7a, 0x1a, 0x6f, 0x71, 0x04, 0x04, 0x48, 0xa1, 0x50, 0x00,
+  0x2a, 0x8f, 0xb4, 0xe0, 0x9b, 0x2c, 0xfb, 0xc8, 0xdf, 0xb4, 0x81, 0x5b,
+  0x6e, 0x5c, 0x20, 0x89, 0xc4, 0xc9, 0xc6, 0xf7, 0x3b, 0x1b, 0xf1, 0x02,
+  0xad, 0x1c, 0x01, 0x6b, 0x73, 0x08, 0x15, 0x6f, 0x35, 0xfc, 0xf5, 0x4e,
+  0xf0, 0x4b, 0x23, 0x5d, 0xf8, 0x4f, 0x2b, 0x23, 0x2f, 0xae, 0x49, 0xd5,
+  0xc3, 0x97, 0x04, 0x16, 0x37, 0x82, 0x2c, 0x2b, 0x2d, 0xa0, 0xd3, 0xea,
+  0x63, 0xed, 0x6e, 0x79, 0xa8, 0x0a, 0x34, 0x7a, 0x08, 0x64, 0x8e, 0xa0,
+  0xe3, 0x12, 0x2d, 0xa6, 0x9d, 0xfd, 0x4f, 0x35, 0xa8, 0x8d, 0x57, 0xc9,
+  0xc9, 0x63, 0xc5, 0x9a, 0xd0, 0xb7, 0x39, 0x4b, 0x5f, 0xa5, 0xd6, 0x3a,
+  0xda, 0xc6, 0x65, 0xd9, 0xdb, 0xdd, 0xbd, 0x17, 0x4b, 0x4e, 0xc8, 0x7c,
+  0x2d, 0xa4, 0x1c, 0xa9, 0xc5, 0x1c, 0xe6, 0xb6, 0xd8, 0x27, 0x69, 0x2e,
+  0x85, 0xad, 0x5d, 0xf4, 0x4d, 0xf3, 0x49, 0x0b, 0xed, 0x66, 0xb5, 0xb0,
+  0x1b, 0xdb, 0x77, 0x35, 0x03, 0xac, 0x1c, 0xe9, 0xcc, 0x47, 0x7c, 0x9f,
+  0x0f, 0xda, 0xef, 0x74, 0x13, 0x41, 0x58, 0x0e, 0x20, 0xce, 0x4f, 0x2f,
+  0xba, 0x3b, 0x91, 0x7c, 0x75, 0xe7, 0x3c, 0xb8, 0x36, 0x3a, 0x89, 0x79,
+  0x91, 0xa2, 0xc5, 0xf3, 0x1f, 0xad, 0x31, 0x00, 0xe2, 0x70, 0x71, 0xff,
+  0xc6, 0xda, 0x25, 0x46, 0x34, 0x62, 0x6a, 0x59, 0x63, 0x48, 0x06, 0xc1,
+  0x8a, 0x87, 0x2d, 0xec, 0x6a, 0xd3, 0x3a, 0x68, 0xc6, 0xe7, 0xf5, 0xd5,
+  0x63, 0x6d, 0x78, 0x2d, 0xee, 0x7f, 0x1b, 0xfd, 0xaf, 0x5d, 0x5e, 0xf0,
+  0xac, 0x7d, 0xbe, 0x04, 0xc1, 0x31, 0x04, 0xd0, 0x46, 0x57, 0x10, 0x12,
+  0x36, 0x07, 0x11, 0x39, 0x9c, 0xcd, 0x65, 0xe1, 0x79, 0xe1, 0x09, 0x75,
+  0x92, 0x53, 0x3a, 0xb5, 0x26, 0xb7, 0x03, 0x76, 0x1e, 0x82, 0xc5, 0xaa,
+  0x4a, 0x4b, 0x21, 0xa7, 0xd2, 0x03, 0x39, 0xb4, 0x75, 0xd8, 0x31, 0x7f,
+  0x7e, 0x08, 0x9f, 0xc4, 0xa5, 0x21, 0x2e, 0x56, 0xc4, 0x80, 0x22, 0x48,
+  0x7b, 0x83, 0x3f, 0x80, 0x35, 0x05, 0x63, 0xb7, 0x0e, 0x70, 0x76, 0xe6,
+  0xd6, 0x50, 0x25, 0x10, 0x9f, 0x70, 0xd4, 0xc9, 0x31, 0x48, 0x2c, 0x5a,
+  0x60, 0x22, 0x2d, 0x29, 0x79, 0x31, 0xb5, 0x43, 0x0e, 0x45, 0xe9, 0x22,
+  0xfd, 0xc2, 0x8c, 0x5b, 0xab, 0x8f, 0xa2, 0x88, 0x65, 0x69, 0x41, 0x3b,
+  0x37, 0x4f, 0x6d, 0x12, 0x2e, 0x06, 0x42, 0x98, 0x3c, 0xb2, 0x85, 0xe9,
+  0x64, 0x0d, 0x04, 0xf0, 0x26, 0x09, 0x67, 0x0d, 0xb2, 0x41, 0x16, 0xca,
+  0x5f, 0x24, 0x49, 0x11, 0xc8, 0x6f, 0x82, 0xc3, 0x01, 0x54, 0xca, 0xaa,
+  0xf2, 0x52, 0xa3, 0x36, 0xae, 0x72, 0x73, 0xaa, 0xc5, 0x06, 0x54, 0x22,
+  0x27, 0x58, 0xe5, 0xbb, 0xc1, 0x62, 0x57, 0x73, 0x2f, 0x42, 0x17, 0xea,
+  0x0e, 0x16, 0xe1, 0x21, 0x28, 0x84, 0x75, 0x48, 0x17, 0x2c, 0x53, 0x24,
+  0xb7, 0x98, 0xd7, 0x10, 0x6f, 0xf5, 0x26, 0x31, 0x3d, 0x4b, 0x1d, 0x62,
+  0xdf, 0xa2, 0x89, 0x23, 0x32, 0x66, 0x6d, 0x0b, 0x35, 0x0b, 0xf9, 0xbf,
+  0x20, 0x57, 0x3e, 0xfd, 0x8b, 0xf6, 0x38, 0x66, 0x1d, 0xd3, 0x21, 0x08,
+  0xb2, 0x57, 0x04, 0x7a, 0x5e, 0x52, 0xb6, 0xd3, 0x3b, 0x14, 0xa7, 0xba,
+  0x0f, 0x83, 0xba, 0x03, 0xa0, 0x50, 0x02, 0xcd, 0x2d, 0xe1, 0x00, 0x12,
+  0x3a, 0xa6, 0x2d, 0x9c, 0x56, 0xf9, 0xb2, 0xe1, 0xb4, 0x34, 0xa9, 0x9a,
+  0xb9, 0xcf, 0xea, 0xbf, 0x9c, 0x97, 0x93, 0x94, 0xef, 0x88, 0x4d, 0x5a,
+  0xd5, 0xb8, 0x57, 0x0b, 0xd8, 0x9e, 0xd8, 0x1b, 0x91, 0x67, 0xa4, 0x31,
+  0x8f, 0x59, 0xf1, 0xf0, 0x60, 0x80, 0xbc, 0x8d, 0xdb, 0x66, 0xed, 0x07,
+  0xed, 0x27, 0x18, 0x26, 0x76, 0x78, 0x31, 0x90, 0xdb, 0xab, 0xe8, 0x1d,
+  0xc8, 0xf9, 0xad, 0xbd, 0x2b, 0x15, 0x58, 0xde, 0x80, 0xdb, 0x49, 0x66,
+  0x2b, 0x56, 0x07, 0x9d, 0x3c, 0xd9, 0x94, 0x7c, 0x21, 0x69, 0x7e, 0x8a,
+  0x44, 0x54, 0xdb, 0xd3, 0x86, 0xd3, 0x72, 0x62, 0xd8, 0x0d, 0x04, 0x24,
+  0x2f, 0xe9, 0xa8, 0x83, 0xe4, 0xaa, 0xbc, 0x41, 0xe9, 0x5d, 0x41, 0xc6,
+  0x89, 0x9b, 0x9c, 0x96, 0x55, 0x78, 0x7b, 0xc5, 0x00, 0x3c, 0x21, 0xc5,
+  0x5f, 0xb0, 0x5b, 0x00, 0xba, 0x34, 0x9f, 0xc9, 0x9a, 0x9d, 0xf1, 0xbb,
+  0x51, 0xb4, 0x1d, 0x45, 0xf6, 0xd3, 0x3d, 0x21, 0x35, 0xf0, 0x35, 0x73,
+  0xc4, 0x73, 0xee, 0x17, 0xba, 0x65, 0xe8, 0x45, 0xea, 0xa4, 0x53, 0x18,
+  0x53, 0x40, 0x51, 0x16, 0x39, 0xcb, 0x9c, 0x20, 0x9a, 0xc4, 0x67, 0x56,
+  0x41, 0xb9, 0xcb, 0xf3, 0x3b, 0xce, 0xa0, 0xc4, 0x91, 0xc3, 0xe7, 0x21,
+  0x81, 0x63, 0xa5, 0xa7, 0xac, 0x99, 0x7a, 0xbf, 0x9c, 0x65, 0xe9, 0x3c,
+  0xda, 0xa7, 0x9c, 0x26, 0x8c, 0x68, 0x27, 0xf3, 0x36, 0x34, 0xed, 0x2c,
+  0x34, 0x78, 0x2e, 0xf5, 0x33, 0x9c, 0x41, 0x5e, 0xb4, 0x80, 0x7a, 0x70,
+  0xa7, 0xc2, 0x93, 0xa6, 0x3e, 0x6f, 0xd7, 0xc0, 0x0c, 0xd3, 0x4e, 0x18,
+  0x8c, 0xd4, 0xec, 0x0a, 0x2b, 0xe1, 0x6b, 0x7a, 0x73, 0x92, 0xd8, 0x07,
+  0x90, 0xfc, 0xca, 0x19, 0xbc, 0x41, 0x7b, 0x39, 0x89, 0xa6, 0x09, 0x80,
+  0x00, 0x8b, 0x19, 0xad, 0xc8, 0xa3, 0x79, 0x71, 0x2e, 0x24, 0xf1, 0xc8,
+  0x6d, 0xb9, 0x8a, 0xc8, 0xb8, 0x03, 0xfb, 0x58, 0x86, 0x27, 0x7d, 0x9d,
+  0x69, 0xca, 0x2b, 0xcc, 0x0f, 0xde, 0xfe, 0xc6, 0x82, 0x2a, 0xd0, 0x58,
+  0xc2, 0x6b, 0x98, 0xcd, 0xec, 0xef, 0xc7, 0x6f, 0x06, 0x37, 0x41, 0x57,
+  0x12, 0xc3, 0x5d, 0xaf, 0xd3, 0x8b, 0x4c, 0x6d, 0x16, 0x61, 0xdd, 0xe5,
+  0xd4, 0x6c, 0x1f, 0x32, 0x75, 0x6e, 0xd8, 0xa0, 0x28, 0x22, 0xc5, 0xca,
+  0xcc, 0x35, 0x89, 0x4b, 0x5a, 0x91, 0x4b, 0xd7, 0x40, 0xd8, 0x6d, 0x3d,
+  0xcf, 0x97, 0x1a, 0xa6, 0x1c, 0x24, 0x99, 0x64, 0x93, 0xce, 0xef, 0xe4,
+  0x48, 0x56, 0xc3, 0x88, 0x03, 0x4e, 0xf3, 0xed, 0x14, 0x26, 0x7d, 0x4e,
+  0x96, 0xd1, 0x56, 0x67, 0xf4, 0xc7, 0xbb, 0x7b, 0x98, 0xed, 0xe3, 0xdd,
+  0x67, 0xdb, 0x6d, 0xa9, 0x3c, 0xaf, 0xb3, 0x21, 0xb2, 0x91, 0x1f, 0xd8,
+  0xd1, 0x14, 0x6f, 0x48, 0xfe, 0xf2, 0x6c, 0x55, 0x39, 0x7f, 0x1e, 0xf5,
+  0xba, 0x85, 0x83, 0xb2, 0xbe, 0x22, 0x74, 0xde, 0x40, 0xca, 0xd3, 0x6b,
+  0xf2, 0x1e, 0x27, 0x36, 0x92, 0x58, 0xe2, 0x9d, 0x4a, 0xf1, 0xb2, 0x74,
+  0xd2, 0xe4, 0x8d, 0xc0, 0x73, 0xd6, 0x02, 0x8f, 0xb5, 0xbd, 0x96, 0x55,
+  0x73, 0x15, 0x25, 0x67, 0x70, 0xb4, 0x9b, 0xd2, 0x5b, 0x9e, 0x93, 0xbc,
+  0xce, 0x8b, 0xbc, 0xbe, 0x22, 0xb2, 0x5f, 0x50, 0xd2, 0xc2, 0x65, 0x16,
+  0x02, 0xa1, 0x18, 0x76, 0x64, 0x4c, 0x00, 0x36, 0xf7, 0x2b, 0x74, 0x30,
+  0xa1, 0x8c, 0x60, 0xde, 0x77, 0xa9, 0x44, 0x94, 0x5e, 0xac, 0x40, 0xd0,
+  0x74, 0xcb, 0xec, 0x6b, 0x15, 0xec, 0x3a, 0x05, 0xf7, 0x35, 0x0a, 0xa6,
+  0xb6, 0x95, 0xc0, 0x52, 0xf4, 0x9a, 0xc8, 0xc5, 0xba, 0x83, 0x25, 0x5b,
+  0x74, 0xb8, 0xa7, 0x63, 0xc3, 0x82, 0x5c, 0x4f, 0x7b, 0xe4, 0x76, 0x9b,
+  0x9f, 0xfd, 0x60, 0x74, 0xd1, 0xd1, 0x73, 0xfb, 0xe3, 0xed, 0x87, 0x35,
+  0x16, 0xde, 0xef, 0xe8, 0x66, 0x54, 0x64, 0x21, 0x11, 0x69, 0x38, 0xac,
+  0xbe, 0xe0, 0x7f, 0xc4, 0x3d, 0xde, 0xc0, 0x12, 0x38, 0x7e, 0x73, 0x48,
+  0x45, 0x2e, 0xae, 0xec, 0xd3, 0xcb, 0x2d, 0xd6, 0xca, 0x6b, 0xdb, 0x79,
+  0x35, 0x93, 0x12, 0x85, 0x28, 0x10, 0xac, 0xa0, 0x19, 0x70, 0x12, 0x26,
+  0xf2, 0xc9, 0x5d, 0xf2, 0x85, 0x6a, 0x73, 0x73, 0x6a, 0x25, 0x49, 0x17,
+  0x61, 0x94, 0x9c, 0x64, 0xdc, 0x55, 0x6d, 0xf3, 0xcb, 0xcd, 0x48, 0x99,
+  0xf6, 0xe6, 0x0b, 0xaf, 0x13, 0x45, 0xed, 0x1a, 0x36, 0x6e, 0xfe, 0x91,
+  0xcc, 0x7a, 0x02, 0xdd, 0xe2, 0x6f, 0xca, 0x11, 0x70, 0xe1, 0x84, 0xe4,
+  0xbc, 0xf4, 0x54, 0xde, 0x0a, 0x8e, 0x6c, 0x3b, 0x87, 0x74, 0xc9, 0x00,
+  0xde, 0x54, 0x09, 0xd1, 0x5e, 0xbb, 0x2a, 0x73, 0x9b, 0x41, 0x19, 0x77,
+  0x71, 0x27, 0xa0, 0x6e, 0xdc, 0xcb, 0xdd, 0x35, 0xbb, 0xe6, 0x19, 0xf1,
+  0x54, 0xe0, 0x42, 0x33, 0x7a, 0x3e, 0xcc, 0x42, 0xb6, 0xb9, 0xcd, 0xaf,
+  0x2f, 0x2f, 0xa3, 0x89, 0xae, 0x66, 0x0b, 0xe8, 0xe0, 0x69, 0xcd, 0x17,
+  0xc6, 0xde, 0x82, 0xbe, 0x41, 0x72, 0xbe, 0xbf, 0x2a, 0xc6, 0xe9, 0xee,
+  0x91, 0x67, 0xbc, 0x55, 0xbc, 0xf0, 0x0b, 0x0f, 0x7b, 0xe2, 0x1e, 0x20,
+  0x03, 0xa1, 0x03, 0x72, 0x66, 0xe1, 0xa7, 0x36, 0xe8, 0x71, 0x91, 0x1a,
+  0xca, 0xb8, 0x93, 0x04, 0xa3, 0x39, 0x95, 0x8a, 0x89, 0x31, 0x15, 0xf0,
+  0xb0, 0x39, 0x9a, 0x0d, 0x4a, 0x61, 0x12, 0x75, 0x9c, 0xe2, 0x7d, 0x2c,
+  0x44, 0xdb, 0x90, 0x4a, 0x26, 0x18, 0x26, 0x89, 0xb6, 0x5d, 0x12, 0xff,
+  0x05, 0x8a, 0x94, 0xba, 0xbe, 0x71, 0x29, 0x59, 0x52, 0x7c, 0x44, 0x56,
+  0x56, 0x5c, 0x4e, 0x0b, 0x2a, 0xaf, 0xc0, 0x34, 0xbc, 0x7e, 0xea, 0x5e,
+  0x95, 0x7a, 0x37, 0x52, 0x05, 0x0b, 0xc2, 0x30, 0xa3, 0x1d, 0x5c, 0x12,
+  0x2e, 0x15, 0x9b, 0x12, 0xdc, 0x19, 0x5e, 0x2e, 0x13, 0x6a, 0xe6, 0xb9,
+  0xff, 0xe8, 0xf3, 0xcf, 0xa3, 0x0e, 0x3e, 0x86, 0xdd, 0x30, 0x34, 0x48,
+  0xdb, 0xe4, 0xa0, 0x93, 0x07, 0x16, 0x04, 0x9f, 0xbe, 0x4e, 0x04, 0xa6,
+  0x5e, 0xae, 0x12, 0x4d, 0x64, 0xe9, 0xab, 0xa1, 0x93, 0x17, 0xce, 0x97,
+  0x05, 0x69, 0x15, 0xc2, 0xc5, 0xa0, 0x5c, 0x11, 0xd7, 0x58, 0xe4, 0x7d,
+  0xf0, 0x90, 0x99, 0xa4, 0x69, 0x0b, 0x84, 0x88, 0x80, 0xc8, 0x4a, 0x5d,
+  0x01, 0xf7, 0xb8, 0x35, 0x8a, 0x03, 0xca, 0x97, 0x38, 0xfb, 0x0f, 0x74,
+  0xd5, 0x53, 0xe7, 0xbf, 0x99, 0x68, 0x06, 0xcc, 0x24, 0xb3, 0x38, 0x3c,
+  0xec, 0xe8, 0xe8, 0x20, 0xa5, 0xb1, 0xff, 0xb1, 0xa0, 0x62, 0x5f, 0xea,
+  0x88, 0x64, 0x86, 0xef, 0x0c, 0x07, 0xe8, 0x8b, 0xcb, 0xac, 0x09, 0x0b,
+  0x54, 0xbd, 0xb2, 0x8e, 0x35, 0x83, 0x47, 0x6e, 0x83, 0x94, 0xd7, 0xbe,
+  0x90, 0xe6, 0x1d, 0xf9, 0x85, 0x5e, 0x50, 0x6d, 0x20, 0xf4, 0x25, 0x27,
+  0xdb, 0xbe, 0x60, 0x47, 0x0b, 0x97, 0x1b, 0x33, 0x87, 0xfa, 0x32, 0x8a,
+  0x85, 0xe9, 0x7a, 0x59, 0x02, 0x9b, 0xb1, 0x69, 0x8c, 0x66, 0xed, 0xb8,
+  0x37, 0x2a, 0x84, 0x2c, 0xfa, 0x9e, 0xec, 0x2f, 0x54, 0xe4, 0x79, 0x0c,
+  0x8c, 0xe9, 0x85, 0xf5, 0x58, 0x4b, 0x4b, 0x2c, 0xaa, 0xd0, 0xa2, 0xf9,
+  0xc4, 0x76, 0x42, 0xfb, 0x59, 0x10, 0x87, 0x30, 0x4f, 0x07, 0x56, 0x0f,
+  0xbd, 0xeb, 0xed, 0x53, 0x78, 0xf6, 0x2e, 0xf7, 0xd2, 0x61, 0xc6, 0xf1,
+  0x1e, 0x3b, 0xe8, 0x39, 0x3f, 0x84, 0x9b, 0x5a, 0xa7, 0x37, 0x2e, 0x45,
+  0x37, 0x2e, 0x47, 0xeb, 0x74, 0x10, 0x1d, 0xa0, 0xac, 0xcb, 0x32, 0xe3,
+  0x59, 0x02, 0x7e, 0x89, 0xb7, 0xf6, 0x05, 0x1c, 0x57, 0x4d, 0xb5, 0x9a,
+  0x92, 0x5e, 0x09, 0xa3, 0x1c, 0x5f, 0x8a, 0x75, 0x6d, 0xd4, 0x30, 0x9b,
+  0x5d, 0x31, 0x7a, 0xab, 0xe2, 0xcc, 0xb0, 0xc5, 0x02, 0x1c, 0xcb, 0x16,
+  0x9e, 0xe0, 0x0a, 0x73, 0x9d, 0xc2, 0x30, 0xda, 0xef, 0x3b, 0x83, 0xb3,
+  0xa5, 0xce, 0xff, 0xce, 0x5a, 0x99, 0x14, 0x78, 0x28, 0x8c, 0x26, 0x1c,
+  0x1c, 0x19, 0x35, 0x76, 0x49, 0x5e, 0x51, 0x37, 0x6a, 0x16, 0xe5, 0x44,
+  0x6f, 0x01, 0x9f, 0xf6, 0x6b, 0x9c, 0x58, 0x1c, 0x91, 0x1a, 0x57, 0x65,
+  0x97, 0x2b, 0x12, 0x74, 0xd8, 0xa6, 0x2d, 0x85, 0xcd, 0xd6, 0x27, 0x96,
+  0xf9, 0x12, 0x1d, 0xaf, 0x8c, 0x3d, 0x17, 0xb4, 0xef, 0x35, 0x6f, 0x6d,
+  0x63, 0xc9, 0x85, 0xd9, 0xad, 0x66, 0x45, 0xb9, 0x28, 0x02, 0x1b, 0x66,
+  0xd8, 0xd7, 0x5f, 0x11, 0x00, 0x2a, 0x65, 0xe5, 0xdc, 0xa2, 0x69, 0x66,
+  0x2d, 0xef, 0x24, 0xbb, 0x08, 0x6c, 0x97, 0x0c, 0xf9, 0x8f, 0x24, 0x17,
+  0x38, 0xa5, 0xb0, 0x51, 0x0e, 0xc0, 0x1d, 0x49, 0xc9, 0x13, 0xf3, 0x47,
+  0x0a, 0x05, 0xc8, 0x55, 0x86, 0xb6, 0x82, 0x5d, 0xc1, 0x14, 0xba, 0xc3,
+  0x01, 0x39, 0x57, 0xb5, 0x27, 0x1f, 0x4f, 0x59, 0x9a, 0x62, 0x0d, 0x18,
+  0x21, 0x9c, 0xeb, 0x56, 0x05, 0x1c, 0x2e, 0xad, 0xb9, 0x2e, 0xae, 0x0e,
+  0x1b, 0x75, 0x43, 0x04, 0xb0, 0x56, 0xfd, 0x57, 0x6b, 0xf0, 0x12, 0xeb,
+  0x8b, 0xc0, 0xec, 0x01, 0x5f, 0xfc, 0x40, 0x3c, 0xa8, 0xd4, 0xf6, 0x54,
+  0x18, 0x5a, 0xdb, 0xee, 0x18, 0x88, 0x86, 0xb8, 0x69, 0x78, 0x27, 0xed,
+  0xfd, 0xa6, 0x30, 0xcd, 0x18, 0xb6, 0x9b, 0xc5, 0x51, 0xa8, 0x28, 0x1a,
+  0x47, 0x77, 0xc4, 0xc2, 0x21, 0x5b, 0x06, 0x02, 0x85, 0xaa, 0x4a, 0x0d,
+  0xbf, 0xfc, 0xeb, 0xf2, 0xb2, 0x17, 0x8e, 0x9b, 0x7b, 0xab, 0x19, 0x5b,
+  0x21, 0x6c, 0xe6, 0x08, 0x3a, 0x1c, 0xbe, 0x4e, 0x64, 0x3e, 0x5f, 0x7c,
+  0xd9, 0x1a, 0x50, 0x1b, 0x1c, 0xf9, 0xfd, 0x3b, 0x04, 0xbc, 0x69, 0x7a,
+  0x99, 0xf7, 0x6e, 0x02, 0xef, 0x02, 0x7a, 0xdf, 0xd8, 0x9a, 0x92, 0xfa,
+  0xaa, 0xcc, 0xe4, 0xe4, 0x0a, 0x58, 0xc0, 0x8e, 0x6f, 0x68, 0x2a, 0x41,
+  0xd4, 0xc1, 0xde, 0x3f, 0x65, 0xc8, 0xf4, 0xff, 0x2c, 0xaf, 0x0a, 0xfa,
+  0x07, 0x0d, 0x4f, 0xa3, 0x7f, 0xb1, 0xb7, 0x17, 0x9d, 0xf5, 0xfa, 0x03,
+  0xc3, 0x54, 0x49, 0x08, 0x49, 0x81, 0x80, 0xc7, 0xd3, 0x5a, 0x06, 0xff,
+  0x08, 0x65, 0xd0, 0x11, 0x3f, 0x64, 0x0a, 0xf6, 0x0a, 0xc4, 0x4a, 0xef,
+  0x65, 0xce, 0xbe, 0x8e, 0x32, 0xc3, 0xdc, 0x4a, 0x06, 0x80, 0xa1, 0x45,
+  0x72, 0x27, 0xfa, 0x17, 0xbe, 0x41, 0x99, 0x00, 0x77, 0x5f, 0xbc, 0xb8,
+  0x5a, 0x5d, 0x66, 0xe0, 0x97, 0xcd, 0x6d, 0xb3, 0xf1, 0xa0, 0x55, 0xab,
+  0x6f, 0x82, 0xd3, 0xba, 0x1a, 0x2f, 0xa5, 0x1d, 0xd5, 0x6a, 0x2d, 0xc5,
+  0x81, 0x03, 0x2b, 0x48, 0xb5, 0xb7, 0xa9, 0x0e, 0xdd, 0x42, 0x51, 0x56,
+  0x42, 0x07, 0xbc, 0x69, 0x02, 0x64, 0xe4, 0xa0, 0x53, 0xd6, 0xac, 0xe0,
+  0x26, 0x9b, 0x7c, 0xf1, 0x25, 0xf9, 0xb3, 0x6e, 0xd1, 0x5f, 0x86, 0xb5,
+  0x59, 0xda, 0xb8, 0x1d, 0xb4, 0x9b, 0x49, 0xbc, 0x45, 0x74, 0x07, 0x29,
+  0xab, 0xfe, 0x61, 0xbd, 0xc2, 0x55, 0x6f, 0xc8, 0x8b, 0xb2, 0x5c, 0x3b,
+  0x22, 0xed, 0x0a, 0x77, 0x30, 0xc4, 0xbe, 0x78, 0xc9, 0xec, 0x9c, 0xe2,
+  0xed, 0xca, 0xf2, 0x99, 0x24, 0x9c, 0x80, 0xe1, 0xbb, 0x10, 0x03, 0x49,
+  0x41, 0xbc, 0x95, 0x6d, 0x73, 0x95, 0x34, 0x5f, 0x0c, 0xb4, 0xae, 0x33,
+  0xd2, 0x51, 0xcc, 0xad, 0x81, 0xaf, 0x21, 0xa8, 0x82, 0xfe, 0xfa, 0x47,
+  0xfb, 0x3a, 0xfd, 0xc7, 0xdc, 0x62, 0x74, 0x6c, 0x58, 0xb3, 0x9a, 0xe3,
+  0x0b, 0xfb, 0xc5, 0x1d, 0xa4, 0x1f, 0xd8, 0x30, 0xeb, 0xe6, 0x80, 0xf5,
+  0xeb, 0x3f, 0x6e, 0xb6, 0xe2, 0x54, 0x88, 0x21, 0x71, 0x90, 0x6a, 0x56,
+  0x06, 0xea, 0x2c, 0xe5, 0xe2, 0x4b, 0x94, 0x89, 0x66, 0xdf, 0x33, 0x71,
+  0xd2, 0xb6, 0x13, 0x9d, 0xfb, 0x8f, 0x1b, 0x76, 0xf6, 0x3f, 0x6e, 0xb8,
+  0xf9, 0xff, 0xb8, 0xe1, 0x56, 0xf0, 0xe3, 0xc6, 0x06, 0xf7, 0x57, 0x0e,
+  0x0d, 0xe1, 0x9f, 0x7b, 0xe8, 0x9b, 0xfc, 0x51, 0xf7, 0x4d, 0xef, 0x93,
+  0xde, 0x17, 0x37, 0x36, 0xd7, 0x6d, 0x9a, 0x4b, 0x0d, 0xc8, 0x2f, 0x3c,
+  0x00, 0x62, 0xde, 0x40, 0x52, 0xaf, 0x64, 0x93, 0x74, 0x97, 0xdc, 0xae,
+  0x20, 0xa2, 0x75, 0x17, 0x00, 0x76, 0xb9, 0x27, 0x68, 0xcb, 0x5d, 0xf3,
+  0x42, 0xaf, 0x29, 0x8f, 0x45, 0x39, 0xb6, 0x01, 0x43, 0xc0, 0x5b, 0xce,
+  0x42, 0x39, 0x64, 0x5f, 0x0f, 0xe4, 0xce, 0x7f, 0x37, 0x5f, 0xb0, 0x79,
+  0xd7, 0xd2, 0x4f, 0x84, 0x51, 0x07, 0xb4, 0x5c, 0xa6, 0xe0, 0x7c, 0x15,
+  0xa9, 0x83, 0x26, 0xdc, 0xc2, 0xbc, 0x71, 0xbd, 0x23, 0x03, 0x96, 0xbb,
+  0xc8, 0xd1, 0xca, 0xd2, 0x2c, 0x6b, 0xce, 0x86, 0xe9, 0x0e, 0x49, 0x03,
+  0x54, 0x3e, 0xa0, 0xc3, 0x64, 0x0d, 0xd3, 0x5c, 0x6c, 0xd6, 0x56, 0x10,
+  0xb2, 0x8f, 0x32, 0x88, 0x30, 0x36, 0x69, 0xd0, 0xaa, 0xfe, 0x62, 0xa3,
+  0xa2, 0xd6, 0xe0, 0xc9, 0x65, 0x65, 0xf4, 0xd7, 0x3f, 0x12, 0x6d, 0xad,
+  0xcc, 0x69, 0xb9, 0x8b, 0x7a, 0x3b, 0x5c, 0xdc, 0x99, 0xc9, 0x6f, 0xfe,
+  0x1c, 0xca, 0xb0, 0x2c, 0x6d, 0x36, 0xd3, 0xbc, 0x86, 0x4e, 0x82, 0x9a,
+  0xdc, 0x5a, 0x1c, 0x9d, 0xde, 0x49, 0x7d, 0xe6, 0x8b, 0x18, 0x0c, 0x6a,
+  0xb0, 0x10, 0x8f, 0xf3, 0xc2, 0x44, 0xfb, 0xe2, 0xf4, 0xdb, 0x3f, 0xea,
+  0x00, 0x3f, 0x6e, 0xfc, 0x30, 0xe4, 0x9f, 0x02, 0x00, 0xe2, 0x20, 0x39,
+  0xfd, 0x96, 0x88, 0xfb, 0xe7, 0x31, 0xb0, 0x75, 0x1f, 0xf8, 0x92, 0xff,
+  0x02, 0xca, 0x5e, 0x37, 0xec, 0xb9, 0x97, 0x26, 0xf7, 0x45, 0x42, 0x2d,
+  0xee, 0x51, 0x64, 0x8a, 0x8c, 0xd1, 0xe5, 0x92, 0x4a, 0x47, 0x15, 0xf2,
+  0xa0, 0x61, 0xc8, 0x03, 0xe8, 0x95, 0x93, 0x12, 0xbe, 0x82, 0x26, 0xec,
+  0x9d, 0x00, 0xec, 0xf6, 0xbf, 0x09, 0x7d, 0x11, 0x49, 0xdd, 0x89, 0x0e,
+  0xdc, 0xce, 0x31, 0xd3, 0x7c, 0x13, 0xb5, 0x2e, 0xcc, 0x7d, 0x38, 0x8a,
+  0x34, 0xc9, 0x71, 0x68, 0x75, 0xfc, 0x37, 0xe8, 0x63, 0x00, 0xe5, 0x23,
+  0xd3, 0x8a, 0x1a, 0x6e, 0x72, 0x86, 0xd8, 0x82, 0x9b, 0xee, 0xc2, 0xdf,
+  0x8d, 0xa8, 0x92, 0xa1, 0x97, 0x48, 0x08, 0x40, 0xa2, 0x92, 0x52, 0x86,
+  0x74, 0x51, 0xce, 0x67, 0x12, 0x8d, 0x30, 0x94, 0xcf, 0x27, 0x6c, 0xdb,
+  0xac, 0x1a, 0x55, 0x83, 0x36, 0x42, 0x22, 0x14, 0xf2, 0xd9, 0x18, 0x52,
+  0x80, 0x84, 0x11, 0x25, 0xbd, 0x8f, 0xfb, 0x0f, 0x48, 0xe2, 0x09, 0x48,
+  0xdf, 0x4c, 0x64, 0x31, 0xc9, 0xe0, 0x75, 0xd2, 0xa2, 0xfc, 0xa1, 0xf8,
+  0x85, 0x23, 0x9e, 0x9b, 0xee, 0xb5, 0x41, 0x2a, 0x9b, 0x54, 0xe5, 0x13,
+  0x2c, 0xe0, 0x37, 0x70, 0xa9, 0xe6, 0x0a, 0x39, 0x23, 0x7d, 0xcf, 0x90,
+  0x8b, 0x90, 0xc6, 0x17, 0x6b, 0x73, 0x66, 0x68, 0x87, 0xc2, 0xdb, 0x96,
+  0xfc, 0x4e, 0x3c, 0xc8, 0x5e, 0x6a, 0x0d, 0x56, 0x2f, 0xe7, 0x35, 0x0a,
+  0x5e, 0xf8, 0x41, 0x52, 0x42, 0x87, 0x7b, 0x07, 0x5e, 0x17, 0x3b, 0xfe,
+  0x59, 0x7c, 0x78, 0x1f, 0xd5, 0x4b, 0x66, 0x95, 0xd7, 0xb2, 0xfd, 0x6b,
+  0xc6, 0xdf, 0xb7, 0xe3, 0x7f, 0x16, 0x01, 0xd2, 0x62, 0xa8, 0xab, 0xf8,
+  0x67, 0xcf, 0xfd, 0x24, 0x70, 0x75, 0x9f, 0x3a, 0x27, 0x46, 0xcb, 0x7d,
+  0x20, 0x99, 0x7e, 0x0c, 0xb3, 0xc5, 0x08, 0x3a, 0x11, 0xab, 0x7f, 0xc6,
+  0x19, 0x42, 0xbc, 0x0e, 0xb3, 0x8d, 0x5d, 0xd3, 0x10, 0x1c, 0x59, 0xe8,
+  0xaa, 0x5c, 0x10, 0x42, 0xf7, 0xec, 0xc0, 0xb5, 0x44, 0x66, 0x50, 0xa0,
+  0xdc, 0x2f, 0xad, 0x72, 0x20, 0x0a, 0x61, 0x51, 0x7b, 0x0b, 0x00, 0x3f,
+  0xf8, 0x14, 0xb8, 0xb1, 0x80, 0xf3, 0x7b, 0x3d, 0x7b, 0x37, 0xb7, 0x36,
+  0xc5, 0xa1, 0x42, 0x1f, 0x4b, 0x11, 0xa6, 0x10, 0x07, 0x72, 0x4a, 0xc8,
+  0x0f, 0xbc, 0xfc, 0x61, 0x44, 0xeb, 0x38, 0x90, 0xec, 0x06, 0xb9, 0x13,
+  0x8c, 0xfc, 0x86, 0x44, 0x16, 0x35, 0x97, 0x19, 0xa5, 0xb1, 0x85, 0xf6,
+  0x16, 0x1a, 0xc7, 0xde, 0xfe, 0xca, 0x60, 0x6c, 0x93, 0x22, 0x5b, 0x5d,
+  0x6e, 0xc4, 0xe6, 0x17, 0xdb, 0x9b, 0x76, 0x69, 0xfd, 0xe6, 0x50, 0x1b,
+  0x08, 0x4e, 0x43, 0x8f, 0x36, 0x67, 0x86, 0x7d, 0x6e, 0x0b, 0xca, 0x78,
+  0x48, 0xb2, 0x21, 0x0e, 0x33, 0x0e, 0x89, 0xca, 0x78, 0x1d, 0x8c, 0xf2,
+  0x93, 0x17, 0xb8, 0x9b, 0x0c, 0xde, 0xc5, 0x24, 0x9e, 0xce, 0x1b, 0x2a,
+  0xd4, 0x42, 0x29, 0x1d, 0xc3, 0xb7, 0xd6, 0x07, 0x9e, 0x36, 0x1e, 0xb9,
+  0x9e, 0x14, 0xc3, 0x41, 0x93, 0x1d, 0xf1, 0x83, 0x78, 0x9e, 0x8c, 0x75,
+  0xaa, 0xf7, 0xe6, 0x17, 0x5b, 0x2c, 0xaf, 0x9c, 0x1f, 0xcd, 0xfb, 0xf6,
+  0x66, 0xf2, 0x63, 0x1c, 0xd5, 0x20, 0xe1, 0x77, 0x3d, 0xfb, 0x40, 0x68,
+  0xf6, 0xbe, 0x37, 0x92, 0x17, 0x93, 0x72, 0x76, 0xf7, 0x27, 0x44, 0x9c,
+  0xe4, 0x95, 0x17, 0x3b, 0xf8, 0x51, 0x47, 0x65, 0xee, 0x1b, 0x08, 0xa3,
+  0x98, 0xa3, 0xc2, 0x9f, 0x5f, 0xd2, 0xe3, 0x6a, 0x31, 0x6c, 0x26, 0xa3,
+  0x91, 0x61, 0x44, 0xf5, 0x02, 0xed, 0x1a, 0xd7, 0x08, 0x16, 0x00, 0x98,
+  0x6a, 0xa7, 0x2e, 0x41, 0xa0, 0x82, 0x3f, 0x47, 0x6d, 0x6b, 0x76, 0x3c,
+  0xf2, 0xaf, 0xaa, 0x2f, 0xcc, 0x98, 0x87, 0x36, 0x45, 0x32, 0xc9, 0x22,
+  0x3d, 0x14, 0xe8, 0x12, 0x33, 0x43, 0xf4, 0x00, 0x41, 0x3e, 0x9f, 0xe4,
+  0x82, 0x6d, 0x3a, 0x2b, 0x5b, 0xb8, 0xcc, 0x0c, 0xd2, 0x63, 0xc4, 0x7b,
+  0x1c, 0xfa, 0x12, 0x39, 0x87, 0x14, 0x1b, 0xc2, 0xef, 0xad, 0x01, 0x23,
+  0x73, 0x1b, 0x1e, 0x09, 0xd0, 0xa2, 0xf0, 0x97, 0x41, 0xf2, 0x6c, 0x92,
+  0x37, 0x0e, 0x17, 0x2e, 0xc8, 0xde, 0x60, 0x4b, 0xbf, 0x4e, 0x3e, 0x1f,
+  0xd2, 0x73, 0x5e, 0x37, 0x71, 0xa1, 0xfb, 0x76, 0xe6, 0xc6, 0x40, 0xf4,
+  0xc2, 0x21, 0xd2, 0x52, 0x23, 0xe5, 0x98, 0xb4, 0xb2, 0x49, 0x5a, 0x67,
+  0x4f, 0x1f, 0xf3, 0x27, 0x79, 0x93, 0x6a, 0xbd, 0xf6, 0xce, 0xf3, 0xea,
+  0xb2, 0xd8, 0x5a, 0x0b, 0xea, 0x5e, 0x04, 0xa0, 0x4a, 0x90, 0x72, 0x46,
+  0xcd, 0x21, 0xb9, 0x04, 0x83, 0xa4, 0xa9, 0x51, 0x24, 0x2f, 0x1b, 0xd4,
+  0x93, 0x3e, 0x7b, 0xea, 0x4d, 0x7a, 0x74, 0x8f, 0x85, 0xde, 0x65, 0xa4,
+  0xb2, 0xc6, 0xee, 0x9a, 0x2c, 0xc5, 0x06, 0xf7, 0x92, 0x7c, 0x1c, 0x8c,
+  0x24, 0x29, 0x8b, 0xb4, 0x5e, 0xc5, 0xfb, 0xae, 0x91, 0x7f, 0x09, 0xfe,
+  0xa8, 0xa4, 0xd3, 0xfd, 0xf0, 0x5a, 0xa2, 0xf6, 0x4c, 0x24, 0x7d, 0x9f,
+  0x27, 0xc1, 0x84, 0x7d, 0x3f, 0x5d, 0x53, 0xf0, 0xe0, 0x62, 0x55, 0x41,
+  0xfa, 0xc8, 0x63, 0xac, 0x24, 0x68, 0x95, 0xaa, 0xe8, 0xe9, 0x6f, 0x0e,
+  0xdf, 0xbe, 0x3f, 0x3c, 0x79, 0x78, 0xd7, 0xb8, 0x56, 0x23, 0xd2, 0xb5,
+  0xaf, 0x79, 0xb0, 0x14, 0x1d, 0xe0, 0xb6, 0xe3, 0x41, 0x0f, 0x90, 0x4d,
+  0x10, 0x6d, 0x20, 0x60, 0x9b, 0x6e, 0xae, 0x36, 0x95, 0x0c, 0x13, 0x69,
+  0x51, 0x6a, 0x48, 0x1c, 0xd3, 0x8d, 0x8b, 0x3c, 0x24, 0x2e, 0xee, 0x65,
+  0xed, 0xa7, 0xb5, 0xf4, 0xec, 0xdd, 0xd0, 0xf7, 0xe9, 0xf5, 0x0d, 0x29,
+  0x1d, 0xb2, 0x28, 0x21, 0x11, 0x2a, 0xb7, 0xa8, 0x26, 0x36, 0xe3, 0x6a,
+  0xc9, 0x00, 0xdb, 0x33, 0x11, 0x66, 0x2d, 0xa7, 0x5b, 0x79, 0x71, 0xe1,
+  0x15, 0x4f, 0x74, 0x23, 0x7b, 0x2f, 0x5f, 0xf6, 0x03, 0x2e, 0x7c, 0x4a,
+  0xf8, 0xeb, 0x4e, 0x3d, 0x12, 0xb6, 0xd1, 0x71, 0xf7, 0x61, 0x53, 0x32,
+  0x1a, 0xc9, 0x0b, 0x99, 0x5b, 0x7c, 0x57, 0x19, 0x7a, 0xcc, 0x83, 0x8e,
+  0x51, 0x25, 0x17, 0x0d, 0xc9, 0xc7, 0x47, 0xef, 0xb0, 0x5d, 0x67, 0x87,
+  0xe3, 0xb1, 0xc5, 0x02, 0x91, 0x0c, 0x9f, 0xc0, 0x18, 0x43, 0xb0, 0xcf,
+  0xeb, 0x8a, 0x35, 0x72, 0xb9, 0x61, 0x92, 0xcb, 0xaf, 0x9c, 0xe3, 0x7c,
+  0xb5, 0x30, 0xf7, 0xc5, 0x28, 0xbc, 0x33, 0x8a, 0x0f, 0x73, 0x04, 0xb6,
+  0x4b, 0x78, 0xc4, 0xb9, 0x54, 0x91, 0xc2, 0x61, 0x83, 0xfe, 0x50, 0xf0,
+  0x33, 0xd6, 0x52, 0x96, 0x54, 0xa3, 0xd6, 0x1e, 0x68, 0xf9, 0x20, 0xea,
+  0xfb, 0xd9, 0x18, 0x1f, 0x9f, 0x1f, 0x25, 0x87, 0xef, 0xcf, 0xbf, 0xd9,
+  0xe0, 0x0d, 0xee, 0xe2, 0x1f, 0xc1, 0x53, 0x4f, 0x0d, 0xc0, 0x25, 0x6d,
+  0xda, 0x16, 0x53, 0x73, 0xe9, 0x62, 0x44, 0x53, 0xf2, 0xbe, 0x39, 0x5a,
+  0x73, 0x4a, 0x4f, 0x46, 0x4f, 0xba, 0xa7, 0xd4, 0xdf, 0xce, 0x00, 0x88,
+  0xf4, 0x80, 0xb4, 0xdf, 0xd6, 0xbd, 0x13, 0x8a, 0x17, 0xa4, 0x7b, 0x4a,
+  0x9c, 0xda, 0x71, 0xfd, 0xb5, 0x24, 0xad, 0x19, 0x76, 0x7f, 0x04, 0x0e,
+  0xd5, 0x62, 0xc3, 0xda, 0x68, 0x38, 0xa0, 0xfd, 0x2d, 0x7c, 0x9c, 0x38,
+  0x79, 0x39, 0x0e, 0x6a, 0x4e, 0x2c, 0xad, 0x66, 0x16, 0x13, 0x20, 0xa2,
+  0x1f, 0x6a, 0x8a, 0x1f, 0x25, 0x99, 0x1b, 0x12, 0x18, 0x3d, 0x2c, 0xa1,
+  0xcc, 0xe5, 0xf1, 0xc5, 0x9b, 0x2d, 0xc0, 0x79, 0x8e, 0x2e, 0x5e, 0x16,
+  0xe6, 0x7f, 0x6d, 0xd6, 0x63, 0x1c, 0xd0, 0x9f, 0xf6, 0x55, 0x12, 0x45,
+  0x5e, 0xf0, 0x9f, 0x71, 0x7a, 0x27, 0x91, 0x5b, 0x95, 0x73, 0xf6, 0x20,
+  0xca, 0x0b, 0x9c, 0xbc, 0xc9, 0xb5, 0x8e, 0xb6, 0x06, 0x2f, 0x45, 0xf4,
+  0x13, 0xe6, 0x09, 0xb7, 0x99, 0x09, 0xdb, 0x32, 0x6e, 0x8d, 0xb7, 0x13,
+  0xeb, 0x6a, 0x3d, 0x47, 0x2c, 0x11, 0xe3, 0x45, 0x8a, 0x58, 0x03, 0xa4,
+  0xe1, 0x20, 0x52, 0x41, 0xe4, 0xec, 0x6e, 0x6f, 0x68, 0x31, 0x81, 0x51,
+  0x4f, 0x6f, 0x66, 0x3d, 0xe0, 0xa3, 0xb4, 0x04, 0xe4, 0x8e, 0xd9, 0x52,
+  0x84, 0x97, 0xdf, 0xbf, 0xf2, 0x3a, 0xb1, 0x69, 0x72, 0x5a, 0xc2, 0xc4,
+  0x22, 0xb9, 0xe4, 0x7d, 0x78, 0xc1, 0x1e, 0xee, 0x29, 0x9a, 0x9f, 0x52,
+  0x34, 0x75, 0x96, 0x65, 0x4b, 0xdb, 0xfb, 0x22, 0x47, 0x8d, 0x25, 0x92,
+  0x73, 0xcc, 0x3d, 0xe5, 0xbe, 0x23, 0x8b, 0xd0, 0xb3, 0x64, 0xb5, 0x1e,
+  0xe6, 0x1c, 0x0e, 0x94, 0x8a, 0x3a, 0x4b, 0x52, 0xec, 0x76, 0xef, 0xd9,
+  0xa3, 0xcf, 0x8d, 0x60, 0xbe, 0x43, 0xf2, 0x77, 0x0b, 0xa4, 0x9e, 0xc1,
+  0xdd, 0xfb, 0x81, 0x5b, 0xc5, 0xaa, 0xd1, 0x94, 0x5e, 0x01, 0xd3, 0x49,
+  0x6a, 0x32, 0x23, 0xe0, 0xa0, 0x12, 0x68, 0x8b, 0x10, 0x89, 0xcc, 0x6c,
+  0xa2, 0x7a, 0x7b, 0xb0, 0x63, 0x94, 0x4b, 0x88, 0xdd, 0xe2, 0xcc, 0xb0,
+  0x91, 0x47, 0xc3, 0x46, 0xb9, 0xa3, 0x5e, 0x9b, 0x83, 0xe4, 0xdd, 0xd1,
+  0xf9, 0xbb, 0x41, 0x32, 0x3e, 0x3f, 0x7d, 0xd7, 0x03, 0xb5, 0xdb, 0x30,
+  0x48, 0x13, 0xed, 0x99, 0xa6, 0xa9, 0xf0, 0xad, 0x6c, 0xc1, 0x70, 0x22,
+  0x03, 0x9a, 0x19, 0x4f, 0x1d, 0x45, 0x6e, 0xf4, 0x00, 0x1c, 0xbd, 0xdd,
+  0x02, 0xd9, 0x18, 0xf9, 0xb0, 0x76, 0x61, 0x7c, 0xec, 0x0f, 0xa0, 0x10,
+  0xa2, 0x45, 0x5a, 0xae, 0x65, 0xf3, 0x98, 0xad, 0xb1, 0xd8, 0xc8, 0xf5,
+  0xef, 0xda, 0x9c, 0x68, 0x49, 0x48, 0x0f, 0x3c, 0x2d, 0xa7, 0xe4, 0xd6,
+  0x2e, 0x65, 0xd8, 0x90, 0xdc, 0x86, 0xa2, 0xc0, 0x6c, 0x98, 0xeb, 0x06,
+  0xef, 0xb1, 0x03, 0x5c, 0xbb, 0x87, 0x7e, 0x8d, 0x2e, 0xb4, 0x3d, 0xf2,
+  0x12, 0x78, 0x92, 0xba, 0x5c, 0x64, 0xec, 0xe6, 0x87, 0x23, 0x48, 0xf9,
+  0x13, 0xb7, 0xf8, 0x05, 0xd2, 0x78, 0x0c, 0x0d, 0xc9, 0x62, 0x42, 0xd2,
+  0x29, 0x6f, 0x5a, 0x38, 0x19, 0xad, 0x43, 0xe0, 0x73, 0xc9, 0x8c, 0x99,
+  0xda, 0x00, 0x6c, 0x73, 0x53, 0x67, 0xe5, 0x81, 0x45, 0xb6, 0x99, 0xf7,
+  0x5e, 0x97, 0xc9, 0x10, 0x24, 0x4f, 0x94, 0xb3, 0x50, 0x82, 0x4a, 0x0b,
+  0x08, 0x48, 0x6b, 0xa0, 0xa0, 0x4a, 0xf8, 0xdd, 0xa5, 0xcf, 0xe4, 0x29,
+  0x8d, 0x84, 0x07, 0xac, 0x00, 0x6c, 0x60, 0xee, 0xca, 0x79, 0xf5, 0xcc,
+  0x39, 0x42, 0xb3, 0xea, 0x72, 0xdd, 0x0e, 0xbe, 0x4d, 0xd7, 0x81, 0x27,
+  0x6a, 0x5b, 0xe2, 0x3a, 0xf6, 0x75, 0xb0, 0x5a, 0xd6, 0xb6, 0x85, 0xbc,
+  0x57, 0x79, 0x91, 0x06, 0xf0, 0xe2, 0xbb, 0x44, 0x4a, 0x30, 0xc0, 0xfe,
+  0xe2, 0xf8, 0x69, 0x49, 0xf2, 0xbe, 0x60, 0x58, 0x21, 0xf6, 0x24, 0x15,
+  0x48, 0x7c, 0x98, 0xd9, 0x9d, 0x23, 0x44, 0x3d, 0x4a, 0xd8, 0x82, 0xdc,
+  0x9a, 0x95, 0x50, 0xe8, 0x69, 0xd1, 0x21, 0x8a, 0x2b, 0x9c, 0xc8, 0xc8,
+  0x23, 0x50, 0x49, 0x23, 0x83, 0x49, 0xf8, 0x8a, 0x8b, 0xbb, 0x3a, 0x2b,
+  0x05, 0xc6, 0x4f, 0xb0, 0xd0, 0x33, 0xff, 0xd8, 0x98, 0xa3, 0xc1, 0xfe,
+  0x71, 0x8c, 0xa0, 0x61, 0xa8, 0x9d, 0x16, 0x62, 0x92, 0xac, 0x36, 0x9a,
+  0x23, 0x5e, 0x08, 0x9e, 0xd1, 0xaa, 0x98, 0x53, 0x7a, 0x78, 0x1b, 0x28,
+  0x48, 0x77, 0x72, 0xb4, 0x06, 0x80, 0xd2, 0xc7, 0x15, 0x6a, 0x91, 0x64,
+  0x1b, 0xad, 0xa5, 0xbd, 0xba, 0x5e, 0xdc, 0x07, 0x56, 0x28, 0xde, 0xd1,
+  0xc1, 0xd5, 0x59, 0xdd, 0x29, 0x16, 0xcf, 0x8b, 0x9c, 0xa0, 0xe4, 0xca,
+  0x6a, 0x87, 0xca, 0x14, 0x09, 0x87, 0x35, 0x31, 0x12, 0x52, 0x33, 0x51,
+  0x23, 0x0e, 0x0e, 0xd5, 0xe5, 0xc0, 0x40, 0xcc, 0xd0, 0xa3, 0x48, 0x6d,
+  0xa0, 0xa0, 0xec, 0x5b, 0x4c, 0x2d, 0xec, 0xed, 0x28, 0x89, 0xb5, 0x0b,
+  0x95, 0x5c, 0x10, 0xe4, 0x3a, 0xb6, 0x35, 0x32, 0xed, 0x5d, 0xad, 0xdd,
+  0xa7, 0x70, 0xb0, 0xd0, 0xf8, 0x36, 0xeb, 0xde, 0x4a, 0x6e, 0x6d, 0xfc,
+  0x05, 0x35, 0xdf, 0xec, 0x8a, 0x64, 0x85, 0xb4, 0xef, 0x26, 0x2c, 0x87,
+  0xf6, 0xc7, 0xea, 0xac, 0x59, 0x2d, 0x43, 0x39, 0x7f, 0x7c, 0xe6, 0x86,
+  0x14, 0xfc, 0x76, 0xda, 0x6a, 0x89, 0x8a, 0x7a, 0x93, 0x24, 0x58, 0x1d,
+  0x7b, 0x00, 0x4e, 0xf4, 0x77, 0x6f, 0x23, 0x14, 0x81, 0x40, 0xba, 0xf7,
+  0xe1, 0xc0, 0xa8, 0x78, 0xa1, 0x06, 0xf2, 0x1b, 0x46, 0xbb, 0xd8, 0x45,
+  0x07, 0x67, 0x6d, 0xd8, 0x23, 0xf5, 0x4e, 0xfa, 0xae, 0xd9, 0x94, 0xd6,
+  0x6c, 0xc3, 0x3b, 0xa3, 0x75, 0x28, 0x52, 0xb2, 0x4e, 0xe7, 0xb3, 0xf5,
+  0x9e, 0xfa, 0x32, 0xd1, 0x1d, 0xde, 0xfe, 0x2c, 0x5c, 0xba, 0x8c, 0xb5,
+  0x6e, 0x56, 0x7b, 0xcf, 0xf7, 0x47, 0x7b, 0x4f, 0x3f, 0x1f, 0xed, 0xa1,
+  0xd3, 0xb9, 0x37, 0x3b, 0xd7, 0x91, 0xdb, 0x1b, 0x28, 0xd2, 0xef, 0x3d,
+  0xe9, 0x87, 0x68, 0xe7, 0x2f, 0x2c, 0xee, 0x46, 0xf4, 0xdc, 0x88, 0xbb,
+  0xae, 0x05, 0xdf, 0x58, 0x18, 0xb5, 0x26, 0x2f, 0x82, 0x38, 0xc8, 0xd0,
+  0x65, 0x13, 0xa9, 0xb8, 0x5f, 0xe6, 0x44, 0x47, 0x0a, 0x9c, 0xec, 0x66,
+  0x65, 0x5b, 0xc6, 0x6a, 0x07, 0x2c, 0xba, 0x9d, 0xf1, 0x19, 0x29, 0x53,
+  0x9f, 0x8a, 0x1e, 0xe9, 0xf8, 0xba, 0xfd, 0xfe, 0xbf, 0x60, 0xf3, 0x29,
+  0x8f, 0x7c, 0x95, 0x3b, 0xef, 0x05, 0x7b, 0xa6, 0xd4, 0x26, 0x81, 0xcf,
+  0x1d, 0x18, 0x7f, 0x5d, 0x98, 0x38, 0x41, 0xfd, 0x62, 0xf6, 0xd7, 0x01,
+  0x5a, 0xf3, 0x84, 0xcc, 0x91, 0x07, 0xeb, 0xe8, 0x27, 0x21, 0x61, 0x4c,
+  0x4d, 0x41, 0xea, 0x22, 0xf9, 0xc9, 0x6b, 0x10, 0x58, 0xcc, 0xa1, 0x75,
+  0x38, 0x7a, 0xed, 0x0f, 0x7f, 0x70, 0x1c, 0x69, 0x8c, 0xe4, 0x17, 0xee,
+  0xce, 0xf4, 0x64, 0xc0, 0x78, 0xcb, 0x08, 0x78, 0x71, 0xa3, 0x97, 0x8d,
+  0x83, 0xbf, 0xc0, 0x37, 0xfc, 0xd3, 0xf0, 0x2f, 0xe6, 0x9f, 0x3f, 0x6d,
+  0xe8, 0xad, 0x66, 0x64, 0x46, 0x2d, 0x13, 0x71, 0xe0, 0xb7, 0x38, 0x9e,
+  0x41, 0xbb, 0x6b, 0x39, 0xb4, 0x82, 0xf3, 0x97, 0x67, 0x7c, 0x11, 0x2b,
+  0x8e, 0x79, 0x63, 0x9d, 0xc4, 0x88, 0xa0, 0xd6, 0x13, 0x07, 0x67, 0xa4,
+  0x67, 0xa6, 0x13, 0xbb, 0x97, 0xde, 0x3b, 0x03, 0x97, 0xd2, 0x70, 0xc3,
+  0x1c, 0x20, 0x35, 0xea, 0xed, 0x25, 0xf9, 0x57, 0x18, 0x90, 0x64, 0x44,
+  0xd5, 0x86, 0xac, 0x4b, 0x4b, 0x47, 0x79, 0x02, 0x75, 0x34, 0x44, 0x62,
+  0xaf, 0xc3, 0x8d, 0x99, 0xd3, 0x40, 0xe0, 0xcc, 0xb9, 0x24, 0xa2, 0x51,
+  0x18, 0xdd, 0x82, 0xec, 0x14, 0xc5, 0x73, 0xaf, 0xf2, 0xfa, 0x23, 0x2d,
+  0x4e, 0xaa, 0x7b, 0xbc, 0x0c, 0x21, 0xcc, 0xe7, 0x33, 0xab, 0xf5, 0xdd,
+  0x29, 0x62, 0x99, 0x2d, 0xdb, 0xf6, 0x76, 0xd6, 0x49, 0x07, 0x3d, 0x73,
+  0x45, 0xb6, 0x89, 0x82, 0x2e, 0xca, 0x63, 0x55, 0x16, 0xc7, 0x02, 0xed,
+  0xa4, 0xa9, 0x49, 0x2d, 0xe5, 0x99, 0x51, 0x74, 0x2d, 0x75, 0x78, 0xc8,
+  0x7c, 0xc9, 0x16, 0xfd, 0x80, 0xa4, 0xdf, 0x76, 0x57, 0x6a, 0x51, 0xcb,
+  0xb1, 0x34, 0xf7, 0xfd, 0x32, 0x28, 0xa5, 0xce, 0x49, 0x2b, 0x98, 0x55,
+  0x66, 0x0e, 0xdc, 0x75, 0x00, 0xc0, 0x2c, 0x8a, 0x00, 0x44, 0x81, 0x5e,
+  0xd5, 0xe8, 0x3e, 0x8b, 0xda, 0x0a, 0x92, 0x97, 0xec, 0xd4, 0x51, 0xd4,
+  0xd0, 0xb3, 0x2b, 0xb6, 0xc6, 0xc6, 0xd3, 0x9f, 0x60, 0xd8, 0x54, 0x97,
+  0x73, 0x53, 0x90, 0x6b, 0xa9, 0x0e, 0x0d, 0x1a, 0x4c, 0x7e, 0x11, 0xc3,
+  0x5c, 0xf7, 0x84, 0xea, 0xfe, 0x6e, 0xe8, 0x4a, 0xa9, 0x3f, 0xe6, 0xbc,
+  0xc9, 0xc3, 0x7c, 0x79, 0x3f, 0x98, 0x2a, 0x1d, 0x9b, 0xe2, 0xc8, 0xb7,
+  0xf8, 0x8a, 0x95, 0x30, 0xf5, 0xea, 0xf2, 0x12, 0xa0, 0x48, 0x61, 0x46,
+  0x1e, 0xd7, 0x29, 0x4a, 0xc5, 0x80, 0x74, 0xa8, 0x31, 0xbc, 0x1c, 0x53,
+  0xd7, 0xed, 0x70, 0x15, 0x91, 0xc2, 0x71, 0x1c, 0xd4, 0x7f, 0x2f, 0x70,
+  0xc2, 0x28, 0x39, 0x96, 0xfb, 0xed, 0x14, 0x99, 0x2a, 0x1b, 0xea, 0x3c,
+  0xbb, 0x4c, 0x90, 0x2c, 0xb0, 0x34, 0xc8, 0x7c, 0xb5, 0x0c, 0xb1, 0x5e,
+  0xc3, 0xfb, 0x7a, 0xf2, 0x5f, 0x85, 0x03, 0x92, 0x8f, 0xcd, 0x82, 0x1a,
+  0x52, 0x18, 0x89, 0x21, 0x5c, 0x19, 0x83, 0xb3, 0xb2, 0xa0, 0x86, 0x3e,
+  0x76, 0x51, 0x57, 0x6a, 0x5e, 0x60, 0x37, 0xd6, 0xf9, 0x05, 0x1c, 0x1f,
+  0xf4, 0xb5, 0xa5, 0xc7, 0xa3, 0xfd, 0xe0, 0x60, 0xeb, 0xf9, 0x70, 0x3a,
+  0x9d, 0x0e, 0xa1, 0x07, 0xbc, 0x60, 0xf5, 0x64, 0x47, 0x94, 0x83, 0xb8,
+  0xe2, 0x34, 0xce, 0x64, 0xb7, 0x5f, 0xbe, 0x7c, 0x29, 0x7a, 0xcc, 0xf9,
+  0x55, 0x47, 0xa1, 0xb0, 0x70, 0x83, 0xa2, 0x4d, 0x45, 0x3b, 0x05, 0xd4,
+  0x57, 0xab, 0x86, 0x68, 0x95, 0x79, 0x86, 0x32, 0x5f, 0x5b, 0x1b, 0xdb,
+  0xc1, 0x84, 0x2e, 0xcd, 0x89, 0x0c, 0x5c, 0x4a, 0xa2, 0x19, 0x3c, 0x38,
+  0x9a, 0x25, 0x77, 0xb4, 0xc2, 0x8b, 0x32, 0x76, 0xb7, 0x05, 0x37, 0xcf,
+  0xd5, 0x07, 0x6e, 0xd4, 0x19, 0xd6, 0xb1, 0x34, 0x5e, 0x1d, 0x05, 0x9f,
+  0x4d, 0x73, 0xc9, 0xff, 0x4a, 0xe5, 0x5b, 0xdd, 0xb1, 0xef, 0x39, 0x0f,
+  0xd9, 0xea, 0xf6, 0x91, 0x3c, 0xed, 0x3d, 0x92, 0x38, 0x9f, 0x02, 0xe2,
+  0x01, 0xed, 0x7c, 0xb2, 0xf5, 0x12, 0x98, 0xd2, 0xd4, 0x83, 0x02, 0x77,
+  0xe2, 0xe5, 0x15, 0xe5, 0x70, 0xcd, 0xcd, 0x01, 0x99, 0x59, 0xd7, 0xe0,
+  0x02, 0xdc, 0x98, 0x77, 0x7c, 0xb2, 0x73, 0x7e, 0x32, 0x0e, 0x32, 0xdd,
+  0xef, 0xc8, 0x65, 0x0c, 0xd7, 0x70, 0xdb, 0xe1, 0xc9, 0x5b, 0x04, 0xb4,
+  0x7f, 0x91, 0x40, 0x96, 0xc2, 0xf9, 0x0b, 0x51, 0xb4, 0xab, 0x55, 0xa1,
+  0x45, 0x30, 0xce, 0x65, 0x5b, 0x64, 0x05, 0x40, 0x44, 0x48, 0x88, 0xe3,
+  0x0a, 0x20, 0x13, 0xb6, 0x4e, 0xde, 0x1e, 0x9e, 0x53, 0x5d, 0x4b, 0x23,
+  0x79, 0x1e, 0x17, 0xe5, 0x3c, 0xf4, 0x8c, 0xdf, 0x58, 0x4c, 0x1a, 0x44,
+  0x6d, 0xd2, 0xa9, 0xeb, 0x6e, 0xa5, 0x9a, 0x3a, 0x1f, 0x5f, 0xad, 0x94,
+  0xb7, 0x6e, 0xfb, 0xcd, 0x96, 0x8a, 0x74, 0xe8, 0xd2, 0x7c, 0xf7, 0x34,
+  0xf6, 0xa2, 0xa7, 0xc1, 0x1b, 0x10, 0x3d, 0x91, 0x77, 0xc2, 0xcb, 0x65,
+  0x9b, 0x2d, 0xe9, 0xc2, 0x77, 0x39, 0x2f, 0x2f, 0x73, 0x43, 0xdf, 0x02,
+  0xff, 0x2d, 0xc5, 0x25, 0x12, 0x85, 0x0a, 0xdc, 0xa4, 0xbc, 0x39, 0x54,
+  0x7b, 0xbd, 0x02, 0x04, 0x44, 0x0b, 0xc1, 0x9c, 0x2f, 0x09, 0x49, 0x0a,
+  0xbb, 0xa9, 0xd2, 0xd9, 0x44, 0x4b, 0x1f, 0xc3, 0xca, 0x42, 0xe2, 0x31,
+  0xf9, 0xd4, 0x18, 0x08, 0xd3, 0xbb, 0x11, 0xd7, 0x00, 0xd6, 0xed, 0xc4,
+  0xda, 0xbc, 0x05, 0x41, 0x6c, 0x1d, 0xa4, 0x14, 0xb5, 0x8f, 0x16, 0xff,
+  0xc8, 0x1a, 0xd7, 0xfa, 0xe1, 0x9f, 0xb6, 0x84, 0xc7, 0xd7, 0x64, 0x91,
+  0x5d, 0x06, 0x42, 0xd7, 0x61, 0x10, 0x0d, 0xba, 0xa0, 0xe4, 0xae, 0x05,
+  0x11, 0xb9, 0x86, 0xb8, 0x5f, 0x5d, 0xa7, 0x89, 0xf7, 0x6c, 0x10, 0x6d,
+  0xb0, 0x32, 0xe8, 0xf6, 0x2c, 0xa9, 0xc2, 0x4e, 0x05, 0x2d, 0x5c, 0x38,
+  0x0b, 0x3e, 0xd5, 0x19, 0xee, 0x6b, 0x23, 0xf5, 0x2d, 0x76, 0x4b, 0x07,
+  0x3e, 0xae, 0xd5, 0x2c, 0x87, 0xf3, 0x71, 0x28, 0x08, 0x75, 0x43, 0x6d,
+  0xba, 0x6f, 0xe2, 0x46, 0x0e, 0x6b, 0xb1, 0xe7, 0xae, 0xbd, 0x06, 0x5f,
+  0x0f, 0xd6, 0x01, 0x33, 0x9b, 0xa5, 0x4a, 0xc0, 0x63, 0x1a, 0xa0, 0xff,
+  0x8f, 0x4d, 0xd7, 0xee, 0x6d, 0x14, 0xfa, 0x21, 0x5c, 0x8b, 0xdf, 0x0e,
+  0x7a, 0xbc, 0x8b, 0x3d, 0x0d, 0xdc, 0x6c, 0x39, 0x5c, 0x29, 0xd5, 0xde,
+  0x61, 0x7c, 0x1e, 0xab, 0x5b, 0x3f, 0x9f, 0x6f, 0x8e, 0x0e, 0x5f, 0xf5,
+  0xa2, 0x97, 0x7c, 0x0a, 0x5c, 0x79, 0xeb, 0xeb, 0x9b, 0x64, 0xdc, 0xd5,
+  0x67, 0x25, 0x6e, 0x92, 0x14, 0x87, 0xa3, 0x84, 0xca, 0x10, 0x35, 0x19,
+  0x30, 0x5b, 0xd0, 0xbc, 0xb0, 0xb7, 0xbb, 0x4d, 0xaf, 0x67, 0xc4, 0xcf,
+  0x3e, 0x10, 0x87, 0x35, 0xa9, 0xca, 0x5c, 0x53, 0xe5, 0x11, 0xf2, 0x25,
+  0x08, 0x79, 0x5e, 0x4e, 0xca, 0x8b, 0x8b, 0x35, 0x51, 0x41, 0x06, 0x07,
+  0x46, 0xed, 0x13, 0xd3, 0xcb, 0x06, 0x6d, 0x23, 0xbd, 0x37, 0x61, 0xf0,
+  0xe8, 0xca, 0x5c, 0xb6, 0x0d, 0x49, 0xc6, 0x42, 0xd7, 0xd2, 0xe0, 0x6e,
+  0xb4, 0x02, 0x08, 0x6a, 0x30, 0xa8, 0x85, 0x87, 0x6a, 0x7c, 0xf6, 0xc6,
+  0x68, 0x96, 0x90, 0x6d, 0xd4, 0x62, 0x76, 0xfd, 0x1f, 0xff, 0xfc, 0xcb,
+  0x4f, 0x91, 0x76, 0x35, 0xe8, 0xe7, 0x78, 0xc5, 0x25, 0x85, 0xe6, 0x79,
+  0x6d, 0x5c, 0x60, 0x1b, 0x83, 0x70, 0xa6, 0x09, 0x07, 0x34, 0x9a, 0x3a,
+  0x9b, 0x5f, 0x78, 0x78, 0x4b, 0xa1, 0x58, 0xac, 0xdd, 0x07, 0xd1, 0x7d,
+  0x94, 0x2a, 0xc0, 0xb9, 0x64, 0x97, 0xda, 0x36, 0xa0, 0xe5, 0x9b, 0xcb,
+  0x97, 0xb6, 0xb0, 0xee, 0x72, 0x12, 0x01, 0x7a, 0x98, 0xeb, 0xcb, 0xe6,
+  0x57, 0x32, 0x31, 0x01, 0x1e, 0x5b, 0x47, 0xa7, 0xcf, 0x95, 0xaf, 0x0c,
+  0xa5, 0xde, 0x0d, 0xb3, 0xbb, 0x6c, 0x62, 0x38, 0x44, 0xad, 0x80, 0x0f,
+  0xc3, 0x45, 0x9d, 0xbc, 0x58, 0x18, 0x22, 0xcf, 0x7b, 0xa0, 0x3a, 0xbe,
+  0xa1, 0xd7, 0x8c, 0x11, 0x2d, 0xef, 0x59, 0xf8, 0xea, 0xcb, 0xb2, 0x32,
+  0x5b, 0xb4, 0x90, 0x32, 0x5c, 0x29, 0x45, 0x6e, 0xbb, 0x32, 0x50, 0x58,
+  0x12, 0xb8, 0x03, 0x08, 0x3f, 0x95, 0xca, 0xa9, 0x3c, 0x20, 0x4e, 0x51,
+  0x0b, 0x67, 0x2b, 0xa3, 0x39, 0x9a, 0xa9, 0x1b, 0xfb, 0x1a, 0x36, 0x3d,
+  0xf9, 0x05, 0x99, 0xa2, 0xb8, 0xc8, 0x90, 0x5e, 0x89, 0xc2, 0x07, 0xa8,
+  0xf0, 0x10, 0x0b, 0xcb, 0xf0, 0x1c, 0x7f, 0x45, 0xb6, 0xcb, 0xb5, 0xff,
+  0x49, 0x41, 0x44, 0x09, 0xf7, 0x55, 0xa6, 0xcf, 0x17, 0xda, 0xa6, 0xae,
+  0x52, 0x91, 0x46, 0xae, 0xcd, 0xe7, 0x53, 0x5f, 0x3f, 0xf6, 0x1a, 0x0f,
+  0x04, 0x97, 0x12, 0x4d, 0xac, 0xe5, 0x58, 0x7c, 0xe0, 0x58, 0x94, 0x1f,
+  0xa6, 0x54, 0x0d, 0x99, 0xcd, 0x99, 0xc5, 0x49, 0x5e, 0x95, 0x1b, 0x15,
+  0x1c, 0xb7, 0x0b, 0xd0, 0x52, 0x53, 0x8a, 0x00, 0x97, 0xc1, 0x8a, 0x43,
+  0x1f, 0xf5, 0xe4, 0xe2, 0x77, 0x88, 0xc6, 0x7a, 0xcf, 0x19, 0x29, 0xed,
+  0x12, 0x91, 0x23, 0x31, 0x1f, 0x80, 0x95, 0x8f, 0x5e, 0x90, 0x0c, 0x3f,
+  0x42, 0x2f, 0x23, 0xbb, 0x82, 0x58, 0x88, 0x9c, 0xf7, 0x91, 0x9c, 0x77,
+  0x67, 0x38, 0x0a, 0xb7, 0x24, 0x4f, 0x9f, 0x3c, 0x79, 0x92, 0x70, 0xc0,
+  0x25, 0xd9, 0x38, 0x66, 0x7c, 0xb6, 0x77, 0x47, 0x2f, 0x4f, 0xdf, 0xbc,
+  0x39, 0x7a, 0xfb, 0xea, 0xe8, 0x95, 0xbd, 0x68, 0xba, 0x16, 0x4b, 0x1d,
+  0xc1, 0x8a, 0x28, 0x4f, 0x70, 0x96, 0xec, 0x3d, 0xd9, 0x1d, 0xee, 0x3f,
+  0xd9, 0x4d, 0x0c, 0x29, 0xa6, 0xb6, 0x3c, 0x2d, 0x9d, 0xa7, 0x64, 0xdf,
+  0x5e, 0xad, 0x8c, 0x96, 0x46, 0xb8, 0xce, 0x0d, 0xe1, 0x6c, 0xc0, 0xf3,
+  0x4a, 0xce, 0xe1, 0x22, 0x6b, 0xc8, 0x8e, 0x8e, 0x64, 0x06, 0x8c, 0x36,
+  0x12, 0x0b, 0xd2, 0xe9, 0x42, 0x96, 0xa2, 0xfc, 0x80, 0x40, 0xf7, 0x77,
+  0xe9, 0x53, 0xa3, 0xe4, 0xb5, 0xd1, 0x3f, 0x2e, 0xca, 0xdb, 0x84, 0xb5,
+  0x40, 0xa3, 0x94, 0x66, 0x61, 0xa8, 0xb2, 0xfd, 0x3a, 0xbd, 0xfd, 0x88,
+  0xdf, 0xfe, 0x0d, 0x63, 0xf4, 0x4f, 0x9e, 0xb7, 0x0d, 0x4b, 0x73, 0x91,
+  0xd1, 0x15, 0x44, 0x6b, 0x11, 0xfb, 0x9b, 0xd7, 0x91, 0x0c, 0x3a, 0x3c,
+  0xa3, 0x87, 0x8d, 0x4d, 0x7e, 0xfa, 0xc3, 0x9f, 0x5d, 0x6d, 0xe7, 0xf5,
+  0x9e, 0x26, 0x33, 0x4a, 0x09, 0x2b, 0x77, 0x56, 0x2d, 0xc2, 0xa0, 0xb7,
+  0xc5, 0x88, 0xf3, 0x4d, 0x42, 0x95, 0x33, 0x58, 0x23, 0xe5, 0xa0, 0x9a,
+  0xcd, 0xe3, 0xb6, 0x87, 0x72, 0x6e, 0x55, 0x2d, 0x45, 0x44, 0x61, 0x3d,
+  0x7f, 0x45, 0x21, 0x0e, 0x33, 0xa7, 0x9c, 0xbb, 0xfe, 0xe4, 0xc5, 0x8c,
+  0x3b, 0x8d, 0xb7, 0xfc, 0xb2, 0x4d, 0xb5, 0x6a, 0x99, 0x95, 0xea, 0x87,
+  0x1d, 0xad, 0x87, 0xd9, 0x58, 0x56, 0xf9, 0x22, 0xad, 0xf2, 0xf9, 0x9d,
+  0x12, 0xf8, 0x0d, 0xf7, 0x3e, 0xe6, 0x4c, 0x29, 0x84, 0xbe, 0x2c, 0xae,
+  0x30, 0xe5, 0x10, 0xa4, 0x91, 0xfa, 0x9b, 0x7c, 0x2a, 0x57, 0x4a, 0xb0,
+  0xbf, 0xf8, 0x5c, 0x79, 0xb7, 0xd6, 0xa2, 0x21, 0xb5, 0xed, 0x7f, 0xab,
+  0x52, 0x44, 0x4b, 0x6f, 0x49, 0xcd, 0x7d, 0x7d, 0x7c, 0x72, 0xb4, 0x9d,
+  0xbc, 0xce, 0x1a, 0xa9, 0x6e, 0xd2, 0x24, 0x63, 0x12, 0xf7, 0xff, 0x06,
+  0x05, 0xcb, 0x42, 0xd2, 0x4a, 0x6d, 0x70, 0x34, 0x17, 0x8c, 0xcd, 0x18,
+  0xe8, 0x1a, 0x5a, 0x29, 0xc5, 0x27, 0x83, 0x25, 0x52, 0x38, 0x4e, 0x53,
+  0xcb, 0x34, 0xbc, 0x29, 0x27, 0x1f, 0xcb, 0xbb, 0x55, 0x84, 0x87, 0x51,
+  0x1b, 0xf0, 0xb2, 0x2c, 0xbc, 0x14, 0x02, 0x9a, 0xb7, 0xe4, 0x3d, 0x73,
+  0x3c, 0x30, 0xaf, 0x97, 0x73, 0x62, 0x06, 0x31, 0x74, 0x97, 0x79, 0xe6,
+  0x2a, 0xfa, 0x40, 0xf9, 0xc6, 0x7a, 0xb0, 0x89, 0x98, 0xcc, 0x53, 0x69,
+  0xbd, 0xde, 0xc6, 0x7d, 0xa3, 0x1b, 0x47, 0x69, 0x27, 0xfc, 0xe7, 0xce,
+  0x97, 0x6b, 0xb0, 0xd2, 0x8e, 0xd0, 0x03, 0x5d, 0x5e, 0x00, 0x41, 0xa1,
+  0x2b, 0xab, 0xa6, 0x32, 0xa9, 0xd2, 0xd9, 0xa2, 0x84, 0x98, 0xfa, 0x0a,
+  0x7a, 0x70, 0xa1, 0xf8, 0x3f, 0x4b, 0xeb, 0x3d, 0x55, 0x21, 0xa8, 0xf8,
+  0xdb, 0xc9, 0x97, 0xcc, 0xfb, 0x68, 0x1d, 0xed, 0x71, 0xa9, 0x95, 0x15,
+  0xd0, 0x56, 0x58, 0x9b, 0xa2, 0x7c, 0xfd, 0xb4, 0x9d, 0xb1, 0xcf, 0x8f,
+  0x5d, 0x49, 0xe3, 0x02, 0x38, 0x53, 0xb8, 0x7c, 0xac, 0x8e, 0xb8, 0xfc,
+  0xdd, 0x5d, 0x74, 0xd1, 0x3d, 0xf4, 0xc9, 0x66, 0xcf, 0x8c, 0xa6, 0x1e,
+  0x0c, 0xa4, 0xb6, 0xeb, 0x96, 0x9f, 0x99, 0xdf, 0x45, 0xb4, 0x25, 0xf9,
+  0xba, 0xcf, 0x82, 0xba, 0x2a, 0xbb, 0xfd, 0x46, 0x69, 0x41, 0x73, 0xc4,
+  0x10, 0x0d, 0xd5, 0x45, 0xda, 0x3b, 0xf6, 0x91, 0x67, 0x68, 0x73, 0xda,
+  0x54, 0xf9, 0xf4, 0x23, 0x00, 0xd1, 0xea, 0x66, 0x05, 0x95, 0x2e, 0x2d,
+  0xfc, 0x59, 0xda, 0x46, 0x1f, 0xb3, 0x12, 0x3b, 0x1d, 0xd7, 0x3e, 0x49,
+  0x45, 0x22, 0x97, 0x01, 0xe1, 0x6f, 0xeb, 0x6c, 0x78, 0x35, 0xf6, 0xae,
+  0x58, 0x35, 0x8d, 0xca, 0x20, 0x71, 0xb2, 0xcb, 0x48, 0x57, 0x00, 0x73,
+  0x8d, 0x09, 0x80, 0x83, 0x7c, 0x6d, 0x37, 0x02, 0x2d, 0xb6, 0x59, 0x65,
+  0xdc, 0x99, 0x64, 0x64, 0x4c, 0xd1, 0x05, 0x55, 0x04, 0x20, 0xcd, 0x56,
+  0x96, 0x2c, 0xdb, 0x63, 0x38, 0xdb, 0x65, 0x7e, 0x1d, 0xcd, 0xb2, 0xd0,
+  0x89, 0x2d, 0x18, 0xef, 0x82, 0x67, 0xa1, 0x29, 0xc7, 0x8a, 0x75, 0x94,
+  0x88, 0x4b, 0x3a, 0x21, 0x28, 0x38, 0x7b, 0x7c, 0xc1, 0x0d, 0x9e, 0x93,
+  0xca, 0x4a, 0x40, 0x5e, 0x05, 0x77, 0x5c, 0xff, 0xc6, 0xe8, 0x3e, 0x07,
+  0x1b, 0xb6, 0x9f, 0x86, 0x24, 0x45, 0x65, 0x1d, 0xca, 0x81, 0x91, 0x51,
+  0x94, 0xc3, 0x68, 0x23, 0x49, 0x56, 0xdc, 0x1b, 0xe5, 0x5b, 0xb6, 0xde,
+  0x26, 0xcc, 0x6a, 0xb6, 0xf5, 0x2f, 0x03, 0x40, 0x9b, 0x5c, 0x85, 0x55,
+  0x7e, 0x34, 0xa5, 0x1f, 0x86, 0x2f, 0xf1, 0xf1, 0xe1, 0x37, 0x18, 0xef,
+  0x8f, 0x1b, 0xd6, 0xdd, 0xdb, 0xfd, 0xd5, 0x41, 0xd8, 0xf9, 0x7d, 0xea,
+  0xb5, 0x78, 0x61, 0x2a, 0x01, 0x3e, 0xa6, 0x70, 0xd9, 0xd4, 0x21, 0x6f,
+  0x02, 0xf2, 0x6d, 0x36, 0xdb, 0xb1, 0x87, 0xce, 0xa9, 0x73, 0x7d, 0x2d,
+  0xc7, 0x8d, 0x14, 0x59, 0x02, 0x45, 0x67, 0x36, 0x2c, 0x2f, 0x86, 0xc8,
+  0x90, 0x26, 0xc8, 0x3c, 0xca, 0x46, 0xf2, 0x6e, 0x1d, 0x80, 0x41, 0x80,
+  0x7e, 0x3a, 0x9b, 0xc5, 0x54, 0xf3, 0xb4, 0x96, 0x3a, 0x62, 0x25, 0x7c,
+  0x2d, 0xb4, 0xe0, 0xc3, 0x3c, 0x10, 0xb7, 0x3c, 0x5e, 0xd7, 0x86, 0xbc,
+  0xc4, 0x06, 0xb5, 0x20, 0x22, 0xf0, 0xa7, 0xa1, 0x3c, 0x62, 0xc0, 0xea,
+  0x3b, 0x16, 0x0d, 0xfb, 0x6d, 0xc1, 0xae, 0x5c, 0x38, 0x9f, 0x57, 0x4b,
+  0xa8, 0xac, 0x84, 0xd6, 0x1c, 0x78, 0x5f, 0xb4, 0x48, 0x84, 0x45, 0xff,
+  0x93, 0xd1, 0xee, 0x20, 0x88, 0xd2, 0x37, 0x30, 0xf3, 0x0b, 0x97, 0x22,
+  0x84, 0x04, 0x09, 0xf0, 0xc8, 0x61, 0xac, 0xaa, 0xd6, 0x5c, 0xc2, 0x3b,
+  0xe2, 0xd6, 0xb6, 0x90, 0x16, 0xb9, 0xc5, 0xae, 0xf0, 0xc1, 0xe5, 0xf5,
+  0x60, 0x0f, 0x85, 0x71, 0xa2, 0x7a, 0x36, 0x06, 0x70, 0x2d, 0x19, 0x5b,
+  0x5f, 0x0e, 0xbb, 0x7d, 0x8f, 0x6d, 0xfb, 0x4a, 0xbf, 0x7a, 0xc3, 0x55,
+  0xab, 0xf7, 0x7b, 0x9a, 0xd0, 0x47, 0xe5, 0x50, 0x5b, 0x9f, 0x0d, 0xcd,
+  0xa6, 0x4a, 0x8b, 0xee, 0x61, 0x46, 0x3f, 0x64, 0xa0, 0x0e, 0x45, 0x8d,
+  0xae, 0xef, 0xd9, 0xb3, 0x47, 0xcf, 0x68, 0xcf, 0x6c, 0x63, 0x19, 0xed,
+  0xa1, 0xe6, 0x04, 0x04, 0xc8, 0xd6, 0xbb, 0x4b, 0xdd, 0x3d, 0x23, 0xbe,
+  0x42, 0x9c, 0xa0, 0xd0, 0xac, 0xef, 0x14, 0xfa, 0xca, 0x5d, 0x6f, 0x6a,
+  0x71, 0x4f, 0xce, 0x2f, 0xae, 0xcd, 0x6b, 0x52, 0xec, 0x87, 0x6f, 0xcd,
+  0x31, 0x1c, 0x24, 0xff, 0x59, 0x66, 0x5c, 0xb3, 0x7a, 0x4f, 0xc9, 0xea,
+  0xf7, 0x87, 0xef, 0xde, 0x1e, 0xbf, 0xfd, 0xfa, 0xc0, 0x41, 0x74, 0x82,
+  0xe7, 0x09, 0x68, 0x7e, 0xd0, 0xef, 0x07, 0xc8, 0xfa, 0xa8, 0x0b, 0x48,
+  0xd9, 0x37, 0x1f, 0xed, 0xb0, 0x90, 0x0c, 0x99, 0x37, 0xb3, 0xef, 0xb2,
+  0xca, 0x38, 0x28, 0xc2, 0xb6, 0xa8, 0x16, 0x4e, 0x48, 0xb5, 0x26, 0x44,
+  0x25, 0xf7, 0xea, 0x8c, 0x00, 0x35, 0x0c, 0x4f, 0x90, 0x97, 0x3b, 0x2f,
+  0x5b, 0x3d, 0x02, 0x89, 0x2e, 0xe7, 0x38, 0xff, 0xd2, 0x27, 0x01, 0xaf,
+  0xd5, 0x1f, 0x41, 0xf0, 0x45, 0xfa, 0xc2, 0xc2, 0xd0, 0x63, 0x01, 0x01,
+  0x83, 0x46, 0xfb, 0xa2, 0x71, 0x73, 0x23, 0xaa, 0xd9, 0x25, 0x4f, 0x45,
+  0xce, 0xf1, 0x7f, 0xb7, 0x1f, 0x36, 0xc9, 0x2b, 0xe2, 0x07, 0xe1, 0x8d,
+  0x9a, 0xa6, 0x2b, 0xbe, 0x31, 0x0c, 0x4a, 0x26, 0x3f, 0x75, 0x95, 0x19,
+  0x76, 0x0b, 0xd6, 0xc7, 0x1d, 0xb8, 0x4a, 0x56, 0xc3, 0xaa, 0x9d, 0x54,
+  0x67, 0x04, 0xfc, 0x1c, 0xc3, 0x32, 0x7f, 0x92, 0x28, 0x89, 0xe2, 0x8f,
+  0xcc, 0x33, 0x57, 0x95, 0x64, 0x75, 0x9d, 0x2b, 0xd6, 0x75, 0xe6, 0xcb,
+  0x00, 0x64, 0x8f, 0xd2, 0xcc, 0xe9, 0x17, 0xb2, 0xbd, 0x14, 0xb7, 0x82,
+  0xfc, 0x55, 0xa3, 0xa4, 0x85, 0x69, 0x67, 0x3b, 0xfd, 0x6a, 0x97, 0xdd,
+  0x50, 0x9e, 0x12, 0xd4, 0x53, 0xc6, 0x40, 0x63, 0x7e, 0x05, 0x8c, 0xf9,
+  0xba, 0xd9, 0xe7, 0xe5, 0x6a, 0xb2, 0x98, 0x3d, 0x49, 0x5e, 0x98, 0xff,
+  0x04, 0x4a, 0xd6, 0x98, 0xb3, 0x49, 0x5f, 0x92, 0x17, 0x9d, 0x52, 0x5c,
+  0x18, 0x00, 0x97, 0x4b, 0x5b, 0x6c, 0x13, 0xa1, 0x47, 0xfb, 0x66, 0xb2,
+  0xb7, 0xa9, 0xa2, 0x5a, 0xce, 0xcc, 0x19, 0x36, 0x48, 0x3d, 0xeb, 0xc1,
+  0x0b, 0x72, 0x39, 0x8d, 0x74, 0xe6, 0x7b, 0xfb, 0x9f, 0x27, 0x54, 0x7a,
+  0xf0, 0xe6, 0xd5, 0x93, 0x64, 0x7a, 0x95, 0x4d, 0x3f, 0xd6, 0xab, 0x85,
+  0x32, 0xe3, 0x84, 0xb6, 0x94, 0x02, 0x21, 0x34, 0xcf, 0x00, 0xe9, 0xc1,
+  0x4c, 0x7c, 0x9e, 0x4f, 0xa9, 0xf0, 0x6f, 0xd0, 0x0a, 0x4f, 0x5d, 0x68,
+  0x78, 0xca, 0xb3, 0x42, 0xad, 0xd8, 0x40, 0xba, 0x00, 0xe7, 0xd4, 0x44,
+  0x82, 0x17, 0x66, 0x0f, 0xcc, 0xe7, 0xa9, 0xed, 0x84, 0xd1, 0xcb, 0xd7,
+  0xba, 0x6c, 0x9f, 0xb5, 0xbd, 0xde, 0x74, 0xb1, 0x77, 0x47, 0xcf, 0x7b,
+  0x00, 0x7d, 0x5b, 0x20, 0x5c, 0x54, 0xab, 0x64, 0x31, 0x9e, 0x61, 0x0f,
+  0x90, 0x96, 0x4f, 0x93, 0x24, 0x20, 0x28, 0x8d, 0xe2, 0x05, 0x1f, 0xa7,
+  0x27, 0x77, 0xe8, 0x09, 0xe9, 0x68, 0x44, 0x0c, 0x04, 0x50, 0x14, 0x4c,
+  0x58, 0x48, 0x12, 0xb2, 0x21, 0x40, 0x84, 0x3f, 0x81, 0x63, 0x84, 0xf8,
+  0x6b, 0x44, 0x69, 0x73, 0xe5, 0xdf, 0xd6, 0x67, 0xe3, 0xba, 0xa6, 0x49,
+  0x21, 0xad, 0x87, 0xe3, 0xa0, 0xd5, 0x84, 0xb4, 0xc3, 0x40, 0x53, 0x09,
+  0x04, 0x9f, 0x7c, 0x99, 0x03, 0xd3, 0xee, 0x38, 0x6a, 0x46, 0x21, 0x84,
+  0xfb, 0x9c, 0x30, 0xa0, 0xd9, 0xa2, 0x2e, 0x6f, 0x8a, 0xcb, 0x8a, 0xfc,
+  0x23, 0xe8, 0x6e, 0x9c, 0xc6, 0x62, 0x19, 0x31, 0xe4, 0x52, 0x37, 0xb6,
+  0xb1, 0xb8, 0x9e, 0x12, 0xa7, 0xf7, 0x77, 0x45, 0x82, 0xd8, 0xb0, 0x49,
+  0xc5, 0x66, 0xf7, 0x8e, 0x68, 0x77, 0x20, 0xc7, 0xb4, 0x37, 0xda, 0xed,
+  0x6b, 0xa2, 0xe5, 0xb5, 0xcf, 0x92, 0xb4, 0x87, 0xd6, 0xf9, 0x98, 0x37,
+  0x7d, 0x3d, 0x99, 0xf3, 0x1c, 0x0c, 0xad, 0xf7, 0x64, 0xdf, 0x99, 0x85,
+  0x8a, 0x03, 0x2b, 0x9b, 0xb5, 0x06, 0x7a, 0x68, 0x8d, 0x84, 0x4c, 0x77,
+  0x4f, 0xc2, 0x30, 0xf4, 0xaf, 0xfd, 0x2e, 0xd1, 0x99, 0x5f, 0x3f, 0x84,
+  0xe8, 0x22, 0x6b, 0xd9, 0x5b, 0x3b, 0x0d, 0x6f, 0x1e, 0xd8, 0x3b, 0xb7,
+  0x79, 0x5a, 0xa1, 0x21, 0xf3, 0xd1, 0x6b, 0x11, 0x46, 0xa5, 0xc3, 0x86,
+  0x27, 0x78, 0x83, 0xca, 0x5d, 0xca, 0x6a, 0x48, 0x3a, 0xbb, 0x39, 0xac,
+  0x40, 0x85, 0x8a, 0x1d, 0x06, 0x4c, 0x8c, 0xbc, 0xae, 0x09, 0x90, 0x12,
+  0xb1, 0x6e, 0xa2, 0x4e, 0x0a, 0x1c, 0xf9, 0x88, 0xf1, 0x75, 0x34, 0x6d,
+  0x1f, 0x04, 0xb2, 0x6f, 0x95, 0x74, 0xfc, 0x93, 0xb6, 0xf4, 0xfd, 0x12,
+  0x04, 0x38, 0x02, 0x90, 0xb2, 0xeb, 0xfa, 0x92, 0x60, 0x72, 0x6c, 0x51,
+  0xc4, 0x66, 0xe7, 0x21, 0xa2, 0x69, 0x04, 0x48, 0xca, 0x35, 0x6b, 0xfd,
+  0x54, 0x4d, 0x95, 0xb0, 0xae, 0x4b, 0x28, 0x37, 0x6a, 0xd1, 0x39, 0xc6,
+  0xe0, 0x7c, 0xf9, 0x56, 0x19, 0x45, 0x53, 0x06, 0x68, 0x25, 0xd3, 0x53,
+  0x67, 0x0c, 0xe6, 0xeb, 0xb6, 0x61, 0xeb, 0xcc, 0x75, 0x0c, 0x8d, 0xf8,
+  0x57, 0xe0, 0x0c, 0x61, 0x71, 0x4a, 0x3b, 0xd4, 0x8f, 0x74, 0xd7, 0x73,
+  0x1c, 0x0f, 0xee, 0x80, 0x13, 0xe0, 0x76, 0xe5, 0xec, 0x23, 0xd3, 0xf2,
+  0x55, 0x5e, 0xcd, 0xe8, 0x61, 0xc4, 0xbd, 0x3b, 0x88, 0xce, 0x8e, 0xc8,
+  0xcd, 0x27, 0xfe, 0x16, 0x08, 0xde, 0xf3, 0x08, 0x71, 0xfd, 0xa2, 0xbb,
+  0xb0, 0xbf, 0x2e, 0x0c, 0x1a, 0xde, 0xc1, 0x47, 0x23, 0xfd, 0x5a, 0xdf,
+  0x5e, 0x05, 0xec, 0xac, 0xa7, 0x7b, 0xd0, 0x43, 0x77, 0xab, 0x67, 0x6f,
+  0xf6, 0xf4, 0x2a, 0xfa, 0xbc, 0xcd, 0xdf, 0xaf, 0xee, 0xd9, 0xca, 0xfe,
+  0x85, 0x90, 0xfb, 0xf1, 0xab, 0xfa, 0x28, 0xbe, 0x9b, 0x56, 0x43, 0xed,
+  0xf8, 0x3c, 0xc9, 0x65, 0x56, 0xe5, 0x0b, 0x00, 0xdf, 0x8d, 0x92, 0x57,
+  0x2e, 0xa5, 0x85, 0x0c, 0x14, 0x43, 0xb1, 0xdd, 0x5d, 0x99, 0xad, 0x7a,
+  0x32, 0x3f, 0x3a, 0x37, 0x3f, 0x38, 0xaf, 0x47, 0x92, 0xd4, 0xe3, 0x52,
+  0x17, 0x20, 0xd5, 0xd5, 0x4d, 0xd8, 0xb5, 0x82, 0xd8, 0x6f, 0xa3, 0xf1,
+  0x3f, 0x09, 0xd3, 0x51, 0x6a, 0x96, 0x44, 0x60, 0xb0, 0xf5, 0x8f, 0xfc,
+  0x98, 0xb9, 0x55, 0xad, 0xa9, 0x84, 0x20, 0xee, 0x29, 0xb2, 0x5f, 0x84,
+  0x45, 0x45, 0x22, 0x51, 0x55, 0x4a, 0xf3, 0x99, 0xeb, 0x3c, 0x4d, 0x0e,
+  0xe7, 0xcd, 0x70, 0xfc, 0xdd, 0x54, 0x9b, 0xf4, 0xda, 0x9d, 0x0a, 0x5a,
+  0x7c, 0xc3, 0xab, 0x22, 0x28, 0x79, 0x14, 0x41, 0xc9, 0xab, 0xe9, 0x6a,
+  0x01, 0xe4, 0x53, 0x10, 0x95, 0xed, 0x12, 0x44, 0xa7, 0xe8, 0xf3, 0x1f,
+  0x4e, 0xb7, 0x0f, 0x41, 0x0f, 0xd3, 0x8f, 0xb5, 0x2e, 0x49, 0x32, 0xeb,
+  0xb9, 0x0c, 0xa3, 0xb5, 0x47, 0xf7, 0xa8, 0xbd, 0x1d, 0xdb, 0x8e, 0x01,
+  0x7a, 0x09, 0x28, 0xe4, 0xbf, 0xbf, 0x3f, 0x7e, 0xe9, 0xeb, 0x55, 0x16,
+  0x5a, 0xbe, 0x3f, 0x5a, 0x31, 0xf0, 0x20, 0xe8, 0x2f, 0x48, 0x89, 0xd5,
+  0x5c, 0x5c, 0xcd, 0x9b, 0x6b, 0x9d, 0x6d, 0xc9, 0xb0, 0xeb, 0x5d, 0x07,
+  0xd8, 0x4d, 0xf1, 0xf3, 0xee, 0xe8, 0xbe, 0xde, 0xd1, 0x47, 0xbf, 0xf6,
+  0x1d, 0x7d, 0xf4, 0x73, 0xef, 0xa8, 0xf0, 0xb7, 0xf8, 0x0d, 0xed, 0xbb,
+  0xad, 0x81, 0x59, 0xea, 0x6e, 0xaf, 0x38, 0x9c, 0xdb, 0x39, 0x03, 0x43,
+  0x06, 0x8f, 0x18, 0x8a, 0xdf, 0x62, 0xc8, 0x05, 0xb2, 0xb1, 0xda, 0x30,
+  0xbe, 0xc3, 0x0a, 0xf8, 0x38, 0x48, 0x8e, 0x19, 0xcb, 0xdc, 0x87, 0x51,
+  0x3c, 0xe1, 0xea, 0x5a, 0xf1, 0x7a, 0xbb, 0x92, 0x8a, 0x48, 0x05, 0x7e,
+  0x3e, 0x25, 0x58, 0xb5, 0x39, 0xf0, 0x92, 0xe0, 0x73, 0x87, 0xcd, 0x6c,
+  0x9b, 0xa9, 0xad, 0x10, 0x54, 0x48, 0x0e, 0x97, 0x54, 0x24, 0x6b, 0x74,
+  0x8e, 0x5b, 0xf5, 0x43, 0x10, 0x81, 0x85, 0xb9, 0x48, 0x25, 0x2a, 0xdc,
+  0x35, 0xf1, 0xbe, 0x33, 0x1d, 0x1a, 0x98, 0x11, 0x0f, 0xe7, 0x44, 0xf9,
+  0x8c, 0x16, 0x5e, 0x50, 0xc7, 0x0f, 0x43, 0xe0, 0x97, 0x41, 0x53, 0x9d,
+  0xc9, 0x5d, 0x13, 0x29, 0x03, 0xa3, 0x75, 0xc3, 0x95, 0xbd, 0xc5, 0x8a,
+  0xaa, 0x11, 0x23, 0x66, 0x23, 0xb7, 0x8d, 0xad, 0xf9, 0x11, 0xc8, 0xbd,
+  0x19, 0xea, 0x74, 0xac, 0x7d, 0x85, 0x66, 0x28, 0x97, 0xe4, 0xaf, 0x92,
+  0xfa, 0x8f, 0xa0, 0x62, 0xe6, 0xef, 0x99, 0x26, 0x39, 0x6a, 0x0a, 0xa1,
+  0xc0, 0xcc, 0xb6, 0x4b, 0x54, 0xf3, 0x01, 0xba, 0x8e, 0xc2, 0x39, 0xdd,
+  0x0d, 0x1e, 0x89, 0xcb, 0x9a, 0x3e, 0x2e, 0xfa, 0x8c, 0x62, 0xf9, 0x8b,
+  0xc1, 0x2b, 0x5c, 0x4b, 0xba, 0x33, 0x09, 0xf2, 0x09, 0x83, 0x78, 0xf6,
+  0xf5, 0x63, 0xf1, 0xac, 0xe5, 0x29, 0xf7, 0x26, 0xe5, 0x8f, 0xa8, 0x13,
+  0x0a, 0xa6, 0xbe, 0x68, 0x30, 0xe4, 0x26, 0x1a, 0x68, 0x9f, 0xad, 0x41,
+  0x08, 0xa7, 0x67, 0xeb, 0xce, 0x1c, 0x44, 0x74, 0xeb, 0xca, 0x2a, 0xa4,
+  0xf3, 0x68, 0x34, 0x8a, 0xc0, 0x59, 0x5c, 0xe7, 0xd9, 0x4d, 0xcb, 0x17,
+  0x2f, 0x13, 0x1b, 0xd8, 0x2e, 0x19, 0xec, 0x01, 0xba, 0xa6, 0x1d, 0x32,
+  0x43, 0x4e, 0x08, 0x42, 0xb3, 0xa7, 0x9c, 0xc4, 0x5d, 0x79, 0xff, 0x69,
+  0x6f, 0x9b, 0x3f, 0xf2, 0x36, 0xd7, 0xb1, 0x7a, 0x50, 0x06, 0x44, 0x76,
+  0x3d, 0x1c, 0x06, 0xe4, 0x12, 0xa9, 0xee, 0x12, 0xf4, 0x6d, 0xf2, 0x38,
+  0x1a, 0x5d, 0x7f, 0xae, 0x40, 0xc8, 0x6b, 0x46, 0x24, 0xce, 0x63, 0x45,
+  0x31, 0x93, 0x4c, 0xd3, 0x8e, 0x3a, 0x5d, 0x63, 0x84, 0xa3, 0xab, 0xb6,
+  0x61, 0x04, 0xdf, 0x94, 0x5c, 0x51, 0x68, 0x03, 0x22, 0x5d, 0x08, 0xc8,
+  0x17, 0x13, 0x49, 0x3d, 0xd2, 0xc6, 0x24, 0xae, 0x6f, 0x95, 0x97, 0x28,
+  0xe3, 0x7a, 0x8a, 0x24, 0xba, 0xc0, 0x68, 0xbc, 0x37, 0x18, 0xa4, 0xb5,
+  0x8c, 0xc9, 0x9d, 0x76, 0xe5, 0xb4, 0x6e, 0x58, 0xab, 0xca, 0x06, 0x06,
+  0xb6, 0x57, 0x9f, 0xea, 0x10, 0x94, 0x5a, 0xbe, 0x6d, 0x8b, 0x76, 0x27,
+  0x1f, 0xa8, 0x3d, 0x80, 0xec, 0x00, 0x6a, 0xc0, 0xe1, 0xb5, 0xd2, 0xc0,
+  0xdc, 0xde, 0x2d, 0x7a, 0xc4, 0x2c, 0x2d, 0x19, 0xf5, 0x82, 0x1a, 0x10,
+  0xae, 0x28, 0xf1, 0x04, 0xd7, 0x5f, 0xaa, 0xd7, 0xa5, 0x60, 0xbd, 0x0b,
+  0x66, 0x62, 0x21, 0xe1, 0x68, 0xef, 0x47, 0x57, 0xe9, 0xed, 0xed, 0xa8,
+  0xce, 0x76, 0x0c, 0xd5, 0xd6, 0x3b, 0x75, 0x3d, 0xa7, 0x8f, 0xd6, 0x40,
+  0x5f, 0x5b, 0xdb, 0xdb, 0xf8, 0xf6, 0xce, 0x12, 0x90, 0x30, 0xe7, 0x69,
+  0x4a, 0xaf, 0xb6, 0x98, 0xad, 0x6b, 0x6e, 0xcc, 0xed, 0xc1, 0xba, 0x29,
+  0xc3, 0x0c, 0x38, 0x4d, 0x6e, 0x5a, 0xbf, 0xd2, 0x96, 0x39, 0x83, 0xcb,
+  0xcc, 0xb2, 0xc3, 0x38, 0x10, 0xfd, 0x84, 0x10, 0xa6, 0xab, 0xbe, 0xd2,
+  0x8e, 0x44, 0xee, 0xaa, 0x1f, 0x1c, 0x35, 0xdb, 0x62, 0x4b, 0x20, 0xb8,
+  0x47, 0x94, 0x40, 0xeb, 0xa0, 0xe1, 0x9f, 0x11, 0xb1, 0xe5, 0xc7, 0x08,
+  0xe4, 0x53, 0x9f, 0xdb, 0xd2, 0x5b, 0x1a, 0xd5, 0x8a, 0x1c, 0x38, 0x70,
+  0xc1, 0x9b, 0x9b, 0x9b, 0xd1, 0x3a, 0xbf, 0xe5, 0xbf, 0x1c, 0x03, 0x6f,
+  0x0f, 0x77, 0x5a, 0x24, 0x27, 0x79, 0xb1, 0xba, 0xf5, 0x10, 0x5e, 0x6c,
+  0x13, 0x38, 0x0d, 0xca, 0x25, 0xdf, 0xbd, 0x7b, 0x3d, 0xb0, 0x81, 0x4d,
+  0x05, 0xd7, 0x80, 0xe7, 0xb7, 0x8e, 0x68, 0x6d, 0x59, 0x0e, 0xe2, 0x61,
+  0xb8, 0xe8, 0x97, 0x87, 0x67, 0x1f, 0xde, 0x1e, 0x9d, 0x7f, 0x78, 0x77,
+  0xf8, 0x3d, 0x6d, 0x21, 0xfb, 0x65, 0x8c, 0xbc, 0xa2, 0x88, 0x40, 0x55,
+  0x96, 0x86, 0xcd, 0xbe, 0x21, 0xa6, 0x9e, 0x17, 0x80, 0x57, 0x89, 0x75,
+  0x6c, 0x53, 0xc8, 0x28, 0x99, 0x27, 0x4d, 0xe6, 0xc0, 0xa3, 0x41, 0xda,
+  0xaf, 0x8f, 0x59, 0x55, 0x64, 0xf3, 0x51, 0x59, 0x5d, 0x12, 0x15, 0xee,
+  0xbc, 0x12, 0xfe, 0x19, 0x1d, 0x6e, 0x47, 0xb2, 0x1a, 0x08, 0x82, 0xec,
+  0xba, 0xba, 0x20, 0xc4, 0x92, 0x35, 0x1a, 0x4f, 0xab, 0x3f, 0xad, 0x47,
+  0x9a, 0x8f, 0xc1, 0x00, 0x97, 0xd7, 0x8f, 0xd7, 0xa9, 0x77, 0x4d, 0xcb,
+  0x1c, 0x92, 0x16, 0x9f, 0x20, 0x20, 0xb8, 0x7e, 0xfc, 0x64, 0x95, 0x8c,
+  0x23, 0xd2, 0x83, 0x08, 0x00, 0x02, 0xf4, 0xb9, 0xd2, 0x42, 0x49, 0xa0,
+  0xc0, 0x8d, 0x92, 0x6c, 0xfa, 0xb9, 0x76, 0x68, 0xb8, 0x58, 0x1f, 0x42,
+  0x5b, 0xfd, 0xf4, 0x7d, 0x0f, 0x4f, 0x43, 0xcb, 0x90, 0x5a, 0xee, 0x7a,
+  0x6b, 0x7e, 0x2a, 0x6b, 0x7e, 0xfa, 0xaf, 0xad, 0xf9, 0xe9, 0x2f, 0x5f,
+  0xf3, 0xe3, 0x5f, 0x79, 0xcd, 0x8f, 0xa3, 0x6b, 0xf6, 0xbe, 0x32, 0xfc,
+  0x2b, 0xad, 0xf9, 0xaf, 0xab, 0xe2, 0xe3, 0xd0, 0x4c, 0x97, 0xa4, 0xb0,
+  0x34, 0xd8, 0xac, 0x7b, 0x4c, 0x36, 0x9b, 0xfb, 0x0f, 0xef, 0x1e, 0xc3,
+  0x7c, 0x0a, 0xae, 0xb0, 0xd7, 0x2f, 0x34, 0xf5, 0x3a, 0xe8, 0x71, 0xe4,
+  0xa9, 0xab, 0x87, 0x7b, 0x91, 0x07, 0x98, 0x07, 0x39, 0xd5, 0xfb, 0xd6,
+  0x53, 0xf2, 0x54, 0x90, 0x6a, 0xbf, 0x21, 0xb3, 0xd1, 0x61, 0x37, 0xb4,
+  0xe1, 0x0a, 0x6e, 0x7a, 0x1a, 0xe2, 0x1c, 0x4d, 0x19, 0x23, 0xfd, 0x8a,
+  0x5b, 0xcf, 0x41, 0x16, 0x21, 0x68, 0x25, 0x99, 0xfe, 0xdc, 0xe0, 0x88,
+  0x51, 0xa0, 0x74, 0xe8, 0x5c, 0xc0, 0xd4, 0x42, 0x9e, 0x71, 0x7e, 0xb7,
+  0xa4, 0x01, 0x93, 0x49, 0x65, 0x04, 0x30, 0x7c, 0x96, 0xf3, 0x1b, 0x4a,
+  0x4d, 0xd0, 0x19, 0xda, 0x21, 0xec, 0xaa, 0xd9, 0xba, 0x42, 0xb4, 0x6e,
+  0x33, 0x50, 0x18, 0xa6, 0xf3, 0x92, 0x38, 0xce, 0x6c, 0xbd, 0xf1, 0x31,
+  0x71, 0xdd, 0x4d, 0x59, 0x5e, 0x74, 0xda, 0x9d, 0xfa, 0x72, 0xe3, 0x63,
+  0x96, 0x2d, 0xd3, 0x39, 0xa0, 0x35, 0x28, 0xf7, 0xa1, 0xaf, 0x41, 0x56,
+  0x8b, 0x30, 0x6a, 0x2d, 0x1d, 0xc0, 0x2b, 0x7e, 0x19, 0x30, 0x33, 0x3a,
+  0x3e, 0x49, 0xaa, 0x96, 0x49, 0xf2, 0x19, 0x95, 0xba, 0xc6, 0xfb, 0xa5,
+  0x68, 0xf2, 0x83, 0x9d, 0x02, 0x29, 0x26, 0x13, 0x01, 0x80, 0x61, 0x7b,
+  0x12, 0xa8, 0x54, 0x0a, 0x23, 0x87, 0xd4, 0x9c, 0xeb, 0x9c, 0xb2, 0xf2,
+  0xba, 0x98, 0xc3, 0x9d, 0x11, 0x80, 0x2a, 0xd5, 0x6a, 0x98, 0xc0, 0x87,
+  0x47, 0x4f, 0x94, 0x56, 0x00, 0x92, 0xdf, 0x1f, 0x5d, 0xa4, 0x03, 0x92,
+  0x52, 0xe4, 0x64, 0xe9, 0x42, 0xf1, 0xf2, 0xec, 0xc3, 0xb7, 0x47, 0x47,
+  0x67, 0xc7, 0xaf, 0x4e, 0x8e, 0xe4, 0xc6, 0xd8, 0x1f, 0xbd, 0x3d, 0xff,
+  0xee, 0xc4, 0xf5, 0x05, 0x95, 0xb0, 0x47, 0x97, 0xe0, 0x05, 0xee, 0x5f,
+  0xd8, 0xf2, 0x00, 0x7d, 0xb0, 0x8c, 0x2d, 0x7d, 0x78, 0xfc, 0x83, 0x51,
+  0x5b, 0xcf, 0x86, 0xef, 0x7f, 0x08, 0x5a, 0x90, 0xb4, 0x6a, 0x4c, 0xba,
+  0x76, 0x97, 0xad, 0x38, 0x19, 0x0e, 0x8b, 0xd2, 0x1d, 0x60, 0x6f, 0xca,
+  0xdd, 0xaf, 0x2c, 0x06, 0x29, 0x71, 0xb9, 0xb0, 0x1a, 0x03, 0xbf, 0xa8,
+  0x7d, 0x7e, 0xbc, 0xac, 0xb6, 0xa7, 0xbb, 0xda, 0x3e, 0x6d, 0x6d, 0xd0,
+  0xa2, 0xd3, 0xb2, 0xed, 0x63, 0x76, 0x07, 0x0c, 0xc7, 0xe4, 0x05, 0xfd,
+  0x37, 0xde, 0xe4, 0x34, 0x39, 0xab, 0xf2, 0x6b, 0x52, 0x00, 0xcd, 0xc3,
+  0x1c, 0xd3, 0xa5, 0x67, 0x47, 0xb6, 0xe9, 0xab, 0x84, 0x95, 0x69, 0x14,
+  0x24, 0x9e, 0x60, 0xd4, 0x98, 0xb7, 0x07, 0xd0, 0x38, 0xe4, 0x5e, 0xb5,
+  0xa3, 0xe5, 0x86, 0x74, 0x5e, 0x1d, 0xbd, 0x1b, 0x24, 0x67, 0x47, 0x6f,
+  0xb8, 0x4a, 0xe5, 0xe8, 0xed, 0xd7, 0xdc, 0xc5, 0xd1, 0xb6, 0x36, 0x1d,
+  0x71, 0xae, 0x74, 0x98, 0xac, 0xe9, 0xed, 0x89, 0x79, 0x1d, 0x41, 0x91,
+  0xba, 0x36, 0xd2, 0xf5, 0x13, 0x02, 0xe8, 0xf0, 0xd2, 0x5e, 0x98, 0xff,
+  0xc4, 0xb6, 0xca, 0xd8, 0x11, 0xdf, 0x6c, 0x87, 0xbb, 0x25, 0x6a, 0x99,
+  0xcd, 0x9d, 0x11, 0x93, 0x80, 0x76, 0x83, 0x37, 0xcc, 0xec, 0x48, 0x98,
+  0xc5, 0xa1, 0x3b, 0x54, 0x08, 0x2e, 0x9e, 0xf4, 0x4e, 0x97, 0x10, 0x3c,
+  0x3a, 0x13, 0x8c, 0xbf, 0x19, 0x10, 0x59, 0x02, 0x88, 0xdc, 0xed, 0x45,
+  0xb4, 0x3a, 0xba, 0x02, 0xab, 0x93, 0xfa, 0x7a, 0x1b, 0x02, 0x25, 0xb5,
+  0x6a, 0x96, 0xcf, 0x00, 0xc1, 0x00, 0x17, 0x5d, 0x59, 0x51, 0x06, 0x47,
+  0x92, 0x6c, 0xfe, 0xcf, 0x9d, 0x51, 0x5d, 0x5f, 0xed, 0xe4, 0xb3, 0x0f,
+  0x55, 0x9d, 0x6e, 0x76, 0x65, 0x91, 0xf7, 0xeb, 0x19, 0xfd, 0x3a, 0xd9,
+  0x1c, 0xd9, 0x47, 0xe5, 0xef, 0xf4, 0xf3, 0xd8, 0x39, 0xa8, 0x04, 0x62,
+  0xcf, 0x8a, 0xe6, 0x73, 0x6a, 0xf3, 0xdc, 0x79, 0x3e, 0xa9, 0x8c, 0x02,
+  0xe7, 0x9a, 0x7e, 0x48, 0x2b, 0xdc, 0x64, 0xf9, 0x71, 0x5a, 0xef, 0xed,
+  0x85, 0x28, 0xf4, 0xb6, 0xc4, 0x71, 0xa0, 0xa9, 0xb9, 0x67, 0xdf, 0xbe,
+  0x1c, 0xff, 0x6e, 0x6f, 0x0f, 0x69, 0xd0, 0x5b, 0x94, 0xae, 0xfa, 0xec,
+  0xc9, 0xde, 0xfe, 0x76, 0x4c, 0x81, 0x0c, 0xf2, 0x7a, 0xa0, 0x50, 0xfa,
+  0xe4, 0x89, 0x18, 0xb7, 0xd4, 0x3c, 0xd8, 0x81, 0x67, 0x19, 0xa5, 0x08,
+  0x92, 0xf3, 0xd0, 0x76, 0x3f, 0x41, 0xee, 0x64, 0x90, 0x7a, 0x81, 0x5f,
+  0xb1, 0xe3, 0x7e, 0x83, 0xe7, 0x7f, 0xb0, 0x61, 0xe9, 0xca, 0x4f, 0x22,
+  0x47, 0x06, 0x8a, 0x37, 0x6f, 0x64, 0xfe, 0x74, 0xc3, 0x6b, 0xfe, 0xba,
+  0x90, 0xe9, 0xe8, 0x90, 0xa6, 0x32, 0x76, 0x0e, 0xd8, 0xc6, 0xc1, 0x91,
+  0xe4, 0x80, 0xc0, 0x57, 0x2f, 0x33, 0xda, 0x48, 0x98, 0x82, 0x88, 0xe2,
+  0x53, 0x37, 0xaa, 0xdd, 0x7f, 0x8f, 0x43, 0xb4, 0x47, 0x0d, 0x12, 0x27,
+  0x21, 0xa9, 0x37, 0xcc, 0xf5, 0xdd, 0x88, 0x8e, 0xf8, 0x49, 0xef, 0x64,
+  0x35, 0x49, 0x5e, 0xcc, 0xcd, 0x8b, 0xf3, 0x78, 0xe9, 0xdd, 0x11, 0xb7,
+  0xd9, 0xfa, 0x36, 0xab, 0x26, 0x59, 0x55, 0xd6, 0x9d, 0x12, 0x21, 0x6d,
+  0xed, 0xca, 0x89, 0xd8, 0x18, 0x86, 0xd3, 0xa5, 0x22, 0x2e, 0x4d, 0x3a,
+  0x34, 0xd9, 0x9d, 0x00, 0x96, 0x67, 0x13, 0xd5, 0x4a, 0x74, 0x01, 0xa8,
+  0xb1, 0x14, 0xfd, 0x69, 0xb8, 0xf1, 0x05, 0x37, 0x07, 0x4d, 0xe7, 0x9b,
+  0xd4, 0xed, 0xa7, 0x7b, 0x8d, 0x84, 0xd6, 0x36, 0x0d, 0x2f, 0xe5, 0xd1,
+  0x88, 0x3b, 0x00, 0xef, 0x40, 0xe6, 0xc1, 0xbe, 0x5e, 0xdb, 0x54, 0xd4,
+  0x4f, 0x02, 0xac, 0x83, 0x0e, 0x48, 0x76, 0xb8, 0x36, 0x74, 0x52, 0x5f,
+  0x86, 0xf1, 0xaf, 0x2c, 0xa6, 0xf8, 0x18, 0x1e, 0x1c, 0x3a, 0x0a, 0x5c,
+  0xab, 0x9d, 0xe1, 0xf4, 0xb0, 0xfc, 0x73, 0xd6, 0xd7, 0xa3, 0x9d, 0x73,
+  0x0f, 0xb9, 0x36, 0xbc, 0xd3, 0x76, 0x98, 0xb2, 0x36, 0x51, 0x1e, 0x41,
+  0x66, 0xa1, 0x54, 0xbe, 0x4a, 0x69, 0x30, 0xda, 0x46, 0x8a, 0x7e, 0x11,
+  0x06, 0xc7, 0x39, 0x5b, 0x0d, 0x71, 0x6e, 0x9d, 0xf6, 0x90, 0xcd, 0xf7,
+  0x97, 0x89, 0xb8, 0x23, 0x50, 0x19, 0x75, 0x53, 0x11, 0x5e, 0x6a, 0xa1,
+  0x51, 0x08, 0x16, 0x8f, 0x71, 0x10, 0x2d, 0x85, 0x54, 0x35, 0x87, 0x34,
+  0x97, 0x7e, 0x86, 0x9a, 0x8d, 0x58, 0xe9, 0xb4, 0x86, 0x92, 0xce, 0xa1,
+  0x1e, 0x03, 0x7a, 0xef, 0xdf, 0xfe, 0xc5, 0x93, 0x63, 0x85, 0x5e, 0x9a,
+  0x27, 0x44, 0x60, 0x12, 0x1e, 0x8c, 0x15, 0xd7, 0x29, 0xf3, 0x43, 0xc9,
+  0xc0, 0x10, 0x42, 0xe9, 0x85, 0xe1, 0xa7, 0x59, 0x00, 0x96, 0xa5, 0x0a,
+  0x82, 0x60, 0xf7, 0x48, 0xb3, 0x57, 0xaf, 0xe5, 0x22, 0xde, 0x25, 0x9a,
+  0x07, 0x96, 0x84, 0x1f, 0x9c, 0x1b, 0x92, 0xca, 0xda, 0x75, 0xb7, 0x51,
+  0x9b, 0x12, 0x57, 0xa5, 0x8d, 0x6b, 0x0b, 0x30, 0x7a, 0x05, 0x39, 0xd2,
+  0x2c, 0x69, 0xde, 0x10, 0x72, 0x45, 0x4b, 0xfe, 0x2d, 0x6c, 0x8b, 0x34,
+  0xf0, 0x81, 0xa0, 0xe2, 0x81, 0x3b, 0x7f, 0xa4, 0xdc, 0x11, 0x61, 0x73,
+  0xc6, 0x6e, 0x51, 0x1c, 0x89, 0x9d, 0x27, 0xdd, 0x3d, 0x99, 0x17, 0x67,
+  0xd6, 0x9a, 0x1b, 0x1d, 0x98, 0x0a, 0x13, 0x33, 0xc4, 0x4d, 0x3e, 0x6b,
+  0xae, 0xd0, 0x89, 0x47, 0x2d, 0xa3, 0x5a, 0x70, 0x01, 0xc8, 0x4d, 0x9d,
+  0xc7, 0x8a, 0xde, 0xa2, 0x0e, 0x3c, 0x3e, 0x31, 0xec, 0x69, 0xc2, 0xf0,
+  0x58, 0xe4, 0xa9, 0xc3, 0x31, 0xc0, 0xa7, 0xbd, 0xc3, 0x9a, 0x9e, 0x45,
+  0x86, 0xa1, 0x76, 0xd9, 0x17, 0xd4, 0x65, 0x27, 0xf4, 0xd0, 0x6b, 0x79,
+  0xda, 0xc8, 0x5e, 0x11, 0x88, 0xa5, 0xcd, 0x8f, 0x8c, 0x8b, 0xff, 0xed,
+  0xa6, 0xf6, 0x93, 0x5d, 0x15, 0x8d, 0x5f, 0x43, 0x63, 0x6e, 0xe8, 0xc7,
+  0x7c, 0x5e, 0x46, 0x5d, 0xea, 0x86, 0xb5, 0x2d, 0xf8, 0xf5, 0x37, 0x9b,
+  0xea, 0x27, 0x25, 0xc0, 0x84, 0xcb, 0x54, 0x7e, 0xcd, 0x58, 0x29, 0x9b,
+  0x97, 0xfc, 0xd0, 0xd7, 0xfa, 0x50, 0xd8, 0x43, 0x82, 0xbc, 0xf6, 0xec,
+  0xa5, 0xd7, 0x64, 0xba, 0xfa, 0x80, 0xea, 0x33, 0xbe, 0x1d, 0x24, 0x8f,
+  0x16, 0x38, 0x94, 0xbd, 0xaf, 0xa3, 0x95, 0x73, 0xc0, 0x65, 0x80, 0xf5,
+  0xa5, 0x99, 0x3e, 0xc3, 0x3f, 0x93, 0xd1, 0x85, 0x3d, 0x63, 0xca, 0xb4,
+  0xc5, 0x60, 0x5c, 0x6e, 0xe8, 0xa4, 0x57, 0x57, 0x37, 0xa2, 0xa3, 0x5a,
+  0x92, 0x8d, 0x30, 0xcb, 0x14, 0x23, 0x7c, 0x01, 0xd7, 0x26, 0x65, 0x4b,
+  0x2d, 0x05, 0x0b, 0x83, 0x48, 0x75, 0x68, 0x21, 0x48, 0xeb, 0x39, 0x3d,
+  0x80, 0xe6, 0x58, 0x65, 0x90, 0x59, 0x3d, 0x5f, 0xc2, 0x40, 0xb2, 0x3d,
+  0xec, 0xbc, 0x29, 0x51, 0x61, 0xeb, 0x34, 0x11, 0x1f, 0xcf, 0x27, 0x14,
+  0x89, 0xf3, 0x01, 0xee, 0x67, 0xdd, 0x0c, 0x23, 0x78, 0xaf, 0x8c, 0x0f,
+  0x78, 0x76, 0x7a, 0xf6, 0x68, 0xdb, 0xd6, 0x47, 0x73, 0xb2, 0xbf, 0xa0,
+  0x23, 0x58, 0xbc, 0x40, 0x0b, 0x9c, 0xa0, 0xe0, 0xcc, 0x28, 0xd3, 0x0b,
+  0x6d, 0x4b, 0x80, 0x7d, 0x83, 0xb5, 0xe0, 0x7b, 0x70, 0xf8, 0xbb, 0x22,
+  0x11, 0xaf, 0x07, 0xa2, 0xbb, 0x96, 0x0e, 0x1f, 0xf1, 0xb3, 0x10, 0x56,
+  0xa6, 0xd6, 0x8c, 0x72, 0x60, 0xb2, 0x0c, 0x51, 0xfe, 0x97, 0xb4, 0x1b,
+  0x8a, 0x50, 0x43, 0x8a, 0xce, 0x24, 0x39, 0xf1, 0x28, 0x92, 0xd2, 0x25,
+  0x41, 0x5e, 0xf7, 0x20, 0x02, 0x12, 0x5a, 0x0d, 0xc9, 0xf2, 0xd6, 0x66,
+  0x5b, 0x90, 0xb7, 0x94, 0xc8, 0x96, 0x31, 0x95, 0x47, 0xb1, 0x0a, 0x5c,
+  0xe9, 0x67, 0x27, 0x7d, 0x2d, 0x5a, 0x16, 0x99, 0xf4, 0x2a, 0x4b, 0x93,
+  0xb7, 0x27, 0xe3, 0x73, 0x3f, 0x86, 0x04, 0x3d, 0x2c, 0x48, 0x65, 0x6e,
+  0x03, 0xbb, 0x79, 0x89, 0x45, 0x27, 0xc7, 0xe3, 0xf3, 0x51, 0xac, 0x63,
+  0xc3, 0x41, 0x32, 0xa6, 0x5a, 0x1b, 0x0f, 0x27, 0x03, 0xa7, 0x26, 0xf8,
+  0x59, 0x1c, 0x1c, 0x53, 0xbc, 0xb4, 0xbc, 0xf2, 0xb2, 0xb2, 0x42, 0x4a,
+  0xa5, 0x29, 0xfe, 0x91, 0xd3, 0x94, 0x25, 0xc5, 0x59, 0x43, 0x44, 0xf5,
+  0x6a, 0x32, 0xf4, 0x90, 0x14, 0x59, 0xdf, 0x41, 0x6f, 0x2e, 0x43, 0xbd,
+  0x46, 0x42, 0x7d, 0x0c, 0x6d, 0xcc, 0x2d, 0xa1, 0x27, 0x26, 0x24, 0x41,
+  0xc1, 0x6c, 0x79, 0xbb, 0xa7, 0x49, 0x06, 0xc4, 0x5d, 0xb8, 0x99, 0xe8,
+  0xe9, 0x07, 0x11, 0x15, 0x6d, 0x44, 0x67, 0x1f, 0xa5, 0x97, 0x63, 0xbb,
+  0x62, 0x81, 0x62, 0x76, 0x3f, 0x33, 0x4e, 0x29, 0x65, 0xdc, 0x88, 0xba,
+  0x33, 0xd5, 0x21, 0x39, 0x38, 0x63, 0x7f, 0x93, 0x9d, 0x75, 0x1f, 0x08,
+  0x70, 0x3e, 0x63, 0x20, 0xcc, 0xba, 0x8d, 0x84, 0xc9, 0xa0, 0x07, 0xc4,
+  0x72, 0xb8, 0xf3, 0x0f, 0x39, 0x46, 0x7a, 0x4e, 0x92, 0x5d, 0x72, 0xad,
+  0xf4, 0xd4, 0xe1, 0x0f, 0x9c, 0xf0, 0x8c, 0x38, 0xd9, 0x20, 0x86, 0xcf,
+  0x16, 0x83, 0x15, 0xb2, 0xd0, 0x2b, 0x45, 0xf2, 0xfe, 0xf8, 0xd5, 0x49,
+  0x17, 0x99, 0x07, 0x69, 0xb4, 0x76, 0xa9, 0x54, 0xd4, 0xa2, 0x4c, 0x13,
+  0x27, 0x12, 0x04, 0x7d, 0x56, 0x45, 0x6e, 0xbe, 0xef, 0xf7, 0xb5, 0x37,
+  0xdc, 0xef, 0xca, 0x89, 0xb1, 0xcd, 0xda, 0xb6, 0xaf, 0xcb, 0x67, 0x5e,
+  0xed, 0x87, 0xe4, 0x6b, 0x46, 0xf3, 0x8f, 0xd7, 0x22, 0xa7, 0xec, 0xb5,
+  0xe1, 0x4d, 0x81, 0x72, 0x2c, 0x60, 0x64, 0x46, 0x1c, 0xed, 0xa0, 0x7e,
+  0x31, 0x50, 0x2e, 0xc8, 0x01, 0x94, 0x26, 0x5e, 0x7e, 0x5d, 0x1b, 0x66,
+  0xa7, 0xac, 0xa4, 0xee, 0x71, 0xeb, 0xf5, 0xbb, 0xd3, 0x37, 0xc3, 0xf3,
+  0xd3, 0x6d, 0x22, 0x13, 0x0c, 0xdd, 0x9f, 0x22, 0x52, 0xdb, 0x16, 0xa9,
+  0x0e, 0xa5, 0x44, 0x5c, 0x6d, 0x5b, 0x35, 0x41, 0x0b, 0xba, 0xa6, 0x29,
+  0x98, 0x9e, 0xbe, 0x15, 0xb4, 0x2f, 0x29, 0x58, 0x13, 0x81, 0x2b, 0xc3,
+  0xd0, 0xd2, 0x34, 0x25, 0x85, 0xd1, 0x06, 0xb2, 0x38, 0xab, 0x43, 0x58,
+  0xf7, 0x64, 0x55, 0xdf, 0x25, 0x52, 0x5f, 0x5a, 0xd3, 0x49, 0x19, 0x5b,
+  0x2a, 0x8c, 0x0e, 0x28, 0x58, 0x9f, 0x45, 0x2a, 0xa2, 0x92, 0x3b, 0x2e,
+  0xeb, 0x6a, 0x4a, 0x73, 0x7b, 0xd3, 0xaa, 0x2a, 0x6f, 0x54, 0x6e, 0xa1,
+  0xf6, 0xdb, 0x1c, 0xa3, 0x99, 0x3a, 0x9d, 0x53, 0x75, 0xd7, 0x8b, 0xee,
+  0x22, 0x80, 0x65, 0xda, 0x31, 0x7c, 0xad, 0xfa, 0xf7, 0xa4, 0x8d, 0xb9,
+  0xa1, 0x09, 0xe0, 0xc3, 0xa6, 0x5a, 0x51, 0x4d, 0x69, 0x4f, 0x12, 0xdf,
+  0x09, 0x10, 0x1c, 0x3b, 0x49, 0xe3, 0x03, 0x01, 0x55, 0x24, 0x00, 0x1e,
+  0xb4, 0x79, 0xb3, 0x25, 0x7a, 0xda, 0x76, 0xe8, 0x0f, 0xc1, 0x0d, 0x16,
+  0xac, 0x65, 0x52, 0xea, 0xe7, 0x73, 0x97, 0x36, 0x2e, 0x88, 0x9d, 0x79,
+  0xc3, 0x9d, 0x37, 0x35, 0x05, 0x07, 0x48, 0x6a, 0xdc, 0xf9, 0x37, 0xbd,
+  0x0b, 0x4d, 0x2f, 0x45, 0x49, 0xca, 0x09, 0xa1, 0x62, 0xb6, 0x9a, 0xe2,
+  0x94, 0x28, 0xe2, 0x47, 0x7d, 0x3d, 0x27, 0x0c, 0xdc, 0xaa, 0x30, 0x0f,
+  0x34, 0xb4, 0xcb, 0x97, 0x67, 0x07, 0x4e, 0x57, 0xcb, 0xe2, 0xa7, 0x6c,
+  0xb3, 0x32, 0x52, 0x25, 0x29, 0xad, 0xcf, 0x36, 0xda, 0xea, 0x98, 0x9c,
+  0x14, 0x53, 0x72, 0xad, 0x92, 0x43, 0x76, 0x45, 0xa0, 0xf9, 0x80, 0x0b,
+  0x97, 0xb8, 0x3f, 0x21, 0x5b, 0x12, 0xf9, 0x22, 0xe8, 0xfe, 0x55, 0x5a,
+  0x1b, 0xb6, 0xd4, 0x1e, 0x71, 0x7b, 0x8d, 0x7b, 0x7a, 0xa5, 0x85, 0x15,
+  0xde, 0xe9, 0x9d, 0x0c, 0xbc, 0xd3, 0xe8, 0x39, 0xb9, 0x63, 0x91, 0xd2,
+  0xc2, 0xd7, 0x38, 0x39, 0xc3, 0xdb, 0x73, 0xe1, 0x52, 0xc0, 0x5d, 0xa4,
+  0x6c, 0xf5, 0x94, 0xda, 0x5c, 0x5f, 0xc7, 0x98, 0x53, 0x6a, 0x7b, 0x39,
+  0x36, 0x89, 0x7e, 0x34, 0xd9, 0xd2, 0xca, 0x4f, 0x5b, 0x8a, 0x74, 0x22,
+  0xbf, 0x3a, 0xb0, 0xb5, 0xa9, 0xc4, 0xd3, 0x3a, 0xc3, 0x3d, 0xfa, 0xe1,
+  0x87, 0xa4, 0xdd, 0x78, 0x79, 0x7b, 0x10, 0xd6, 0x44, 0xf8, 0x45, 0x29,
+  0xb3, 0xd2, 0x9f, 0x6e, 0x50, 0x57, 0xc7, 0x34, 0x67, 0x14, 0x02, 0xa4,
+  0xf0, 0x8f, 0x2c, 0x50, 0x44, 0x53, 0x1a, 0xeb, 0xef, 0x4a, 0x0b, 0xad,
+  0x90, 0xbf, 0xe1, 0x12, 0x38, 0xc8, 0x55, 0x86, 0x22, 0xcf, 0x30, 0xe7,
+  0x07, 0x0c, 0x57, 0x53, 0x2f, 0x38, 0xa6, 0x82, 0x9c, 0x74, 0x7f, 0xb3,
+  0x6a, 0xe7, 0x9c, 0xb9, 0xa2, 0xd8, 0x82, 0xe0, 0x92, 0xdf, 0xdb, 0x1c,
+  0x9a, 0xa1, 0x3f, 0xb0, 0x2e, 0x08, 0x7c, 0xee, 0x2a, 0xc1, 0x09, 0xb1,
+  0xd3, 0x2a, 0x13, 0x5f, 0x43, 0x6d, 0xa1, 0xf5, 0x83, 0x28, 0x32, 0x81,
+  0xf6, 0xcc, 0x39, 0x75, 0x8d, 0xfd, 0xaa, 0xa9, 0x77, 0x63, 0x1c, 0xe6,
+  0x62, 0xe7, 0xcc, 0xb8, 0x16, 0x23, 0xd0, 0xde, 0x6f, 0x4a, 0xd2, 0x9f,
+  0x08, 0x03, 0x03, 0x88, 0x71, 0x25, 0x3b, 0xb5, 0xd0, 0x37, 0x58, 0xa5,
+  0xcd, 0x1f, 0xf4, 0xde, 0x8e, 0x40, 0x90, 0x36, 0x20, 0x46, 0x54, 0x10,
+  0x0b, 0x81, 0x2a, 0x33, 0xc1, 0xc1, 0x10, 0xbe, 0x2f, 0xa5, 0xc3, 0x69,
+  0x47, 0x32, 0xf2, 0x16, 0x6b, 0x94, 0x9c, 0xf5, 0x69, 0x40, 0x51, 0x2c,
+  0x60, 0xbb, 0x04, 0x40, 0xd3, 0xee, 0xca, 0x32, 0x58, 0x0e, 0xb1, 0x19,
+  0x0b, 0x4d, 0xc7, 0xbe, 0x2d, 0x63, 0x92, 0x0e, 0xf1, 0x58, 0xdd, 0x97,
+  0x6e, 0xe2, 0xa2, 0x66, 0xd2, 0x3d, 0xc5, 0xdf, 0x30, 0x88, 0xd8, 0x8b,
+  0x56, 0x66, 0x4b, 0xce, 0x3d, 0x47, 0x09, 0x40, 0x64, 0x10, 0xb1, 0x77,
+  0xd8, 0xab, 0x30, 0x2b, 0x03, 0x4f, 0xac, 0xad, 0x52, 0xe5, 0x9b, 0x40,
+  0x68, 0x1d, 0x32, 0x72, 0x2b, 0x1f, 0x28, 0xd0, 0x95, 0xeb, 0xe4, 0xd1,
+  0xee, 0x9e, 0x31, 0x96, 0x76, 0xf7, 0xd1, 0x4d, 0xfa, 0xd1, 0xee, 0x23,
+  0x8b, 0x76, 0xd0, 0xba, 0x23, 0xfc, 0x2c, 0xdc, 0x21, 0x6c, 0x84, 0x9a,
+  0x8b, 0x74, 0x7b, 0x1b, 0xb6, 0xa9, 0xc8, 0xda, 0x75, 0x14, 0x43, 0x5b,
+  0x7b, 0x18, 0x4e, 0xd5, 0x6d, 0x24, 0xe2, 0x75, 0x61, 0x67, 0x4a, 0xae,
+  0xf4, 0xa5, 0x9a, 0x19, 0x00, 0x84, 0x8c, 0xfa, 0xda, 0x58, 0x35, 0x5d,
+  0x0c, 0x34, 0x39, 0x70, 0x1f, 0x33, 0x06, 0x87, 0x48, 0xbb, 0x22, 0xd0,
+  0x4b, 0x66, 0xa5, 0xb7, 0x7d, 0xf5, 0x07, 0xae, 0x77, 0x9f, 0xc5, 0x28,
+  0x55, 0x46, 0xa3, 0x75, 0x32, 0xda, 0x9b, 0xf5, 0x80, 0x12, 0x3e, 0x0c,
+  0x71, 0xd3, 0x26, 0x06, 0x37, 0x99, 0x7f, 0xa1, 0xf9, 0x79, 0xfc, 0xaf,
+  0x47, 0x51, 0x7b, 0x5d, 0x10, 0x50, 0xc8, 0x09, 0x6a, 0xb5, 0x38, 0xa7,
+  0xc6, 0xb5, 0x02, 0xbb, 0xec, 0x0a, 0xe1, 0xe7, 0x63, 0x9e, 0x7a, 0xf6,
+  0x0b, 0x38, 0x3f, 0x41, 0x9d, 0xcd, 0x05, 0x4c, 0x63, 0xd5, 0x4a, 0x73,
+  0x1a, 0x02, 0x23, 0x69, 0xa8, 0x0b, 0x7a, 0x21, 0x7f, 0x09, 0x1c, 0xa0,
+  0xe8, 0x5a, 0x0c, 0x75, 0x1b, 0x9d, 0x67, 0xb6, 0xad, 0x53, 0x06, 0x66,
+  0x24, 0x8d, 0x61, 0x37, 0x45, 0x54, 0x1f, 0xe9, 0x08, 0xcf, 0x5c, 0xbf,
+  0x2b, 0xe7, 0x5a, 0x42, 0xa7, 0xf7, 0x44, 0x55, 0xbd, 0x0c, 0xc6, 0xd7,
+  0xbc, 0x0d, 0x8b, 0x43, 0xe0, 0xd4, 0x6c, 0xf3, 0x58, 0x8c, 0x21, 0xd4,
+  0x9a, 0x70, 0x8f, 0xb6, 0xda, 0xea, 0xc1, 0x97, 0x39, 0x76, 0xa6, 0x93,
+  0x1c, 0x36, 0x68, 0x2f, 0x0d, 0xe7, 0x5a, 0x68, 0xf7, 0xd2, 0x56, 0x0c,
+  0x78, 0x2b, 0xd0, 0xb3, 0x9d, 0x1a, 0xf1, 0x68, 0x5e, 0x67, 0x6b, 0xa6,
+  0x1c, 0x5e, 0x01, 0x62, 0xb4, 0x66, 0x7f, 0xc4, 0xd2, 0x76, 0x39, 0xf5,
+  0x03, 0x07, 0xda, 0x5e, 0xe8, 0x72, 0x4e, 0xa8, 0x8d, 0x30, 0x25, 0xa4,
+  0xb5, 0xf4, 0xe3, 0x01, 0xfe, 0xf6, 0x64, 0xf7, 0x39, 0x93, 0xd3, 0xf1,
+  0xd1, 0xf9, 0xeb, 0xae, 0x87, 0xb0, 0x32, 0xa4, 0xcd, 0xff, 0x1d, 0x66,
+  0x69, 0x75, 0x65, 0x2c, 0x16, 0x02, 0x60, 0x1a, 0x52, 0x53, 0x8f, 0xe1,
+  0xee, 0x6e, 0x2c, 0x19, 0xe4, 0x13, 0x62, 0x4e, 0x3c, 0x7a, 0xdc, 0x8e,
+  0x13, 0x92, 0x9d, 0x30, 0xa4, 0xed, 0xee, 0x87, 0x07, 0x6e, 0x93, 0x97,
+  0x45, 0x90, 0x97, 0xc7, 0x5b, 0x59, 0x00, 0x5a, 0x4c, 0x07, 0x31, 0xd5,
+  0x41, 0xd7, 0xf4, 0xec, 0xf6, 0xae, 0xd6, 0xe4, 0x40, 0x69, 0xb7, 0xd8,
+  0x36, 0x69, 0xee, 0xb6, 0x13, 0x6e, 0x4d, 0xc9, 0x3d, 0xe4, 0x1a, 0x30,
+  0x1b, 0x58, 0x26, 0xd1, 0x6a, 0xfc, 0x5a, 0xea, 0x11, 0xab, 0x8c, 0x70,
+  0xdc, 0x58, 0x97, 0x94, 0x5e, 0x5c, 0xf7, 0x63, 0xd1, 0x61, 0x0b, 0xaa,
+  0xe9, 0x52, 0x2a, 0x53, 0xf9, 0xdf, 0x24, 0xdf, 0x5b, 0x49, 0xb9, 0xfb,
+  0x4f, 0x22, 0x1b, 0x07, 0x2d, 0xe0, 0x17, 0x6e, 0x9c, 0xd3, 0xb7, 0xd8,
+  0x2b, 0xc8, 0x1d, 0xa3, 0xb4, 0xfe, 0x31, 0x92, 0xfe, 0xad, 0x2d, 0xa2,
+  0x7f, 0xf6, 0x5a, 0x68, 0xb7, 0x47, 0xeb, 0x10, 0x2d, 0xed, 0x5b, 0x43,
+  0x28, 0xed, 0xe8, 0xe0, 0x11, 0x5f, 0xcc, 0xf7, 0x3e, 0xd8, 0x02, 0xe3,
+  0xad, 0x95, 0xae, 0x0e, 0xd2, 0x08, 0xcf, 0x7c, 0x49, 0x40, 0x1f, 0x86,
+  0x3a, 0x5d, 0xa1, 0x56, 0x94, 0x1b, 0xc2, 0x42, 0x98, 0x00, 0x44, 0x8d,
+  0xae, 0xab, 0x31, 0x5c, 0xc8, 0xe5, 0x21, 0xfa, 0xd0, 0x05, 0x99, 0x4d,
+  0x74, 0xd7, 0x1a, 0x8d, 0xc1, 0xa8, 0x09, 0xaa, 0xe3, 0x07, 0x15, 0x6f,
+  0xf0, 0xce, 0xbc, 0x7b, 0x79, 0x76, 0x9e, 0x9c, 0x9f, 0xfa, 0x6e, 0x05,
+  0xae, 0xda, 0x26, 0x03, 0x1a, 0x4d, 0x8e, 0xa2, 0x5c, 0xde, 0x4e, 0xd4,
+  0xb5, 0xb7, 0x10, 0x9b, 0x9c, 0x05, 0x16, 0x52, 0x2b, 0x81, 0xaa, 0x07,
+  0xec, 0x5b, 0x7f, 0xb7, 0x22, 0xc5, 0x6d, 0xd8, 0xbd, 0xae, 0xdb, 0x9f,
+  0x15, 0x58, 0x9b, 0x1e, 0xed, 0xa9, 0xb1, 0x9c, 0xdc, 0x9d, 0xf0, 0xf4,
+  0x62, 0xcd, 0xf7, 0x34, 0xc9, 0xd4, 0x96, 0x39, 0x72, 0x46, 0x08, 0xcd,
+  0xe5, 0x3a, 0x9d, 0xe7, 0x33, 0x6f, 0x57, 0x42, 0xc7, 0x63, 0xc1, 0xe0,
+  0xf9, 0x9c, 0x0b, 0xc3, 0xea, 0xaa, 0x3e, 0x2c, 0xd6, 0x64, 0x64, 0xcf,
+  0x68, 0x05, 0x83, 0x9f, 0x7d, 0x6a, 0x0c, 0x0b, 0x83, 0xdd, 0x86, 0x07,
+  0x82, 0xd6, 0x83, 0x0c, 0x0d, 0x43, 0xdd, 0xb3, 0x78, 0x9f, 0x94, 0xd2,
+  0xf1, 0xb0, 0xce, 0x34, 0x46, 0x6d, 0x04, 0x96, 0xe7, 0x3d, 0xf4, 0xfa,
+  0x4b, 0xef, 0xde, 0xc0, 0xb5, 0xff, 0x21, 0xed, 0x6a, 0x21, 0xed, 0x0d,
+  0xe1, 0x70, 0x43, 0x54, 0xbf, 0x8b, 0x8e, 0x94, 0x2d, 0xb3, 0xb4, 0x55,
+  0xea, 0xd1, 0x66, 0xc6, 0xd6, 0x51, 0x13, 0xbf, 0x0d, 0x51, 0x67, 0xa3,
+  0x78, 0xbb, 0xd8, 0x95, 0x86, 0xcb, 0xaf, 0x71, 0x89, 0x81, 0x1c, 0xb3,
+  0xbc, 0xae, 0x3c, 0x41, 0x65, 0x6c, 0x60, 0x39, 0x31, 0x19, 0xb0, 0x13,
+  0xce, 0x32, 0x97, 0xd2, 0xc1, 0x4b, 0xf0, 0xe0, 0x65, 0x5c, 0x07, 0x6e,
+  0xcd, 0xa3, 0xb0, 0xef, 0x73, 0xd2, 0xaf, 0x5a, 0x74, 0xdf, 0xbd, 0x7b,
+  0xfd, 0x67, 0x3d, 0x9a, 0x6d, 0x9d, 0x5e, 0xd0, 0x0c, 0xad, 0x3d, 0xdd,
+  0x49, 0xe6, 0xa5, 0xc3, 0x0a, 0x0e, 0x4a, 0x6b, 0xd7, 0xf9, 0x5f, 0x82,
+  0x64, 0x10, 0xe2, 0xe4, 0x33, 0x9e, 0x77, 0xb2, 0x45, 0xb1, 0x66, 0xf3,
+  0xdc, 0x58, 0xfc, 0x1a, 0x8f, 0x46, 0x4f, 0xe0, 0x16, 0x7c, 0xfd, 0xf2,
+  0xc9, 0xa3, 0xfd, 0xbd, 0xed, 0x51, 0xb2, 0xd5, 0x91, 0x6e, 0xdb, 0x9f,
+  0x3d, 0x68, 0xb7, 0xed, 0x79, 0x67, 0xb7, 0x4b, 0x22, 0xdd, 0xad, 0xa3,
+  0x1f, 0xce, 0xde, 0x06, 0x6b, 0x34, 0x6b, 0x0a, 0xb2, 0x09, 0xfa, 0xd6,
+  0xe8, 0xf4, 0xe6, 0xd6, 0xf8, 0x9a, 0xd7, 0x8b, 0x6e, 0xed, 0x91, 0x78,
+  0xfd, 0xeb, 0x2a, 0x27, 0x63, 0x6f, 0x83, 0xb6, 0x64, 0xe3, 0xa4, 0x2c,
+  0x66, 0xc6, 0x58, 0x3a, 0x25, 0xa0, 0xca, 0x6c, 0xc3, 0xdc, 0x82, 0x7b,
+  0x57, 0xd7, 0xcf, 0xd6, 0xdf, 0x0c, 0x70, 0x55, 0x8a, 0x30, 0xcd, 0xeb,
+  0x0d, 0x7e, 0x08, 0x4c, 0x70, 0x02, 0xf8, 0xe1, 0x32, 0xab, 0x95, 0x14,
+  0xa6, 0xa3, 0x43, 0x5a, 0xfb, 0xb6, 0xdd, 0xa2, 0x2b, 0x17, 0xdc, 0x9e,
+  0x2f, 0x10, 0xd5, 0x79, 0x60, 0x40, 0x10, 0x6f, 0x6c, 0x69, 0x70, 0x6b,
+  0xdb, 0x6b, 0x36, 0x0d, 0x04, 0x5b, 0x0e, 0xf8, 0x91, 0x5d, 0x13, 0xd1,
+  0x11, 0xf0, 0x98, 0x33, 0xae, 0x73, 0x5b, 0x1a, 0x22, 0x88, 0x02, 0x94,
+  0xf9, 0x4e, 0x88, 0x28, 0x83, 0x36, 0x84, 0x67, 0x2c, 0x10, 0x84, 0x3c,
+  0x1a, 0xee, 0x39, 0x59, 0xb4, 0xd1, 0x8e, 0xc1, 0xad, 0xc0, 0x58, 0xb3,
+  0x5b, 0x4a, 0x46, 0x26, 0x83, 0xea, 0x69, 0x68, 0x0a, 0x1c, 0xca, 0x52,
+  0xd4, 0xf2, 0x61, 0x5f, 0xab, 0x6a, 0x5b, 0x50, 0x2a, 0x25, 0x6b, 0x74,
+  0xe0, 0xc5, 0xe2, 0x5c, 0x28, 0x2e, 0xc6, 0x46, 0x39, 0x30, 0xc7, 0x1b,
+  0x26, 0x9e, 0x4d, 0x74, 0x5e, 0xa7, 0xe0, 0x9c, 0x44, 0xdb, 0x10, 0x8d,
+  0xc3, 0x4d, 0xa1, 0x78, 0x5c, 0x6f, 0xac, 0xcd, 0x8b, 0xcf, 0xf5, 0x05,
+  0xe8, 0xf2, 0x66, 0x4d, 0x44, 0xae, 0xeb, 0x87, 0xb1, 0xf1, 0xb9, 0x16,
+  0xf1, 0x3d, 0xf9, 0x3c, 0x42, 0x7c, 0x6f, 0x4f, 0xcf, 0x8f, 0x0e, 0x04,
+  0xe7, 0x4e, 0x01, 0xa1, 0x72, 0x01, 0x65, 0xe1, 0xfc, 0x4c, 0xaa, 0x78,
+  0x2a, 0xa4, 0xf2, 0x96, 0x94, 0x42, 0x3d, 0xf5, 0x41, 0xec, 0xca, 0xa3,
+  0x50, 0x82, 0xae, 0x09, 0x87, 0x3b, 0x9a, 0x20, 0x83, 0x4f, 0x73, 0xf6,
+  0x00, 0x78, 0x21, 0x76, 0x34, 0xd3, 0x13, 0x9d, 0x7f, 0x08, 0x0f, 0x04,
+  0x0c, 0x19, 0xc0, 0xb2, 0xb0, 0x7e, 0x18, 0x90, 0x90, 0x84, 0xd0, 0xe1,
+  0x74, 0xb0, 0x51, 0x86, 0x29, 0xb5, 0x14, 0x0e, 0x3b, 0xe1, 0x22, 0x4c,
+  0x4d, 0xf1, 0x19, 0xee, 0xb9, 0xa9, 0x50, 0xbc, 0x17, 0xb1, 0xe6, 0x84,
+  0x9e, 0x4a, 0xe6, 0xa2, 0xe9, 0xdd, 0x4b, 0x25, 0x1e, 0x0a, 0x72, 0x85,
+  0xf7, 0x40, 0x60, 0xb1, 0x33, 0xdc, 0xde, 0x27, 0xa5, 0x13, 0x73, 0x8f,
+  0xd4, 0x57, 0x41, 0xae, 0x15, 0x6b, 0xc2, 0x0b, 0x90, 0x53, 0x98, 0xc3,
+  0x01, 0x16, 0xd8, 0xf6, 0x0d, 0x3a, 0xaf, 0x93, 0x9a, 0x17, 0xc8, 0x5e,
+  0xcb, 0x50, 0x9d, 0xc8, 0xf5, 0x99, 0xdc, 0x0b, 0x39, 0x0e, 0x47, 0xec,
+  0x03, 0x6d, 0x88, 0x11, 0x48, 0xa2, 0x6f, 0x6a, 0x14, 0x4d, 0xbf, 0x0c,
+  0x07, 0xf2, 0x1d, 0x1e, 0x1d, 0xa4, 0xba, 0xc1, 0xde, 0x7d, 0xb2, 0xdb,
+  0xe3, 0xd0, 0x61, 0x13, 0x8d, 0x96, 0xdc, 0x49, 0xf6, 0x18, 0xee, 0x41,
+  0xb0, 0x4a, 0xe8, 0x7d, 0x55, 0x28, 0xa6, 0xe1, 0xa7, 0x8b, 0xb3, 0x2e,
+  0x06, 0x72, 0x46, 0x6b, 0x93, 0x79, 0xdf, 0xc8, 0xc1, 0xe0, 0xa1, 0xbc,
+  0xd0, 0x3c, 0x4d, 0xd6, 0xec, 0x81, 0x79, 0x34, 0x57, 0xe4, 0x66, 0x73,
+  0x33, 0x4b, 0xf4, 0x44, 0xb6, 0x19, 0x20, 0xa1, 0xb3, 0x99, 0xfc, 0x74,
+  0xa3, 0x24, 0xf1, 0x41, 0xf8, 0x28, 0x9c, 0x45, 0xb7, 0x42, 0x0e, 0x86,
+  0x76, 0x1d, 0x6e, 0xe7, 0x09, 0x81, 0x58, 0x24, 0x7f, 0x2d, 0x27, 0xe2,
+  0x89, 0x24, 0x3d, 0x35, 0x06, 0x67, 0x75, 0x81, 0x12, 0x92, 0x95, 0xa1,
+  0xb2, 0xd9, 0x8a, 0xa3, 0x0b, 0x34, 0x21, 0x29, 0x47, 0xe0, 0xfe, 0xe7,
+  0x14, 0xf5, 0x4b, 0x2e, 0xb9, 0xe9, 0x0e, 0xf2, 0xa1, 0x15, 0x8d, 0x21,
+  0x2c, 0xf9, 0xdf, 0xef, 0x82, 0x16, 0xa5, 0x53, 0x72, 0x0a, 0x9a, 0xc1,
+  0x05, 0x1f, 0x84, 0x61, 0x27, 0x5d, 0xdd, 0x46, 0x3a, 0x6d, 0x56, 0xb2,
+  0xf1, 0xdd, 0xd9, 0x95, 0x1a, 0x27, 0x30, 0xef, 0xa2, 0x19, 0x02, 0x92,
+  0xf1, 0xa6, 0x86, 0xf2, 0xd2, 0xe9, 0x9d, 0xea, 0x0b, 0x4e, 0xb8, 0x0a,
+  0xaa, 0xa9, 0x6b, 0x9d, 0x10, 0x16, 0x3a, 0xeb, 0x24, 0x28, 0xe4, 0x9f,
+  0xd7, 0xbf, 0xbc, 0x65, 0xd1, 0xc3, 0xed, 0x6a, 0xbf, 0xf1, 0x1c, 0x47,
+  0x5e, 0x14, 0x7d, 0xb5, 0x75, 0xd5, 0xb3, 0x26, 0xa5, 0x5d, 0xbe, 0x1f,
+  0x8c, 0xa6, 0xe5, 0x30, 0xe3, 0xe0, 0xb8, 0xb5, 0x00, 0x90, 0x0d, 0xa2,
+  0x4d, 0xd7, 0x8e, 0x43, 0x3d, 0xe2, 0x8d, 0x7c, 0x85, 0xf9, 0xe1, 0x16,
+  0x98, 0x95, 0x2b, 0xaa, 0xa6, 0x61, 0x1e, 0x73, 0xda, 0x64, 0xf2, 0xe4,
+  0xf3, 0x27, 0x8f, 0xb7, 0x93, 0x4e, 0x32, 0xee, 0x76, 0xc4, 0xf2, 0xe0,
+  0x1b, 0xb7, 0xaa, 0x6d, 0x91, 0xe0, 0x22, 0x87, 0x91, 0x02, 0xbd, 0x46,
+  0x2c, 0x92, 0x9c, 0x9b, 0xc7, 0x91, 0xc9, 0x80, 0x0e, 0x8c, 0xcc, 0x94,
+  0x83, 0x24, 0x1a, 0xfa, 0x18, 0x5b, 0x38, 0xc9, 0x16, 0x38, 0x7c, 0x5a,
+  0x3b, 0xe6, 0xed, 0xca, 0xe3, 0xb8, 0xde, 0x18, 0x4a, 0x9a, 0xe6, 0x7f,
+  0x6e, 0x03, 0xc6, 0x21, 0xea, 0x6e, 0x65, 0x9f, 0x33, 0x34, 0x55, 0x51,
+  0x3d, 0x8c, 0x94, 0xb8, 0xb2, 0x9d, 0xf4, 0x68, 0x68, 0xf6, 0x2a, 0x72,
+  0x81, 0x23, 0x0b, 0x9e, 0x18, 0x5a, 0x3b, 0xe0, 0x56, 0x18, 0xd6, 0xa6,
+  0xb3, 0x8f, 0x0c, 0xff, 0x0b, 0x04, 0x12, 0x79, 0x5f, 0xb2, 0x04, 0xe5,
+  0x4c, 0xa2, 0xe0, 0x18, 0x8b, 0x6c, 0xa1, 0x2d, 0xd2, 0x58, 0xf5, 0x28,
+  0x2b, 0x57, 0x9f, 0xce, 0x81, 0x4a, 0x16, 0x97, 0x48, 0x9a, 0xef, 0x43,
+  0x9f, 0x52, 0xb7, 0x5d, 0xaa, 0x48, 0x39, 0xad, 0x99, 0xf5, 0x16, 0x79,
+  0x29, 0xb5, 0x29, 0x1e, 0x55, 0xb7, 0xb6, 0x4b, 0xff, 0x6e, 0xa9, 0x32,
+  0x2c, 0xeb, 0xe4, 0xaf, 0x76, 0x36, 0xa2, 0x67, 0xf6, 0xb0, 0xa4, 0x18,
+  0x39, 0x12, 0xbe, 0xbf, 0xb0, 0x43, 0xf2, 0x3c, 0xd9, 0xc2, 0x84, 0x77,
+  0x76, 0xb6, 0xef, 0x9f, 0xb4, 0x3c, 0x79, 0xdf, 0x24, 0xcf, 0xd8, 0x11,
+  0xe7, 0x35, 0x55, 0xb9, 0xf0, 0xe6, 0x40, 0xdf, 0xf4, 0x30, 0x63, 0x06,
+  0x4c, 0x91, 0x92, 0x6d, 0x49, 0x0e, 0xf3, 0xbb, 0x48, 0x05, 0x19, 0x22,
+  0xab, 0xa9, 0x2c, 0xb0, 0xbd, 0x76, 0x71, 0xd3, 0x30, 0xa6, 0xa5, 0xb0,
+  0x10, 0x4a, 0x0f, 0x04, 0xc8, 0xe0, 0xa1, 0x21, 0xc2, 0x50, 0xdf, 0x74,
+  0xd3, 0xf2, 0x16, 0x07, 0x97, 0x4c, 0x27, 0xda, 0x84, 0x5b, 0xa8, 0x3e,
+  0x33, 0x8e, 0x4b, 0x45, 0x0a, 0x84, 0xf4, 0x69, 0x9b, 0x64, 0x0c, 0xa7,
+  0x41, 0x04, 0x17, 0x9c, 0x9f, 0x74, 0x3d, 0xa2, 0x23, 0x0d, 0x45, 0x5a,
+  0x21, 0x04, 0x1e, 0xd0, 0x70, 0xd4, 0x8f, 0x6e, 0xcd, 0x0c, 0xca, 0xed,
+  0x07, 0x41, 0x5c, 0xc1, 0x71, 0x5a, 0x85, 0xa1, 0x27, 0xcc, 0xcd, 0xd2,
+  0x37, 0x76, 0x8c, 0x11, 0xa9, 0x26, 0xfc, 0xd3, 0xd6, 0x66, 0x0e, 0xf8,
+  0x8e, 0x02, 0x0d, 0x2a, 0xa6, 0xab, 0xa3, 0x75, 0x68, 0x08, 0x67, 0x62,
+  0xf7, 0x70, 0x6d, 0x1a, 0xaa, 0xcd, 0x43, 0xe5, 0xa0, 0x08, 0x67, 0xa2,
+  0x86, 0x72, 0x56, 0x7d, 0xc3, 0x3a, 0x68, 0xdb, 0x37, 0xf6, 0xac, 0xed,
+  0x6b, 0xb0, 0xd0, 0x2c, 0x3d, 0x20, 0xa5, 0x48, 0x41, 0xae, 0x93, 0xb7,
+  0xfa, 0x58, 0xb2, 0x35, 0x3e, 0x7b, 0x7b, 0xf4, 0xf5, 0xe9, 0xf6, 0x7d,
+  0x3e, 0xf5, 0x36, 0xff, 0xb7, 0xeb, 0x4a, 0x35, 0x57, 0x5e, 0xa6, 0x0f,
+  0xeb, 0xe4, 0xeb, 0xf1, 0x78, 0x78, 0x78, 0x76, 0x8c, 0x3e, 0xaf, 0x63,
+  0xf3, 0x67, 0x4f, 0x43, 0x82, 0x11, 0xda, 0x61, 0x0c, 0xbf, 0x93, 0x02,
+  0xea, 0x5a, 0xd4, 0x8c, 0x04, 0x1e, 0x6b, 0x24, 0x67, 0x41, 0x79, 0x10,
+  0xf5, 0xce, 0x82, 0xdb, 0x60, 0xf8, 0xae, 0xc9, 0x73, 0x76, 0xbc, 0x83,
+  0x4f, 0xd1, 0x27, 0xb1, 0xa0, 0x1e, 0xf7, 0xc1, 0x2a, 0xec, 0xf2, 0x4a,
+  0x9a, 0x0f, 0x12, 0xad, 0xc1, 0xa0, 0xb5, 0x22, 0xc2, 0x58, 0x7e, 0x24,
+  0x4e, 0x5c, 0xd4, 0x3a, 0x5e, 0x7f, 0x46, 0xae, 0x5b, 0x2a, 0x30, 0x52,
+  0xe4, 0xe0, 0x8e, 0xab, 0x18, 0x26, 0x1a, 0xe3, 0x43, 0xce, 0xa9, 0x8b,
+  0xc3, 0x58, 0x13, 0x1f, 0xbb, 0x4e, 0x91, 0xcd, 0xe1, 0x2a, 0x49, 0x0e,
+  0x36, 0x39, 0xc9, 0x3a, 0x2b, 0xca, 0xd5, 0xe5, 0x15, 0x1b, 0x58, 0x6d,
+  0x3f, 0x44, 0xab, 0xdd, 0xb3, 0x6d, 0x60, 0x62, 0x26, 0x19, 0x90, 0x20,
+  0xde, 0x51, 0xbd, 0xa7, 0xca, 0x28, 0x42, 0xca, 0xea, 0x0d, 0xa7, 0xbf,
+  0xcd, 0x7e, 0x93, 0x06, 0x89, 0x6b, 0x34, 0x90, 0x09, 0x67, 0x0f, 0xc0,
+  0xed, 0x5b, 0x34, 0xf3, 0x85, 0xfc, 0x35, 0x2d, 0xee, 0xe0, 0xde, 0x97,
+  0x60, 0x17, 0x8a, 0xa0, 0x2d, 0x4d, 0xb7, 0x09, 0xbd, 0xa9, 0xa6, 0x30,
+  0xf4, 0x39, 0x0f, 0x9b, 0xab, 0x9f, 0xd7, 0xd1, 0x2c, 0xa9, 0xf4, 0x46,
+  0x13, 0x37, 0x46, 0x15, 0x94, 0xf4, 0x62, 0xa0, 0xa3, 0x0c, 0x8c, 0x39,
+  0x2c, 0xd1, 0x62, 0x51, 0x84, 0x85, 0x08, 0x22, 0xac, 0x08, 0x7d, 0x50,
+  0xb7, 0xd2, 0x49, 0x5d, 0xce, 0x57, 0x0d, 0x74, 0x01, 0x72, 0xe2, 0x53,
+  0x85, 0xd9, 0xb6, 0xeb, 0x23, 0x8f, 0x51, 0x35, 0xd3, 0x99, 0xc3, 0x46,
+  0x11, 0xf7, 0xa4, 0x6b, 0xd2, 0x3b, 0x72, 0x21, 0x2b, 0x0e, 0xa7, 0x8b,
+  0x7f, 0x82, 0x76, 0x96, 0xc7, 0xc2, 0x50, 0x4b, 0xe4, 0xe6, 0x5d, 0x2b,
+  0xe0, 0x61, 0x78, 0x7e, 0x7a, 0x56, 0xad, 0xdd, 0xd1, 0x68, 0x10, 0xb1,
+  0xee, 0x56, 0xb5, 0x86, 0xd3, 0x1a, 0x63, 0x9c, 0xad, 0x37, 0x5d, 0x5f,
+  0xf3, 0x65, 0x26, 0x74, 0x4b, 0x26, 0x77, 0xf6, 0x63, 0xfc, 0x9d, 0x14,
+  0xf9, 0x6c, 0x56, 0x11, 0x7e, 0x28, 0xbe, 0x98, 0x3b, 0x8c, 0xd1, 0xba,
+  0x8c, 0xac, 0xf6, 0x97, 0x3a, 0x43, 0x7f, 0x47, 0x10, 0x0a, 0xf6, 0x88,
+  0x71, 0x1a, 0xad, 0x43, 0xee, 0xa0, 0xdf, 0x88, 0xaf, 0x81, 0x36, 0x62,
+  0x84, 0x27, 0x02, 0x02, 0xa6, 0x6c, 0x12, 0xbb, 0x2a, 0x55, 0x8f, 0xc8,
+  0xdf, 0x96, 0x72, 0x4f, 0x59, 0x7e, 0xd9, 0xfb, 0x86, 0xad, 0x87, 0x2b,
+  0xd7, 0xb7, 0x7d, 0x76, 0xa7, 0x33, 0x7a, 0xc0, 0x86, 0xb8, 0xf5, 0xbb,
+  0x1f, 0x06, 0x96, 0x9d, 0x4d, 0x99, 0xa8, 0xa7, 0x82, 0x60, 0x39, 0x12,
+  0x2a, 0xdc, 0xfa, 0x20, 0x7f, 0xa1, 0x3b, 0xf0, 0x7d, 0x5e, 0x18, 0xcd,
+  0xb0, 0xde, 0x56, 0xe2, 0x94, 0x0c, 0xcd, 0xf0, 0xee, 0x56, 0x9b, 0xd4,
+  0xd7, 0xd8, 0x70, 0x1c, 0x97, 0xad, 0x4a, 0x8a, 0x33, 0x07, 0x18, 0x03,
+  0x56, 0xe4, 0x75, 0xf7, 0xbd, 0x5b, 0x06, 0x45, 0x64, 0x53, 0xcb, 0x74,
+  0x30, 0x06, 0xe0, 0xbb, 0x8d, 0x59, 0x50, 0xe4, 0xb7, 0x2e, 0xcb, 0xc5,
+  0x42, 0x10, 0xfa, 0x81, 0x7f, 0xc3, 0x08, 0x49, 0x5c, 0x45, 0x66, 0x17,
+  0x84, 0x5c, 0x69, 0x77, 0xb1, 0xce, 0xad, 0x27, 0xdb, 0xc9, 0x45, 0xb3,
+  0xdc, 0xda, 0xdb, 0xe6, 0x5e, 0x0e, 0x8c, 0xcf, 0xe0, 0x77, 0xf6, 0x0d,
+  0xbd, 0x38, 0x94, 0x60, 0x9b, 0xbc, 0xb4, 0x9f, 0x45, 0xec, 0x9f, 0x50,
+  0x0d, 0x51, 0xc9, 0x7a, 0x21, 0x37, 0x98, 0x37, 0xcc, 0x36, 0xd9, 0xb1,
+  0x75, 0xc2, 0x5d, 0xef, 0x00, 0x52, 0xdf, 0x96, 0x84, 0x6f, 0x8c, 0x0a,
+  0x5f, 0x63, 0x41, 0xe4, 0x8d, 0x8f, 0x24, 0x4d, 0x3d, 0x33, 0xb8, 0xfc,
+  0xdf, 0xec, 0xdc, 0x7c, 0x36, 0x24, 0x1e, 0x72, 0x59, 0x95, 0x46, 0x44,
+  0x56, 0x11, 0x10, 0x58, 0xb1, 0x29, 0xce, 0x51, 0x83, 0x76, 0x9d, 0x57,
+  0x65, 0x01, 0xa4, 0xdd, 0xeb, 0xb4, 0xca, 0x91, 0xed, 0xb2, 0xf1, 0xcd,
+  0xe9, 0x9b, 0xa3, 0x0d, 0xdf, 0x29, 0x72, 0x91, 0x6b, 0x19, 0xed, 0x55,
+  0xd8, 0x4a, 0xc0, 0x9e, 0x66, 0xcc, 0x69, 0x68, 0x44, 0xfa, 0xf4, 0xa3,
+  0x62, 0x68, 0xdc, 0x31, 0x5e, 0x62, 0x66, 0x0b, 0xcc, 0x8d, 0x2a, 0x29,
+  0x89, 0x30, 0xd2, 0x5c, 0x54, 0x29, 0x0c, 0x99, 0x70, 0xb1, 0x16, 0x50,
+  0x6a, 0x1a, 0xa2, 0x0d, 0x54, 0xe9, 0xb7, 0xb7, 0x4c, 0xbc, 0x16, 0x98,
+  0xa4, 0xe6, 0x6b, 0x7d, 0x9a, 0x73, 0xb1, 0x77, 0xc5, 0xe3, 0xe2, 0x8e,
+  0x2c, 0x9b, 0xcd, 0xb6, 0x00, 0xdc, 0xac, 0xc9, 0x18, 0x6f, 0x36, 0x75,
+  0x7b, 0x91, 0x33, 0xed, 0x78, 0x7c, 0xd8, 0x76, 0xbc, 0xe7, 0xeb, 0x4c,
+  0xd5, 0xfc, 0x09, 0x37, 0x3a, 0x0f, 0xee, 0x6e, 0xdf, 0x01, 0xdf, 0xbe,
+  0xdb, 0x26, 0x0a, 0x12, 0xe6, 0x57, 0x8d, 0xa4, 0xae, 0x4c, 0xb2, 0xdd,
+  0xb4, 0xbc, 0x9d, 0xc1, 0x42, 0x9d, 0x56, 0x42, 0xaf, 0xa2, 0xf9, 0x7c,
+  0x39, 0xcd, 0xfd, 0x34, 0x91, 0x00, 0xf5, 0x5c, 0xb5, 0xa4, 0xc2, 0xeb,
+  0xd1, 0x83, 0xd1, 0x7a, 0x51, 0x77, 0x8d, 0xe0, 0x46, 0x2e, 0xa1, 0x46,
+  0xe5, 0xf2, 0x8a, 0x80, 0xac, 0x5c, 0xd6, 0x83, 0x7c, 0x69, 0xe0, 0x43,
+  0x0a, 0x0c, 0x7a, 0x70, 0xb8, 0x5d, 0x3e, 0x96, 0xd5, 0x4b, 0x18, 0x88,
+  0x9a, 0xa1, 0x8c, 0x6d, 0xa6, 0x8c, 0xa2, 0x39, 0x87, 0xfa, 0xb1, 0xdd,
+  0x49, 0x75, 0x6c, 0xa3, 0x6c, 0xcf, 0xfc, 0x8d, 0xcd, 0x19, 0x8b, 0x22,
+  0x0b, 0xab, 0x9e, 0x15, 0x0e, 0xea, 0xc1, 0xa3, 0x38, 0xf3, 0x51, 0xeb,
+  0xda, 0xde, 0x47, 0xb3, 0x34, 0x69, 0x27, 0x52, 0xaf, 0xaa, 0x6b, 0x94,
+  0x7e, 0x4b, 0x13, 0x3a, 0xce, 0x8f, 0x77, 0xe7, 0x21, 0xe7, 0x10, 0x91,
+  0xf2, 0xde, 0x0c, 0x29, 0x77, 0xb9, 0x12, 0x78, 0xb8, 0xe4, 0x6b, 0x9e,
+  0x85, 0x9d, 0xa0, 0xb5, 0x74, 0x08, 0x05, 0x88, 0xb5, 0xd8, 0xa0, 0x52,
+  0xa5, 0xac, 0x01, 0x1e, 0xdd, 0x54, 0xe9, 0xd4, 0xfd, 0x65, 0x98, 0xd6,
+  0xd3, 0x3c, 0xd7, 0xa6, 0x66, 0x14, 0x1f, 0xcc, 0x28, 0x27, 0x3c, 0x0e,
+  0x12, 0x65, 0xcf, 0xc3, 0xf6, 0x13, 0x9a, 0x71, 0x4f, 0x1b, 0xc9, 0xd0,
+  0x4a, 0xb9, 0xdb, 0x25, 0xa5, 0x29, 0xa1, 0x42, 0x54, 0x82, 0x87, 0xb1,
+  0x3e, 0x6f, 0x8a, 0xd4, 0xdb, 0x63, 0xda, 0x1a, 0xeb, 0x7b, 0xcf, 0x37,
+  0xbf, 0x75, 0x13, 0x86, 0x04, 0xd5, 0x56, 0x37, 0x6c, 0x4a, 0xde, 0xdc,
+  0xec, 0xfb, 0xcf, 0xac, 0xcb, 0xde, 0xe8, 0x20, 0x83, 0x15, 0xe5, 0x30,
+  0x9d, 0x2f, 0xa3, 0x79, 0x9e, 0xe3, 0xed, 0x56, 0xcb, 0xd7, 0xc3, 0x93,
+  0xb3, 0xb7, 0x00, 0x8d, 0xa4, 0xee, 0x01, 0x45, 0xcd, 0x59, 0x35, 0xf4,
+  0x33, 0xaa, 0xe3, 0x28, 0x18, 0x5b, 0x15, 0xf9, 0x55, 0xb3, 0x10, 0x63,
+  0x80, 0x63, 0xe3, 0x64, 0x3e, 0xc4, 0xec, 0x2b, 0xce, 0x6c, 0x2b, 0x12,
+  0xaf, 0xcc, 0x97, 0x19, 0xbc, 0xda, 0x17, 0xdd, 0xe5, 0x98, 0xaf, 0xba,
+  0x6f, 0x6b, 0xa3, 0x11, 0x5b, 0x8c, 0xd7, 0x7e, 0xd7, 0xe2, 0x66, 0x96,
+  0x0a, 0x92, 0x19, 0xf0, 0xf3, 0x26, 0xb3, 0xe8, 0x9c, 0x62, 0xd7, 0xd9,
+  0x48, 0xb9, 0x78, 0x95, 0x24, 0xa9, 0x08, 0xe8, 0x2d, 0x8a, 0x13, 0x11,
+  0x57, 0x27, 0x6c, 0x1a, 0xa3, 0xd9, 0xd8, 0x62, 0x59, 0x74, 0x41, 0xe7,
+  0x64, 0xbb, 0xa3, 0x46, 0x68, 0x80, 0x80, 0xf8, 0x90, 0xda, 0x48, 0x3a,
+  0x91, 0xd1, 0x9a, 0x03, 0x7e, 0x3b, 0xe0, 0xaf, 0x4e, 0x56, 0xc4, 0x21,
+  0x3a, 0x5f, 0x90, 0xe3, 0x65, 0xa5, 0x89, 0x9f, 0xa0, 0xef, 0x89, 0xfb,
+  0x8b, 0x11, 0xc5, 0xa8, 0x92, 0x39, 0x4b, 0x17, 0xd4, 0xeb, 0x53, 0xab,
+  0x65, 0xc8, 0xf3, 0x4b, 0x59, 0xcd, 0xdd, 0x09, 0xaf, 0x52, 0xe1, 0x58,
+  0x2d, 0x58, 0xff, 0x4e, 0x11, 0x0d, 0x7f, 0x86, 0x38, 0xa9, 0x3f, 0x7c,
+  0xac, 0x30, 0x12, 0xaf, 0x83, 0x87, 0x20, 0x1b, 0x80, 0xe3, 0x36, 0xda,
+  0x00, 0x97, 0xd1, 0xf3, 0x79, 0x08, 0x6d, 0x54, 0x8a, 0x06, 0x6e, 0x57,
+  0xab, 0xe2, 0xa3, 0x99, 0x42, 0x88, 0x09, 0xa0, 0x19, 0xef, 0xd4, 0x02,
+  0x86, 0xfb, 0x46, 0xd3, 0x5f, 0x2c, 0xc4, 0x07, 0x8f, 0x40, 0xc0, 0xfd,
+  0xd7, 0xe4, 0xc8, 0x13, 0x24, 0xfb, 0x7e, 0x68, 0x46, 0xf6, 0x3c, 0xdb,
+  0xfb, 0x61, 0x66, 0x65, 0x37, 0x30, 0x5a, 0xd3, 0xa1, 0x27, 0x2d, 0x3a,
+  0x19, 0x12, 0x8b, 0x2f, 0x3d, 0x91, 0x22, 0x51, 0x6c, 0x45, 0x51, 0x43,
+  0x59, 0x1e, 0x59, 0x20, 0xc4, 0x5c, 0x02, 0x76, 0xb8, 0xaa, 0xb9, 0x14,
+  0x52, 0x8e, 0x95, 0xe8, 0xc1, 0x6f, 0xc1, 0x16, 0x99, 0x49, 0x1b, 0xa0,
+  0xa2, 0x8f, 0x0e, 0xda, 0x6d, 0xa0, 0x1d, 0x9e, 0x85, 0x64, 0x4e, 0x59,
+  0x9d, 0x8d, 0xba, 0x23, 0xfb, 0xdd, 0x59, 0x23, 0x7c, 0xcb, 0xe5, 0x29,
+  0x66, 0x85, 0x25, 0xb2, 0x45, 0x14, 0x7d, 0xf9, 0x93, 0xef, 0x92, 0x5b,
+  0x88, 0xb7, 0x51, 0xf6, 0x87, 0x9d, 0x4d, 0x2a, 0x1e, 0xc4, 0x0d, 0xdf,
+  0x86, 0xcc, 0xf0, 0x6d, 0x9b, 0x17, 0xba, 0x95, 0x06, 0x60, 0x02, 0x91,
+  0x1b, 0x7d, 0x2f, 0x0f, 0xa4, 0xe1, 0xa9, 0xca, 0xe4, 0xec, 0x6d, 0x08,
+  0x75, 0x20, 0xee, 0x3f, 0x62, 0xbe, 0xf7, 0x73, 0x41, 0x6b, 0xba, 0xcb,
+  0xcf, 0x7a, 0x5c, 0x5b, 0xbf, 0x9c, 0x05, 0xaa, 0x45, 0x25, 0xac, 0x2e,
+  0xe4, 0x80, 0x45, 0xc0, 0x00, 0x85, 0xee, 0x3e, 0x0d, 0x0b, 0xa4, 0x4f,
+  0x1a, 0x2b, 0xfb, 0x92, 0xb2, 0x52, 0xc8, 0x0d, 0x18, 0xb0, 0xc1, 0x53,
+  0xeb, 0x37, 0xe2, 0x82, 0x33, 0xdb, 0x6a, 0x50, 0xdf, 0x4a, 0xf0, 0x96,
+  0xb2, 0x1b, 0x45, 0x8b, 0x5e, 0xac, 0x10, 0x4d, 0x0b, 0x0a, 0x48, 0x1c,
+  0xe5, 0xa7, 0x0c, 0x75, 0x63, 0x1e, 0xba, 0x49, 0xab, 0x82, 0xf3, 0x63,
+  0x66, 0x7e, 0xde, 0xa8, 0x61, 0xa6, 0xf6, 0x6a, 0xcd, 0xb9, 0x1a, 0xa6,
+  0x0e, 0xfd, 0x46, 0x75, 0x8e, 0xa2, 0xf0, 0xa8, 0x09, 0x8b, 0x4b, 0x63,
+  0x37, 0x91, 0x2b, 0xdc, 0x7a, 0xef, 0x8d, 0x7f, 0x6d, 0xc4, 0xbb, 0xd1,
+  0x7f, 0x69, 0xda, 0x5b, 0xc6, 0x37, 0xc7, 0x92, 0x7f, 0x67, 0x67, 0x00,
+  0xd6, 0xf1, 0x40, 0x40, 0x46, 0x26, 0x88, 0x7a, 0x60, 0x17, 0xd6, 0x46,
+  0x2e, 0x7d, 0x16, 0x9c, 0x9d, 0x10, 0x5b, 0x3e, 0x8b, 0x42, 0xd0, 0xe8,
+  0xa5, 0x94, 0xa6, 0xd6, 0x12, 0x6b, 0xa2, 0x6b, 0xa4, 0xd8, 0x57, 0xc7,
+  0xaf, 0xcc, 0x42, 0xc9, 0xca, 0xb8, 0x34, 0xf7, 0xe7, 0xab, 0xbb, 0xa4,
+  0xe7, 0x5a, 0x92, 0xb2, 0xeb, 0xe2, 0xf1, 0xf0, 0xcd, 0x10, 0xc0, 0xaf,
+  0x0f, 0x4c, 0x48, 0x38, 0xa5, 0x5e, 0x23, 0x47, 0xc9, 0x95, 0x90, 0x1e,
+  0x5a, 0x71, 0x57, 0x12, 0x99, 0x02, 0xc0, 0x0a, 0xb8, 0x5a, 0x19, 0x4a,
+  0x25, 0x35, 0x85, 0x3b, 0xde, 0x71, 0x0a, 0x7a, 0x49, 0xe6, 0x01, 0xd8,
+  0x2d, 0x4d, 0xd8, 0x9b, 0x71, 0x40, 0x05, 0x1c, 0x80, 0xa8, 0x33, 0xc3,
+  0x42, 0xb9, 0xd4, 0x71, 0x52, 0x95, 0x1f, 0x33, 0xe6, 0x17, 0x30, 0x0a,
+  0x01, 0x1d, 0xc7, 0x3a, 0xb0, 0xf8, 0xd1, 0x8d, 0x84, 0xe2, 0xae, 0x36,
+  0x94, 0x6b, 0x12, 0x04, 0xcc, 0xb9, 0xc7, 0xae, 0x60, 0xce, 0x38, 0x39,
+  0x96, 0xe3, 0x75, 0x80, 0xbd, 0x68, 0x23, 0x1a, 0xbe, 0x6a, 0x53, 0x4a,
+  0x21, 0xfc, 0x0d, 0x79, 0xb6, 0x3d, 0x75, 0x9f, 0x67, 0x47, 0x8e, 0xf4,
+  0xe1, 0x9d, 0x73, 0x0d, 0x2d, 0xc1, 0x79, 0x99, 0xbc, 0x60, 0x86, 0x70,
+  0x7b, 0x87, 0x3a, 0xe8, 0xae, 0x87, 0x12, 0xdd, 0x9f, 0x87, 0x6a, 0x2d,
+  0xce, 0x12, 0xc9, 0xc1, 0x82, 0xad, 0x4d, 0x36, 0x14, 0xe7, 0x60, 0xce,
+  0x1c, 0x80, 0xb5, 0xf4, 0x80, 0x01, 0xe0, 0x4e, 0x88, 0x08, 0x4d, 0x2e,
+  0x4e, 0xeb, 0x7a, 0xe3, 0x6c, 0x51, 0x98, 0x4f, 0x74, 0x3a, 0xc0, 0x1d,
+  0x43, 0xc7, 0x06, 0xb1, 0x0f, 0xfe, 0x9d, 0xf2, 0x45, 0x8d, 0x31, 0xd2,
+  0x50, 0x0a, 0x1f, 0x7f, 0x29, 0x30, 0x17, 0xb8, 0x1b, 0xaa, 0x2d, 0x74,
+  0x63, 0x40, 0x1c, 0x0b, 0xaa, 0x45, 0xfd, 0x13, 0x7c, 0xad, 0x8e, 0xdb,
+  0xd3, 0x24, 0x47, 0x64, 0x69, 0x46, 0x8c, 0x78, 0xc5, 0x10, 0xc2, 0x1a,
+  0x73, 0x69, 0x6d, 0xc1, 0xd9, 0x76, 0xe2, 0x11, 0x49, 0x35, 0x8d, 0x4e,
+  0x16, 0xde, 0x86, 0xfa, 0x8c, 0x74, 0x6c, 0x91, 0x64, 0x35, 0x34, 0x66,
+  0x16, 0xf0, 0x6d, 0x10, 0x80, 0xf6, 0x41, 0x6d, 0xe5, 0x3a, 0xc1, 0xba,
+  0x84, 0x59, 0x73, 0x13, 0xe9, 0x65, 0x8a, 0xd9, 0x24, 0xee, 0xa1, 0x81,
+  0xf7, 0xf7, 0x83, 0xcf, 0x77, 0x15, 0xa2, 0x83, 0x02, 0x94, 0xfe, 0x33,
+  0x68, 0x5c, 0x1b, 0xd1, 0x00, 0xe9, 0x39, 0xf3, 0x53, 0xfb, 0x68, 0x4f,
+  0x0b, 0x09, 0x4a, 0x55, 0x7a, 0x44, 0x79, 0x0a, 0x6d, 0x67, 0xb5, 0xf3,
+  0x04, 0x36, 0x3d, 0x9e, 0x9f, 0x3a, 0x96, 0x59, 0x3e, 0xf3, 0x94, 0x06,
+  0x39, 0x8c, 0x63, 0x89, 0x70, 0x6f, 0xa2, 0x5f, 0x6a, 0xd4, 0x87, 0x44,
+  0xaf, 0x45, 0xfc, 0x4e, 0x9c, 0x7c, 0x28, 0xe4, 0x66, 0x3b, 0xd9, 0xa2,
+  0x8f, 0x1f, 0x93, 0x36, 0xce, 0xd1, 0x5c, 0x98, 0x0d, 0x74, 0xe1, 0xd2,
+  0x29, 0x9b, 0xbd, 0x5f, 0x7b, 0x4f, 0x9e, 0x8f, 0x1e, 0xb7, 0xee, 0x49,
+  0x33, 0x5f, 0x0c, 0x6f, 0x26, 0xf7, 0x84, 0xab, 0xce, 0x4f, 0xde, 0x20,
+  0x5d, 0x47, 0xd9, 0x0d, 0x3a, 0x49, 0x69, 0xe4, 0x80, 0x64, 0x15, 0xbb,
+  0x77, 0xaf, 0x00, 0x6d, 0x1b, 0xd6, 0x8b, 0x44, 0x22, 0x33, 0xb6, 0xe4,
+  0x5d, 0x1c, 0x35, 0x16, 0xb2, 0xd3, 0x8c, 0x88, 0x08, 0x04, 0x41, 0x56,
+  0xcc, 0xf3, 0x68, 0x65, 0xa2, 0x66, 0xf1, 0x67, 0xb7, 0xd9, 0x74, 0x85,
+  0xd4, 0x02, 0x52, 0xec, 0x09, 0x03, 0x6f, 0x7d, 0xcc, 0xc3, 0x8b, 0x73,
+  0x48, 0x64, 0xc3, 0xfc, 0xa0, 0xbb, 0x19, 0x36, 0x99, 0x4a, 0x17, 0xcf,
+  0xab, 0x0f, 0x3c, 0x9e, 0x9c, 0x0b, 0x8e, 0xdf, 0xb5, 0x7f, 0x15, 0x84,
+  0xf7, 0x51, 0xe4, 0x43, 0xca, 0x8c, 0xa1, 0xa7, 0xfc, 0xb2, 0x60, 0x75,
+  0xf1, 0x4d, 0x3e, 0xad, 0xca, 0xba, 0xbc, 0x90, 0xf2, 0x31, 0x67, 0xda,
+  0x1e, 0x1f, 0x8f, 0x93, 0x9b, 0x6c, 0xa2, 0x65, 0xfd, 0xa3, 0xd0, 0xff,
+  0xcf, 0x5c, 0x84, 0xa2, 0x5a, 0x55, 0x9e, 0x35, 0xb4, 0x6b, 0x1a, 0xc7,
+  0x26, 0x8c, 0x3b, 0x74, 0xd6, 0x14, 0x08, 0x28, 0xd8, 0x5e, 0xd4, 0x9b,
+  0x78, 0x0e, 0xd1, 0xb4, 0xcc, 0xca, 0x48, 0x2e, 0x03, 0x4f, 0x40, 0xc5,
+  0x8a, 0xb4, 0xc6, 0x26, 0xfd, 0x6b, 0x92, 0xd2, 0x94, 0xd8, 0x0a, 0xc8,
+  0xd1, 0x0e, 0x9d, 0xb4, 0x4b, 0xf1, 0x86, 0x7d, 0x24, 0x37, 0x67, 0x50,
+  0x6c, 0x67, 0x33, 0xe2, 0x6d, 0x65, 0x82, 0xba, 0x5c, 0x8b, 0x59, 0x59,
+  0x21, 0x7f, 0xcc, 0x6b, 0xc9, 0x46, 0xbd, 0x8b, 0x57, 0x15, 0xb9, 0xf9,
+  0x81, 0xbf, 0x1c, 0xf2, 0xd3, 0x9b, 0xab, 0x92, 0x3b, 0x58, 0x62, 0x9b,
+  0x9d, 0xce, 0x86, 0xba, 0x44, 0x69, 0xfa, 0x03, 0xae, 0xe0, 0xe4, 0x8d,
+  0x7f, 0x50, 0x51, 0xac, 0x56, 0x39, 0x0f, 0x57, 0x13, 0x2f, 0xf9, 0x25,
+  0xaf, 0xf2, 0xcb, 0xbe, 0xfe, 0xdc, 0x70, 0xf9, 0x01, 0x9b, 0xc6, 0x29,
+  0x46, 0x98, 0x91, 0x08, 0xcd, 0x8a, 0x6f, 0x69, 0xd0, 0x73, 0x9e, 0xfe,
+  0x15, 0x3a, 0xcf, 0x7b, 0xa8, 0xef, 0x37, 0x0e, 0x03, 0x5a, 0xdf, 0x85,
+  0x37, 0x17, 0x7b, 0x05, 0xbc, 0x2e, 0x28, 0x4e, 0x65, 0x77, 0x91, 0xf3,
+  0x00, 0x41, 0xe7, 0x3e, 0x7d, 0x3d, 0x1e, 0x64, 0xd1, 0x28, 0x64, 0x24,
+  0x97, 0xc8, 0x0b, 0xa4, 0xcb, 0xbf, 0x67, 0x38, 0x9e, 0x76, 0x94, 0xd2,
+  0xbf, 0xba, 0x25, 0xfd, 0x60, 0x7f, 0x38, 0xc9, 0x52, 0x6a, 0x11, 0xf7,
+  0xa2, 0x21, 0x85, 0x69, 0x5d, 0x15, 0x1c, 0x97, 0x24, 0x24, 0x9a, 0x38,
+  0xe9, 0x55, 0xc3, 0x7d, 0xc5, 0x43, 0x9c, 0x43, 0xe5, 0xa2, 0x13, 0x3e,
+  0x3d, 0x7c, 0x7f, 0xfe, 0x4d, 0xb2, 0x1f, 0x34, 0x0b, 0x52, 0xa0, 0x87,
+  0x0e, 0x63, 0x38, 0xef, 0x8e, 0xa1, 0x67, 0x88, 0x68, 0x8f, 0x91, 0xa8,
+  0x7f, 0x5d, 0x15, 0xd3, 0xa8, 0x93, 0x81, 0xdb, 0xba, 0x09, 0x1e, 0x0a,
+  0x6b, 0x52, 0x2c, 0x87, 0xa5, 0xbe, 0xa4, 0x95, 0x20, 0xef, 0xb7, 0x2a,
+  0x1c, 0x0e, 0xc3, 0xf0, 0xa6, 0x99, 0xb8, 0x0b, 0x9e, 0xf7, 0xf6, 0xcc,
+  0x0b, 0x26, 0x2b, 0x28, 0x68, 0x1a, 0xef, 0x46, 0x57, 0x38, 0x32, 0x60,
+  0xf8, 0x6a, 0xd9, 0x26, 0xe3, 0x50, 0x67, 0xdf, 0xbd, 0x7e, 0xd9, 0x19,
+  0xee, 0xe9, 0xb3, 0x27, 0xbb, 0x9f, 0x30, 0xcf, 0xb2, 0xa4, 0xf5, 0x88,
+  0x65, 0x16, 0x45, 0xff, 0xfa, 0xbe, 0xa2, 0xfa, 0x7b, 0x75, 0x15, 0x95,
+  0xf2, 0x90, 0x0f, 0x10, 0x52, 0x37, 0x33, 0x4a, 0xb8, 0xd3, 0xa6, 0x9a,
+  0xb4, 0x40, 0x56, 0xfa, 0xff, 0xf1, 0xcf, 0xd0, 0xba, 0xfb, 0xcb, 0x4f,
+  0x88, 0xe8, 0xa0, 0x35, 0xaf, 0x2d, 0xd4, 0x50, 0x5e, 0x53, 0x3b, 0xa9,
+  0x4c, 0xb7, 0x7a, 0xf3, 0x77, 0x9b, 0x89, 0xed, 0xa0, 0x27, 0xf6, 0x79,
+  0xbc, 0xff, 0x88, 0x46, 0xfd, 0x74, 0x76, 0x7a, 0xac, 0x15, 0xd1, 0x4e,
+  0xea, 0x29, 0x06, 0xba, 0x0b, 0xd2, 0x56, 0x6e, 0xd6, 0xd7, 0x00, 0x53,
+  0x7b, 0xc1, 0x09, 0x0e, 0xa1, 0x46, 0x3a, 0x28, 0x22, 0xc1, 0xe9, 0x71,
+  0x58, 0x01, 0xa9, 0xa4, 0x40, 0x61, 0xc8, 0x8b, 0x1e, 0xf7, 0xb3, 0xe4,
+  0x80, 0xfd, 0xc3, 0x9c, 0xc0, 0xa0, 0xb9, 0x29, 0xff, 0xd9, 0x76, 0x45,
+  0x1b, 0x45, 0x83, 0xe6, 0xfb, 0xe1, 0x77, 0x7b, 0x54, 0x84, 0xb8, 0xf1,
+  0x59, 0x48, 0x6f, 0x2b, 0x54, 0x3b, 0xf2, 0xa9, 0x5a, 0x3d, 0x69, 0x1d,
+  0xc8, 0xb8, 0x7e, 0x90, 0x50, 0x13, 0x06, 0xa4, 0x3c, 0xfe, 0x73, 0x44,
+  0xff, 0xfd, 0xcb, 0xde, 0xf0, 0xc9, 0x4f, 0xf6, 0xa3, 0xbf, 0xdb, 0xfb,
+  0xf0, 0xbb, 0xfd, 0x8d, 0x58, 0x8d, 0xa9, 0x83, 0x30, 0xf1, 0x72, 0x4c,
+  0x49, 0xaf, 0x2d, 0xee, 0xa4, 0xd0, 0x46, 0x62, 0xc4, 0xae, 0x61, 0xaf,
+  0xd9, 0x93, 0x3a, 0x86, 0xf3, 0x46, 0xae, 0xc7, 0x51, 0xd7, 0xdf, 0xaf,
+  0x6d, 0x7b, 0x95, 0x39, 0xdc, 0x94, 0xfc, 0xbe, 0x02, 0xbd, 0xd0, 0x0d,
+  0x91, 0x12, 0x90, 0x80, 0x25, 0x16, 0x59, 0x9b, 0x3c, 0x08, 0xf5, 0x49,
+  0xa1, 0x82, 0xc2, 0xdd, 0x90, 0xcc, 0x36, 0x23, 0xd6, 0xd2, 0xa4, 0xb3,
+  0xe9, 0x93, 0x89, 0xfd, 0x49, 0x91, 0x05, 0xb5, 0x9f, 0x0a, 0xd0, 0xc8,
+  0x46, 0x9c, 0xb2, 0x83, 0xd2, 0x65, 0x1d, 0x48, 0xfb, 0xb7, 0x44, 0x56,
+  0x6e, 0xe3, 0xa7, 0xb8, 0xd2, 0x41, 0xf2, 0xd8, 0x5f, 0x01, 0x78, 0xe8,
+  0xb9, 0x69, 0x58, 0xb8, 0x98, 0x01, 0xf3, 0xda, 0x45, 0xd0, 0xf0, 0x33,
+  0x89, 0x9e, 0x11, 0x52, 0x09, 0xc9, 0x3a, 0x86, 0x96, 0x09, 0x6b, 0x63,
+  0xaf, 0xb3, 0x76, 0x8b, 0x42, 0xda, 0x0f, 0x88, 0x9e, 0x89, 0x03, 0xcd,
+  0x4b, 0xeb, 0x9e, 0x0d, 0xf1, 0xb7, 0xc2, 0xdb, 0x04, 0xd9, 0x28, 0x6c,
+  0xce, 0xfa, 0x66, 0xa2, 0x43, 0x4a, 0xff, 0x6d, 0xb2, 0xa1, 0x57, 0xdb,
+  0x0f, 0x28, 0x01, 0xfc, 0x54, 0x6b, 0x76, 0x29, 0xe6, 0xa5, 0x91, 0xd9,
+  0x61, 0x10, 0x4e, 0x26, 0x41, 0x35, 0xbb, 0x33, 0xdc, 0x90, 0x11, 0xaa,
+  0x47, 0x56, 0x58, 0xa8, 0xa7, 0x40, 0xb8, 0x8d, 0x21, 0xb5, 0xcd, 0xe1,
+  0x66, 0xb2, 0x65, 0xed, 0xbb, 0x59, 0x5a, 0x5f, 0x6d, 0xc7, 0x1c, 0xc9,
+  0xce, 0x77, 0xeb, 0x18, 0x95, 0x74, 0x18, 0x82, 0xe4, 0x64, 0x0e, 0xd5,
+  0xaf, 0xc7, 0x9e, 0x32, 0x36, 0x10, 0x65, 0x79, 0x0e, 0x6d, 0x2a, 0x40,
+  0xeb, 0x27, 0x54, 0x98, 0x29, 0x18, 0xe3, 0xff, 0x29, 0x25, 0xe8, 0x61,
+  0x55, 0xbe, 0x79, 0x96, 0x13, 0xf5, 0x86, 0x5c, 0xc3, 0xe6, 0x64, 0x29,
+  0xa9, 0xe4, 0xf3, 0x79, 0x36, 0x1f, 0xe6, 0x8b, 0x45, 0x36, 0x8b, 0x64,
+  0xb3, 0x71, 0x2e, 0xd7, 0x8c, 0xb3, 0xc0, 0xf5, 0x69, 0xcf, 0xa1, 0x12,
+  0x41, 0xe2, 0xd0, 0x38, 0x5e, 0x14, 0x96, 0x56, 0xfc, 0xfc, 0xa2, 0x16,
+  0x0a, 0xca, 0x10, 0x23, 0xfa, 0x50, 0xc4, 0x10, 0xde, 0xb4, 0xd5, 0x92,
+  0x4b, 0xb1, 0xfd, 0x9e, 0x18, 0x86, 0x91, 0x9a, 0xaf, 0x0f, 0x43, 0xe7,
+  0x8e, 0x99, 0x0d, 0x81, 0xbd, 0x91, 0x85, 0xe7, 0x63, 0x16, 0xdd, 0xa4,
+  0x8c, 0xdb, 0xe6, 0x00, 0x9e, 0x08, 0xf0, 0xc3, 0xf9, 0x81, 0x58, 0xce,
+  0x76, 0x87, 0x83, 0xf1, 0x44, 0x7c, 0x45, 0x24, 0xc0, 0x2d, 0x09, 0x2f,
+  0x44, 0x32, 0x6a, 0xee, 0x88, 0xce, 0xa5, 0xc3, 0xbe, 0x8f, 0xbc, 0xf7,
+  0xec, 0xfe, 0xc7, 0xc0, 0xdb, 0x5f, 0xb5, 0x45, 0x74, 0xbb, 0x17, 0xe9,
+  0x6d, 0xdb, 0x3f, 0xd6, 0x41, 0x69, 0xf6, 0x1f, 0x8c, 0x9d, 0x48, 0x5a,
+  0x7f, 0xe4, 0x1c, 0x84, 0x59, 0xe9, 0x4e, 0xc5, 0x3b, 0x14, 0x16, 0x74,
+  0xed, 0x39, 0x0c, 0x92, 0x35, 0xe8, 0xee, 0x64, 0xfe, 0x57, 0xe5, 0xbc,
+  0x96, 0xdc, 0x01, 0x2e, 0x5f, 0xb0, 0x40, 0x1b, 0xde, 0xc6, 0xf1, 0x37,
+  0xeb, 0x9c, 0xb6, 0x28, 0x2d, 0x22, 0xd9, 0xfb, 0x75, 0x24, 0xb8, 0x4a,
+  0xba, 0x87, 0xd6, 0xd2, 0x1a, 0x6a, 0x89, 0x68, 0x0e, 0x3d, 0xfb, 0xb6,
+  0xae, 0xfd, 0x51, 0xeb, 0xc1, 0xfe, 0x34, 0x1d, 0x29, 0xf0, 0x03, 0x64,
+  0x8a, 0x5b, 0x06, 0xd3, 0x93, 0x9c, 0x0d, 0xaa, 0x72, 0xa9, 0x51, 0xe5,
+  0xac, 0x07, 0x46, 0xa5, 0xca, 0x2e, 0x09, 0x4a, 0x8c, 0xf4, 0x40, 0x42,
+  0x53, 0x31, 0x3c, 0xae, 0x88, 0x94, 0x8e, 0xaf, 0xe9, 0xd4, 0x44, 0xa9,
+  0x0e, 0xc9, 0x8b, 0xe5, 0x55, 0x65, 0x0c, 0xad, 0xb0, 0x24, 0x75, 0xfc,
+  0x4d, 0x02, 0xa7, 0x27, 0x75, 0x5b, 0xe5, 0x67, 0x2c, 0x07, 0xf6, 0xc0,
+  0x89, 0x3f, 0x21, 0x9e, 0x2e, 0xe5, 0xda, 0x0d, 0xd3, 0x7a, 0x18, 0x50,
+  0x07, 0x65, 0x5c, 0xf8, 0xfd, 0x18, 0xc9, 0xc6, 0x23, 0xd3, 0x9f, 0xd2,
+  0xbc, 0x29, 0xfb, 0xa0, 0x20, 0xcc, 0x36, 0x43, 0x1f, 0x3b, 0xa3, 0xd1,
+  0x0e, 0xe9, 0x05, 0x3b, 0xe6, 0x8f, 0xdc, 0x6b, 0x40, 0xd6, 0xed, 0x72,
+  0x6b, 0x24, 0x09, 0x7d, 0x8b, 0xbc, 0xad, 0xd2, 0x0f, 0xde, 0xeb, 0x1a,
+  0xfa, 0xb7, 0x15, 0xb2, 0xf4, 0x2b, 0x63, 0xb8, 0x55, 0x80, 0x7f, 0xc9,
+  0x16, 0x1d, 0x45, 0x34, 0xe8, 0x2d, 0xcb, 0xd1, 0xc7, 0x5a, 0xc0, 0xa5,
+  0xb4, 0x95, 0xa9, 0x43, 0xd1, 0x67, 0x47, 0x27, 0x2d, 0x22, 0x6f, 0x14,
+  0xd5, 0x13, 0xe8, 0x40, 0xe9, 0x5a, 0xd7, 0xc9, 0xe3, 0xfd, 0xce, 0xf1,
+  0xe5, 0xe6, 0xc0, 0x67, 0xc6, 0x0c, 0x05, 0x18, 0x38, 0x25, 0x2a, 0x87,
+  0xa5, 0x8e, 0x02, 0x9d, 0x1e, 0xb4, 0xb0, 0x5c, 0xd5, 0xb6, 0xcb, 0x81,
+  0x55, 0xea, 0xbd, 0x36, 0xb6, 0x52, 0x96, 0x11, 0x28, 0xa4, 0xfc, 0x11,
+  0xa4, 0x3a, 0x4a, 0x21, 0x03, 0xc8, 0x21, 0x63, 0xdd, 0x31, 0x57, 0x0e,
+  0x86, 0x4e, 0xe6, 0x8d, 0xd8, 0xc9, 0x92, 0x39, 0x15, 0x73, 0x30, 0x5a,
+  0xf7, 0x9e, 0x15, 0x5a, 0xde, 0x14, 0xcc, 0x9a, 0x09, 0x4f, 0xdd, 0xec,
+  0xfc, 0xab, 0xa3, 0x77, 0x62, 0x05, 0x00, 0x5d, 0x86, 0xd4, 0x2b, 0xd6,
+  0xa8, 0x02, 0x00, 0x7f, 0xf8, 0x0c, 0x9e, 0x3e, 0x86, 0x65, 0x4f, 0xfb,
+  0x56, 0x5f, 0xa5, 0xfb, 0x4f, 0x9e, 0xca, 0xb4, 0x15, 0x5d, 0x13, 0x2e,
+  0x89, 0x4d, 0xfe, 0xd5, 0xce, 0x0e, 0xe7, 0x14, 0x91, 0x1f, 0x28, 0x90,
+  0xbd, 0x70, 0xc9, 0xd2, 0xb3, 0x7f, 0xdc, 0x8c, 0x67, 0x13, 0xab, 0x91,
+  0xc8, 0x29, 0xbd, 0x09, 0x82, 0x74, 0x9c, 0xf5, 0xec, 0x37, 0x72, 0x1a,
+  0xf8, 0xa1, 0x2d, 0x86, 0x4a, 0x4a, 0xd7, 0xf4, 0x37, 0x12, 0x3c, 0x2a,
+  0xe9, 0xe8, 0x9a, 0x28, 0xc4, 0x04, 0x21, 0x7d, 0x7b, 0xbb, 0xc3, 0x89,
+  0xc2, 0xb7, 0x0d, 0x1c, 0xb8, 0x41, 0x65, 0x22, 0x4a, 0xe1, 0x40, 0x75,
+  0xfe, 0xc8, 0x92, 0x23, 0x9f, 0x73, 0x78, 0x07, 0x94, 0xa7, 0xb1, 0x69,
+  0xf6, 0x7e, 0xe2, 0x30, 0x57, 0x93, 0x20, 0x99, 0x4b, 0xbe, 0x69, 0x61,
+  0xb9, 0xe1, 0x3c, 0xf3, 0x52, 0xa8, 0xdd, 0x75, 0xe1, 0x72, 0x7b, 0x10,
+  0x96, 0xdb, 0x80, 0xc0, 0x49, 0xd3, 0xea, 0x03, 0x61, 0xeb, 0xee, 0x39,
+  0x66, 0x75, 0x87, 0xe0, 0x78, 0x70, 0x0f, 0x0c, 0x29, 0xec, 0x10, 0x1d,
+  0x88, 0x5d, 0x1f, 0x34, 0x5c, 0xa2, 0x50, 0xdc, 0xf3, 0xd1, 0xee, 0x81,
+  0x62, 0xb8, 0x0f, 0x92, 0xaf, 0x8b, 0x15, 0x9d, 0x07, 0x2d, 0xfa, 0xeb,
+  0xf1, 0xb7, 0x41, 0x1d, 0x2a, 0xbd, 0xf1, 0xf8, 0x11, 0xbd, 0xf1, 0x76,
+  0xcc, 0x4f, 0xdd, 0x94, 0xf3, 0x0b, 0xf3, 0x66, 0xec, 0xb9, 0x67, 0xf4,
+  0x9c, 0xa1, 0xb8, 0x59, 0x63, 0xae, 0x91, 0x10, 0xd5, 0x9a, 0x99, 0x3c,
+  0x7e, 0x1c, 0x99, 0xc9, 0xe0, 0x67, 0x7f, 0xe8, 0x14, 0x72, 0x9d, 0x88,
+  0x89, 0x1a, 0x15, 0x82, 0x70, 0x50, 0xa1, 0x63, 0x5b, 0x12, 0x7c, 0x4a,
+  0xe6, 0xcb, 0x70, 0x44, 0x0f, 0xe9, 0x62, 0x5a, 0x01, 0x59, 0xb5, 0x01,
+  0xb4, 0xcc, 0xb3, 0xfd, 0x47, 0x7b, 0x3b, 0x4f, 0x47, 0x8f, 0x47, 0xfb,
+  0x36, 0x63, 0x96, 0x61, 0x17, 0x1a, 0x24, 0x28, 0x45, 0x22, 0x43, 0xc8,
+  0x15, 0xcb, 0x0b, 0xc1, 0x55, 0xb2, 0x3f, 0x81, 0x4b, 0xd5, 0xe5, 0xca,
+  0x11, 0xd2, 0xd2, 0x9e, 0x5f, 0x7a, 0x19, 0xeb, 0xea, 0x4d, 0xbd, 0x78,
+  0x51, 0x33, 0x26, 0x6e, 0x40, 0x2a, 0x1e, 0x40, 0xc4, 0x7a, 0x92, 0xff,
+  0x6d, 0x95, 0x37, 0x46, 0x0b, 0x20, 0xa6, 0x42, 0xce, 0x4d, 0xed, 0xcb,
+  0x02, 0xbb, 0x01, 0xeb, 0xa0, 0x1b, 0x11, 0xf1, 0x1a, 0x0b, 0x66, 0x04,
+  0xed, 0xa6, 0x07, 0x11, 0x82, 0xf2, 0xce, 0x1c, 0xbc, 0x2b, 0xe1, 0x76,
+  0x68, 0xc6, 0xbe, 0x2f, 0xa6, 0xa4, 0x9c, 0x7f, 0x63, 0xcc, 0xef, 0x6b,
+  0x44, 0x54, 0xd2, 0xb8, 0xbb, 0x86, 0x11, 0x84, 0x34, 0x26, 0xa6, 0x89,
+  0x5b, 0xae, 0x75, 0x8a, 0xfc, 0x80, 0x4b, 0xc1, 0xd8, 0x39, 0x88, 0x75,
+  0x07, 0xdc, 0xc9, 0xed, 0x43, 0xeb, 0xc4, 0xa5, 0xeb, 0x08, 0x95, 0x62,
+  0x72, 0xec, 0x87, 0xa1, 0x62, 0xc1, 0xa2, 0x3c, 0xf8, 0xc3, 0x98, 0x6f,
+  0xf2, 0x1e, 0x47, 0x9d, 0xe0, 0x50, 0xb5, 0x81, 0xa8, 0xf8, 0x5f, 0xad,
+  0x5a, 0x5d, 0xa7, 0x1e, 0x05, 0x35, 0x99, 0xdd, 0x66, 0xe5, 0x32, 0xe6,
+  0x2f, 0xa6, 0xb2, 0x47, 0xbf, 0x3e, 0x95, 0xed, 0x3f, 0x94, 0xca, 0x1c,
+  0x91, 0xd1, 0x3d, 0x5b, 0x43, 0x62, 0x09, 0x5a, 0x9b, 0x43, 0xf4, 0xf6,
+  0x50, 0x99, 0x4f, 0x66, 0x92, 0xd6, 0x16, 0x12, 0x5a, 0x8b, 0xce, 0x2c,
+  0x99, 0xf5, 0x50, 0x19, 0x63, 0x50, 0x32, 0x8d, 0xad, 0x27, 0x31, 0x45,
+  0x7a, 0x48, 0xd6, 0x53, 0x59, 0x3b, 0x3e, 0xb5, 0x9e, 0xce, 0x1c, 0x39,
+  0x3c, 0x98, 0xca, 0xb4, 0xeb, 0x1d, 0x73, 0x9d, 0x1e, 0x12, 0x6b, 0xd1,
+  0xd8, 0x9a, 0x66, 0xdf, 0x7b, 0xcf, 0x63, 0x54, 0xf6, 0xe8, 0x21, 0x54,
+  0x66, 0x0e, 0x74, 0x4e, 0xa2, 0xb2, 0x45, 0x65, 0x8f, 0x7f, 0x5d, 0x2a,
+  0x23, 0x78, 0xbc, 0x6e, 0x19, 0x79, 0x72, 0xf8, 0xaf, 0x9e, 0x63, 0x8a,
+  0x61, 0x75, 0xd4, 0xa0, 0xba, 0xfa, 0xe7, 0x71, 0x8a, 0xce, 0x85, 0xbe,
+  0xf7, 0xc4, 0xda, 0xe8, 0x74, 0x7b, 0x3f, 0xfb, 0xc4, 0xf6, 0xbb, 0x96,
+  0x49, 0x95, 0x71, 0x48, 0xe3, 0x2f, 0x1a, 0x5a, 0x3a, 0xd8, 0xd9, 0xf9,
+  0x09, 0xbe, 0xb9, 0x03, 0x92, 0x7d, 0x3f, 0x75, 0x55, 0xf8, 0x98, 0x3a,
+  0x3b, 0x3e, 0x7d, 0xf9, 0xed, 0x58, 0x42, 0x23, 0xa2, 0x73, 0xa8, 0x4e,
+  0xc2, 0x36, 0xb8, 0xd1, 0x55, 0x01, 0x8c, 0x10, 0xa8, 0xb9, 0xdc, 0x29,
+  0x7d, 0x78, 0x3b, 0xd0, 0xf8, 0x04, 0x32, 0x12, 0x85, 0x19, 0x03, 0xa1,
+  0x48, 0x20, 0x07, 0x38, 0xf4, 0x21, 0xa3, 0xf6, 0xe2, 0x5d, 0xf2, 0x44,
+  0x64, 0x26, 0xd6, 0x25, 0x56, 0x78, 0x2f, 0x6e, 0x35, 0x57, 0x15, 0x6a,
+  0xbe, 0xf0, 0xe8, 0xb6, 0x46, 0x27, 0xd7, 0xcd, 0x4e, 0xe6, 0xf5, 0x0d,
+  0xc0, 0xe2, 0x97, 0x95, 0x06, 0x7c, 0x63, 0x46, 0xae, 0xfd, 0xad, 0x7a,
+  0x68, 0x63, 0x78, 0x30, 0x02, 0xf9, 0xe8, 0xed, 0x37, 0xbd, 0x17, 0x64,
+  0xd7, 0x12, 0xba, 0xbf, 0x07, 0x97, 0x46, 0xe2, 0xc1, 0x50, 0x5f, 0x81,
+  0x12, 0x28, 0xbb, 0x44, 0x1d, 0x84, 0x73, 0x1b, 0x33, 0x34, 0xca, 0xaa,
+  0x1f, 0x9b, 0x21, 0xbb, 0xfe, 0x3e, 0xfe, 0x45, 0x4a, 0xbf, 0xe1, 0xbf,
+  0x3f, 0xa1, 0xef, 0x22, 0x7e, 0x87, 0x7f, 0x5d, 0xd1, 0x3f, 0x25, 0x75,
+  0x45, 0x40, 0x0c, 0xfd, 0x53, 0x9e, 0xc6, 0x37, 0xda, 0x2f, 0x26, 0xb4,
+  0xb0, 0x27, 0x6f, 0x4b, 0x57, 0x6e, 0xeb, 0xaf, 0xda, 0x87, 0xb7, 0x0a,
+  0x32, 0xc2, 0x2c, 0x17, 0xc6, 0xc8, 0x8f, 0xe3, 0x0a, 0x57, 0xe6, 0x83,
+  0x30, 0x2b, 0xa0, 0x88, 0xdf, 0x5b, 0xd3, 0xc5, 0xe3, 0xe5, 0x00, 0x80,
+  0xc9, 0x19, 0xeb, 0x92, 0xc0, 0x8d, 0xa3, 0x64, 0xde, 0x7b, 0xbb, 0x9f,
+  0x87, 0x2e, 0x89, 0xf7, 0x5a, 0xec, 0xea, 0x90, 0x88, 0x91, 0x75, 0x83,
+  0xb2, 0x93, 0x89, 0x2b, 0xf1, 0x8a, 0x7d, 0x36, 0x52, 0x0f, 0x4b, 0xb6,
+  0xef, 0x2c, 0x63, 0x63, 0x69, 0xc2, 0x76, 0x6f, 0x58, 0x6e, 0x80, 0xf2,
+  0xfe, 0x1a, 0x92, 0x4d, 0x30, 0xf4, 0x13, 0xc9, 0x1d, 0x09, 0xf8, 0x3b,
+  0x79, 0x31, 0x34, 0xa2, 0xf9, 0xa5, 0xc3, 0x39, 0xfd, 0xfd, 0xe3, 0x5d,
+  0x3a, 0x55, 0x1d, 0x85, 0x7a, 0xc7, 0xcd, 0x4b, 0xc1, 0xb2, 0xf9, 0xfd,
+  0xa3, 0x74, 0xf4, 0x1b, 0x42, 0x0a, 0x3e, 0x69, 0x5b, 0xd1, 0xbf, 0x1b,
+  0xf8, 0xe9, 0x67, 0x93, 0xb4, 0x8a, 0xf8, 0x6c, 0x44, 0x43, 0x54, 0xf8,
+  0x21, 0x05, 0xef, 0xb1, 0x79, 0x69, 0x29, 0x1b, 0xb0, 0x28, 0x93, 0xb1,
+  0x3f, 0x34, 0x43, 0x25, 0x61, 0x37, 0x26, 0x1b, 0x07, 0xe2, 0x2c, 0x06,
+  0xf6, 0x14, 0x0c, 0xd8, 0xb3, 0xd8, 0xca, 0xd5, 0x1b, 0x70, 0xb6, 0x5b,
+  0xbc, 0x80, 0xae, 0xf5, 0x91, 0x59, 0x95, 0xde, 0x78, 0x16, 0x34, 0x43,
+  0xb8, 0x5d, 0x70, 0x3c, 0xc8, 0x66, 0xf8, 0x50, 0x35, 0x05, 0x05, 0xfc,
+  0x63, 0xda, 0x47, 0x3d, 0xad, 0x32, 0x89, 0xbc, 0x11, 0x0c, 0x30, 0x82,
+  0xfb, 0x84, 0x9f, 0x6b, 0xd4, 0x8e, 0xcb, 0x4c, 0x8b, 0xaa, 0xed, 0xaa,
+  0x15, 0x35, 0x07, 0x50, 0x39, 0xa3, 0x48, 0xbd, 0x82, 0x73, 0x67, 0x69,
+  0xf2, 0x62, 0x2a, 0xb8, 0x3a, 0xf4, 0xaa, 0x96, 0xb7, 0x4b, 0xc2, 0x36,
+  0x7a, 0x17, 0x2f, 0xd1, 0x50, 0xb6, 0xbe, 0xca, 0x97, 0x5d, 0x11, 0x3d,
+  0xfc, 0xa2, 0xfc, 0x62, 0xb8, 0x6d, 0xb1, 0x37, 0xcb, 0xeb, 0xac, 0xe6,
+  0xa6, 0xed, 0x34, 0x59, 0x4a, 0x07, 0xb8, 0x82, 0x93, 0x45, 0xc4, 0x17,
+  0x6a, 0xb9, 0x91, 0x9b, 0x2d, 0x08, 0x8b, 0x41, 0xfb, 0x31, 0x9e, 0x59,
+  0x45, 0x79, 0x00, 0xc2, 0xef, 0xc8, 0x1d, 0x63, 0x76, 0xeb, 0x82, 0x53,
+  0x3f, 0x51, 0xed, 0x4d, 0x49, 0x12, 0xd2, 0x67, 0x80, 0x63, 0x2d, 0xe5,
+  0xb2, 0x2d, 0x9b, 0x08, 0x38, 0x40, 0x79, 0xc3, 0x0b, 0x65, 0x2a, 0x7f,
+  0xba, 0xb7, 0x2c, 0xc8, 0xb2, 0x9f, 0x0b, 0x71, 0x62, 0xd0, 0xe5, 0x43,
+  0x99, 0x18, 0xf7, 0x27, 0x98, 0x5e, 0x65, 0x0b, 0x69, 0xd3, 0xd6, 0x03,
+  0xb2, 0xd0, 0x8b, 0x48, 0xd0, 0x9e, 0x13, 0xe7, 0xcd, 0x5e, 0x34, 0xcb,
+  0xd1, 0xa2, 0xfc, 0xbb, 0xd9, 0xe6, 0x94, 0xfa, 0xbe, 0x06, 0x57, 0xc2,
+  0xc8, 0xfa, 0x82, 0xcf, 0x85, 0x42, 0x67, 0x85, 0xb5, 0x2a, 0x13, 0x0f,
+  0x16, 0x55, 0x90, 0x0a, 0x05, 0x1e, 0x2f, 0x79, 0x69, 0x66, 0x7c, 0xf4,
+  0xe1, 0xfd, 0xdb, 0xf1, 0xfb, 0xb3, 0x2e, 0x61, 0x9f, 0x9d, 0xbe, 0x3b,
+  0x3f, 0x7a, 0xf5, 0xe1, 0xec, 0xdd, 0xe9, 0xf9, 0xe9, 0xcb, 0xd3, 0x93,
+  0x64, 0x6b, 0x6f, 0x7b, 0x6d, 0xf1, 0xa7, 0xf5, 0x40, 0x58, 0x58, 0x65,
+  0xe7, 0x8c, 0x65, 0x9e, 0x65, 0x67, 0xb1, 0x45, 0xeb, 0x09, 0x47, 0xfb,
+  0x5e, 0xa8, 0x4b, 0x52, 0x51, 0xd5, 0x65, 0x0c, 0x57, 0x04, 0xc4, 0x1b,
+  0xd8, 0x7a, 0x9a, 0x5c, 0xae, 0xf8, 0xa6, 0xb8, 0x64, 0x12, 0x06, 0x92,
+  0x0e, 0x14, 0x2e, 0x89, 0x63, 0xfb, 0x75, 0x83, 0x6b, 0xdd, 0x71, 0x4f,
+  0xba, 0x3a, 0x0b, 0x9d, 0x01, 0x14, 0x30, 0x47, 0x15, 0xf5, 0x7a, 0xb2,
+  0x60, 0xb0, 0x21, 0xb4, 0x69, 0xb0, 0x6f, 0xa0, 0x89, 0x8d, 0x44, 0x16,
+  0xcb, 0xc2, 0x6a, 0x74, 0x23, 0x6a, 0x80, 0x18, 0xc4, 0x87, 0xe4, 0x15,
+  0x33, 0xdf, 0x42, 0x9a, 0x6a, 0xcb, 0x44, 0x10, 0x59, 0xa6, 0xfd, 0x95,
+  0x7c, 0x07, 0xf3, 0x00, 0xfd, 0xd6, 0xe3, 0xaa, 0x28, 0x9a, 0x0c, 0xd1,
+  0x86, 0xf1, 0x32, 0x03, 0xf1, 0xdc, 0x78, 0x93, 0xa2, 0xe1, 0x48, 0x29,
+  0x03, 0xac, 0x6d, 0x84, 0xc3, 0x1e, 0x69, 0xd0, 0x92, 0x41, 0x84, 0x70,
+  0x23, 0xa1, 0xbe, 0x28, 0xfc, 0xd4, 0xd8, 0x5f, 0xcc, 0x3d, 0x84, 0xcc,
+  0x9b, 0x48, 0x51, 0xa4, 0x01, 0x9d, 0xfd, 0x80, 0x09, 0x5a, 0xa2, 0xb5,
+  0x6b, 0x6a, 0x8f, 0xbe, 0x6a, 0xa3, 0x78, 0xfa, 0xc8, 0xfe, 0x5c, 0x5b,
+  0x8a, 0x89, 0x0c, 0x2c, 0x2c, 0xd6, 0xeb, 0xce, 0xb4, 0xba, 0xec, 0xe7,
+  0xd9, 0xe8, 0xe9, 0x93, 0xd1, 0x3e, 0x61, 0xba, 0x9c, 0xce, 0x29, 0xbe,
+  0x29, 0x8a, 0x05, 0x9c, 0xcb, 0xf8, 0x80, 0x00, 0x58, 0x21, 0x43, 0xd2,
+  0xed, 0x95, 0x8c, 0x18, 0xb3, 0xa5, 0xb4, 0xd4, 0x5c, 0x25, 0x99, 0xa2,
+  0x7e, 0x48, 0xd7, 0x75, 0x41, 0xfe, 0x27, 0xcc, 0x20, 0xf3, 0x99, 0x03,
+  0x97, 0x24, 0x48, 0x69, 0x73, 0x5d, 0x5e, 0x7b, 0x6c, 0xfb, 0x92, 0x8e,
+  0x5f, 0x9e, 0x09, 0x36, 0x87, 0x43, 0x11, 0x01, 0x3b, 0xc7, 0xeb, 0x86,
+  0x54, 0x77, 0x47, 0xbb, 0xc9, 0xf8, 0xcd, 0x57, 0x02, 0x38, 0xfc, 0xd5,
+  0x38, 0xa2, 0x09, 0x40, 0x9f, 0xd7, 0xd7, 0x47, 0x7e, 0x90, 0x91, 0x16,
+  0x67, 0x66, 0xf7, 0x07, 0xfa, 0x53, 0xeb, 0x2b, 0x90, 0xc0, 0xec, 0x56,
+  0x9c, 0x04, 0x4e, 0x3e, 0xdd, 0xd2, 0x81, 0x07, 0xf2, 0x61, 0xee, 0x2b,
+  0x01, 0x3b, 0xc7, 0x96, 0x3c, 0x5a, 0x0f, 0x14, 0xb8, 0x1f, 0x5c, 0xb4,
+  0x7b, 0xaf, 0x98, 0x73, 0x76, 0xdf, 0x77, 0xc9, 0x44, 0x53, 0x52, 0xe9,
+  0xd0, 0x95, 0x69, 0x67, 0xad, 0x3b, 0x90, 0x51, 0x71, 0x21, 0x1c, 0xc3,
+  0xf3, 0xec, 0x02, 0xaa, 0x21, 0x2a, 0x7e, 0x07, 0xf8, 0x25, 0x22, 0xcd,
+  0x36, 0xa7, 0x30, 0x8e, 0x1a, 0x87, 0x63, 0x42, 0x31, 0xa6, 0xa7, 0x6d,
+  0x5b, 0x94, 0xc9, 0x4d, 0xb3, 0xb1, 0xd4, 0xa3, 0x4f, 0xca, 0xce, 0xe7,
+  0x77, 0x08, 0x43, 0xe6, 0xb7, 0x7c, 0xb7, 0xff, 0x9e, 0x55, 0x65, 0x98,
+  0xf6, 0x00, 0xe5, 0x41, 0xb1, 0xfe, 0x8c, 0xca, 0x7d, 0xa8, 0x60, 0x44,
+  0xee, 0x87, 0xf4, 0xd5, 0xe0, 0xce, 0xfd, 0x01, 0xed, 0xe1, 0x19, 0xbf,
+  0x9e, 0x95, 0x0a, 0x01, 0xa3, 0x01, 0xae, 0x66, 0xae, 0xc1, 0x6a, 0x8f,
+  0x07, 0xcc, 0xa9, 0x44, 0xf9, 0x8e, 0xab, 0x9b, 0x03, 0x13, 0x13, 0xea,
+  0xdf, 0x8c, 0x4c, 0x19, 0x97, 0x9c, 0x6d, 0xc3, 0x6b, 0xd4, 0x8a, 0xd1,
+  0xe1, 0x11, 0x8a, 0x3e, 0x17, 0xf2, 0xf4, 0x61, 0x92, 0xbc, 0xca, 0x8a,
+  0x3b, 0xe5, 0xe9, 0x2e, 0xaf, 0x10, 0xa8, 0x42, 0xd7, 0xec, 0x13, 0x77,
+  0xc0, 0x17, 0xdc, 0x72, 0xe8, 0xc2, 0x4d, 0x31, 0x9c, 0x52, 0x7b, 0xce,
+  0x31, 0xce, 0xf5, 0x85, 0xdd, 0x06, 0x30, 0xad, 0xf6, 0x5e, 0x6c, 0x01,
+  0xbb, 0x46, 0x43, 0xed, 0xf8, 0x9e, 0x8e, 0xb8, 0x76, 0x1b, 0xb6, 0x11,
+  0xd7, 0x84, 0x49, 0x57, 0xaf, 0x26, 0x7f, 0x15, 0xec, 0x74, 0x72, 0x2d,
+  0x54, 0xb2, 0x0d, 0x92, 0x87, 0x6a, 0x4e, 0xd5, 0x3c, 0xc0, 0x61, 0x2b,
+  0xc3, 0x1d, 0x8a, 0xd8, 0x70, 0x48, 0x02, 0xd0, 0x16, 0x1c, 0x6d, 0x12,
+  0xc3, 0x94, 0xa2, 0x65, 0xa3, 0x59, 0x8f, 0xca, 0xa0, 0xf7, 0x67, 0x78,
+  0x41, 0x3c, 0x95, 0xd3, 0x1b, 0x3b, 0xc2, 0x97, 0xf7, 0x92, 0x53, 0x6a,
+  0x6d, 0x82, 0x37, 0x3d, 0xde, 0x3b, 0x96, 0x72, 0xea, 0x7a, 0xf0, 0x07,
+  0xfa, 0x23, 0x5c, 0x43, 0x8b, 0x64, 0x69, 0x9b, 0x95, 0x91, 0xd0, 0xe3,
+  0x60, 0x4b, 0x78, 0xbd, 0xef, 0x03, 0x5f, 0x38, 0x31, 0xb0, 0x7e, 0x6c,
+  0x70, 0xb1, 0x87, 0x7c, 0xe0, 0x7d, 0xa1, 0x58, 0x8f, 0x4a, 0xdd, 0x4b,
+  0xdb, 0x81, 0x45, 0x0a, 0x68, 0xda, 0x86, 0x10, 0x41, 0x04, 0x2d, 0xa5,
+  0x39, 0x53, 0x7a, 0x41, 0xb9, 0xef, 0x55, 0xe6, 0xb0, 0xdd, 0xe9, 0x24,
+  0x19, 0x09, 0x4c, 0x7a, 0x50, 0x68, 0x2a, 0xf6, 0xb2, 0x6c, 0xb8, 0x1b,
+  0x06, 0x25, 0xcb, 0x93, 0xa6, 0x53, 0x91, 0x8f, 0xd0, 0xdb, 0x64, 0x55,
+  0x92, 0x69, 0x34, 0x7b, 0xf8, 0x9c, 0x70, 0x40, 0xd1, 0x42, 0x49, 0x63,
+  0xd4, 0x4e, 0x01, 0x8e, 0x32, 0xf9, 0x73, 0x9c, 0xef, 0x08, 0x97, 0x93,
+  0x0b, 0xee, 0xa5, 0xd7, 0x65, 0x4e, 0xd9, 0x72, 0x96, 0x27, 0x77, 0xc0,
+  0xa4, 0xcf, 0xc3, 0x76, 0x4e, 0x30, 0xaf, 0x6c, 0x8a, 0x99, 0xd8, 0x57,
+  0x79, 0x61, 0xf3, 0xff, 0xea, 0x56, 0x61, 0x24, 0xdf, 0x6e, 0x1d, 0x0e,
+  0x79, 0x48, 0x08, 0x57, 0x17, 0x14, 0x66, 0x2a, 0xd2, 0x46, 0xef, 0x8b,
+  0xc7, 0x6e, 0x69, 0x86, 0x64, 0xa6, 0x51, 0x1e, 0x46, 0x4a, 0x52, 0x49,
+  0x0b, 0x3f, 0x3b, 0x0d, 0x2f, 0x7c, 0xd7, 0x92, 0xa7, 0x0b, 0xd8, 0xac,
+  0x69, 0xa7, 0xe6, 0x8e, 0xee, 0x91, 0x11, 0xb7, 0x77, 0x9a, 0xa7, 0xb9,
+  0x56, 0x05, 0x5b, 0x02, 0xf4, 0xc0, 0x6c, 0x74, 0xde, 0xe0, 0xc0, 0x3a,
+  0x79, 0xe2, 0x9a, 0x3e, 0x2d, 0xfe, 0x9a, 0xc5, 0x62, 0x15, 0x36, 0xd8,
+  0x95, 0x68, 0x9d, 0x9f, 0x41, 0xc9, 0xd0, 0x77, 0x50, 0x80, 0xc4, 0x51,
+  0xc3, 0x4d, 0x80, 0xbc, 0xc6, 0x48, 0x94, 0x8e, 0x4f, 0xf1, 0xbb, 0xb8,
+  0x1f, 0x71, 0xc7, 0x82, 0x5e, 0x19, 0x82, 0x29, 0x66, 0x43, 0xc3, 0x04,
+  0x96, 0x6b, 0xfc, 0x70, 0xce, 0x55, 0xd5, 0x4a, 0x30, 0xf7, 0x51, 0x76,
+  0xf8, 0x27, 0x9c, 0xc7, 0x2a, 0x7b, 0x17, 0x16, 0x68, 0x18, 0x4d, 0xe3,
+  0x51, 0x6c, 0x27, 0x63, 0x89, 0xb2, 0x5d, 0x39, 0x4b, 0x8b, 0xea, 0xed,
+  0x0c, 0xc4, 0x3b, 0x88, 0x0d, 0xd4, 0x0d, 0xeb, 0x4b, 0x27, 0xe4, 0xbd,
+  0x93, 0x6d, 0x7b, 0xcf, 0xa5, 0xa7, 0x18, 0x11, 0x88, 0x02, 0x85, 0x94,
+  0x26, 0x78, 0x5f, 0x62, 0x53, 0x2e, 0xd8, 0x47, 0xc0, 0xd0, 0x69, 0x8f,
+  0x19, 0x7e, 0x12, 0xe1, 0x20, 0x9f, 0xdb, 0xc5, 0x4f, 0x3b, 0xe2, 0x0b,
+  0x02, 0x9f, 0xc4, 0x87, 0x68, 0x62, 0xf9, 0x5a, 0x80, 0x97, 0x9e, 0xc3,
+  0x88, 0x61, 0x1b, 0xcd, 0x3a, 0x59, 0xdf, 0xfa, 0xf3, 0x69, 0x4a, 0x81,
+  0xdb, 0x78, 0x92, 0xe9, 0x58, 0xee, 0xdb, 0x50, 0x9f, 0x22, 0x3e, 0x8d,
+  0x0b, 0x9c, 0x17, 0xbe, 0x73, 0x90, 0xbb, 0x14, 0xde, 0xae, 0x49, 0xe5,
+  0xf2, 0x3e, 0x87, 0x78, 0xbd, 0xe4, 0x6c, 0xe9, 0xb8, 0xee, 0x9f, 0xfe,
+  0x6f, 0x6f, 0x07, 0x31, 0x26, 0x4d, 0x67, 0xd5, 0xef, 0x65, 0x69, 0x7f,
+  0xe6, 0x85, 0xb9, 0xd1, 0xeb, 0x16, 0x85, 0x87, 0x7e, 0xc9, 0xa2, 0x82,
+  0x55, 0x61, 0x19, 0xd8, 0xef, 0xe0, 0x4c, 0xf8, 0x33, 0x6b, 0x62, 0x55,
+  0x3d, 0x4b, 0x30, 0x23, 0xae, 0x69, 0x55, 0xef, 0x2d, 0xc3, 0x3e, 0xf8,
+  0x73, 0x57, 0x72, 0xff, 0x36, 0x82, 0x34, 0xe8, 0xbf, 0x7f, 0x39, 0x80,
+  0x1b, 0x70, 0xf6, 0x53, 0xef, 0x3c, 0x8e, 0x06, 0x32, 0x97, 0x4f, 0x30,
+  0x8d, 0x7c, 0x79, 0x45, 0xba, 0xe5, 0x8b, 0x58, 0x65, 0x9b, 0xb7, 0x11,
+  0xf2, 0xd8, 0xaf, 0xff, 0xfd, 0x6a, 0xee, 0xf0, 0xbf, 0xd6, 0x7c, 0x5f,
+  0x1e, 0xfb, 0xd5, 0xbf, 0xcf, 0x77, 0xf7, 0x5e, 0xb7, 0x0f, 0x18, 0xd5,
+  0x2b, 0x29, 0x1f, 0x88, 0xf0, 0xc4, 0x5f, 0xcc, 0x14, 0xa5, 0x24, 0x21,
+  0xe4, 0x8a, 0xf2, 0x31, 0x7a, 0x37, 0x68, 0x10, 0x27, 0x6c, 0x11, 0x5c,
+  0xf1, 0x57, 0xe1, 0x60, 0x60, 0xcd, 0xe1, 0xe6, 0x48, 0xeb, 0xb4, 0x17,
+  0xfc, 0xe7, 0xce, 0x97, 0xb1, 0x33, 0xd2, 0x2a, 0x2f, 0x92, 0x82, 0xda,
+  0x6b, 0x0d, 0xed, 0xbb, 0x18, 0x55, 0x45, 0x34, 0x5e, 0xdb, 0x93, 0xca,
+  0x6f, 0xe6, 0x81, 0x85, 0xc6, 0x3a, 0xbc, 0xc9, 0x0e, 0x69, 0x7a, 0xb6,
+  0x86, 0x29, 0x5c, 0xce, 0x10, 0x29, 0x1e, 0x99, 0xf7, 0xc5, 0xda, 0x82,
+  0x57, 0x45, 0x5c, 0xa3, 0x7e, 0x9b, 0x6c, 0x87, 0xef, 0xfc, 0xcd, 0x40,
+  0x1a, 0xac, 0x99, 0xd1, 0x88, 0xaa, 0x24, 0x37, 0x59, 0x82, 0x1f, 0x72,
+  0x9c, 0x21, 0x0a, 0x16, 0xc3, 0xd0, 0x71, 0xe5, 0x0c, 0x17, 0x60, 0x9b,
+  0x15, 0xbe, 0x3c, 0x7d, 0xfb, 0xf6, 0xe8, 0x65, 0x37, 0x58, 0x68, 0x9b,
+  0x51, 0x3b, 0x55, 0x3f, 0xe8, 0xef, 0x8b, 0xcf, 0xa3, 0xcd, 0x8a, 0x44,
+  0x8b, 0xf8, 0xfb, 0x68, 0xfe, 0x97, 0x0a, 0x82, 0x35, 0xff, 0x52, 0xba,
+  0xd8, 0x30, 0xba, 0xb1, 0x50, 0x40, 0xa4, 0x98, 0x32, 0xa0, 0x07, 0x1f,
+  0x59, 0x83, 0x5b, 0x6b, 0xd6, 0xe8, 0x26, 0x09, 0x45, 0x14, 0x26, 0xac,
+  0xcc, 0x02, 0x95, 0x0c, 0xb3, 0xd9, 0x8e, 0x14, 0x0a, 0xe8, 0xb7, 0xfb,
+  0x68, 0x99, 0x01, 0x11, 0xa9, 0x26, 0x6b, 0x58, 0x5e, 0x70, 0xcf, 0x91,
+  0x45, 0x5a, 0x7d, 0xa4, 0x70, 0xb6, 0x57, 0x9d, 0x85, 0xfa, 0x5c, 0x60,
+  0xb3, 0xcf, 0x66, 0x31, 0xc8, 0x0e, 0x78, 0xdd, 0xfd, 0x2a, 0x14, 0x99,
+  0x8c, 0xf4, 0xe6, 0x3d, 0xd0, 0xb2, 0x59, 0x7a, 0xbd, 0xc8, 0x6e, 0xe8,
+  0x33, 0x8c, 0x53, 0x44, 0xb8, 0x1b, 0x61, 0x6b, 0x1e, 0x86, 0xd7, 0xe7,
+  0xa8, 0xc2, 0x9d, 0x40, 0x7e, 0xd0, 0x51, 0x2d, 0xb8, 0xf9, 0x0d, 0xf0,
+  0xca, 0xa9, 0x45, 0x25, 0x97, 0x5c, 0x05, 0x7b, 0xf5, 0x8d, 0x60, 0x8e,
+  0x76, 0x02, 0x6a, 0x41, 0x1e, 0xb2, 0xd4, 0xa3, 0x59, 0x1c, 0x52, 0x14,
+  0x63, 0xf4, 0xc1, 0x36, 0xf1, 0x4e, 0xe3, 0x18, 0xc8, 0x5a, 0xa9, 0x5b,
+  0x43, 0xe8, 0xe9, 0xa6, 0x3d, 0x91, 0xbf, 0x31, 0xf5, 0x10, 0xc0, 0x5d,
+  0xa1, 0x4f, 0x18, 0x26, 0xf6, 0xa4, 0x8b, 0x87, 0x0d, 0xa8, 0x38, 0x38,
+  0x49, 0x09, 0x23, 0xf2, 0x12, 0x55, 0x25, 0xf4, 0x30, 0x2e, 0x6b, 0xa0,
+  0xe6, 0x12, 0x43, 0x45, 0xdd, 0xe5, 0x40, 0xac, 0x02, 0xc4, 0x30, 0xcd,
+  0xee, 0xd2, 0x39, 0xc8, 0xde, 0x2b, 0xe6, 0x13, 0x47, 0x21, 0xe4, 0x02,
+  0x9b, 0x3f, 0x97, 0xab, 0x26, 0x08, 0x24, 0x12, 0xfa, 0x1d, 0x03, 0x9f,
+  0x7c, 0x39, 0x0c, 0xbb, 0x25, 0xa6, 0x33, 0xff, 0x4c, 0xc1, 0xc0, 0x61,
+  0xf6, 0xd7, 0xcd, 0x2c, 0xbf, 0x0f, 0x9d, 0x14, 0xe8, 0xd4, 0xb6, 0xbb,
+  0x53, 0xdb, 0xaa, 0xc1, 0x8e, 0x39, 0x52, 0xdd, 0x81, 0x5f, 0xa1, 0x4b,
+  0x0b, 0xf6, 0x15, 0x65, 0x11, 0xeb, 0x40, 0x8e, 0x00, 0x22, 0xd0, 0xe1,
+  0x7e, 0xc6, 0xca, 0x21, 0xc7, 0x56, 0xd6, 0x27, 0x94, 0x3e, 0x0e, 0x80,
+  0x93, 0xcb, 0x0f, 0xfd, 0xfa, 0x92, 0xe9, 0x63, 0x76, 0xf7, 0x20, 0x1d,
+  0xc5, 0x3e, 0xf7, 0x29, 0x66, 0x90, 0xbc, 0x30, 0xff, 0x59, 0xfb, 0xed,
+  0x87, 0x7f, 0x36, 0x80, 0x02, 0x7d, 0x98, 0xd4, 0x75, 0x30, 0xb7, 0x0e,
+  0xe7, 0x36, 0xe8, 0xe6, 0x75, 0x13, 0x56, 0x49, 0xb6, 0x24, 0xf2, 0x5a,
+  0x19, 0xec, 0xca, 0x04, 0x7d, 0x31, 0x1c, 0x09, 0xd8, 0xc7, 0x20, 0x77,
+  0x25, 0x04, 0xf5, 0x30, 0x91, 0x7c, 0xaf, 0x08, 0x6e, 0x55, 0x59, 0x77,
+  0xf3, 0xac, 0x6c, 0x91, 0xe5, 0x03, 0x37, 0x2e, 0x52, 0x72, 0x9c, 0xfc,
+  0x8b, 0xea, 0x0a, 0x2a, 0x3b, 0x5b, 0xca, 0x0a, 0xbe, 0xd2, 0xda, 0x84,
+  0x87, 0x48, 0xa5, 0x60, 0x4b, 0xba, 0xa5, 0x9a, 0xad, 0x8d, 0x0a, 0x77,
+  0x61, 0x5d, 0xd6, 0xbb, 0x23, 0x4f, 0x3c, 0xf5, 0xab, 0x5f, 0x8b, 0x87,
+  0xa7, 0x6c, 0xb7, 0x0f, 0x66, 0x6d, 0xbe, 0x36, 0xe7, 0x03, 0x73, 0x96,
+  0x75, 0x7f, 0xca, 0x76, 0x37, 0x67, 0xdb, 0xf3, 0x4a, 0x44, 0x92, 0xb6,
+  0x31, 0xda, 0xff, 0x85, 0x29, 0xdb, 0x7e, 0xc6, 0x76, 0x8a, 0x7c, 0xed,
+  0x48, 0xba, 0xb6, 0x6c, 0xb4, 0xe4, 0x6b, 0x4a, 0x73, 0xdb, 0x75, 0x29,
+  0xdb, 0x7e, 0xce, 0xf6, 0xba, 0xa4, 0x6d, 0x60, 0x06, 0xac, 0x49, 0xd9,
+  0xfe, 0x65, 0x19, 0xdb, 0x7d, 0x29, 0xdb, 0x3f, 0x3f, 0x67, 0xfb, 0xd7,
+  0x4d, 0xd9, 0xfe, 0x35, 0xb3, 0x91, 0x71, 0x7b, 0xe8, 0x44, 0xf2, 0xa9,
+  0x14, 0x9d, 0xbd, 0xe8, 0x45, 0x7c, 0xd6, 0x4a, 0xcc, 0x56, 0x02, 0x8b,
+  0x17, 0x66, 0x96, 0x61, 0x58, 0xa3, 0xf1, 0x14, 0xf7, 0xb0, 0x6e, 0x48,
+  0x68, 0x25, 0x92, 0x01, 0xe7, 0xc7, 0x81, 0x1f, 0xc5, 0x6e, 0x7a, 0x5d,
+  0xcf, 0xb9, 0x3d, 0x21, 0x95, 0x84, 0x07, 0x56, 0xa2, 0xe3, 0x33, 0x9d,
+  0xe7, 0x7e, 0x7d, 0x96, 0xd3, 0xcc, 0xeb, 0xbd, 0x47, 0xce, 0x56, 0x97,
+  0xbf, 0xac, 0xa8, 0x4e, 0x39, 0x66, 0xb7, 0x4b, 0xc1, 0xc8, 0x58, 0xb8,
+  0x8c, 0x42, 0xd0, 0xf0, 0x6b, 0xf0, 0x92, 0x66, 0xb6, 0x45, 0xab, 0x0d,
+  0x49, 0xd8, 0x36, 0xee, 0x41, 0x31, 0x0c, 0xd0, 0x09, 0xfc, 0x75, 0x40,
+  0x86, 0x50, 0xd9, 0x8b, 0x32, 0xed, 0x1a, 0xb7, 0x70, 0x6f, 0xf4, 0x88,
+  0x2b, 0xd7, 0x35, 0xa4, 0x23, 0xf3, 0x0c, 0x00, 0xc3, 0xf0, 0x7d, 0xc6,
+  0x6b, 0x77, 0x39, 0x68, 0xdc, 0x52, 0x4e, 0xdf, 0x19, 0x25, 0xef, 0x48,
+  0x7d, 0x34, 0xca, 0xba, 0x99, 0x91, 0x0c, 0x2e, 0xbf, 0x8b, 0x0d, 0xd7,
+  0xc6, 0x08, 0x36, 0xf4, 0xf3, 0xfe, 0xdd, 0x49, 0x18, 0x9f, 0x46, 0xf4,
+  0xe0, 0x60, 0x67, 0x07, 0x19, 0x52, 0x57, 0xe9, 0xed, 0xed, 0xa8, 0xce,
+  0x76, 0x66, 0xe5, 0xb4, 0xde, 0xa1, 0x13, 0xd4, 0x2f, 0x5f, 0x35, 0x8b,
+  0xf9, 0xba, 0xac, 0x87, 0xbc, 0xd6, 0x62, 0x69, 0x45, 0x44, 0x76, 0x99,
+  0x97, 0x6c, 0x6d, 0xe5, 0x7e, 0x27, 0x00, 0xf0, 0xfd, 0x00, 0x40, 0x0c,
+  0x55, 0x05, 0x66, 0x51, 0xe6, 0xff, 0xd0, 0x12, 0x87, 0x82, 0x4a, 0x91,
+  0x82, 0x72, 0xbf, 0x73, 0xb6, 0x57, 0x43, 0x10, 0x1e, 0x10, 0xdb, 0x01,
+  0x84, 0xf8, 0x9b, 0x35, 0x60, 0x61, 0xed, 0x3d, 0xd3, 0x4d, 0x6f, 0x35,
+  0xad, 0xb6, 0xe4, 0x15, 0x76, 0xd5, 0x03, 0x9d, 0xf5, 0xf4, 0xb1, 0xfe,
+  0xd5, 0x59, 0x82, 0xa1, 0x6e, 0x92, 0xf2, 0x0f, 0x51, 0x76, 0xfd, 0x47,
+  0x3f, 0xc5, 0x2d, 0xb3, 0x09, 0x79, 0x2f, 0x38, 0xdb, 0x6e, 0xed, 0x4c,
+  0xec, 0xc3, 0x9f, 0x62, 0x26, 0xc0, 0x4f, 0x88, 0xf2, 0xc7, 0xd6, 0x1c,
+  0xf0, 0xd8, 0xa7, 0xf8, 0xfe, 0xf5, 0x5e, 0xdf, 0x67, 0xf7, 0x06, 0xfc,
+  0xe9, 0xeb, 0xbd, 0x5f, 0xf1, 0xc3, 0xef, 0xad, 0xb3, 0x8a, 0xb1, 0x26,
+  0x5e, 0xd0, 0x7f, 0x0f, 0x74, 0x87, 0xd7, 0x36, 0xff, 0xeb, 0xe9, 0xac,
+  0x20, 0xfc, 0xcd, 0xc9, 0x86, 0xf5, 0x98, 0x2e, 0x31, 0x32, 0xa7, 0x7b,
+  0xc5, 0x80, 0x5d, 0x82, 0xb9, 0x8e, 0x56, 0x18, 0x43, 0x05, 0x6c, 0x64,
+  0x80, 0x1b, 0xc6, 0x1c, 0xa2, 0x4f, 0xcf, 0x4a, 0xc5, 0xc0, 0x32, 0x86,
+  0x42, 0x5c, 0x0c, 0x65, 0x08, 0xf6, 0x47, 0x00, 0x7f, 0xd8, 0x10, 0xbf,
+  0x8b, 0xb5, 0x31, 0xe7, 0xb6, 0xdd, 0x11, 0xc7, 0xd6, 0xba, 0x96, 0x12,
+  0xe0, 0xd9, 0x3e, 0x52, 0xd4, 0xc4, 0xfa, 0xd1, 0xc0, 0x57, 0xba, 0x4c,
+  0x54, 0xe1, 0x86, 0x6d, 0x46, 0xa7, 0x77, 0xc5, 0x0f, 0x92, 0x8d, 0xe1,
+  0xfb, 0xe4, 0x60, 0x23, 0xd8, 0xa2, 0xd3, 0x42, 0x5a, 0xf2, 0xc0, 0xe3,
+  0x55, 0x01, 0xa0, 0x00, 0x5d, 0xbe, 0x7c, 0xcd, 0xe4, 0x8a, 0xf0, 0xa4,
+  0x9c, 0x39, 0x61, 0xdb, 0x59, 0x5c, 0x06, 0x41, 0xb8, 0x85, 0xb6, 0x1b,
+  0xb6, 0xed, 0xa7, 0x48, 0x90, 0x90, 0xd3, 0xc6, 0x61, 0xd3, 0x43, 0x7b,
+  0xe2, 0xd6, 0x1a, 0xc4, 0x5a, 0x29, 0x98, 0x48, 0xc1, 0x4c, 0xaa, 0xc6,
+  0x0f, 0xb1, 0x20, 0x11, 0xb3, 0xad, 0xb5, 0x94, 0x6e, 0x59, 0xd6, 0x75,
+  0x3e, 0x31, 0x9c, 0xfa, 0x52, 0x58, 0x64, 0x9d, 0x71, 0x3e, 0x15, 0x97,
+  0x5e, 0xd3, 0x6e, 0xb6, 0x60, 0x19, 0xba, 0x5b, 0x84, 0x95, 0x0a, 0x1a,
+  0x84, 0x38, 0x97, 0xcc, 0xec, 0x98, 0xb1, 0x5d, 0xe7, 0x34, 0x34, 0x53,
+  0x5b, 0x9a, 0x4c, 0xaa, 0x3c, 0xbb, 0xa0, 0x54, 0x47, 0xac, 0x48, 0x14,
+  0xaf, 0x2e, 0x93, 0x9d, 0x13, 0x62, 0x0a, 0x25, 0xe9, 0x50, 0xa6, 0x6d,
+  0x4d, 0x98, 0xa0, 0x48, 0xbf, 0x46, 0xee, 0xa3, 0xcb, 0xed, 0xae, 0x32,
+  0xca, 0x1c, 0xa0, 0x76, 0xb6, 0x58, 0x44, 0xaa, 0xad, 0x91, 0x7a, 0x72,
+  0x52, 0x2b, 0x0b, 0x9d, 0x8e, 0x6a, 0x07, 0x20, 0x36, 0xe9, 0x05, 0xc5,
+  0x17, 0xd1, 0x6a, 0x53, 0xd3, 0x77, 0x1d, 0xa4, 0xc2, 0xe8, 0x93, 0xf1,
+  0x78, 0xcf, 0x0b, 0xfd, 0x33, 0xea, 0x00, 0xda, 0x9d, 0xd8, 0xd6, 0x65,
+  0xc5, 0x7b, 0x99, 0xd1, 0x01, 0xc2, 0x4d, 0x3c, 0x1d, 0xfe, 0x82, 0x7a,
+  0x16, 0x24, 0x6f, 0xbb, 0x5a, 0x4e, 0x24, 0xb1, 0x9c, 0x12, 0xe8, 0x38,
+  0x5f, 0xcd, 0xae, 0xae, 0x01, 0xea, 0x03, 0x4a, 0xf9, 0xfd, 0xc0, 0xf0,
+  0xfb, 0x40, 0xc4, 0xbb, 0x74, 0xf9, 0xfe, 0x04, 0x79, 0x2f, 0x3f, 0x1e,
+  0x05, 0x21, 0xec, 0x23, 0x4f, 0x69, 0x06, 0xa1, 0x4c, 0x26, 0x88, 0x77,
+  0xce, 0x8d, 0xd7, 0xd4, 0x78, 0x3f, 0x33, 0xde, 0xe8, 0x7c, 0x5e, 0xac,
+  0xde, 0x81, 0xb2, 0x92, 0x83, 0x35, 0x1e, 0x25, 0xc6, 0x0d, 0x45, 0x7b,
+  0x8e, 0x67, 0x41, 0x93, 0x4d, 0x9f, 0x97, 0xeb, 0x50, 0xd7, 0x79, 0x6a,
+  0x15, 0x28, 0xf7, 0x21, 0xde, 0x4f, 0x41, 0xe7, 0x4e, 0x7b, 0x6b, 0x43,
+  0x88, 0xdb, 0x33, 0x0e, 0x52, 0xa4, 0xb2, 0xf3, 0xed, 0x78, 0x1c, 0xa6,
+  0xc8, 0x17, 0xc6, 0x38, 0x29, 0x2f, 0x8b, 0xfc, 0xef, 0xc0, 0x0c, 0xa2,
+  0xa0, 0x65, 0x37, 0xbd, 0xb5, 0x55, 0xa4, 0x90, 0x78, 0x01, 0x79, 0x4a,
+  0x94, 0x08, 0xf9, 0x1b, 0x92, 0xe8, 0x20, 0x75, 0x28, 0x1d, 0x8c, 0xf0,
+  0xc5, 0x6c, 0x26, 0x20, 0x05, 0x19, 0xa4, 0x29, 0x36, 0xdb, 0x62, 0x36,
+  0x77, 0x96, 0x3f, 0x1c, 0x1c, 0xae, 0x52, 0x85, 0x60, 0x02, 0x45, 0x01,
+  0xbf, 0x78, 0xa4, 0x9f, 0x5d, 0x54, 0x80, 0xbe, 0x95, 0x3f, 0xbf, 0xa4,
+  0x20, 0x8e, 0x8e, 0x95, 0xdd, 0x32, 0x03, 0x6d, 0x49, 0x02, 0x0f, 0x56,
+  0x47, 0x72, 0xb2, 0xeb, 0x2c, 0x26, 0x5e, 0x74, 0x8f, 0x59, 0x90, 0x3e,
+  0x08, 0x85, 0x50, 0x95, 0xcf, 0x34, 0xbc, 0x5b, 0x5d, 0x00, 0x42, 0x1b,
+  0xe8, 0x78, 0x00, 0xf2, 0x20, 0xb9, 0xf1, 0x15, 0xf3, 0x5f, 0xfc, 0xe9,
+  0xe8, 0x84, 0xc3, 0xf8, 0x0b, 0x19, 0xc3, 0x05, 0xda, 0x4a, 0x20, 0xb1,
+  0x51, 0xe8, 0xc2, 0x46, 0x7b, 0xb4, 0x12, 0x1c, 0x03, 0x74, 0x77, 0xb8,
+  0x97, 0xa5, 0x1a, 0x8c, 0xbb, 0xa1, 0x61, 0x80, 0x11, 0xe1, 0xe3, 0x51,
+  0x5d, 0x95, 0xba, 0xee, 0xcd, 0xaf, 0xa9, 0x52, 0x4b, 0xa9, 0xa2, 0x4b,
+  0x5a, 0xae, 0xff, 0x82, 0x9d, 0x22, 0xa7, 0x88, 0x88, 0x8f, 0xdf, 0xf6,
+  0x15, 0x6c, 0x4b, 0x31, 0x06, 0x88, 0x0d, 0x48, 0x4b, 0xf0, 0x82, 0xa0,
+  0x05, 0xac, 0x8c, 0x4d, 0x46, 0xb8, 0xcc, 0x5c, 0x56, 0x64, 0x69, 0x65,
+  0x40, 0xdc, 0x87, 0x59, 0xae, 0x78, 0xea, 0x86, 0x4b, 0xe5, 0xb2, 0xdd,
+  0xc5, 0xde, 0xc9, 0x20, 0x3d, 0xba, 0xfc, 0x27, 0xa8, 0x44, 0xf9, 0x45,
+  0xa5, 0x28, 0x9f, 0xb6, 0x12, 0xc5, 0x49, 0x0a, 0x92, 0x3a, 0xa1, 0x9c,
+  0x40, 0x94, 0x90, 0x5c, 0x32, 0x9c, 0x06, 0x75, 0x93, 0xda, 0xc6, 0x40,
+  0xfc, 0x5a, 0x67, 0xb8, 0xf8, 0x65, 0x1a, 0x24, 0xad, 0x2c, 0xd9, 0x2c,
+  0xe0, 0x91, 0x5b, 0xc2, 0x35, 0xb6, 0x7b, 0xe0, 0x97, 0x32, 0x2a, 0x19,
+  0x9f, 0x65, 0x02, 0x9d, 0xf6, 0x07, 0xd7, 0x98, 0xe7, 0x53, 0x1b, 0x60,
+  0x7b, 0x86, 0x37, 0xbf, 0xf0, 0xe4, 0xf1, 0x9f, 0xee, 0x15, 0xc8, 0xb8,
+  0x67, 0xf4, 0x9a, 0x03, 0x28, 0xf5, 0xf8, 0x9d, 0xc3, 0x28, 0xab, 0x63,
+  0xa8, 0xaa, 0x76, 0x18, 0x61, 0x76, 0x96, 0xbd, 0x51, 0x66, 0x1c, 0xbd,
+  0xdf, 0xc3, 0xe0, 0x32, 0x8d, 0xbb, 0xaa, 0x49, 0x6c, 0x38, 0xfa, 0x24,
+  0x6b, 0x6e, 0x48, 0x8b, 0xc3, 0x7e, 0xe8, 0x46, 0x7a, 0x5c, 0x40, 0xb6,
+  0xa8, 0x37, 0xdf, 0x65, 0xc0, 0x69, 0x70, 0xc4, 0x50, 0x18, 0x66, 0xd9,
+  0xfa, 0x45, 0x34, 0xa6, 0x1b, 0xdc, 0xbe, 0x68, 0xa7, 0x2d, 0x17, 0xa2,
+  0x6e, 0xed, 0x8d, 0xe6, 0xe2, 0xb6, 0x2a, 0x86, 0x34, 0x6d, 0x49, 0x1e,
+  0xf4, 0x7d, 0xfc, 0xf6, 0x1a, 0xcb, 0xb5, 0x8d, 0x02, 0x56, 0x50, 0x60,
+  0x0c, 0xef, 0xca, 0x7c, 0xf4, 0xfc, 0x3d, 0x55, 0x2b, 0x82, 0x9d, 0x44,
+  0x71, 0xb9, 0x58, 0x68, 0xb8, 0x8f, 0xc9, 0xb0, 0x27, 0x47, 0x7e, 0x9b,
+  0x2e, 0xcd, 0xcf, 0x28, 0x24, 0x08, 0xc4, 0x5f, 0x6e, 0x0b, 0x19, 0xe4,
+  0x25, 0x80, 0x00, 0xfc, 0x89, 0x75, 0xc2, 0xe2, 0x38, 0x9f, 0xb0, 0x8f,
+  0x85, 0x18, 0x67, 0xb1, 0xee, 0x43, 0xb5, 0x20, 0x6a, 0xa9, 0x77, 0x4a,
+  0x83, 0xe4, 0x12, 0x6c, 0xf1, 0x85, 0xab, 0x80, 0x47, 0x16, 0x7c, 0x80,
+  0x4d, 0x88, 0x0c, 0xdf, 0x5a, 0x64, 0x39, 0x8a, 0xf4, 0x20, 0x85, 0xa6,
+  0x83, 0x8a, 0xac, 0x60, 0xfe, 0x92, 0xc5, 0xa7, 0x3d, 0x29, 0x9d, 0xab,
+  0xc7, 0xb6, 0x98, 0x0e, 0x5b, 0x0d, 0x13, 0x28, 0x97, 0xbe, 0x20, 0x08,
+  0xd5, 0x32, 0xbe, 0xed, 0xdc, 0xdb, 0x17, 0x99, 0x8c, 0xe5, 0x70, 0xb4,
+  0x6e, 0xad, 0xc4, 0x1e, 0x22, 0xb1, 0xb9, 0xad, 0x31, 0xd5, 0x45, 0x8c,
+  0x5f, 0x9e, 0x6d, 0x27, 0x67, 0x1d, 0x24, 0x18, 0x14, 0x25, 0x91, 0x30,
+  0xf5, 0xf9, 0xb0, 0x74, 0x4a, 0x64, 0x00, 0xd2, 0x7e, 0xd4, 0x10, 0x85,
+  0x7d, 0xb6, 0x50, 0xbb, 0x08, 0xfd, 0xfe, 0xea, 0x8c, 0xa9, 0xb3, 0x96,
+  0x43, 0x14, 0x69, 0x30, 0x28, 0x88, 0x98, 0x94, 0xfe, 0x35, 0x35, 0x16,
+  0x74, 0x49, 0xa5, 0x76, 0xdc, 0x9b, 0x4c, 0x9c, 0xf2, 0x8a, 0x7f, 0x32,
+  0x0f, 0x52, 0x1d, 0xb1, 0x11, 0x9a, 0x75, 0xee, 0xa1, 0x1f, 0x49, 0x93,
+  0xd0, 0x9a, 0xa5, 0x52, 0xa7, 0x89, 0x07, 0x78, 0xd8, 0x65, 0x56, 0x64,
+  0x31, 0x84, 0xb0, 0x3b, 0x08, 0x72, 0x21, 0xe9, 0xd9, 0xa8, 0x0b, 0x6e,
+  0xee, 0x05, 0x0d, 0x64, 0x72, 0x79, 0xe9, 0x1a, 0x19, 0xf4, 0x00, 0xa0,
+  0xb2, 0x8e, 0x47, 0x3d, 0x42, 0x89, 0x23, 0x12, 0x4c, 0x3e, 0x4c, 0x82,
+  0x69, 0xb9, 0xbc, 0xa3, 0xcd, 0x30, 0x8f, 0xd5, 0xf5, 0xd5, 0xbe, 0xe1,
+  0x1b, 0xfb, 0xa3, 0xcf, 0x19, 0x34, 0xfb, 0xca, 0x08, 0xeb, 0x08, 0x5a,
+  0x32, 0xa7, 0x8f, 0x48, 0x37, 0xe1, 0xce, 0x78, 0xa2, 0x85, 0x8f, 0x9c,
+  0xe2, 0x3f, 0xfc, 0xef, 0x44, 0x69, 0x7f, 0x5b, 0x85, 0xf1, 0xbb, 0x2d,
+  0x22, 0xa8, 0x84, 0xc8, 0x6a, 0x9b, 0x7b, 0x5f, 0x72, 0xa6, 0xc1, 0x24,
+  0x6f, 0xd0, 0x73, 0x42, 0xad, 0xc8, 0xf6, 0xd5, 0x44, 0x7f, 0xb8, 0x0a,
+  0x6f, 0x45, 0x6b, 0xe2, 0x47, 0xc9, 0x7f, 0xa7, 0x4f, 0xe9, 0xdb, 0x5c,
+  0x96, 0x81, 0x64, 0x88, 0xaf, 0x8e, 0x5e, 0x9f, 0xbe, 0x3b, 0x6a, 0x97,
+  0x2b, 0x36, 0xc0, 0xdc, 0x4a, 0x10, 0xec, 0xef, 0xce, 0x8e, 0xd1, 0x06,
+  0x05, 0x06, 0x41, 0x32, 0x15, 0x72, 0xb2, 0xfb, 0x93, 0xb3, 0xef, 0x5f,
+  0xd9, 0xd9, 0x91, 0x96, 0x50, 0x70, 0x13, 0x33, 0x19, 0x74, 0xc0, 0x3b,
+  0xdd, 0x15, 0xed, 0xa4, 0x05, 0x50, 0xaf, 0x36, 0xe9, 0xfd, 0x6e, 0xe7,
+  0x87, 0x14, 0x0b, 0x4e, 0x8c, 0xd1, 0x52, 0x7d, 0x40, 0xdc, 0xd7, 0x35,
+  0x95, 0xde, 0xdb, 0x41, 0x03, 0xbd, 0x97, 0xad, 0x23, 0x06, 0x9c, 0xe2,
+  0xd4, 0xe2, 0x34, 0x01, 0xaa, 0x1f, 0x01, 0xfd, 0x8d, 0x92, 0xf0, 0x43,
+  0x9a, 0x14, 0x82, 0xaf, 0xc4, 0x18, 0xf6, 0x15, 0x65, 0x69, 0x23, 0x10,
+  0xc2, 0xd2, 0x8e, 0x1c, 0x2e, 0x44, 0xb4, 0xb6, 0x2d, 0xdc, 0x80, 0x11,
+  0x18, 0x25, 0xdc, 0xe3, 0x6f, 0x64, 0x24, 0x42, 0x6e, 0xbe, 0xb9, 0x55,
+  0x53, 0xa1, 0x83, 0x37, 0x55, 0xfb, 0x9b, 0x44, 0x2d, 0xe8, 0xcd, 0x3f,
+  0x6c, 0xba, 0x9a, 0x10, 0x6e, 0x6f, 0x19, 0x6f, 0x07, 0xeb, 0xda, 0x03,
+  0x6e, 0xdf, 0x97, 0xbf, 0xa5, 0x2b, 0xee, 0xab, 0xc7, 0x96, 0xd0, 0x9d,
+  0xa4, 0xf4, 0xa0, 0x4b, 0xef, 0x8a, 0x91, 0x64, 0xc1, 0x38, 0x44, 0x98,
+  0xea, 0x28, 0x1a, 0xf0, 0x0b, 0x8b, 0x2f, 0x1a, 0x82, 0x5d, 0x70, 0x2d,
+  0xc3, 0x94, 0xe1, 0x20, 0x60, 0xa6, 0x7d, 0x2d, 0x10, 0x8a, 0x40, 0x2f,
+  0xb6, 0xfa, 0xae, 0x68, 0xe8, 0xa2, 0x32, 0x4f, 0x99, 0x96, 0x55, 0xb4,
+  0x00, 0x8c, 0x08, 0xc9, 0x91, 0x6e, 0x0d, 0xa4, 0x89, 0xe7, 0x4f, 0x9e,
+  0x93, 0x68, 0x47, 0x86, 0x92, 0x34, 0xcc, 0x13, 0xf8, 0x6d, 0x44, 0x4f,
+  0x19, 0x5b, 0x39, 0x00, 0xbb, 0xf6, 0xd7, 0xa0, 0x4d, 0xce, 0x27, 0xd9,
+  0x9c, 0x9b, 0xf4, 0x8d, 0xbd, 0x41, 0x42, 0x30, 0xa5, 0x35, 0x07, 0x46,
+  0x30, 0x7e, 0x86, 0x7c, 0xf2, 0xfa, 0x63, 0xb2, 0xf5, 0xef, 0xdb, 0x8c,
+  0x40, 0xa2, 0x69, 0x39, 0xe4, 0x9b, 0xcd, 0x8b, 0x55, 0x40, 0xf9, 0xe4,
+  0x9c, 0xcb, 0x5b, 0x9b, 0x8a, 0x3d, 0xc7, 0xfa, 0x26, 0xb1, 0x9a, 0xbc,
+  0xba, 0x29, 0x97, 0x09, 0x77, 0x55, 0xac, 0x82, 0xe0, 0x98, 0x1c, 0xd7,
+  0x5a, 0x3b, 0xb5, 0xbf, 0x6c, 0x21, 0x94, 0x88, 0x60, 0x42, 0xc0, 0x2c,
+  0x17, 0x87, 0xab, 0x6a, 0x57, 0xa3, 0xe4, 0x7d, 0x81, 0x44, 0x3c, 0xa1,
+  0x3b, 0x91, 0x13, 0x79, 0x61, 0xd6, 0x6f, 0x68, 0xda, 0x48, 0x8a, 0x08,
+  0x13, 0xfa, 0x5b, 0x9b, 0xf9, 0x08, 0x93, 0xec, 0x04, 0x48, 0x71, 0x69,
+  0x85, 0xad, 0x59, 0xb6, 0x95, 0x24, 0xaf, 0xc3, 0xf6, 0x93, 0xdc, 0x3e,
+  0x8f, 0x48, 0xdd, 0x2c, 0x07, 0x63, 0x53, 0x08, 0x3c, 0x9b, 0xcf, 0x87,
+  0x8c, 0x71, 0x4f, 0x88, 0xdf, 0xa4, 0xdc, 0x73, 0x95, 0x34, 0x12, 0xd8,
+  0x7c, 0xc3, 0x27, 0x90, 0x2c, 0x28, 0xf6, 0x06, 0x92, 0xac, 0xc2, 0x8d,
+  0x48, 0x29, 0x96, 0x06, 0xd6, 0xa8, 0x72, 0xcf, 0x39, 0x43, 0xb0, 0x39,
+  0xbc, 0xa4, 0xbe, 0x86, 0x71, 0x21, 0x5c, 0xec, 0xf4, 0xea, 0xb2, 0x5a,
+  0x72, 0xd3, 0xca, 0x58, 0x47, 0x4d, 0x5f, 0xeb, 0xe6, 0x47, 0x95, 0x28,
+  0xea, 0xac, 0xe1, 0xc9, 0xf0, 0xbb, 0xc7, 0xaf, 0xf4, 0x2a, 0x5a, 0x25,
+  0x83, 0x4c, 0xbf, 0xf8, 0x70, 0xf6, 0x31, 0xdc, 0x47, 0x27, 0x35, 0xec,
+  0x50, 0xce, 0xc4, 0x98, 0x28, 0x34, 0x39, 0x7e, 0x17, 0x1f, 0x4e, 0x46,
+  0x61, 0x55, 0x95, 0xc7, 0xd0, 0x81, 0x41, 0x2a, 0xc6, 0x12, 0xcd, 0xa9,
+  0xff, 0x18, 0x11, 0xc3, 0x65, 0x56, 0xd9, 0xcf, 0x84, 0x49, 0x92, 0x57,
+  0x8b, 0x72, 0x46, 0x35, 0x5d, 0xd9, 0xfd, 0x7b, 0x41, 0x4f, 0xba, 0xfb,
+  0x26, 0xe5, 0x70, 0xb5, 0x85, 0xba, 0xe5, 0x8a, 0x3d, 0xea, 0x45, 0xd0,
+  0xd4, 0xb2, 0x33, 0xf1, 0xe1, 0xdc, 0x52, 0xb5, 0x89, 0xac, 0xbc, 0xe9,
+  0x2f, 0xa1, 0x48, 0xca, 0x69, 0xe3, 0xad, 0x80, 0x1e, 0x88, 0x0f, 0xc7,
+  0x8c, 0x35, 0xb2, 0x32, 0x2a, 0x90, 0x82, 0x45, 0xb9, 0x7e, 0x65, 0xfc,
+  0x60, 0x70, 0xc8, 0xe6, 0x87, 0x0e, 0x13, 0xb8, 0x75, 0xc2, 0xfd, 0x2b,
+  0x8b, 0x9d, 0x30, 0x66, 0xd0, 0x3d, 0x60, 0x87, 0x53, 0x8e, 0xc7, 0x87,
+  0xf1, 0xe1, 0xec, 0x09, 0x0b, 0x08, 0xf9, 0x9a, 0x03, 0x96, 0xaf, 0x04,
+  0xbb, 0x30, 0x2f, 0x8c, 0x7a, 0xb7, 0xaa, 0xa6, 0xd9, 0x07, 0xcc, 0xad,
+  0x49, 0xab, 0xcb, 0xac, 0xf9, 0xb0, 0x7e, 0x43, 0xe6, 0x82, 0xa6, 0x70,
+  0xb7, 0x40, 0x17, 0x78, 0xcb, 0x2c, 0x04, 0xf7, 0x37, 0x15, 0x74, 0x01,
+  0xa3, 0xe0, 0xe1, 0xf7, 0x6c, 0xcd, 0xf4, 0x90, 0xbd, 0xfb, 0x5e, 0xa2,
+  0x50, 0x3a, 0x46, 0x5c, 0xe6, 0x85, 0x82, 0xd8, 0x08, 0x8f, 0xf1, 0xa6,
+  0x98, 0xc4, 0x90, 0x97, 0xd6, 0x85, 0xab, 0x16, 0x1f, 0xa9, 0xc4, 0xca,
+  0x2a, 0x01, 0x1f, 0x22, 0xbd, 0x5b, 0x7c, 0x3a, 0xe6, 0xc7, 0xf5, 0xb8,
+  0x79, 0x4d, 0x52, 0x43, 0x68, 0x9b, 0x05, 0xfb, 0x27, 0x9d, 0x84, 0xa5,
+  0xd0, 0x9e, 0x40, 0xd4, 0x0f, 0xda, 0x1b, 0xd9, 0x9d, 0xdd, 0xf2, 0x66,
+  0x66, 0x1d, 0x31, 0xe6, 0xaf, 0xfa, 0x5d, 0x15, 0xee, 0xe8, 0xed, 0xa1,
+  0xfd, 0xb8, 0x29, 0x81, 0x89, 0x07, 0xbb, 0x50, 0x64, 0xf2, 0xde, 0x4f,
+  0x17, 0x4d, 0xa8, 0xff, 0x04, 0x1f, 0xaf, 0x32, 0xce, 0x7b, 0xc5, 0xf6,
+  0xca, 0x61, 0xf4, 0x6f, 0x8d, 0x3c, 0xed, 0xa6, 0xc8, 0xdc, 0xdd, 0xb1,
+  0xae, 0x2a, 0xb2, 0x45, 0xfd, 0xec, 0x4e, 0xbe, 0xda, 0xb9, 0x0e, 0xb3,
+  0x8c, 0xfc, 0xb2, 0x42, 0x08, 0x94, 0xb0, 0xc5, 0x03, 0x29, 0xd7, 0x5b,
+  0x47, 0x46, 0xbd, 0x7b, 0x5c, 0x2d, 0xee, 0xb9, 0xe2, 0xe6, 0x01, 0xb7,
+  0x2a, 0xc6, 0xe1, 0xb0, 0xab, 0x0a, 0xee, 0xa5, 0x5c, 0xe2, 0x9e, 0x9d,
+  0xef, 0x9b, 0x41, 0x8b, 0x06, 0xd7, 0xcd, 0xc4, 0xa7, 0x3e, 0x7f, 0x32,
+  0x6e, 0x6b, 0x8d, 0x2a, 0xd7, 0xa0, 0x19, 0xb8, 0xce, 0x2c, 0x3e, 0x9c,
+  0x25, 0x4f, 0x7d, 0x4f, 0xb6, 0x67, 0xe0, 0xf9, 0x2e, 0xb9, 0xd1, 0x8b,
+  0x31, 0x1b, 0x43, 0xda, 0xd0, 0xeb, 0xfd, 0xb3, 0xd8, 0x03, 0xd9, 0xe7,
+  0xf3, 0xc2, 0xb7, 0xc8, 0xe9, 0x8b, 0x46, 0xf2, 0xae, 0x29, 0x65, 0xf1,
+  0x9a, 0x43, 0xd8, 0x03, 0xe7, 0x56, 0xcf, 0x88, 0xbb, 0x22, 0x21, 0x0f,
+  0x89, 0xaa, 0xe8, 0x13, 0x26, 0x4a, 0x2a, 0xe0, 0xe2, 0x66, 0xd4, 0x81,
+  0x25, 0xcc, 0x9b, 0xe7, 0x4f, 0x72, 0xd6, 0x16, 0xc3, 0x20, 0x53, 0xe4,
+  0x50, 0x94, 0x10, 0x6d, 0x24, 0x5d, 0x67, 0x62, 0x25, 0xe8, 0xe3, 0x09,
+  0x37, 0x75, 0x09, 0xfb, 0x67, 0x77, 0x12, 0xe8, 0x48, 0xfd, 0xe8, 0xc0,
+  0xa0, 0x67, 0x97, 0x33, 0xbf, 0x1b, 0xbd, 0xb7, 0xfc, 0x6a, 0xc0, 0x5b,
+  0x70, 0x69, 0x16, 0x8f, 0x3f, 0xa2, 0x45, 0x22, 0x50, 0x89, 0xa1, 0xab,
+  0x10, 0xea, 0xc1, 0x76, 0xf2, 0x4e, 0x42, 0x9b, 0xa4, 0xd3, 0xdd, 0x35,
+  0x04, 0xb2, 0x4d, 0x03, 0x6c, 0xe5, 0x23, 0x23, 0x0c, 0xb9, 0x28, 0x80,
+  0x14, 0x24, 0xea, 0x94, 0x10, 0x0b, 0x14, 0x6f, 0x4b, 0x40, 0x94, 0x1d,
+  0x6e, 0x3b, 0x7b, 0xa3, 0xbd, 0x81, 0x6f, 0x75, 0xba, 0xd4, 0x3f, 0xd2,
+  0xbd, 0x53, 0x0b, 0xd1, 0x4e, 0x9f, 0xee, 0xfa, 0x19, 0xde, 0xd1, 0x87,
+  0xeb, 0xd0, 0x2d, 0x0c, 0xd7, 0xb2, 0x33, 0x58, 0x6e, 0xd2, 0xbb, 0x50,
+  0x31, 0xdd, 0x1d, 0x3e, 0x7e, 0xfe, 0xbc, 0x25, 0xcf, 0x6b, 0x0f, 0xdf,
+  0xfe, 0xc9, 0xee, 0x2e, 0xd6, 0x16, 0xd4, 0x44, 0x9b, 0x5f, 0x0c, 0x9f,
+  0xe3, 0xc5, 0xf6, 0x6b, 0x75, 0x66, 0x8e, 0x60, 0xd6, 0xff, 0xde, 0x90,
+  0x7e, 0x13, 0xf9, 0x1c, 0xfc, 0x29, 0xbd, 0x6f, 0x3d, 0xa7, 0xcf, 0x45,
+  0xde, 0xc2, 0xc3, 0xbc, 0x8f, 0xe5, 0xc5, 0x05, 0x39, 0xb2, 0xe8, 0x49,
+  0xc5, 0xe5, 0xb9, 0x49, 0xab, 0x59, 0xb8, 0xdc, 0xdd, 0xc1, 0x70, 0xaf,
+  0x6f, 0xb9, 0x88, 0x26, 0x23, 0x01, 0x8e, 0xce, 0x93, 0xec, 0x44, 0x63,
+  0x7d, 0x70, 0x81, 0x50, 0x77, 0xa0, 0x3d, 0x33, 0xa3, 0xbd, 0xe7, 0xcf,
+  0x07, 0x34, 0xb3, 0x27, 0xcf, 0x9f, 0xf7, 0x16, 0x84, 0x7b, 0x9f, 0xb9,
+  0x29, 0x9d, 0xfb, 0x89, 0x5e, 0x77, 0x44, 0x53, 0x93, 0x91, 0x13, 0xff,
+  0x0e, 0xfd, 0x26, 0xf9, 0x22, 0x79, 0x7b, 0x7a, 0x7e, 0xe4, 0x79, 0x66,
+  0x70, 0xbf, 0x38, 0x60, 0xe8, 0x99, 0x9a, 0x88, 0xc1, 0x2e, 0xd1, 0x6a,
+  0x0d, 0x56, 0xaf, 0xb1, 0x49, 0x42, 0x63, 0x12, 0xc5, 0x2a, 0xea, 0x11,
+  0xfc, 0xb7, 0x30, 0x23, 0x02, 0xfd, 0xd4, 0x2e, 0xf3, 0xc6, 0x87, 0x6d,
+  0xda, 0x32, 0x87, 0xbd, 0x0d, 0x17, 0x07, 0x27, 0xb9, 0x49, 0x30, 0x65,
+  0xb3, 0xa6, 0xea, 0x0e, 0x4e, 0x84, 0xa5, 0x7f, 0x94, 0xcb, 0xcd, 0xa0,
+  0xc0, 0x22, 0x9b, 0x53, 0xde, 0xaa, 0x48, 0x42, 0x7e, 0x61, 0x88, 0x27,
+  0xe5, 0xba, 0xc0, 0x5e, 0xbd, 0x85, 0x07, 0x3e, 0x05, 0xaa, 0xa5, 0xff,
+  0xf1, 0x48, 0x3c, 0x85, 0x38, 0x21, 0x27, 0x62, 0x68, 0x65, 0x16, 0x0d,
+  0xe3, 0xa3, 0x1b, 0x6f, 0xd6, 0xce, 0xe1, 0x69, 0xbd, 0x73, 0x05, 0x9d,
+  0x43, 0x80, 0x47, 0xc8, 0x4e, 0xfc, 0x59, 0xb6, 0xd4, 0x94, 0xd2, 0xa2,
+  0x3d, 0x8e, 0xa1, 0xe5, 0x8b, 0xfc, 0x72, 0x55, 0xc5, 0xd3, 0x2f, 0xd1,
+  0xd2, 0x4f, 0x32, 0x1d, 0xb4, 0x9b, 0x43, 0x7a, 0x93, 0x56, 0x99, 0xf6,
+  0x20, 0x2c, 0xee, 0xec, 0xdd, 0x56, 0x2b, 0x58, 0xeb, 0x81, 0xa8, 0xd5,
+  0x46, 0x60, 0x49, 0x53, 0x09, 0x97, 0xd1, 0x63, 0xc8, 0x4b, 0x20, 0x29,
+  0x3a, 0xd2, 0x52, 0x22, 0x6d, 0x5c, 0x45, 0x96, 0x38, 0x10, 0xe9, 0xb0,
+  0x49, 0x98, 0x02, 0x33, 0x13, 0x5b, 0x10, 0xe6, 0xd4, 0x6d, 0xce, 0x9d,
+  0xef, 0x9e, 0x9e, 0x85, 0xb7, 0xe5, 0xaa, 0xf4, 0xda, 0xb7, 0x84, 0xa0,
+  0x0d, 0xc4, 0x79, 0x18, 0xce, 0x05, 0x7f, 0xe5, 0x43, 0x32, 0xcf, 0xdf,
+  0x14, 0xf3, 0x32, 0x9d, 0x39, 0xe7, 0xc9, 0x52, 0xd3, 0x75, 0x05, 0x72,
+  0x4c, 0x8e, 0x36, 0xc8, 0xea, 0xa0, 0x93, 0xe6, 0x33, 0x4e, 0xb6, 0x3c,
+  0x40, 0x11, 0x50, 0xa8, 0xe7, 0x06, 0x61, 0x2e, 0x45, 0x94, 0xc2, 0x00,
+  0x19, 0x04, 0x77, 0x13, 0x9a, 0xbd, 0x44, 0xef, 0x7c, 0x5a, 0x36, 0xd1,
+  0x05, 0xed, 0x68, 0x49, 0x48, 0x7a, 0x2e, 0x8d, 0x64, 0x7c, 0xfc, 0x3f,
+  0x8e, 0x3e, 0x65, 0xd4, 0xa9, 0x4a, 0x6f, 0x6c, 0xe1, 0xe0, 0xf7, 0x0c,
+  0x58, 0x29, 0xd1, 0x20, 0x8b, 0x54, 0x91, 0xce, 0xc5, 0x86, 0xa7, 0x96,
+  0xa7, 0x90, 0x1e, 0x08, 0x2b, 0x4a, 0xb7, 0x69, 0x43, 0x58, 0x21, 0x6d,
+  0x53, 0x7d, 0x9f, 0x43, 0x2e, 0xe3, 0x5c, 0x74, 0x54, 0x7c, 0xb1, 0x03,
+  0x90, 0xcf, 0x71, 0x01, 0x57, 0x22, 0x4c, 0x7b, 0xf2, 0xf6, 0x32, 0x9c,
+  0x54, 0xa4, 0x91, 0x2c, 0x10, 0x11, 0x69, 0x52, 0x66, 0xae, 0xf7, 0xb4,
+  0x8c, 0xf4, 0x2b, 0xed, 0x33, 0x6e, 0xab, 0x41, 0xe1, 0xa9, 0x2a, 0x79,
+  0xf1, 0xfe, 0xdd, 0x49, 0x4f, 0xb9, 0xe4, 0x18, 0x67, 0x40, 0x9b, 0xb5,
+  0xf1, 0x2e, 0x03, 0x9a, 0x59, 0x95, 0x9c, 0xa5, 0x97, 0xd9, 0x86, 0x0f,
+  0x20, 0xd7, 0x42, 0x90, 0x14, 0x07, 0x44, 0xcc, 0x9d, 0xe2, 0xb7, 0x43,
+  0x21, 0x26, 0xee, 0xc2, 0xc2, 0x7e, 0x91, 0xe3, 0xc5, 0x3c, 0x95, 0xbd,
+  0x5b, 0x55, 0x14, 0xce, 0xc7, 0xce, 0x47, 0x3a, 0x7d, 0xa9, 0x9f, 0xb2,
+  0x03, 0xfd, 0x29, 0x1d, 0xcc, 0x50, 0x96, 0x95, 0x2e, 0x89, 0x86, 0x92,
+  0x8d, 0x3f, 0x92, 0x07, 0x7e, 0x43, 0xa7, 0x39, 0xcc, 0xc2, 0x20, 0x9b,
+  0x6e, 0x05, 0x05, 0x86, 0x5b, 0x5e, 0xa8, 0xb6, 0xef, 0x9e, 0x66, 0xad,
+  0xf1, 0xd6, 0x8c, 0xf0, 0x78, 0x6b, 0xc4, 0x92, 0x83, 0x4e, 0x6e, 0x14,
+  0xfe, 0x22, 0xd0, 0x45, 0xc6, 0x61, 0xa5, 0x8c, 0x93, 0xe4, 0x44, 0xe6,
+  0x77, 0x20, 0xc1, 0x16, 0xd6, 0x85, 0x74, 0x6a, 0xad, 0xcc, 0xa0, 0xd8,
+  0x62, 0xd3, 0x39, 0x35, 0x2a, 0xb2, 0xde, 0x2f, 0x5a, 0xe3, 0xac, 0xa4,
+  0xe6, 0x36, 0x34, 0xa5, 0xb4, 0xb0, 0xce, 0xe4, 0xd6, 0xc9, 0x7e, 0x72,
+  0xa8, 0x43, 0x17, 0x00, 0x3a, 0xd4, 0xee, 0x5b, 0x43, 0x43, 0x1d, 0x85,
+  0xd4, 0xc1, 0x7b, 0xc7, 0xea, 0xd1, 0xde, 0x7f, 0x7a, 0x2d, 0x5d, 0xbc,
+  0xa6, 0x2c, 0x3d, 0x88, 0xb9, 0xde, 0x74, 0x1b, 0x94, 0xa9, 0xe0, 0x08,
+  0x83, 0xb6, 0x30, 0xae, 0x62, 0x56, 0x84, 0x65, 0xd4, 0x9d, 0x3f, 0xf4,
+  0x0a, 0x5a, 0x5e, 0x72, 0xe9, 0xe6, 0xf0, 0x55, 0x6e, 0x84, 0x48, 0xcd,
+  0x08, 0x44, 0xd0, 0x72, 0xb9, 0xab, 0xab, 0x5e, 0x44, 0x2e, 0xe1, 0x1d,
+  0x86, 0xe8, 0x7e, 0x53, 0xa9, 0xeb, 0xb0, 0xaf, 0xd8, 0x98, 0x8d, 0xa1,
+  0x88, 0x7b, 0x9c, 0xc5, 0x4e, 0x5b, 0x48, 0x9d, 0xb3, 0x02, 0x7b, 0x96,
+  0x6a, 0x07, 0x03, 0x81, 0xf7, 0x20, 0xbf, 0x65, 0x64, 0x77, 0x2c, 0x2e,
+  0x10, 0x32, 0x67, 0xea, 0xc4, 0xa6, 0xc7, 0x4b, 0x77, 0xac, 0xc0, 0xd8,
+  0xb4, 0xad, 0xe5, 0x39, 0xd9, 0xa3, 0x1b, 0x06, 0x34, 0x93, 0xb2, 0x0d,
+  0x8a, 0x38, 0x72, 0xc2, 0x28, 0x7c, 0x5c, 0x9a, 0x3a, 0x35, 0xc3, 0x8e,
+  0x3a, 0x4b, 0xd0, 0xe6, 0x4a, 0x71, 0x81, 0x7b, 0xd7, 0x5a, 0x18, 0x72,
+  0x46, 0x7d, 0xc2, 0xa3, 0xd8, 0x40, 0x51, 0x0a, 0xc2, 0x4b, 0x2c, 0x84,
+  0x8e, 0xec, 0x1d, 0x7a, 0xc4, 0x97, 0x83, 0x9c, 0xb0, 0x91, 0xfc, 0x7e,
+  0xe8, 0x1a, 0x6f, 0x6c, 0xdd, 0x65, 0x46, 0xc3, 0x76, 0x49, 0x1f, 0x30,
+  0xa4, 0x22, 0xd5, 0x9f, 0x09, 0x37, 0x6f, 0xad, 0x5b, 0x75, 0x29, 0x30,
+  0x42, 0xbc, 0xc8, 0x22, 0x6f, 0xba, 0xf4, 0xd0, 0x59, 0x15, 0xd9, 0x2d,
+  0x61, 0x80, 0xf7, 0x0f, 0x17, 0x2a, 0xd9, 0xdf, 0x1f, 0xbe, 0x7b, 0x7b,
+  0xfc, 0xf6, 0xeb, 0x03, 0x42, 0xa8, 0xcb, 0xaa, 0x29, 0x75, 0xca, 0x4e,
+  0xfe, 0xba, 0x9a, 0xe5, 0x53, 0xe6, 0x14, 0xd2, 0xc2, 0xb9, 0x55, 0x19,
+  0x93, 0x89, 0x83, 0xd5, 0x30, 0x97, 0xa0, 0x10, 0x46, 0x92, 0x79, 0xa9,
+  0xae, 0xa7, 0x2a, 0x2f, 0x57, 0x76, 0xeb, 0xa7, 0x50, 0x45, 0x10, 0x06,
+  0x40, 0x78, 0x94, 0xf8, 0x11, 0x13, 0xad, 0x19, 0x9d, 0x14, 0x85, 0x57,
+  0x27, 0x27, 0x49, 0x4f, 0xfb, 0x6e, 0xad, 0xdd, 0xe2, 0x8c, 0x21, 0x0c,
+  0x64, 0xf3, 0x4d, 0x29, 0x9e, 0x67, 0x84, 0x3f, 0x71, 0x9b, 0x16, 0xd7,
+  0x33, 0xa6, 0xeb, 0xf7, 0x61, 0x26, 0x27, 0xf2, 0x8c, 0x91, 0x1c, 0x88,
+  0x13, 0xce, 0xab, 0x19, 0x6c, 0x21, 0xc3, 0x24, 0xcb, 0x8b, 0x86, 0xd4,
+  0xa3, 0x96, 0x24, 0x6d, 0xf7, 0x6b, 0x5a, 0xe7, 0x6c, 0xbf, 0x62, 0x2b,
+  0xa7, 0x05, 0x9c, 0xc2, 0x11, 0x49, 0x24, 0xad, 0x1a, 0x7a, 0x64, 0xbd,
+  0x10, 0x3d, 0xbe, 0xc8, 0x27, 0x15, 0x50, 0xf3, 0x2c, 0x4b, 0x6d, 0xe3,
+  0xf9, 0x9a, 0xb8, 0x65, 0xc8, 0x2e, 0x6e, 0xb2, 0x4a, 0x8c, 0x4f, 0x5b,
+  0x45, 0x6c, 0x98, 0xdd, 0x28, 0x19, 0x97, 0xe6, 0xf9, 0x48, 0xd5, 0x82,
+  0x36, 0xc4, 0x74, 0x4d, 0x6f, 0xd3, 0x46, 0x92, 0x68, 0x6d, 0x5e, 0x15,
+  0x9a, 0x84, 0x21, 0xe6, 0xd6, 0x5e, 0x6f, 0xa4, 0x1d, 0x37, 0xd1, 0xff,
+  0x24, 0xb3, 0x0a, 0xc5, 0x9d, 0x86, 0x76, 0x88, 0x42, 0x36, 0x86, 0x86,
+  0x9d, 0x6e, 0xa0, 0xa5, 0x21, 0x35, 0x09, 0xf7, 0x46, 0xba, 0xa7, 0xd5,
+  0xad, 0x9f, 0xa6, 0xde, 0x5d, 0x70, 0xb4, 0x75, 0xa0, 0xd7, 0x92, 0x2b,
+  0x15, 0xbb, 0xd3, 0xf3, 0x9c, 0x4a, 0x07, 0x37, 0x1b, 0x2a, 0xe5, 0x2a,
+  0xbd, 0x8c, 0x34, 0xcc, 0x20, 0x00, 0x7e, 0xca, 0x60, 0x66, 0xf2, 0x90,
+  0x5f, 0x27, 0xef, 0xbf, 0x2c, 0xe2, 0x66, 0xe0, 0x9c, 0x0b, 0x39, 0x20,
+  0x7d, 0x9a, 0xa0, 0x4e, 0xef, 0x62, 0xb4, 0x1d, 0xcd, 0xab, 0xe1, 0x39,
+  0x88, 0x44, 0xaa, 0xd3, 0x6b, 0x97, 0xf0, 0xd5, 0xcb, 0xf8, 0xb4, 0x58,
+  0xa5, 0x2b, 0xa3, 0x71, 0xa0, 0xd6, 0xab, 0xa4, 0x43, 0xa5, 0x89, 0x57,
+  0xc8, 0xe2, 0x87, 0x2a, 0x5b, 0x98, 0x04, 0xe1, 0x70, 0x52, 0xf1, 0x25,
+  0x41, 0xae, 0x5e, 0x26, 0x2c, 0x91, 0x9b, 0xbc, 0xb8, 0x2e, 0xf1, 0x1b,
+  0x09, 0x52, 0x45, 0x52, 0x54, 0xf2, 0xde, 0xb2, 0x96, 0xf3, 0xce, 0xae,
+  0xaa, 0x83, 0x46, 0x8b, 0x08, 0xcc, 0x5a, 0xb8, 0x34, 0xd0, 0xef, 0xd9,
+  0xe2, 0xda, 0xb4, 0x74, 0x49, 0x81, 0x2f, 0x13, 0x11, 0xef, 0x20, 0xd1,
+  0x8e, 0xef, 0xe6, 0xc5, 0x79, 0x9d, 0x49, 0x17, 0x6a, 0x2e, 0x09, 0x54,
+  0x81, 0x23, 0xf2, 0x26, 0xb7, 0xbe, 0x9f, 0x7e, 0x49, 0x62, 0xcb, 0x84,
+  0xec, 0x5e, 0x3b, 0xfb, 0x95, 0x32, 0x1a, 0xb9, 0x1f, 0x34, 0xdd, 0xe0,
+  0xe9, 0x55, 0x59, 0x4a, 0xcd, 0x69, 0x1f, 0xb3, 0x4d, 0xb8, 0x41, 0x1a,
+  0x21, 0x62, 0xf4, 0xe8, 0x0f, 0xed, 0xf6, 0xa1, 0x92, 0x4c, 0x1e, 0xb6,
+  0x37, 0xcb, 0x9d, 0xc6, 0xea, 0xa1, 0x93, 0xb6, 0x65, 0x1b, 0xcf, 0xc7,
+  0x0a, 0x67, 0x61, 0xae, 0x21, 0xbc, 0x22, 0xb8, 0x00, 0x8b, 0xee, 0xf8,
+  0xf6, 0x48, 0x66, 0xa5, 0xbf, 0x29, 0x51, 0x61, 0xc7, 0xb9, 0x96, 0x0e,
+  0x20, 0x1b, 0x54, 0x03, 0xb3, 0xa9, 0x68, 0x07, 0x34, 0x30, 0xd3, 0xbc,
+  0x01, 0x03, 0xf9, 0xfd, 0xfe, 0x6e, 0x1f, 0x93, 0xa7, 0x81, 0xb4, 0xc6,
+  0x95, 0x6e, 0x63, 0x6d, 0xed, 0x2f, 0x88, 0x41, 0x57, 0x18, 0x40, 0x32,
+  0x64, 0xb5, 0x24, 0x3f, 0xdd, 0x90, 0xe8, 0x25, 0xad, 0xfb, 0xf6, 0x3f,
+  0x6e, 0x15, 0xff, 0xd2, 0xa6, 0x94, 0x3d, 0x3d, 0x29, 0x1d, 0xff, 0x7a,
+  0xe7, 0x9d, 0x31, 0x0d, 0x14, 0x4b, 0x30, 0x53, 0x5e, 0xa2, 0x7e, 0x12,
+  0x4f, 0x69, 0x77, 0x3a, 0x03, 0xec, 0x7a, 0x34, 0x1f, 0x94, 0xcb, 0x49,
+  0xa3, 0x85, 0xe6, 0x6b, 0xba, 0x58, 0x26, 0x11, 0x96, 0x35, 0xd0, 0x1b,
+  0xa0, 0x69, 0x2a, 0xa9, 0x83, 0xbb, 0x4c, 0x85, 0x3d, 0xce, 0xcb, 0x10,
+  0x7d, 0x45, 0x18, 0x29, 0x1b, 0xe3, 0xa9, 0xa4, 0x6b, 0x62, 0x43, 0xe8,
+  0x4b, 0x6d, 0xc1, 0x88, 0x9c, 0xb3, 0x61, 0xd4, 0xdb, 0x1f, 0xed, 0x1a,
+  0x21, 0xd9, 0xe3, 0x3e, 0x14, 0xfe, 0x06, 0xbf, 0xbd, 0x91, 0x6c, 0x11,
+  0x57, 0xdd, 0xb6, 0xca, 0x6b, 0x58, 0xff, 0xac, 0xcd, 0x59, 0xd8, 0x86,
+  0x49, 0x59, 0x42, 0x76, 0x93, 0x67, 0x49, 0x7f, 0x35, 0x56, 0x5e, 0x65,
+  0xe4, 0x3f, 0xf5, 0x7c, 0xe3, 0xea, 0xc1, 0x8b, 0xd5, 0x3c, 0x66, 0xe6,
+  0xd0, 0xdd, 0x96, 0xe0, 0x50, 0x5e, 0xd7, 0x2b, 0x31, 0x02, 0x2d, 0xc0,
+  0x8c, 0x45, 0x1c, 0x4c, 0xe6, 0x66, 0x3e, 0xf8, 0x74, 0x3d, 0xa7, 0xac,
+  0x92, 0x5e, 0xf5, 0x04, 0xde, 0x61, 0x51, 0x7c, 0x6d, 0x03, 0x4f, 0xb6,
+  0xa3, 0xe4, 0x74, 0xb8, 0x11, 0x9d, 0x34, 0x52, 0xa3, 0x4d, 0x18, 0x40,
+  0x56, 0x75, 0x86, 0xdb, 0x38, 0x3d, 0x3b, 0x3f, 0x3e, 0x7d, 0x3b, 0x4e,
+  0xfe, 0x7d, 0x63, 0x6d, 0x79, 0x57, 0x1b, 0x58, 0xf9, 0x87, 0x81, 0x3b,
+  0x93, 0xe4, 0x85, 0xf8, 0x19, 0xfa, 0x6c, 0x63, 0x4f, 0x89, 0x9f, 0x1a,
+  0xe9, 0x6d, 0xf8, 0xab, 0xbe, 0x29, 0xd0, 0x6e, 0x72, 0x5a, 0x1d, 0x34,
+  0xba, 0x40, 0x5b, 0xb6, 0x70, 0x7e, 0x5d, 0x23, 0x9a, 0x99, 0xbd, 0xb3,
+  0x59, 0x3a, 0xc3, 0xc7, 0x39, 0xb0, 0x70, 0xbe, 0x56, 0x2a, 0xa7, 0xbc,
+  0x80, 0x2d, 0xbe, 0x81, 0x5a, 0xca, 0x16, 0xf4, 0x16, 0xf3, 0x4c, 0x55,
+  0xb4, 0xea, 0x48, 0x87, 0xb9, 0xaf, 0x8f, 0xce, 0xc9, 0x49, 0x83, 0x2a,
+  0x57, 0x37, 0x41, 0xb8, 0xba, 0x44, 0xf1, 0x49, 0xad, 0x72, 0xa6, 0xc5,
+  0xad, 0x74, 0x69, 0x8c, 0xf6, 0x3c, 0x4f, 0x8b, 0x68, 0x09, 0x9b, 0xd1,
+  0x68, 0x5f, 0x9a, 0xdd, 0x28, 0x1d, 0xf4, 0xab, 0xfa, 0x4e, 0xbc, 0xbe,
+  0x26, 0x0c, 0xcb, 0x74, 0xf6, 0xfe, 0x5c, 0xfc, 0x54, 0xaf, 0x8e, 0x4e,
+  0x8e, 0xce, 0x8f, 0xba, 0x96, 0xfb, 0x84, 0xc1, 0x2c, 0x51, 0xea, 0xd2,
+  0x64, 0xd3, 0xab, 0xa2, 0x9c, 0x97, 0x97, 0xb9, 0x34, 0xe2, 0x4d, 0xbe,
+  0xcf, 0x26, 0xaf, 0x0e, 0xbf, 0x23, 0x7d, 0x82, 0x7c, 0x4e, 0x67, 0xef,
+  0x4e, 0xcf, 0x5e, 0x1f, 0xbf, 0x7d, 0x35, 0x48, 0x5e, 0x9e, 0x9e, 0xfd,
+  0x79, 0x90, 0xbc, 0x39, 0xfd, 0xee, 0x28, 0x92, 0xe2, 0x4c, 0x08, 0xb7,
+  0x01, 0xc5, 0xd8, 0x66, 0x7d, 0xce, 0xf0, 0x2e, 0x38, 0x64, 0xe1, 0x09,
+  0x11, 0xca, 0xff, 0x37, 0xda, 0x2f, 0xb1, 0x5b, 0xdc, 0x35, 0xb3, 0x75,
+  0x46, 0x86, 0x7e, 0x73, 0x74, 0xf8, 0x6a, 0x10, 0x00, 0x98, 0x53, 0x2b,
+  0x15, 0xf3, 0x31, 0x5a, 0x9f, 0x5d, 0x34, 0x60, 0xaf, 0xd9, 0xfa, 0x80,
+  0x86, 0xc0, 0x41, 0x2e, 0xbe, 0xb1, 0x86, 0x60, 0x51, 0xa5, 0x3f, 0xeb,
+  0xcb, 0x9c, 0x10, 0x2c, 0xfe, 0xde, 0xd6, 0xd7, 0x5e, 0xd9, 0x05, 0x29,
+  0x6b, 0xbe, 0x9a, 0x2d, 0x60, 0x4d, 0x48, 0xab, 0xd7, 0x22, 0x2c, 0x3f,
+  0x4b, 0xb6, 0x07, 0x31, 0x68, 0xd0, 0x82, 0x0a, 0x00, 0x3f, 0x62, 0xd7,
+  0x63, 0x2a, 0x3d, 0x0d, 0xd1, 0xb4, 0xc8, 0x98, 0x49, 0xa4, 0x55, 0x5f,
+  0x38, 0x94, 0xd8, 0xf5, 0x1a, 0xb6, 0x00, 0xa9, 0x0b, 0x6c, 0x13, 0x6d,
+  0x9e, 0x6e, 0x90, 0xed, 0xe9, 0xf9, 0x03, 0xff, 0x58, 0xc0, 0xa2, 0x22,
+  0x89, 0xdb, 0xab, 0x0b, 0x43, 0x96, 0x19, 0xa7, 0x4c, 0xf1, 0x31, 0x59,
+  0xb7, 0x40, 0x32, 0x3c, 0x56, 0xa7, 0xc4, 0x3a, 0x05, 0x4b, 0x6f, 0x8c,
+  0x3a, 0x66, 0x18, 0x2b, 0x4a, 0x7d, 0x56, 0x6d, 0x36, 0xe1, 0x7b, 0x48,
+  0x68, 0x9d, 0x11, 0x7d, 0x5f, 0x8f, 0x58, 0xd1, 0x8c, 0xc4, 0x83, 0xe3,
+  0x6f, 0x0a, 0x40, 0x37, 0x02, 0x5f, 0x96, 0x11, 0xb0, 0x81, 0x70, 0xc1,
+  0x93, 0x86, 0x95, 0x14, 0xe2, 0x11, 0x4d, 0x28, 0xf4, 0x36, 0x64, 0x5b,
+  0xda, 0xcf, 0xf9, 0x55, 0xee, 0x29, 0xba, 0xa9, 0xcc, 0x21, 0x08, 0x51,
+  0x61, 0x9d, 0xae, 0xc7, 0xa4, 0xef, 0xcb, 0x7b, 0xb4, 0x7b, 0xeb, 0x7c,
+  0xec, 0xa4, 0x4d, 0xd4, 0xc9, 0x50, 0xb0, 0xbe, 0x51, 0xbc, 0x17, 0x6c,
+  0xdd, 0xd6, 0xeb, 0x1e, 0xc6, 0xe8, 0x7b, 0x6d, 0x6d, 0x41, 0xbf, 0x65,
+  0x51, 0x27, 0xc7, 0xe6, 0x3a, 0x44, 0xa0, 0x71, 0xb8, 0xe9, 0x2e, 0xa7,
+  0x23, 0x40, 0xaf, 0xc2, 0xee, 0x9b, 0xb1, 0xc2, 0x0f, 0x53, 0x9f, 0xfb,
+  0xe8, 0x97, 0xe9, 0x17, 0xf7, 0x7d, 0x3a, 0x38, 0xb3, 0x77, 0x47, 0xe7,
+  0xef, 0x46, 0xc9, 0x96, 0x8f, 0xf9, 0xfa, 0x74, 0xb4, 0x1b, 0x06, 0x6d,
+  0x8e, 0xdf, 0x1c, 0xc6, 0xd7, 0x4b, 0xbf, 0xe8, 0xfb, 0x2a, 0x78, 0x03,
+  0x7d, 0x37, 0xcc, 0x23, 0xf6, 0x90, 0x9e, 0x76, 0x63, 0xdf, 0x1b, 0xbf,
+  0xe9, 0xd9, 0x5f, 0xfa, 0xc5, 0x9a, 0x55, 0x7e, 0x73, 0x74, 0x12, 0xe9,
+  0xed, 0xf3, 0xdd, 0xbb, 0xd7, 0x7f, 0x6e, 0xaf, 0xf2, 0xd1, 0xe3, 0xc8,
+  0x57, 0x7f, 0x4d, 0x87, 0x7a, 0x56, 0x97, 0x73, 0xa3, 0xb0, 0xa0, 0x8a,
+  0x03, 0x45, 0x1c, 0x07, 0x46, 0x04, 0x50, 0xae, 0xf9, 0x5f, 0x06, 0xf2,
+  0x97, 0x9f, 0x46, 0xa3, 0xd1, 0x9f, 0x42, 0x54, 0x74, 0xf8, 0x68, 0xec,
+  0x72, 0xe5, 0xd9, 0xae, 0x05, 0x8e, 0xaa, 0x19, 0x54, 0x09, 0x51, 0xd4,
+  0x62, 0x99, 0xe6, 0x15, 0x7a, 0x02, 0x45, 0x05, 0x2e, 0x2d, 0xc9, 0x55,
+  0x7a, 0x59, 0x6d, 0x4e, 0x10, 0xc1, 0xf8, 0xba, 0x6e, 0xd5, 0xdb, 0x52,
+  0x57, 0xed, 0x64, 0x70, 0x3a, 0x0b, 0x1c, 0x21, 0xdc, 0x97, 0x85, 0x3e,
+  0x5b, 0x91, 0x7f, 0x96, 0x6d, 0x1d, 0x27, 0x6b, 0x0b, 0x95, 0x1d, 0xb2,
+  0xfa, 0x99, 0x9d, 0x7e, 0xd4, 0x7b, 0x21, 0x75, 0x92, 0x2f, 0x25, 0xa4,
+  0x0e, 0x47, 0x72, 0x0a, 0xb1, 0x82, 0x36, 0xb3, 0x59, 0x33, 0xdd, 0xa1,
+  0x75, 0xd6, 0x2d, 0x0d, 0xd0, 0xaa, 0x70, 0x81, 0x13, 0xc9, 0xcf, 0x93,
+  0x44, 0x05, 0x2d, 0x27, 0xb7, 0x78, 0x25, 0x09, 0xae, 0x88, 0xd7, 0xd3,
+  0xd4, 0x59, 0x3f, 0x08, 0xb9, 0x59, 0xab, 0x23, 0x92, 0x5f, 0x81, 0xa8,
+  0xad, 0x2e, 0x02, 0x76, 0xe8, 0x95, 0xa9, 0x85, 0x6a, 0x3f, 0xb8, 0xb3,
+  0x52, 0x12, 0x25, 0x52, 0x00, 0x7d, 0xfc, 0xa2, 0x25, 0x11, 0xd4, 0x43,
+  0xe7, 0x1f, 0x7a, 0x4f, 0xed, 0x33, 0x26, 0xc0, 0x48, 0xe2, 0x6a, 0xc4,
+  0xd3, 0x4a, 0x43, 0x79, 0xf8, 0x95, 0x4d, 0xd8, 0x40, 0x99, 0xf9, 0xe6,
+  0xbf, 0x6f, 0x92, 0x22, 0x8c, 0xd7, 0xa3, 0xb5, 0xed, 0x4a, 0xb8, 0x64,
+  0xd8, 0xd0, 0x53, 0x11, 0xbd, 0xc1, 0x6e, 0x8a, 0x25, 0x3e, 0xe5, 0xa5,
+  0x3e, 0xf1, 0x60, 0x09, 0xa3, 0xe4, 0xfb, 0x7c, 0x3e, 0x9b, 0xa6, 0x15,
+  0xd2, 0xc3, 0x42, 0xf1, 0x2a, 0x64, 0xc2, 0xf7, 0xa9, 0x2e, 0xf1, 0x55,
+  0x77, 0x79, 0xb4, 0x99, 0x4c, 0x9c, 0xea, 0x23, 0x45, 0x3f, 0xf6, 0x30,
+  0x28, 0xf8, 0xdd, 0x57, 0x74, 0xc6, 0xe4, 0xa3, 0x7b, 0x4c, 0xa2, 0xae,
+  0xdd, 0xc1, 0xa3, 0x7d, 0xae, 0x1a, 0x87, 0x18, 0x3e, 0x0e, 0x63, 0x29,
+  0xf9, 0xf2, 0xfa, 0x31, 0xdc, 0x57, 0x4f, 0x07, 0xfc, 0xaf, 0xa7, 0xae,
+  0xfc, 0xc4, 0x33, 0xd2, 0xd8, 0x8e, 0x61, 0xad, 0xff, 0xf8, 0x4c, 0x8b,
+  0x5c, 0xbb, 0x3c, 0x71, 0xec, 0x61, 0x92, 0xf3, 0x2c, 0xb5, 0x6c, 0xcd,
+  0xbc, 0xa3, 0xb3, 0xa5, 0x1d, 0x31, 0xfc, 0xeb, 0x2f, 0x93, 0x8a, 0x60,
+  0x47, 0x9a, 0xfa, 0xa7, 0x75, 0xf5, 0xc4, 0x46, 0xe7, 0x7f, 0x36, 0x8a,
+  0xb4, 0xdf, 0x8e, 0x7e, 0xc8, 0xa6, 0xfb, 0xba, 0xaf, 0x11, 0x50, 0x14,
+  0xc2, 0x76, 0x94, 0xf5, 0xe3, 0xca, 0x89, 0xa3, 0x1f, 0x7a, 0x7e, 0xcf,
+  0x87, 0xf8, 0x48, 0x2d, 0xee, 0xdb, 0x8d, 0x52, 0x85, 0x9d, 0xbe, 0xf4,
+  0xd2, 0x7e, 0x3c, 0xda, 0x7d, 0x78, 0x86, 0xb2, 0x33, 0xbe, 0x19, 0x7e,
+  0x90, 0x7f, 0x02, 0x2a, 0x91, 0x14, 0xb1, 0xb2, 0x8f, 0xe6, 0xd6, 0x76,
+  0xc6, 0x20, 0xd8, 0x9c, 0x16, 0x2f, 0x37, 0x1b, 0x80, 0x12, 0xa1, 0xca,
+  0x18, 0x87, 0x75, 0xb0, 0x03, 0xc7, 0x45, 0xc7, 0xdd, 0x22, 0x3c, 0x91,
+  0x82, 0xa2, 0xfc, 0x63, 0x82, 0x5f, 0x50, 0x2e, 0x77, 0x44, 0x45, 0x4c,
+  0xef, 0x8e, 0x5e, 0xbf, 0x1f, 0x1f, 0xbd, 0x4a, 0xd2, 0x08, 0x04, 0x16,
+  0xe2, 0xa5, 0x39, 0xdc, 0x72, 0xd2, 0x20, 0xa8, 0x29, 0x4b, 0xce, 0x08,
+  0x92, 0xb9, 0x04, 0x3d, 0x07, 0x25, 0xb9, 0xc8, 0x58, 0xc6, 0x61, 0xdd,
+  0x09, 0xeb, 0x71, 0xf2, 0xe2, 0xcf, 0xc0, 0x1d, 0xe1, 0x55, 0xcf, 0x32,
+  0x6a, 0xce, 0xf5, 0x82, 0xb3, 0x60, 0x02, 0x50, 0x35, 0xd7, 0xc6, 0xab,
+  0x9e, 0x67, 0xd9, 0x52, 0x8a, 0xfe, 0x5c, 0x27, 0x79, 0x73, 0x36, 0xea,
+  0x09, 0x94, 0xe6, 0x1c, 0x18, 0x55, 0x03, 0x87, 0x69, 0x4f, 0x27, 0x29,
+  0xc0, 0xab, 0x71, 0xc6, 0xba, 0xc3, 0x0c, 0x70, 0xdb, 0xc2, 0xbb, 0xb2,
+  0x95, 0x37, 0x1d, 0x17, 0x7a, 0xd0, 0x55, 0x0f, 0x2e, 0x75, 0x02, 0xe8,
+  0x31, 0x76, 0x11, 0x4f, 0x26, 0x9d, 0x5f, 0x96, 0x95, 0x19, 0x6f, 0x61,
+  0xeb, 0x14, 0x19, 0xce, 0xa1, 0xde, 0xee, 0xf6, 0xe2, 0x0c, 0x6b, 0xbe,
+  0xb9, 0xd4, 0x11, 0x21, 0xf0, 0x8c, 0x6b, 0xb8, 0x89, 0x2d, 0xf0, 0x3e,
+  0xc1, 0x63, 0x42, 0xe1, 0x41, 0x96, 0x69, 0x63, 0xa9, 0xba, 0xc6, 0x7e,
+  0xf0, 0x16, 0x06, 0xe6, 0x26, 0x75, 0x1d, 0xe9, 0xba, 0x73, 0x54, 0x75,
+  0xd7, 0x70, 0x80, 0x3f, 0xf7, 0xdf, 0xb2, 0x9b, 0xdb, 0xde, 0x7e, 0xec,
+  0x06, 0x2c, 0xd2, 0x5b, 0xb8, 0xa8, 0x7a, 0xc9, 0x81, 0x1d, 0xb6, 0xb4,
+  0x1d, 0xf4, 0x58, 0xc5, 0x2c, 0x1f, 0x0c, 0xd6, 0x55, 0xbe, 0x70, 0x5e,
+  0x92, 0x3d, 0x69, 0x71, 0x60, 0xc1, 0xee, 0x0e, 0x43, 0x8f, 0x48, 0xe3,
+  0xb6, 0x2d, 0xcd, 0xe0, 0x27, 0x4c, 0x69, 0x99, 0x64, 0xc4, 0x6d, 0x71,
+  0x6b, 0x29, 0x7c, 0x6f, 0x9b, 0x7e, 0x3c, 0x2f, 0x29, 0x4a, 0xc9, 0xc4,
+  0x80, 0xef, 0x87, 0x90, 0x7d, 0x64, 0x24, 0x54, 0x44, 0x88, 0x6a, 0xd0,
+  0xb2, 0x4f, 0x18, 0xad, 0x6c, 0x50, 0x2c, 0x46, 0x00, 0x66, 0xec, 0x01,
+  0xbb, 0x70, 0xe3, 0xc8, 0x9b, 0x41, 0x0e, 0x2b, 0x8f, 0xc3, 0x8a, 0x02,
+  0x86, 0x18, 0xb4, 0x91, 0x95, 0x65, 0xb3, 0x51, 0x9e, 0x89, 0x06, 0xd5,
+  0x68, 0xa5, 0x26, 0x35, 0xf2, 0x11, 0x55, 0x6d, 0xa0, 0xed, 0x73, 0x50,
+  0xda, 0x44, 0xcb, 0x81, 0x9d, 0x99, 0x16, 0xfe, 0x5c, 0x71, 0x00, 0x66,
+  0x8c, 0xbc, 0x9c, 0xa1, 0x28, 0x8a, 0xdb, 0xf0, 0xf4, 0xc1, 0xc7, 0xc8,
+  0x5c, 0x36, 0xc9, 0x53, 0x79, 0x9b, 0x2f, 0x56, 0x0b, 0xbc, 0x3f, 0xe0,
+  0xf2, 0xc7, 0x05, 0x49, 0x2d, 0x3d, 0x54, 0x64, 0x17, 0x36, 0x4a, 0x51,
+  0x31, 0x67, 0x06, 0xf1, 0x36, 0x10, 0x6d, 0xc3, 0x19, 0x3f, 0xf4, 0x16,
+  0xb7, 0xd8, 0xc0, 0x41, 0xfd, 0x2f, 0xa7, 0xcf, 0xe4, 0x85, 0xd1, 0xe8,
+  0xfe, 0x14, 0x4e, 0x22, 0x64, 0x1d, 0xa0, 0x4b, 0xca, 0x73, 0xce, 0x66,
+  0x9e, 0x15, 0x29, 0xe4, 0x06, 0x10, 0x1b, 0x3e, 0xa3, 0x7e, 0x0e, 0x25,
+  0xad, 0x26, 0x31, 0x5f, 0xa1, 0x78, 0x5a, 0xaa, 0x73, 0xfe, 0xb2, 0x58,
+  0x12, 0xba, 0xbf, 0x64, 0x48, 0xbf, 0xd5, 0x32, 0x90, 0xf9, 0x96, 0x4f,
+  0x58, 0x75, 0xd4, 0x7c, 0x7e, 0x57, 0x72, 0x62, 0xc4, 0xb6, 0x25, 0x7f,
+  0xb9, 0xec, 0xb1, 0x75, 0x63, 0x49, 0xc3, 0x85, 0x78, 0x67, 0x4d, 0xf0,
+  0xb2, 0x40, 0x88, 0xb0, 0x62, 0xca, 0x70, 0x48, 0x07, 0xb4, 0x29, 0x7c,
+  0x7c, 0x03, 0x2d, 0xc3, 0x7b, 0x7c, 0x7b, 0x1b, 0x50, 0xb8, 0x67, 0x10,
+  0x33, 0xde, 0x24, 0x5b, 0xcb, 0x8f, 0x77, 0x3f, 0xa7, 0x7f, 0x3e, 0xb9,
+  0xed, 0x18, 0xcd, 0xa3, 0x28, 0x38, 0xa4, 0x96, 0xe5, 0xa6, 0x93, 0x92,
+  0x43, 0x70, 0xbc, 0x61, 0xa9, 0xb7, 0x99, 0x1a, 0x45, 0x90, 0xce, 0xaf,
+  0x37, 0x29, 0x6d, 0x6e, 0x59, 0x84, 0xa9, 0x0d, 0xc8, 0xc5, 0xf4, 0x7a,
+  0xbd, 0x6a, 0xa0, 0x14, 0x4d, 0x0b, 0x8d, 0xf2, 0x4f, 0x9b, 0xa9, 0x7b,
+  0xa5, 0x83, 0xce, 0xca, 0x15, 0x07, 0x32, 0xb3, 0x20, 0x32, 0x96, 0xf3,
+  0xee, 0xd3, 0x95, 0x32, 0x22, 0x2b, 0x9f, 0xd3, 0x3b, 0x7c, 0xaf, 0xeb,
+  0x64, 0xcf, 0x1c, 0x43, 0x5e, 0xac, 0x1a, 0x0b, 0xd6, 0x87, 0x0f, 0x2a,
+  0x85, 0x46, 0x77, 0x9f, 0xf8, 0xbc, 0x15, 0x2c, 0xc2, 0x0b, 0x6a, 0x2f,
+  0x40, 0xc8, 0xf7, 0x04, 0x3a, 0xb9, 0x38, 0x78, 0x7c, 0x29, 0x1b, 0x71,
+  0x15, 0xd9, 0x28, 0xac, 0x74, 0x6e, 0xca, 0x6e, 0xcd, 0x66, 0x33, 0x88,
+  0x52, 0x62, 0x85, 0x83, 0x13, 0x6a, 0x92, 0x21, 0xcc, 0x0d, 0x1b, 0x22,
+  0x99, 0x3f, 0x2d, 0x26, 0x6e, 0x5b, 0x78, 0x81, 0xcf, 0x95, 0x8d, 0x5c,
+  0x49, 0xdb, 0x7c, 0x8d, 0xb5, 0xb6, 0xf8, 0xd5, 0x96, 0x06, 0x6a, 0x8c,
+  0xad, 0x67, 0xb4, 0xb6, 0xa7, 0x54, 0x0d, 0xec, 0x15, 0xa2, 0x99, 0x93,
+  0xb0, 0x59, 0x9b, 0x34, 0xfc, 0x3b, 0x7c, 0xfa, 0x90, 0x42, 0xc6, 0x07,
+  0x31, 0x8d, 0xcc, 0x2f, 0xe6, 0x26, 0xd6, 0x0b, 0x5e, 0x00, 0x7f, 0x7d,
+  0xa6, 0x78, 0xdc, 0x84, 0xd4, 0xcd, 0x97, 0xd5, 0x3a, 0xe0, 0x39, 0x1d,
+  0x20, 0xbb, 0x0d, 0x39, 0x73, 0x4c, 0xd5, 0xf9, 0x0d, 0xd9, 0x51, 0x9d,
+  0x12, 0xfc, 0xe4, 0xaa, 0xb9, 0xfa, 0x7b, 0x3e, 0x8b, 0x22, 0x37, 0xd0,
+  0x6d, 0x30, 0xbf, 0x36, 0xa7, 0x56, 0xb3, 0xfb, 0x4b, 0x91, 0x4d, 0x93,
+  0x2d, 0x79, 0x6d, 0x7b, 0x90, 0xcc, 0x56, 0x70, 0xc8, 0x8d, 0x0f, 0xc7,
+  0x27, 0xc9, 0xd9, 0xc9, 0xe1, 0xf1, 0x5b, 0xf3, 0xce, 0x30, 0x34, 0x52,
+  0x2d, 0x60, 0xd9, 0xa0, 0xdb, 0x62, 0x0c, 0x1e, 0xcf, 0x36, 0xa6, 0x99,
+  0xfd, 0x0e, 0x7f, 0x28, 0xc4, 0x34, 0x9a, 0x41, 0x94, 0xb6, 0x6a, 0x0f,
+  0x86, 0x2b, 0xcd, 0x78, 0xea, 0x47, 0xd5, 0x71, 0x4a, 0x93, 0x66, 0xca,
+  0x48, 0x2a, 0xaa, 0x17, 0x6b, 0xe4, 0xcb, 0x68, 0x24, 0xd7, 0x75, 0x26,
+  0x53, 0x0b, 0x57, 0x63, 0x56, 0xee, 0xb2, 0x8b, 0x68, 0x86, 0x66, 0x46,
+  0xdc, 0x31, 0xcb, 0x50, 0x85, 0x37, 0x2c, 0xc0, 0xdd, 0x6c, 0x96, 0x2b,
+  0x32, 0x06, 0xfb, 0x32, 0xa1, 0xcc, 0xa4, 0xc8, 0xed, 0x48, 0xc9, 0xa1,
+  0xb2, 0x4d, 0x2a, 0x66, 0xbd, 0xac, 0xfc, 0x14, 0x85, 0xc3, 0xd6, 0x4a,
+  0xa3, 0xc5, 0x6e, 0xd6, 0x81, 0x84, 0x9e, 0x94, 0xb7, 0x03, 0x07, 0x93,
+  0x80, 0xd2, 0x26, 0x9b, 0xdf, 0x70, 0x69, 0x98, 0x19, 0x60, 0xa8, 0x78,
+  0x24, 0x33, 0xe8, 0xc0, 0x66, 0xba, 0xd7, 0x57, 0x69, 0x58, 0x30, 0xb0,
+  0x30, 0xda, 0xad, 0x19, 0xd0, 0x77, 0x8d, 0xae, 0xa3, 0xb1, 0xa7, 0x9d,
+  0x5e, 0xde, 0xa0, 0xb1, 0xbc, 0xab, 0xe3, 0x1c, 0x21, 0xcb, 0xd6, 0xe6,
+  0xc8, 0x59, 0xee, 0x6c, 0x86, 0x00, 0x1d, 0xb5, 0xc9, 0x61, 0x2d, 0x00,
+  0xfb, 0x5e, 0xe7, 0x7b, 0x9f, 0x08, 0x25, 0x96, 0x51, 0xbb, 0xfb, 0x1a,
+  0x5f, 0xd6, 0x07, 0xfc, 0x75, 0x07, 0x46, 0x1d, 0x4e, 0x86, 0x91, 0xbd,
+  0xa8, 0x9a, 0x89, 0x1b, 0x94, 0xc6, 0xe0, 0xa1, 0xf0, 0xc4, 0x8e, 0xa4,
+  0xc6, 0xdd, 0x97, 0x61, 0xc2, 0xd0, 0xb3, 0xba, 0xf2, 0x31, 0x51, 0x3f,
+  0x75, 0xf0, 0x1d, 0xc6, 0x60, 0xac, 0x6c, 0x7c, 0x56, 0xec, 0xac, 0x1a,
+  0x4f, 0x53, 0xa2, 0x5c, 0x23, 0xea, 0x9c, 0x95, 0xe4, 0x34, 0x86, 0xcb,
+  0x37, 0xa3, 0x06, 0x08, 0x61, 0xbb, 0x04, 0x4e, 0x41, 0xb8, 0xe0, 0x26,
+  0xa9, 0x3a, 0x03, 0x6f, 0xcc, 0x80, 0x0f, 0xa3, 0x89, 0x06, 0xe8, 0xec,
+  0x6f, 0xab, 0x3c, 0x43, 0x37, 0x5f, 0x23, 0x87, 0x93, 0x57, 0x9c, 0x31,
+  0x29, 0xcd, 0x46, 0xb9, 0xab, 0x31, 0x3a, 0x1f, 0xd3, 0xa3, 0x76, 0x02,
+  0x01, 0x1f, 0x36, 0x13, 0x22, 0xf9, 0xf4, 0x06, 0x93, 0x7e, 0x49, 0x93,
+  0x5e, 0x18, 0x01, 0x08, 0xbf, 0x96, 0x87, 0xae, 0xa7, 0xc9, 0x34, 0x5a,
+  0xe1, 0xc2, 0xa2, 0x2a, 0xad, 0x3f, 0x86, 0x35, 0x2c, 0x83, 0x56, 0xa7,
+  0x36, 0xf8, 0x52, 0x84, 0x31, 0x35, 0xd4, 0xe6, 0xaf, 0x48, 0xe7, 0x3b,
+  0x75, 0x33, 0x23, 0xbd, 0x60, 0x55, 0xcc, 0x69, 0x92, 0x34, 0x54, 0x4f,
+  0xdf, 0xd0, 0x08, 0x0e, 0x15, 0x20, 0xd0, 0x3b, 0x07, 0x84, 0x98, 0x8e,
+  0x65, 0x83, 0x52, 0xcb, 0xe7, 0x1b, 0x76, 0xf4, 0x13, 0x91, 0xab, 0x21,
+  0x28, 0x96, 0xbf, 0x55, 0xc4, 0x76, 0x78, 0xc5, 0xd8, 0xc8, 0xd6, 0xb9,
+  0xad, 0x83, 0x08, 0xb9, 0xa6, 0x09, 0x19, 0x42, 0x9b, 0x94, 0xb5, 0x82,
+  0xa7, 0x9b, 0x45, 0x9a, 0xd7, 0x5b, 0xf7, 0x09, 0x10, 0x74, 0x3f, 0x13,
+  0xe5, 0x87, 0xfb, 0xa5, 0x7b, 0x18, 0x3f, 0xeb, 0xda, 0xa4, 0x87, 0x4d,
+  0xe6, 0x7f, 0x36, 0xc0, 0x4f, 0x0c, 0xc1, 0x8c, 0x5c, 0x2c, 0x36, 0x27,
+  0x58, 0x12, 0xfd, 0x5a, 0x40, 0x37, 0x70, 0x6a, 0x50, 0xe2, 0x45, 0xa4,
+  0x45, 0xa7, 0x21, 0xa7, 0x95, 0x60, 0x83, 0x4c, 0xe7, 0x46, 0x07, 0x8a,
+  0x38, 0x62, 0xc6, 0x02, 0x0c, 0x47, 0x30, 0x78, 0x83, 0xae, 0xc8, 0xae,
+  0x57, 0xa4, 0x9a, 0xcf, 0x57, 0xf4, 0x6d, 0x46, 0x90, 0xb3, 0x08, 0x66,
+  0x0a, 0x69, 0x10, 0x45, 0xfd, 0xb3, 0x10, 0x64, 0x74, 0x47, 0x3d, 0x00,
+  0x44, 0xc5, 0xf4, 0xb5, 0xd8, 0x80, 0x5d, 0x8c, 0xa8, 0x51, 0xcf, 0xec,
+  0xc8, 0x5b, 0xc2, 0xc3, 0x64, 0x02, 0xb0, 0xea, 0x39, 0xa6, 0xa8, 0xcc,
+  0x4b, 0xa7, 0x23, 0x08, 0x81, 0x82, 0xa9, 0x13, 0x45, 0x75, 0x43, 0xce,
+  0x04, 0x2b, 0x5f, 0xfe, 0xdc, 0x54, 0x43, 0x51, 0x00, 0x01, 0x54, 0x5e,
+  0x78, 0x38, 0x80, 0x86, 0x00, 0x8a, 0x20, 0x1e, 0x48, 0xc8, 0x5c, 0xdc,
+  0x58, 0x10, 0x3c, 0x87, 0x15, 0x6a, 0x29, 0x22, 0xab, 0xf5, 0xee, 0xb5,
+  0xa6, 0xc4, 0x10, 0x4d, 0x45, 0x2c, 0x83, 0x9f, 0x5f, 0xda, 0x52, 0x90,
+  0x1e, 0xbc, 0xb6, 0xdd, 0x8a, 0x9b, 0x95, 0x2d, 0x18, 0xea, 0xdf, 0x54,
+  0xe7, 0x7a, 0xd2, 0x6e, 0xa8, 0x27, 0x90, 0x8e, 0xbf, 0xe8, 0x42, 0xa5,
+  0x0f, 0xbb, 0x51, 0x3d, 0xd5, 0x36, 0xff, 0x6f, 0xde, 0xa8, 0xf4, 0x61,
+  0x57, 0x2a, 0x6d, 0xdd, 0x29, 0x5a, 0x66, 0xc8, 0x96, 0x6e, 0x7b, 0x67,
+  0xfc, 0x2b, 0xde, 0x32, 0x9b, 0x98, 0xf4, 0xd0, 0x3b, 0xa6, 0x34, 0xf1,
+  0xff, 0xf6, 0x2d, 0xfb, 0xbc, 0xa3, 0x05, 0x02, 0x1f, 0x75, 0x4d, 0xdf,
+  0x4a, 0x3f, 0x77, 0x8b, 0x14, 0x64, 0xd2, 0xb5, 0x76, 0x2c, 0x94, 0x61,
+  0xbc, 0x79, 0x25, 0x43, 0x6f, 0x45, 0x43, 0x97, 0xa5, 0x1e, 0xed, 0x13,
+  0x7b, 0x1c, 0x8a, 0x3b, 0xb0, 0x76, 0xe4, 0xc0, 0x79, 0xab, 0x08, 0xd1,
+  0x0e, 0x37, 0x65, 0x24, 0xea, 0x83, 0xae, 0xe9, 0xd2, 0xc8, 0xf5, 0x65,
+  0x0e, 0xed, 0xc0, 0x28, 0x2e, 0x64, 0xde, 0x7e, 0x3d, 0x1e, 0x0f, 0x0f,
+  0xcf, 0x8e, 0x93, 0x7b, 0xec, 0x2e, 0xe0, 0xc2, 0xb8, 0x39, 0xc6, 0xec,
+  0xe5, 0xfe, 0x34, 0xac, 0xf6, 0xd7, 0x8d, 0x9e, 0xdb, 0xdd, 0xd6, 0xc3,
+  0x3a, 0x69, 0xa5, 0x19, 0xeb, 0xa4, 0x6c, 0xcb, 0x0d, 0xd2, 0xb6, 0x15,
+  0x75, 0x19, 0xa9, 0xfe, 0xe4, 0xac, 0x21, 0xae, 0x85, 0x07, 0x82, 0x9c,
+  0x6c, 0x20, 0xec, 0x10, 0x3a, 0xce, 0xde, 0xf3, 0xa7, 0x7b, 0xe6, 0x56,
+  0xdc, 0x31, 0xea, 0xa3, 0xbc, 0xfc, 0x78, 0xf4, 0x68, 0xe7, 0xf1, 0xe8,
+  0x31, 0xf1, 0x34, 0x09, 0x96, 0xc2, 0xd9, 0x21, 0xc3, 0x1b, 0x6e, 0x17,
+  0xc9, 0x4a, 0x62, 0x21, 0xf6, 0xf6, 0xe8, 0x65, 0xc2, 0xa9, 0xab, 0x80,
+  0x01, 0xec, 0x18, 0x5d, 0x9c, 0xe1, 0x86, 0x14, 0x16, 0x39, 0x42, 0x26,
+  0xd6, 0xc0, 0x49, 0x11, 0x6c, 0x87, 0x9a, 0x12, 0xb0, 0xb8, 0x0a, 0x3b,
+  0x11, 0x62, 0x77, 0x6c, 0x55, 0xc8, 0xbe, 0xd0, 0x1c, 0xc3, 0x0a, 0x34,
+  0x6f, 0x4b, 0xbc, 0x0d, 0xbb, 0x27, 0xbd, 0xfc, 0x71, 0xff, 0xf9, 0xa8,
+  0xf9, 0xd2, 0x63, 0x00, 0x39, 0xcf, 0x7d, 0x60, 0xe7, 0x08, 0x43, 0x54,
+  0xa3, 0x94, 0x5c, 0x90, 0xd3, 0x85, 0x35, 0x49, 0x2e, 0xfe, 0x36, 0x2b,
+  0x46, 0x3f, 0xd7, 0x9e, 0x8a, 0x28, 0xc4, 0x9e, 0xd9, 0xa4, 0x53, 0x17,
+  0x46, 0x26, 0xb6, 0x52, 0xdf, 0x82, 0xc4, 0x44, 0xea, 0x7a, 0xc8, 0x98,
+  0x04, 0xe8, 0x32, 0xb3, 0x05, 0xe5, 0x0d, 0x65, 0xc7, 0x8f, 0xfc, 0x4c,
+  0x47, 0x8f, 0x18, 0xe4, 0xf4, 0x31, 0x1e, 0xab, 0xca, 0xd2, 0xb9, 0xcc,
+  0xca, 0xfb, 0x4e, 0xf8, 0x4b, 0xda, 0x3d, 0x30, 0xdb, 0x3a, 0x4c, 0xcb,
+  0x94, 0xa0, 0x82, 0x37, 0x05, 0x9b, 0xa6, 0xe5, 0x3a, 0xb9, 0x2c, 0x2b,
+  0x23, 0x4e, 0xf2, 0x65, 0x3a, 0x4f, 0x1e, 0x50, 0x5b, 0xd0, 0x7f, 0xf8,
+  0xf7, 0xf4, 0xe9, 0xc5, 0xec, 0xf5, 0x76, 0xae, 0x61, 0x74, 0x92, 0x7a,
+  0xd4, 0x95, 0xaa, 0x11, 0x2e, 0xd7, 0x33, 0x18, 0x21, 0x27, 0x38, 0x6e,
+  0xa6, 0x14, 0xd7, 0x4d, 0xa0, 0x31, 0x96, 0xa4, 0xf5, 0xbc, 0x92, 0x3b,
+  0xce, 0x85, 0xd2, 0x74, 0x58, 0xa9, 0x79, 0xdd, 0xee, 0x32, 0xc2, 0x18,
+  0x73, 0x6f, 0x4a, 0x61, 0x8a, 0xf7, 0x72, 0xde, 0x5f, 0x83, 0x19, 0x92,
+  0x0a, 0xc7, 0x7e, 0x86, 0x9f, 0xaf, 0xcc, 0xc9, 0x16, 0x26, 0x5b, 0x48,
+  0x03, 0x91, 0x1a, 0x61, 0xc5, 0x09, 0xd5, 0xc4, 0x82, 0x88, 0xb3, 0x08,
+  0x51, 0x63, 0x10, 0x08, 0x6d, 0xc8, 0x3d, 0xa6, 0x55, 0x44, 0xf1, 0x0b,
+  0xf8, 0xec, 0xff, 0x13, 0x6a, 0xe0, 0x93, 0xc4, 0x9e, 0xd5, 0x43, 0xd4,
+  0x41, 0x46, 0x56, 0xe7, 0x7e, 0xe3, 0x01, 0xf4, 0x9d, 0x33, 0xb9, 0xfe,
+  0x7f, 0x6d, 0xf0, 0xff, 0x24, 0x6d, 0xf0, 0x5f, 0xb9, 0xa5, 0x43, 0xc9,
+  0x6b, 0xe6, 0x6b, 0x69, 0x33, 0xab, 0xa4, 0x0e, 0x25, 0x5a, 0x70, 0x30,
+  0xbf, 0x1b, 0x25, 0x3d, 0xf0, 0xc6, 0xf7, 0x5c, 0xd1, 0x90, 0x14, 0xfe,
+  0xdf, 0xb8, 0xa2, 0x0f, 0xba, 0x99, 0xff, 0xbf, 0xef, 0xe3, 0x7f, 0xb7,
+  0x7b, 0x18, 0x21, 0x48, 0x1d, 0x6c, 0xcb, 0x90, 0xd9, 0x0d, 0x65, 0xed,
+  0x71, 0xb3, 0x33, 0x58, 0xda, 0xdb, 0x4e, 0xf5, 0xa1, 0x72, 0x3c, 0xde,
+  0xba, 0xe3, 0xb3, 0xef, 0x9e, 0x02, 0x85, 0x67, 0xdc, 0x4d, 0x66, 0xa9,
+  0x92, 0x93, 0x57, 0x87, 0x67, 0x3f, 0xe3, 0xb6, 0xff, 0x19, 0x6e, 0xd6,
+  0x65, 0x96, 0xcd, 0x86, 0x1c, 0x37, 0x7c, 0x81, 0x7f, 0x44, 0x03, 0xee,
+  0x8a, 0xae, 0x01, 0xb2, 0xa5, 0x70, 0x62, 0x98, 0xc7, 0x80, 0x97, 0x8d,
+  0x9a, 0x52, 0x08, 0xe6, 0xcd, 0x12, 0x6d, 0x97, 0x03, 0x1f, 0x4b, 0x59,
+  0xcc, 0xb6, 0x45, 0x05, 0xe4, 0x6f, 0x83, 0x54, 0x24, 0xff, 0x84, 0xae,
+  0xf7, 0x25, 0xe1, 0xe2, 0x59, 0xe8, 0x50, 0xef, 0x19, 0xce, 0xc4, 0x8b,
+  0x26, 0x43, 0xdd, 0xb9, 0xa5, 0x70, 0xc8, 0x93, 0xd1, 0xeb, 0x1e, 0xed,
+  0x92, 0xff, 0x1d, 0x1c, 0x24, 0x6b, 0x3e, 0x21, 0xda, 0x46, 0xf7, 0xf3,
+  0x7d, 0xe9, 0x34, 0x6b, 0xb7, 0xd2, 0x3f, 0x89, 0xd6, 0x0e, 0x52, 0x84,
+  0x9c, 0x43, 0x87, 0x41, 0x97, 0x72, 0xef, 0x9b, 0x9c, 0x41, 0xc2, 0xf3,
+  0xb5, 0x9f, 0x68, 0xef, 0xe5, 0xf1, 0x45, 0x7b, 0x3b, 0x23, 0xd9, 0xbb,
+  0x83, 0x56, 0xb6, 0x92, 0x3f, 0x25, 0x1b, 0x27, 0xdf, 0x4b, 0xd4, 0xb5,
+  0xcf, 0x98, 0x12, 0x02, 0x65, 0xf1, 0xe7, 0x30, 0x9b, 0xd2, 0x7b, 0xfd,
+  0xbe, 0x4e, 0xc4, 0x65, 0xd1, 0x54, 0x68, 0x31, 0xa2, 0x29, 0x04, 0xb5,
+  0x82, 0xf6, 0xaf, 0xbc, 0x6e, 0xce, 0x29, 0x0a, 0x05, 0xb0, 0x6b, 0x61,
+  0xbb, 0x4d, 0xbe, 0xdf, 0x59, 0x33, 0x1d, 0xd9, 0x93, 0x05, 0x80, 0xa1,
+  0xf9, 0xd5, 0xd4, 0xa8, 0xb8, 0xda, 0x91, 0x7a, 0x80, 0x16, 0x6e, 0xda,
+  0x9c, 0xad, 0xc7, 0x57, 0xa1, 0x99, 0x30, 0x9f, 0xbe, 0x3d, 0xdb, 0xfa,
+  0xfe, 0x87, 0x21, 0x84, 0x84, 0xba, 0x63, 0x2c, 0x57, 0x48, 0x0d, 0x3b,
+  0x03, 0xf8, 0x02, 0x9a, 0x24, 0x53, 0x24, 0xf8, 0x62, 0x9e, 0xde, 0x48,
+  0x3d, 0x5c, 0x97, 0xdf, 0x8f, 0x4f, 0x1e, 0x61, 0x5b, 0xcf, 0x4f, 0xc6,
+  0x3e, 0x7c, 0x7e, 0x8d, 0x60, 0x3c, 0xea, 0x1f, 0xbf, 0x3a, 0x3a, 0x1c,
+  0x9f, 0x8f, 0x82, 0x25, 0x72, 0x1c, 0x38, 0x4a, 0x30, 0xcc, 0x84, 0xc7,
+  0x27, 0x66, 0xad, 0x77, 0x04, 0x9f, 0x29, 0x75, 0x95, 0x34, 0x39, 0x9e,
+  0x9b, 0x8e, 0x4e, 0x76, 0x6e, 0xca, 0xd9, 0xfd, 0x4d, 0x56, 0x85, 0x29,
+  0x49, 0x66, 0xef, 0x26, 0xf9, 0x9c, 0x56, 0x60, 0xe6, 0x65, 0xac, 0xa1,
+  0x85, 0x14, 0x4d, 0xa0, 0x4a, 0xbf, 0x9c, 0x53, 0x26, 0x01, 0x7d, 0xa6,
+  0xed, 0x87, 0xa0, 0x84, 0x64, 0x81, 0x2e, 0xe8, 0x2f, 0x44, 0x36, 0x7a,
+  0x47, 0x49, 0xed, 0x9f, 0xec, 0x54, 0x75, 0xaf, 0x38, 0xee, 0xec, 0x75,
+  0xec, 0x23, 0x7c, 0x23, 0x02, 0x71, 0x09, 0xd3, 0xbd, 0xd3, 0xfa, 0xa3,
+  0x46, 0x76, 0xd1, 0x57, 0x94, 0xa2, 0xc6, 0x6b, 0x73, 0x4e, 0xbb, 0x96,
+  0x90, 0x39, 0x68, 0xd4, 0xc4, 0x53, 0x75, 0x54, 0x50, 0x1c, 0x41, 0x0e,
+  0x80, 0x22, 0x9b, 0x6f, 0xaf, 0x39, 0x71, 0xcd, 0x1c, 0xf1, 0xfb, 0x9e,
+  0xd2, 0x68, 0xf1, 0x5e, 0x6b, 0xc9, 0xf4, 0x2a, 0x33, 0x42, 0x64, 0xe4,
+  0x21, 0x3b, 0x3c, 0x78, 0x43, 0x3e, 0x0b, 0xe0, 0xff, 0x22, 0xdb, 0xf3,
+  0xb3, 0x37, 0xe4, 0xf1, 0xe3, 0x70, 0x43, 0xaa, 0xec, 0x6f, 0xb3, 0x18,
+  0x16, 0x3a, 0x6a, 0x50, 0x50, 0xfe, 0xc2, 0x65, 0x23, 0xef, 0x18, 0xd0,
+  0x9d, 0xa6, 0xba, 0x43, 0x2d, 0x8d, 0x34, 0x8f, 0xde, 0x81, 0xe9, 0x91,
+  0x85, 0x4d, 0x01, 0xc8, 0xb0, 0x1d, 0xbb, 0x82, 0x6e, 0x7a, 0xed, 0x37,
+  0xf3, 0x38, 0x1c, 0x88, 0x64, 0x37, 0xcb, 0x47, 0xd6, 0x6a, 0x90, 0x94,
+  0xcb, 0x82, 0xc6, 0x38, 0x54, 0x62, 0x6a, 0x2f, 0xcf, 0x70, 0x78, 0xd1,
+  0x2c, 0xed, 0xc2, 0xd6, 0x52, 0xc7, 0x6e, 0xb0, 0x19, 0x3d, 0x4b, 0x3f,
+  0xaf, 0xee, 0xd4, 0xfd, 0xba, 0x76, 0xf5, 0x61, 0xb6, 0x25, 0xf5, 0xdc,
+  0xe1, 0x44, 0x6a, 0xa0, 0x96, 0x49, 0x13, 0xf5, 0xde, 0x6d, 0x70, 0x25,
+  0xab, 0xb2, 0x11, 0x21, 0xf3, 0xc0, 0xb6, 0xb4, 0x22, 0xa3, 0x76, 0xc1,
+  0xc2, 0xc1, 0x35, 0x3a, 0x2a, 0x5b, 0xc0, 0xa5, 0x95, 0x28, 0x68, 0x08,
+  0x6e, 0x7b, 0xd1, 0x18, 0x6b, 0xfe, 0x3a, 0x9b, 0xa3, 0xc0, 0x3b, 0x2b,
+  0xa6, 0xd5, 0xdd, 0xd2, 0x07, 0xef, 0x9f, 0xfd, 0x2b, 0xfb, 0xaf, 0x95,
+  0x41, 0x08, 0x1d, 0x1b, 0xc5, 0xc7, 0x30, 0xbb, 0xed, 0x50, 0xff, 0xa2,
+  0x3a, 0x5d, 0x19, 0x8f, 0xf1, 0x48, 0x49, 0x0a, 0x37, 0x7e, 0xad, 0x00,
+  0xd9, 0x32, 0xca, 0xb9, 0x19, 0x42, 0x53, 0xa0, 0x16, 0x2e, 0x42, 0x07,
+  0x32, 0x6d, 0xae, 0xad, 0x04, 0x78, 0xf0, 0xc9, 0xef, 0x0f, 0x78, 0xbb,
+  0xae, 0xf7, 0x03, 0x9e, 0x30, 0x3e, 0xd9, 0x4e, 0x5e, 0x93, 0x8f, 0xa6,
+  0xed, 0x84, 0xa7, 0xeb, 0xaa, 0xed, 0xc9, 0xf6, 0xd9, 0x11, 0xe5, 0x77,
+  0x6b, 0x56, 0x08, 0xfc, 0x20, 0x85, 0x0a, 0x95, 0xe1, 0x78, 0xdb, 0xd5,
+  0xe8, 0x8e, 0x0d, 0x6b, 0xe5, 0xc4, 0x46, 0xf5, 0x2c, 0x71, 0x4f, 0x55,
+  0x2d, 0x7d, 0x36, 0x4f, 0x5f, 0xef, 0xf7, 0x01, 0xd1, 0x8f, 0xe4, 0xd7,
+  0x28, 0x62, 0x9f, 0x65, 0xc0, 0x72, 0x57, 0x2c, 0x4d, 0xaa, 0xe0, 0x62,
+  0x7a, 0x43, 0x56, 0x2f, 0xb9, 0xa7, 0x9f, 0xee, 0x3d, 0x7b, 0xba, 0xbd,
+  0xae, 0x4b, 0x39, 0xf5, 0xee, 0xa1, 0xe2, 0x5c, 0x26, 0x21, 0xfa, 0xd7,
+  0xfe, 0xc8, 0xdf, 0xa0, 0xc4, 0x75, 0x36, 0x91, 0x22, 0xeb, 0x50, 0xc2,
+  0x19, 0x71, 0x43, 0x24, 0x81, 0x8d, 0xd0, 0x76, 0x0f, 0x20, 0x16, 0x5e,
+  0x17, 0xd9, 0x32, 0x72, 0xcb, 0x41, 0xca, 0x5d, 0xa3, 0x30, 0x40, 0xa2,
+  0x87, 0x91, 0x38, 0x7c, 0xa4, 0x73, 0x60, 0xe9, 0xe9, 0xb7, 0xe7, 0xe4,
+  0xc9, 0xe2, 0xef, 0xa3, 0xf6, 0xbf, 0xfc, 0x60, 0xa6, 0x1b, 0xe0, 0x97,
+  0x9c, 0xf2, 0xa3, 0xdf, 0xe0, 0x94, 0x1f, 0xad, 0x3f, 0xe5, 0x47, 0x0f,
+  0x3d, 0xe5, 0x67, 0x4f, 0x9e, 0x7e, 0xfe, 0x0b, 0x4e, 0xd9, 0xdb, 0xe1,
+  0xff, 0x65, 0xa7, 0xec, 0x51, 0xda, 0x2f, 0x3b, 0x65, 0x49, 0x0a, 0xe9,
+  0x16, 0x64, 0x4a, 0xf2, 0x0b, 0xd2, 0x5a, 0x09, 0x4a, 0x83, 0xcb, 0x58,
+  0xf8, 0xd9, 0xb0, 0xce, 0x4a, 0x9a, 0x4f, 0x72, 0xd3, 0x3b, 0xd2, 0xc3,
+  0x22, 0x46, 0xb6, 0x83, 0x16, 0x81, 0x86, 0xbb, 0x9c, 0x53, 0xef, 0xb4,
+  0xcd, 0xe1, 0xa6, 0xba, 0x47, 0xb4, 0x7c, 0x52, 0x71, 0xb1, 0xf8, 0x73,
+  0xe6, 0xa8, 0x7f, 0x43, 0x54, 0xb5, 0x30, 0x67, 0xc6, 0xcb, 0x7a, 0x6a,
+  0x6f, 0xda, 0xdd, 0xdc, 0x98, 0x09, 0x9c, 0x83, 0x14, 0xcd, 0x7e, 0x13,
+  0xe4, 0x77, 0x8b, 0xec, 0xa4, 0x8e, 0x9a, 0x89, 0x51, 0x0a, 0x8d, 0x14,
+  0x28, 0x28, 0xa9, 0xe7, 0x6e, 0x9e, 0x49, 0x01, 0x31, 0x2d, 0x9a, 0x28,
+  0x83, 0x4c, 0xf9, 0xae, 0x4b, 0x58, 0x7a, 0x05, 0x75, 0x32, 0x96, 0x46,
+  0xe2, 0x2e, 0x37, 0xea, 0x59, 0x6b, 0x32, 0x08, 0x02, 0xd4, 0xe6, 0x96,
+  0x4c, 0xaf, 0xb8, 0xbf, 0x48, 0x04, 0xec, 0x67, 0x5d, 0x82, 0x5f, 0x37,
+  0xe1, 0xae, 0xa7, 0x37, 0x51, 0xb4, 0x03, 0x15, 0xf5, 0xa9, 0x6a, 0x37,
+  0xaa, 0xe2, 0x1c, 0x71, 0x46, 0xd4, 0x83, 0xc2, 0xdf, 0xed, 0xfd, 0x24,
+  0x8d, 0xa3, 0x82, 0x42, 0x64, 0x92, 0xe9, 0xb2, 0xa0, 0x76, 0xd3, 0x25,
+  0x97, 0x4d, 0xa8, 0x3b, 0x73, 0x7f, 0xcd, 0x0c, 0x25, 0x9d, 0x4b, 0xcf,
+  0x6d, 0x15, 0x92, 0x6c, 0x82, 0xbf, 0xa2, 0xd3, 0x9d, 0xad, 0x16, 0x4b,
+  0x05, 0x43, 0xa4, 0xea, 0xa6, 0x1c, 0x65, 0x74, 0x02, 0x88, 0x80, 0xa4,
+  0xeb, 0x88, 0x1b, 0xcd, 0x7a, 0x99, 0x24, 0xb9, 0x8d, 0x3d, 0x56, 0x7a,
+  0x56, 0x02, 0xec, 0xc1, 0x0b, 0x40, 0xe2, 0x1a, 0x4a, 0x89, 0x08, 0x5f,
+  0x2d, 0xbb, 0x08, 0x52, 0x0f, 0xd0, 0xa8, 0x16, 0xd1, 0xc9, 0x6c, 0xb2,
+  0xba, 0x54, 0x4c, 0x01, 0xdb, 0xe0, 0xae, 0x4d, 0x95, 0xa8, 0xbf, 0x22,
+  0x94, 0xa1, 0x6c, 0xc0, 0xc9, 0xf0, 0x77, 0x21, 0xb8, 0x4a, 0x43, 0xdd,
+  0x1d, 0xa7, 0xeb, 0x92, 0xc3, 0x82, 0x85, 0x83, 0xd8, 0x5b, 0x2b, 0xc7,
+  0x4f, 0x5a, 0x8d, 0xc7, 0x22, 0xad, 0xb3, 0x7c, 0x52, 0x69, 0xa6, 0xcb,
+  0xe1, 0x45, 0x4a, 0xd0, 0xa4, 0x41, 0x61, 0xb9, 0x24, 0x84, 0xca, 0x15,
+  0x38, 0x7f, 0x79, 0x96, 0xbc, 0x4e, 0xa5, 0xdd, 0x50, 0xb2, 0x65, 0x38,
+  0xf0, 0xb3, 0xc7, 0x7b, 0x8f, 0xb6, 0xd7, 0xea, 0xe1, 0x6d, 0xb8, 0x2d,
+  0x7c, 0xab, 0x28, 0x63, 0x09, 0xeb, 0xe7, 0x2b, 0x63, 0x36, 0x2b, 0x8e,
+  0x8f, 0xf9, 0xd2, 0x87, 0xb7, 0xa7, 0xaf, 0x8e, 0x4e, 0x0e, 0xff, 0x6c,
+  0x51, 0x23, 0x68, 0x13, 0xb4, 0xf2, 0xf8, 0x83, 0x31, 0x5f, 0xef, 0x3e,
+  0xd4, 0x99, 0x99, 0x73, 0xb3, 0xf5, 0x68, 0x9b, 0x2a, 0xf7, 0x82, 0xa6,
+  0x90, 0x97, 0x59, 0x1b, 0x6b, 0x83, 0xeb, 0x07, 0xd6, 0x00, 0x46, 0x59,
+  0x07, 0xe5, 0xee, 0x68, 0x5f, 0xba, 0x8e, 0x48, 0xdb, 0x04, 0xc7, 0xb3,
+  0xbc, 0xc6, 0x29, 0xa9, 0xc0, 0xca, 0x71, 0x6d, 0x6e, 0x58, 0xa1, 0x45,
+  0xc0, 0x1e, 0xf9, 0x34, 0x27, 0x6b, 0x45, 0xae, 0x75, 0x4e, 0x61, 0xf8,
+  0x8b, 0x36, 0x2c, 0x25, 0x8a, 0x77, 0xe9, 0x17, 0xeb, 0xc3, 0xca, 0x6d,
+  0xde, 0xdf, 0x40, 0x58, 0x64, 0xf3, 0x22, 0x6b, 0x86, 0x32, 0xb1, 0x17,
+  0xe6, 0xcf, 0x2f, 0xae, 0xd3, 0x79, 0x50, 0x12, 0x4e, 0x3d, 0x15, 0x95,
+  0x32, 0x2d, 0x2b, 0xa2, 0x37, 0xbd, 0x8e, 0x2b, 0x63, 0xdb, 0x7a, 0x44,
+  0x9f, 0x34, 0x57, 0x25, 0xe8, 0x30, 0x72, 0x7e, 0xfe, 0xe7, 0xb3, 0xa3,
+  0x2f, 0x5e, 0x10, 0x23, 0xfb, 0x13, 0xd5, 0x9e, 0xd4, 0x2d, 0xbe, 0x96,
+  0x50, 0x0f, 0xf7, 0x60, 0x0d, 0x3f, 0xbc, 0x3a, 0x1e, 0x9f, 0x9d, 0x9c,
+  0xbe, 0xfc, 0xe2, 0xc5, 0x0f, 0x64, 0x53, 0x1a, 0xe1, 0x71, 0xe7, 0xbd,
+  0x6b, 0x7f, 0x66, 0xbb, 0x28, 0x84, 0x80, 0x22, 0x47, 0xdf, 0x7f, 0x38,
+  0x7a, 0xfb, 0xdd, 0x17, 0x2f, 0xae, 0xd3, 0x6a, 0x40, 0xeb, 0xe3, 0xb7,
+  0x7b, 0x1a, 0x96, 0xb6, 0x48, 0x8d, 0xd4, 0xf3, 0xc9, 0xfc, 0x63, 0x9d,
+  0xff, 0x3d, 0x4b, 0xcc, 0xeb, 0xf3, 0x55, 0x08, 0x63, 0x7e, 0xce, 0x38,
+  0x0c, 0x66, 0x33, 0xe8, 0x6f, 0xc9, 0x57, 0x27, 0xdf, 0x12, 0x54, 0xae,
+  0xf5, 0x93, 0x2e, 0xb8, 0xef, 0x52, 0xf2, 0xa7, 0x27, 0x7b, 0xfb, 0xdb,
+  0xae, 0xdb, 0x27, 0xa0, 0xb6, 0xcd, 0x8c, 0x3f, 0x06, 0x55, 0x53, 0x7f,
+  0x97, 0xfa, 0x2f, 0x57, 0xcb, 0xd0, 0x38, 0x8b, 0x8a, 0xcb, 0x0f, 0xc4,
+  0xe5, 0x84, 0xe4, 0x7c, 0xe4, 0xbf, 0x52, 0xb3, 0xd4, 0x0a, 0x69, 0xeb,
+  0x81, 0xc7, 0xed, 0xfc, 0xb5, 0x87, 0x71, 0xf3, 0x95, 0x23, 0x3d, 0x33,
+  0x1d, 0xf1, 0xda, 0xad, 0x95, 0x8f, 0x9f, 0x30, 0x96, 0xd3, 0x35, 0x29,
+  0xb1, 0xd9, 0x46, 0xa4, 0x09, 0xfd, 0xc4, 0xf7, 0xd9, 0xcb, 0xf1, 0x41,
+  0x05, 0x58, 0xc9, 0xd8, 0x8c, 0x58, 0xa5, 0x12, 0x9e, 0x42, 0x0a, 0xdc,
+  0xe3, 0xc3, 0xcb, 0x17, 0x54, 0x7b, 0x9c, 0xd5, 0x89, 0xfa, 0x77, 0x3c,
+  0xef, 0xcd, 0x3c, 0xbb, 0x4c, 0xa7, 0x77, 0x16, 0x61, 0x1a, 0x07, 0x32,
+  0xeb, 0xde, 0x4e, 0x78, 0xf8, 0xa6, 0x64, 0xcc, 0x19, 0x11, 0x7c, 0x09,
+  0xf6, 0xcc, 0x50, 0x2a, 0xe6, 0xba, 0x5a, 0xa7, 0x0f, 0x4f, 0xcd, 0x82,
+  0xc5, 0xa8, 0xb8, 0xa4, 0x4d, 0xed, 0x4a, 0xe7, 0xf6, 0x16, 0x77, 0xa8,
+  0x8f, 0xc8, 0x06, 0xed, 0x88, 0xd7, 0xee, 0xe9, 0xe3, 0xb6, 0xc7, 0xfc,
+  0xef, 0xb8, 0xe4, 0x84, 0xc2, 0x05, 0xa7, 0xec, 0x0b, 0xfa, 0x6b, 0x1c,
+  0x87, 0x1f, 0xed, 0xb9, 0xe0, 0xb6, 0xe0, 0x76, 0xd3, 0xdc, 0xf4, 0x80,
+  0x96, 0x6d, 0xeb, 0x0b, 0xa4, 0xad, 0x0d, 0xc1, 0xb9, 0x37, 0xce, 0x9d,
+  0x1e, 0xc7, 0xb8, 0xb3, 0x4e, 0x6d, 0x43, 0x9e, 0x2c, 0xac, 0x88, 0x32,
+  0x7a, 0xc6, 0xb3, 0x05, 0xba, 0xf4, 0xfb, 0x88, 0x63, 0x53, 0x92, 0x11,
+  0x5e, 0xd0, 0x58, 0xc4, 0x12, 0x49, 0x27, 0x31, 0x3b, 0xf5, 0x27, 0x8d,
+  0xfa, 0xa0, 0xf3, 0x51, 0x29, 0xc8, 0x6b, 0x78, 0x88, 0x91, 0x64, 0xea,
+  0x10, 0x86, 0x83, 0xb3, 0xdb, 0xd5, 0x71, 0xc0, 0x09, 0x1a, 0x14, 0x52,
+  0xb3, 0xb0, 0xd2, 0x66, 0x9a, 0xb5, 0x6a, 0xa5, 0x54, 0x04, 0x09, 0x33,
+  0xdd, 0x01, 0xcf, 0x46, 0xb0, 0x08, 0xbc, 0xaa, 0x3d, 0x05, 0x04, 0xe7,
+  0x95, 0x49, 0x3a, 0x02, 0x26, 0xb4, 0xb5, 0xa0, 0x85, 0x48, 0x7f, 0x02,
+  0x6e, 0x06, 0xd1, 0xd7, 0xb0, 0xbd, 0x23, 0xa5, 0xcc, 0x98, 0x34, 0x82,
+  0x48, 0x28, 0xc8, 0x24, 0x86, 0x65, 0xe8, 0xec, 0x46, 0xa4, 0xfa, 0xb8,
+  0xe1, 0x24, 0xfe, 0xae, 0x88, 0x22, 0x50, 0x71, 0x4d, 0x9d, 0x6f, 0x8d,
+  0x20, 0x65, 0xce, 0xe8, 0x44, 0xb7, 0x35, 0x74, 0x2d, 0xc2, 0xf2, 0xc6,
+  0xaa, 0x6c, 0x11, 0xc8, 0x1d, 0x0b, 0x7c, 0x6e, 0x81, 0xdb, 0xd8, 0xf5,
+  0xa9, 0xf4, 0x21, 0x14, 0x41, 0x1f, 0xdb, 0xe1, 0xd2, 0x4f, 0x65, 0x41,
+  0x79, 0xa4, 0xf4, 0x3c, 0x18, 0xac, 0xc8, 0x6e, 0xfc, 0xc1, 0x9c, 0xdd,
+  0x61, 0x07, 0xfc, 0x94, 0xde, 0x6e, 0x63, 0x33, 0x51, 0xbd, 0x5a, 0xf2,
+  0xe2, 0xbb, 0xa3, 0x77, 0xe3, 0xe3, 0xd3, 0xb7, 0x7f, 0x8a, 0x9a, 0xc3,
+  0xf2, 0x4b, 0xdb, 0xea, 0x4d, 0x2b, 0x5d, 0x5d, 0x3b, 0x2e, 0xf2, 0x82,
+  0xa9, 0xaf, 0x85, 0xbb, 0x3a, 0xe5, 0x05, 0x3d, 0x12, 0x74, 0xf9, 0x9a,
+  0x66, 0xcb, 0x06, 0xfa, 0x92, 0xda, 0xd2, 0xd8, 0x25, 0xc4, 0x2d, 0xd0,
+  0x07, 0x06, 0x36, 0x1c, 0x95, 0xba, 0x89, 0x6d, 0x67, 0xff, 0xb6, 0x1f,
+  0x81, 0x79, 0xe3, 0xdf, 0x3c, 0x0a, 0x36, 0x28, 0x9e, 0xb0, 0xe3, 0xc5,
+  0xcb, 0x57, 0x4b, 0xae, 0x92, 0x24, 0x30, 0x13, 0x06, 0x3e, 0xf2, 0x17,
+  0x10, 0xf4, 0x6d, 0x18, 0xed, 0xb6, 0x5f, 0x34, 0x0f, 0x5f, 0xef, 0x79,
+  0x15, 0x2c, 0xf6, 0xb9, 0xbd, 0xd8, 0x73, 0x7b, 0xe1, 0x73, 0xfb, 0xb1,
+  0xe7, 0xf6, 0xc3, 0xe7, 0x1e, 0xc5, 0x9e, 0xf3, 0xd6, 0xeb, 0x99, 0xf1,
+  0xb2, 0x73, 0xeb, 0x2c, 0xe3, 0xd6, 0xbf, 0x1e, 0x8d, 0xdc, 0xf1, 0x7f,
+  0x66, 0xbd, 0x15, 0xdd, 0x46, 0xb5, 0x9e, 0x61, 0xaf, 0x76, 0x7d, 0xbf,
+  0x59, 0xaf, 0x7c, 0x5a, 0x87, 0x33, 0x6a, 0x62, 0xc7, 0xc5, 0x6c, 0xbe,
+  0xb7, 0xf7, 0x68, 0x38, 0xcd, 0x97, 0x57, 0x24, 0x75, 0x5e, 0x68, 0x6b,
+  0x37, 0xda, 0x7c, 0x5a, 0xac, 0xfc, 0x62, 0x45, 0x26, 0x79, 0xa8, 0x87,
+  0x9c, 0x8c, 0xb7, 0x13, 0x0f, 0xaf, 0x48, 0x20, 0x3a, 0xf1, 0x4a, 0xc2,
+  0xef, 0x38, 0xb4, 0xa2, 0xd0, 0xc1, 0x1c, 0x94, 0xba, 0x58, 0xf7, 0x8d,
+  0x79, 0x4f, 0x26, 0xc0, 0xa4, 0xab, 0xb3, 0xd2, 0x69, 0xca, 0xd8, 0x8c,
+  0xaa, 0xab, 0xa1, 0xf7, 0xae, 0x6b, 0x17, 0x3d, 0x2e, 0xf4, 0x15, 0xc5,
+  0xb8, 0xa3, 0xde, 0x6c, 0x45, 0x67, 0x75, 0x3c, 0x9c, 0x55, 0xb9, 0xcb,
+  0x22, 0x26, 0x2a, 0xdf, 0xbf, 0x3b, 0x09, 0x54, 0xcb, 0x84, 0x5c, 0x33,
+  0xf5, 0xc1, 0xce, 0x0e, 0x1a, 0x8c, 0x5f, 0xa5, 0xb7, 0xb7, 0xa3, 0x3a,
+  0xdb, 0x31, 0xfc, 0xa4, 0xde, 0x81, 0xbf, 0x57, 0x3e, 0x7d, 0xd5, 0x2c,
+  0xe6, 0xeb, 0x1c, 0xb5, 0x79, 0xad, 0x98, 0xb2, 0x8c, 0xc5, 0x38, 0x63,
+  0xd4, 0x05, 0x57, 0xa4, 0x8d, 0x0b, 0xc9, 0x07, 0xac, 0x49, 0x77, 0xdd,
+  0x86, 0x1f, 0xdc, 0x49, 0x15, 0x7d, 0x9c, 0xf7, 0x48, 0xf6, 0x41, 0x60,
+  0x5a, 0x88, 0x56, 0x36, 0x21, 0x39, 0xf3, 0xc1, 0x61, 0xe7, 0xd0, 0x0b,
+  0x54, 0x4f, 0x9b, 0x05, 0xe1, 0x0c, 0x0b, 0x92, 0x53, 0x01, 0x14, 0x1f,
+  0xbe, 0x82, 0xd8, 0x9e, 0xd5, 0x7e, 0xe0, 0x83, 0xdc, 0x03, 0xb2, 0xe4,
+  0xa8, 0x9a, 0xf1, 0x89, 0x99, 0x26, 0xa5, 0xe4, 0x91, 0x32, 0x6f, 0x54,
+  0x0e, 0xf3, 0xdf, 0x3f, 0x85, 0x45, 0xe7, 0x09, 0x96, 0x10, 0xa4, 0xee,
+  0x91, 0xfe, 0x4f, 0x65, 0x5f, 0xbc, 0xff, 0xfc, 0x3d, 0xbf, 0x3d, 0x06,
+  0xcc, 0x8b, 0x68, 0xf8, 0x08, 0xc7, 0xb2, 0x31, 0x7e, 0x77, 0xb6, 0x31,
+  0x90, 0x68, 0xbd, 0xf9, 0xc0, 0xd0, 0xfc, 0x3b, 0x81, 0x95, 0x49, 0xed,
+  0x75, 0x9e, 0x3c, 0x96, 0xc4, 0x3a, 0x9e, 0x23, 0x37, 0x99, 0x0b, 0xc3,
+  0x47, 0xf8, 0xa5, 0x4d, 0x2e, 0xe4, 0x2e, 0xb4, 0xae, 0x1a, 0xd5, 0x18,
+  0x80, 0xed, 0x15, 0x72, 0xca, 0xcf, 0xc0, 0x01, 0xaf, 0xc7, 0xd5, 0x3a,
+  0x0b, 0xfb, 0x68, 0x68, 0x06, 0xd3, 0x1c, 0x75, 0x02, 0x04, 0x65, 0xf5,
+  0x51, 0x5a, 0x81, 0x48, 0x98, 0x83, 0x99, 0x4b, 0xd0, 0x7d, 0xb9, 0xe3,
+  0x45, 0xf4, 0xa8, 0x91, 0x5d, 0xac, 0xba, 0x6c, 0xd9, 0x31, 0x85, 0xc1,
+  0xeb, 0x69, 0x31, 0xac, 0xb4, 0x6a, 0x36, 0xec, 0xeb, 0x62, 0x45, 0x67,
+  0x82, 0x51, 0x3a, 0x83, 0xdc, 0x83, 0x55, 0xf3, 0xb8, 0x73, 0xfa, 0xba,
+  0x79, 0x91, 0x63, 0xb7, 0xfb, 0x4a, 0x47, 0x04, 0x8b, 0x46, 0x2b, 0xb4,
+  0xe9, 0xdb, 0x1d, 0x72, 0x70, 0xc8, 0x80, 0x7d, 0xd5, 0x64, 0x8a, 0x2d,
+  0xe3, 0x1d, 0xc8, 0x48, 0x83, 0x6f, 0xc2, 0xa6, 0xdd, 0x59, 0x7b, 0xfd,
+  0x30, 0xe2, 0xa6, 0x81, 0xea, 0x85, 0x2e, 0x7b, 0x45, 0x19, 0xdf, 0xbd,
+  0xeb, 0xf7, 0x97, 0x8f, 0x8f, 0x45, 0xf3, 0xb3, 0x41, 0xf8, 0x9a, 0xc0,
+  0x9a, 0x3c, 0x68, 0x0f, 0x64, 0x0b, 0x7e, 0xe1, 0x0e, 0x88, 0x47, 0xba,
+  0x4b, 0xd2, 0xb4, 0x11, 0xa1, 0xab, 0xec, 0x53, 0xec, 0x4b, 0x6b, 0x63,
+  0x48, 0x00, 0xc7, 0xc5, 0x56, 0x24, 0xa0, 0xe0, 0x69, 0x1c, 0xd0, 0x30,
+  0x94, 0x8f, 0xde, 0x5b, 0xb3, 0x81, 0x00, 0xa2, 0x04, 0x16, 0x68, 0x10,
+  0xed, 0x92, 0x12, 0x62, 0x26, 0x91, 0x3b, 0x56, 0x3e, 0x01, 0xdb, 0x81,
+  0x3f, 0xdf, 0x32, 0x12, 0x01, 0x3a, 0xa5, 0x4a, 0x29, 0xfb, 0x68, 0x12,
+  0xce, 0x85, 0xef, 0x0c, 0xf7, 0x81, 0xae, 0xee, 0x07, 0x61, 0x6b, 0x50,
+  0xd1, 0x88, 0x55, 0x00, 0x96, 0x33, 0xa7, 0xe6, 0x0e, 0x29, 0x80, 0x56,
+  0x29, 0x12, 0x51, 0xa3, 0x2d, 0x4d, 0xb7, 0x43, 0x52, 0x77, 0xdf, 0xcd,
+  0x30, 0xe6, 0x8e, 0x53, 0x3b, 0x6d, 0xf5, 0xf6, 0xaa, 0x2e, 0xda, 0x81,
+  0x6c, 0x43, 0x53, 0x12, 0xab, 0x72, 0xca, 0xae, 0x05, 0x96, 0xc5, 0x7d,
+  0xb5, 0xd6, 0xa1, 0x22, 0x42, 0xfa, 0xd1, 0x2f, 0x3c, 0xac, 0xbd, 0xff,
+  0xc3, 0x0e, 0x6b, 0xef, 0xff, 0x86, 0xc3, 0xda, 0xff, 0x85, 0x87, 0xb5,
+  0xff, 0x7f, 0xd8, 0x61, 0xed, 0xff, 0xdf, 0x70, 0x58, 0x8f, 0x7e, 0xe1,
+  0x61, 0x3d, 0xfa, 0xd5, 0x0f, 0xeb, 0x2d, 0xfd, 0x1e, 0x52, 0x42, 0x75,
+  0xca, 0xbc, 0xee, 0xaa, 0x5c, 0x93, 0x3b, 0xb4, 0xb6, 0x9f, 0xd0, 0x86,
+  0x88, 0x39, 0x22, 0xaa, 0x6a, 0xdd, 0xb5, 0xc9, 0x0e, 0x1b, 0x8b, 0x5a,
+  0x65, 0xfb, 0xaf, 0x48, 0x80, 0x4b, 0xb0, 0xf0, 0x49, 0x9f, 0xfa, 0xaa,
+  0x24, 0xff, 0x8c, 0xd1, 0x3b, 0x06, 0xc9, 0xdb, 0xf1, 0x98, 0x93, 0x9a,
+  0xc6, 0x08, 0xcc, 0x76, 0x0f, 0x8b, 0x5c, 0x9d, 0xb0, 0xa0, 0xb6, 0x48,
+  0x29, 0x3d, 0x35, 0x33, 0x74, 0xcc, 0x85, 0xdf, 0x5b, 0xa4, 0x53, 0xfa,
+  0xf1, 0xee, 0x68, 0xcf, 0x6d, 0xce, 0xf6, 0xcf, 0x80, 0x99, 0x73, 0x51,
+  0xd3, 0xa8, 0x6d, 0x1f, 0x01, 0x84, 0xa7, 0x3c, 0x10, 0xd2, 0x81, 0xdb,
+  0x47, 0x73, 0x2b, 0x90, 0x72, 0x6a, 0x36, 0xf5, 0x43, 0x8f, 0xa3, 0xbf,
+  0x9c, 0x04, 0xbe, 0x41, 0xd4, 0xea, 0x9e, 0x45, 0x86, 0x07, 0xa3, 0x24,
+  0x85, 0xd2, 0xaf, 0x1b, 0x1a, 0xcc, 0x2f, 0x09, 0x69, 0xef, 0xe7, 0xc6,
+  0xad, 0xbd, 0x18, 0xf1, 0xff, 0xb2, 0xb8, 0xf5, 0x83, 0xac, 0x6f, 0xff,
+  0xca, 0x54, 0x43, 0x6d, 0xdc, 0x16, 0x47, 0x87, 0x77, 0x6e, 0x4b, 0xaa,
+  0x33, 0x02, 0x70, 0xe4, 0x8c, 0x49, 0x87, 0xf2, 0x78, 0x8e, 0xe4, 0x5d,
+  0x17, 0x3d, 0x64, 0x23, 0x29, 0x44, 0x77, 0x2a, 0x35, 0xa7, 0xdf, 0xe2,
+  0x19, 0x29, 0x70, 0x06, 0xaf, 0xb2, 0x66, 0x8a, 0x5b, 0x15, 0xfa, 0x19,
+  0x87, 0x40, 0x01, 0x64, 0xb5, 0x20, 0xb9, 0x61, 0x9a, 0x31, 0xee, 0x56,
+  0x7e, 0x9f, 0x06, 0xfd, 0xb4, 0xbd, 0xde, 0x74, 0x9a, 0x0d, 0xd3, 0x7a,
+  0x9a, 0xe7, 0xf1, 0xc6, 0xb1, 0x1a, 0x65, 0xa6, 0xb4, 0x1e, 0xc4, 0x07,
+  0xcc, 0xf3, 0x09, 0x45, 0xf4, 0xb4, 0x0f, 0x3c, 0xf1, 0x43, 0x20, 0x51,
+  0xd1, 0x74, 0xcb, 0x55, 0x73, 0x59, 0x6a, 0xa8, 0x60, 0x10, 0x71, 0x3b,
+  0x52, 0xcc, 0x0f, 0x47, 0x6c, 0x4e, 0x67, 0x5a, 0xe5, 0x4b, 0xa0, 0xdc,
+  0xfa, 0x4d, 0xe7, 0x06, 0xb6, 0x27, 0x3b, 0x5c, 0x79, 0x12, 0x9b, 0xe5,
+  0x16, 0xe5, 0xef, 0x03, 0xf3, 0x77, 0x63, 0xb8, 0x41, 0x4e, 0x53, 0xdb,
+  0xab, 0xcb, 0xbc, 0x4b, 0xd8, 0xe4, 0x5e, 0x54, 0x34, 0x51, 0x48, 0xa5,
+  0x9e, 0x20, 0xbf, 0x06, 0x49, 0x0c, 0x09, 0xdd, 0x29, 0xfe, 0x35, 0xda,
+  0x91, 0x68, 0xf0, 0x93, 0x04, 0x80, 0xb9, 0x83, 0xe4, 0xbc, 0x2f, 0x05,
+  0x07, 0xe4, 0x2a, 0xbb, 0xe5, 0x2a, 0xd5, 0xd0, 0xa0, 0x63, 0xd8, 0x44,
+  0x8a, 0xd6, 0x4a, 0x60, 0xfe, 0x70, 0xfc, 0xf2, 0xf8, 0xb8, 0x55, 0xd3,
+  0x4a, 0x9b, 0xc7, 0xe0, 0xb9, 0x00, 0x1e, 0xa9, 0x09, 0x44, 0x98, 0x42,
+  0xc2, 0xb1, 0x18, 0x3f, 0x77, 0xa2, 0x34, 0xd7, 0x0f, 0x71, 0x1d, 0xc3,
+  0x09, 0x72, 0xed, 0x13, 0x9a, 0x8a, 0x59, 0x53, 0x98, 0x69, 0xe6, 0x04,
+  0xed, 0x76, 0xb5, 0x5a, 0xa4, 0xc5, 0xa7, 0xc7, 0xa5, 0x8b, 0x97, 0x8a,
+  0xc8, 0x6e, 0xf1, 0xbd, 0xf2, 0xe3, 0xc8, 0x21, 0xad, 0x45, 0xda, 0x7e,
+  0x9c, 0x55, 0xd2, 0x14, 0x92, 0x71, 0xda, 0xa4, 0x6f, 0x87, 0x59, 0x26,
+  0x50, 0x34, 0x79, 0x64, 0xb3, 0x56, 0x0d, 0x4d, 0x33, 0x24, 0xbe, 0x30,
+  0x12, 0xba, 0x33, 0x5d, 0x97, 0x23, 0x07, 0xe9, 0xd6, 0xd6, 0xe2, 0xed,
+  0x75, 0x45, 0x25, 0x3e, 0xf2, 0x5b, 0xde, 0x00, 0xff, 0x02, 0xdc, 0x4b,
+  0xff, 0x72, 0x01, 0x7a, 0x6e, 0x00, 0xea, 0x70, 0x5c, 0x8b, 0xbb, 0xfb,
+  0x2f, 0x01, 0x74, 0x91, 0x8d, 0xdf, 0x6f, 0xc4, 0x1b, 0xc3, 0x3c, 0xe0,
+  0x26, 0xb5, 0xe0, 0x5d, 0x7e, 0x5b, 0x4a, 0x8b, 0xe0, 0xcd, 0x78, 0x4c,
+  0xcc, 0x3f, 0xd3, 0x55, 0x91, 0xdf, 0xa2, 0x5c, 0xc4, 0xa8, 0x12, 0x2f,
+  0xa8, 0x29, 0x4a, 0x4f, 0xc3, 0x8f, 0x97, 0xac, 0xd8, 0x24, 0x5a, 0xfd,
+  0x82, 0x55, 0xbc, 0x37, 0x2f, 0x1b, 0x95, 0x71, 0x41, 0xd9, 0x43, 0x3c,
+  0xc6, 0xc0, 0x47, 0x5e, 0x07, 0x5b, 0x8f, 0x64, 0x1f, 0x15, 0x59, 0x43,
+  0x96, 0xeb, 0xda, 0xb8, 0x59, 0x3b, 0x16, 0x79, 0x0e, 0xbc, 0xb1, 0x25,
+  0x95, 0x24, 0xac, 0xe9, 0xdf, 0xcd, 0xe1, 0x44, 0xaf, 0x00, 0xc0, 0x07,
+  0xec, 0xa6, 0x38, 0x99, 0x6b, 0xf3, 0x25, 0xf4, 0x23, 0x52, 0x1f, 0x4d,
+  0x5f, 0x62, 0x89, 0x52, 0xb6, 0x3b, 0x91, 0xeb, 0xed, 0x95, 0x77, 0xe3,
+  0x1e, 0xe8, 0x1e, 0xe5, 0x82, 0xc3, 0xd2, 0x77, 0x33, 0x94, 0xdd, 0x9d,
+  0x26, 0x63, 0x23, 0xaf, 0xdf, 0x71, 0xab, 0x07, 0x1a, 0x50, 0x10, 0xf3,
+  0x39, 0x91, 0xff, 0x8e, 0xe6, 0x4e, 0xcc, 0xc3, 0xcc, 0x7e, 0xd7, 0x58,
+  0x8b, 0x59, 0x1d, 0x95, 0x91, 0x21, 0x7e, 0x4a, 0xff, 0x7e, 0xc9, 0xea,
+  0x3d, 0x3b, 0xc5, 0xdb, 0x8b, 0x90, 0x66, 0x79, 0x5d, 0xf5, 0xc5, 0x8b,
+  0x6e, 0x5f, 0x51, 0xaf, 0x75, 0x9d, 0x57, 0xc5, 0x84, 0xe8, 0xbe, 0xa6,
+  0x59, 0x63, 0x9d, 0x6e, 0x41, 0x41, 0xd6, 0xb4, 0x6d, 0xcc, 0x25, 0x6a,
+  0x14, 0xe3, 0xda, 0x52, 0x29, 0x1f, 0xb5, 0x27, 0xa1, 0x2c, 0x40, 0xdb,
+  0xda, 0x99, 0x0f, 0x96, 0x9b, 0xc2, 0x4b, 0xc5, 0x70, 0x80, 0xdb, 0x9b,
+  0xcf, 0x5b, 0x55, 0x19, 0xe2, 0x08, 0xd6, 0x42, 0xb0, 0x2d, 0xa3, 0xac,
+  0xb3, 0xd2, 0xc6, 0x97, 0x87, 0x5a, 0x8b, 0x28, 0xf0, 0x7b, 0x3f, 0x28,
+  0x78, 0x14, 0x3c, 0xaa, 0x9d, 0x1e, 0x47, 0x9c, 0x63, 0x2b, 0x55, 0xec,
+  0x54, 0x8a, 0xc4, 0x6d, 0xab, 0xda, 0x69, 0x6e, 0x78, 0x5e, 0xf8, 0xe4,
+  0x1e, 0xc4, 0xce, 0xa4, 0xbd, 0x98, 0xb0, 0xa5, 0xe4, 0x50, 0x30, 0xeb,
+  0x33, 0x72, 0xa4, 0x76, 0xbf, 0x33, 0xf2, 0xbf, 0xc3, 0xa5, 0x38, 0xdb,
+  0x01, 0x3c, 0xdc, 0x5d, 0xb7, 0xf7, 0xb9, 0xfd, 0x36, 0xcd, 0x53, 0x2b,
+  0xce, 0x65, 0x66, 0x48, 0x5d, 0xa6, 0xbc, 0x6d, 0xa4, 0x35, 0x84, 0x37,
+  0x11, 0x10, 0x08, 0xce, 0xc8, 0x03, 0x7c, 0xad, 0x74, 0x29, 0xe2, 0x7c,
+  0x6e, 0xe1, 0x68, 0x8c, 0x51, 0x2b, 0xab, 0xa5, 0x50, 0x31, 0x03, 0x97,
+  0x06, 0x7e, 0x50, 0x74, 0x4f, 0x8c, 0xb6, 0xca, 0xf2, 0x0b, 0x12, 0x89,
+  0xa3, 0x85, 0xd7, 0xd9, 0x36, 0x22, 0xa4, 0xce, 0x46, 0xa5, 0x76, 0x60,
+  0xe9, 0xeb, 0xf6, 0x22, 0x58, 0xfe, 0xc9, 0x11, 0xbd, 0x11, 0x0e, 0xf6,
+  0x07, 0xe9, 0x8f, 0x94, 0xfb, 0xbd, 0x46, 0x6f, 0x70, 0x19, 0xba, 0x74,
+  0x25, 0x94, 0x27, 0x8d, 0x23, 0x80, 0x1e, 0x30, 0x92, 0x36, 0x5a, 0xa4,
+  0xb4, 0xab, 0x9a, 0x99, 0x6c, 0x5c, 0xce, 0xcb, 0xc9, 0xc4, 0x2c, 0x7c,
+  0xc3, 0x53, 0x4a, 0xcd, 0x97, 0x03, 0x4f, 0xb5, 0x3f, 0x0f, 0x63, 0x59,
+  0x5d, 0xc2, 0x98, 0x1e, 0x70, 0xd6, 0x9b, 0xb4, 0x5e, 0x20, 0x81, 0xac,
+  0x21, 0x04, 0xf9, 0xbe, 0x22, 0xad, 0x47, 0xe4, 0x8c, 0xe4, 0xdf, 0x0b,
+  0x61, 0xd0, 0xc2, 0x5a, 0x41, 0x05, 0x14, 0x4b, 0xd2, 0x4f, 0x75, 0x82,
+  0x9c, 0xc9, 0x98, 0xf4, 0x25, 0xe3, 0xb6, 0x1a, 0x5d, 0x0d, 0xb4, 0xcf,
+  0x61, 0x5e, 0x87, 0xd1, 0x1b, 0xec, 0x42, 0x7b, 0x41, 0x1b, 0xff, 0xa0,
+  0x3f, 0xf6, 0x06, 0xf4, 0xdf, 0xfd, 0x7f, 0x6e, 0x20, 0xc0, 0x73, 0xb0,
+  0xb3, 0x73, 0x73, 0x73, 0x33, 0x52, 0xb8, 0x42, 0x73, 0x64, 0x9f, 0x85,
+  0x75, 0x85, 0x84, 0xf2, 0xd6, 0xf3, 0x81, 0xf3, 0x64, 0x23, 0x5f, 0x5c,
+  0xfe, 0x65, 0x6f, 0xb8, 0xb7, 0xbb, 0xbb, 0xfb, 0xd3, 0x68, 0x49, 0x5b,
+  0x7c, 0x81, 0x61, 0xcd, 0x7f, 0xfd, 0x61, 0x77, 0x78, 0x26, 0x3b, 0x51,
+  0x40, 0x59, 0xd9, 0x48, 0x8b, 0x10, 0x53, 0x70, 0x53, 0x10, 0x26, 0xe4,
+  0x03, 0x8f, 0xc9, 0x70, 0x9c, 0x3a, 0xed, 0xaf, 0xd2, 0xe7, 0xfe, 0x7c,
+  0x14, 0xa0, 0x78, 0xf2, 0x68, 0x7f, 0x3f, 0x61, 0x95, 0x83, 0x8b, 0xdf,
+  0x38, 0x55, 0x82, 0x70, 0x0f, 0xa4, 0x81, 0x39, 0xcb, 0x32, 0x02, 0x77,
+  0x4c, 0x39, 0x14, 0x64, 0x68, 0xa3, 0x27, 0x61, 0x94, 0x33, 0x13, 0x08,
+  0xe0, 0xd1, 0x70, 0x9f, 0x72, 0x76, 0xe7, 0x06, 0x36, 0x54, 0x5e, 0x11,
+  0x6f, 0xe5, 0x5e, 0xa3, 0x16, 0x45, 0x32, 0xad, 0x63, 0x5a, 0x9b, 0x2d,
+  0x64, 0x83, 0x90, 0x03, 0x08, 0x6f, 0x51, 0x4a, 0x1b, 0x6d, 0xe4, 0x05,
+  0x5c, 0xac, 0x2a, 0xe9, 0xa1, 0x84, 0x34, 0x8a, 0x9b, 0xf4, 0xae, 0x25,
+  0xec, 0xcd, 0x8e, 0xbf, 0x30, 0xff, 0x09, 0xdc, 0xe0, 0xb6, 0x3c, 0x57,
+  0x7a, 0x40, 0x5f, 0x64, 0xcd, 0xf4, 0x2a, 0xc0, 0x94, 0x07, 0xfb, 0x26,
+  0xd5, 0xfd, 0xca, 0xac, 0xc6, 0x42, 0xb6, 0xf7, 0xf5, 0x97, 0x74, 0x55,
+  0xbf, 0x66, 0x50, 0xea, 0x26, 0x82, 0xba, 0x07, 0x6e, 0x37, 0xcf, 0x3c,
+  0xb1, 0x0f, 0x3b, 0xd4, 0xf6, 0x38, 0x45, 0x46, 0x6a, 0x5e, 0x6b, 0x55,
+  0xf2, 0xf4, 0x2a, 0x5b, 0x08, 0xbf, 0xdc, 0xd2, 0x84, 0xcc, 0x0d, 0x21,
+  0xc2, 0x8d, 0x50, 0xa4, 0x6d, 0x5c, 0xc8, 0x6f, 0xcc, 0x62, 0xb6, 0xa5,
+  0xaa, 0xd7, 0x4a, 0x39, 0x69, 0xb5, 0x74, 0xb9, 0x22, 0xab, 0x71, 0x92,
+  0x8a, 0x38, 0xd1, 0x72, 0xf3, 0xbe, 0xbc, 0x69, 0xe2, 0x89, 0x59, 0x05,
+  0x29, 0x46, 0xfe, 0x97, 0xa1, 0xe8, 0x3e, 0x22, 0x54, 0x91, 0xbe, 0x62,
+  0x6e, 0xec, 0xab, 0xe3, 0x97, 0xe7, 0x28, 0xb1, 0x1d, 0xa0, 0x18, 0x67,
+  0x80, 0xba, 0xda, 0xb0, 0x0d, 0xd6, 0x19, 0xfc, 0x23, 0x20, 0x54, 0x89,
+  0x55, 0xa5, 0x2e, 0x81, 0xcf, 0x61, 0x9c, 0x6b, 0x95, 0x9c, 0xd7, 0xc0,
+  0x2c, 0x92, 0x99, 0xdc, 0xd2, 0x12, 0x6d, 0xda, 0xe3, 0xe3, 0x27, 0xa3,
+  0x5d, 0x5e, 0xa3, 0xeb, 0xb0, 0xad, 0x75, 0x60, 0x70, 0x23, 0x69, 0xfc,
+  0x32, 0x8d, 0x67, 0x24, 0xd8, 0xe9, 0x0c, 0x12, 0xc6, 0x56, 0x67, 0xa0,
+  0x06, 0xfd, 0xad, 0x97, 0x8b, 0xb9, 0x56, 0x33, 0xf5, 0xa1, 0x55, 0x89,
+  0x2c, 0x3b, 0xa0, 0xd8, 0x14, 0x79, 0x2b, 0x6d, 0x0d, 0xa7, 0xa0, 0xb8,
+  0xc4, 0x8a, 0xf1, 0x40, 0x13, 0x89, 0x78, 0xb0, 0x9a, 0xac, 0x18, 0xb8,
+  0xce, 0x56, 0x25, 0x49, 0x01, 0x91, 0x58, 0x52, 0xdd, 0xd4, 0x6a, 0x04,
+  0x1b, 0xd3, 0x4f, 0x82, 0x86, 0x61, 0xc3, 0xaf, 0x04, 0xd7, 0x96, 0xf5,
+  0xe4, 0x58, 0x61, 0x19, 0x1d, 0xe5, 0xb6, 0xe6, 0xd0, 0xb2, 0xdd, 0xaa,
+  0x0a, 0xe7, 0x88, 0xdc, 0x85, 0x7c, 0xec, 0x4d, 0xb7, 0xe5, 0xbb, 0xb9,
+  0xa2, 0xc3, 0x10, 0x0b, 0x73, 0x8a, 0x64, 0xab, 0x3b, 0xdb, 0x99, 0x30,
+  0x95, 0x15, 0x82, 0x12, 0x60, 0xec, 0xc1, 0x3f, 0xb5, 0xf1, 0x47, 0x8a,
+  0x22, 0x7d, 0x71, 0xb8, 0xd1, 0xba, 0x91, 0xb1, 0xde, 0x58, 0x35, 0x73,
+  0xb7, 0xb6, 0x25, 0x23, 0x3c, 0x8d, 0xf8, 0x7e, 0x76, 0xdb, 0xb0, 0xdc,
+  0xbf, 0x40, 0x7f, 0xeb, 0xe2, 0xd1, 0x7e, 0x52, 0xdf, 0x19, 0x25, 0x62,
+  0xe1, 0x6f, 0x42, 0xb7, 0x9d, 0x79, 0x34, 0x72, 0xd6, 0xea, 0x03, 0xc8,
+  0x7c, 0xeb, 0x3d, 0xbd, 0x72, 0x88, 0x57, 0xa4, 0x73, 0x98, 0x66, 0x03,
+  0xfa, 0x35, 0xf2, 0xea, 0xf6, 0xec, 0x50, 0x0b, 0x65, 0x63, 0x33, 0x17,
+  0x9b, 0xcc, 0xd3, 0xe2, 0xa3, 0x4d, 0xdb, 0xe6, 0x91, 0x06, 0xd4, 0x7c,
+  0x96, 0xeb, 0x54, 0xdd, 0x0f, 0x25, 0x3d, 0x10, 0x92, 0x31, 0xe8, 0xd1,
+  0x46, 0x7a, 0xe9, 0x22, 0xad, 0xa8, 0x80, 0x11, 0x7b, 0x26, 0xa9, 0xd5,
+  0xfe, 0x99, 0xd8, 0x96, 0x66, 0x2c, 0xcd, 0xbf, 0x41, 0xbe, 0x3c, 0x3f,
+  0x17, 0x8a, 0x30, 0x8e, 0xe0, 0x33, 0xaa, 0x90, 0xe6, 0xa7, 0xf7, 0xf4,
+  0x9b, 0xfb, 0xf5, 0x22, 0xf7, 0x16, 0x66, 0xd9, 0x70, 0x6d, 0xf3, 0xdf,
+  0x03, 0x8d, 0x18, 0xf6, 0xf1, 0x6f, 0x2b, 0x3d, 0x6c, 0x4b, 0x75, 0x1b,
+  0x63, 0xf4, 0x9b, 0xe4, 0xb2, 0x7a, 0xe7, 0xe2, 0x9a, 0xb1, 0xf8, 0xfd,
+  0x28, 0x39, 0x75, 0xe6, 0x64, 0x31, 0x00, 0xe0, 0x6e, 0x53, 0x4d, 0xc5,
+  0x98, 0xc4, 0xdf, 0x25, 0x31, 0x34, 0x9d, 0xc7, 0x76, 0x00, 0x3d, 0xe3,
+  0x72, 0x60, 0x7e, 0xd7, 0xb1, 0xd9, 0x29, 0x38, 0xb8, 0xf0, 0x39, 0xb3,
+  0xb1, 0xd4, 0xb4, 0x94, 0x13, 0x05, 0xd2, 0x20, 0xef, 0x9b, 0x17, 0x11,
+  0xef, 0x56, 0xc7, 0x69, 0x03, 0xb6, 0x4d, 0xad, 0x7b, 0xbc, 0x96, 0x54,
+  0x81, 0xb9, 0x91, 0x8b, 0x9c, 0xd9, 0xe2, 0xba, 0x4d, 0x18, 0x96, 0x56,
+  0x16, 0x83, 0x00, 0x3d, 0x8a, 0x02, 0xf3, 0xec, 0x71, 0xa2, 0x8c, 0xc3,
+  0x85, 0x74, 0x07, 0xb7, 0x2d, 0x86, 0x53, 0x7e, 0x4f, 0x69, 0xd3, 0xff,
+  0xf2, 0x3d, 0x8d, 0x8c, 0xb9, 0xd3, 0x90, 0x1e, 0x86, 0xa1, 0xc2, 0x01,
+  0x17, 0x0a, 0x06, 0x4b, 0x3a, 0x2d, 0xf4, 0x46, 0x0a, 0x98, 0x55, 0xce,
+  0x61, 0xde, 0xda, 0xb7, 0x31, 0xaf, 0xa8, 0x25, 0x94, 0xe7, 0xff, 0x10,
+  0x44, 0x30, 0xa3, 0x6e, 0x06, 0xfa, 0x32, 0xdd, 0x46, 0x24, 0x39, 0x9a,
+  0x1d, 0x06, 0x0c, 0x35, 0x65, 0x0b, 0x51, 0x2e, 0xa6, 0x4b, 0x7d, 0x26,
+  0x7d, 0x22, 0x2b, 0xd8, 0xaa, 0x2f, 0x2d, 0xb2, 0x9b, 0x39, 0x9f, 0x10,
+  0x99, 0x71, 0xc6, 0xc0, 0xbd, 0xb5, 0xb6, 0x54, 0xb6, 0xed, 0xd3, 0x2f,
+  0x45, 0x8e, 0xd4, 0x94, 0x48, 0x6a, 0x38, 0x9a, 0x03, 0xcd, 0xae, 0x75,
+  0xe3, 0x23, 0x2d, 0xab, 0x78, 0xa5, 0xd2, 0xa1, 0xe3, 0xce, 0x07, 0x14,
+  0x36, 0x77, 0xe1, 0x3a, 0xe7, 0xbd, 0x67, 0xa8, 0xb4, 0x49, 0x95, 0x67,
+  0x17, 0xa4, 0x81, 0x60, 0x45, 0x92, 0xa1, 0x1a, 0x78, 0x8d, 0x32, 0x42,
+  0xd5, 0xa6, 0xdc, 0x77, 0x73, 0x8e, 0x54, 0x9e, 0x9c, 0xc3, 0x73, 0xc4,
+  0x3c, 0xd1, 0x76, 0xfa, 0x62, 0x08, 0x7b, 0xaa, 0xc4, 0xc4, 0x22, 0x52,
+  0xad, 0x98, 0x8a, 0x66, 0x7f, 0xa2, 0xcb, 0xbb, 0x78, 0x3c, 0x89, 0xba,
+  0x0a, 0xba, 0xc5, 0xb6, 0x53, 0x24, 0xbe, 0xc8, 0x6c, 0x55, 0xb4, 0x1b,
+  0xaf, 0xd9, 0x58, 0x1c, 0x17, 0x9a, 0x76, 0xe9, 0xdb, 0xac, 0x32, 0xf2,
+  0xaf, 0xac, 0x93, 0xef, 0x9e, 0x68, 0x92, 0xa7, 0xf4, 0xbb, 0x17, 0x55,
+  0xc4, 0x96, 0xd4, 0xa2, 0x18, 0x81, 0xa7, 0x1e, 0x84, 0x2f, 0xb8, 0x34,
+  0x84, 0xb9, 0x97, 0xbe, 0x2e, 0x0a, 0x09, 0x1b, 0xe9, 0x45, 0xf7, 0xca,
+  0x99, 0x9f, 0x18, 0xf2, 0x33, 0xff, 0x8c, 0xf7, 0x36, 0x73, 0x2d, 0xaa,
+  0x8d, 0x76, 0x45, 0xc4, 0x42, 0xbe, 0x3c, 0x73, 0x96, 0x93, 0x06, 0x4a,
+  0x8e, 0x91, 0x4e, 0x76, 0xe2, 0xc9, 0x79, 0x4e, 0xee, 0x1e, 0x49, 0xdf,
+  0x09, 0x55, 0x40, 0x2e, 0x84, 0x10, 0xb5, 0xc6, 0xa1, 0x8f, 0x77, 0x72,
+  0x29, 0x48, 0x8f, 0xac, 0xaf, 0x48, 0x13, 0x23, 0x0d, 0x01, 0x46, 0x7e,
+  0x8f, 0x7a, 0xcf, 0xf2, 0xf1, 0xed, 0xf9, 0xc9, 0x1b, 0x31, 0x9d, 0x1d,
+  0x9b, 0x13, 0xad, 0xc6, 0x99, 0xc5, 0xc2, 0x76, 0x98, 0xaa, 0x42, 0xc4,
+  0x01, 0xdd, 0x0c, 0x2d, 0x5e, 0x64, 0xbc, 0x0b, 0xda, 0xb6, 0x81, 0x64,
+  0xfa, 0x54, 0x52, 0x16, 0x27, 0x46, 0x97, 0x6e, 0x6a, 0xc4, 0x93, 0x4d,
+  0x44, 0x58, 0xe3, 0xec, 0xe1, 0x2a, 0x31, 0x12, 0xc5, 0x30, 0x9a, 0x75,
+  0xf0, 0xed, 0x24, 0xe7, 0x94, 0x1f, 0x7a, 0x5f, 0xe6, 0x95, 0x10, 0x8b,
+  0xe1, 0x6e, 0x1c, 0xc9, 0xab, 0xf2, 0xa6, 0x18, 0x9e, 0x50, 0x75, 0x73,
+  0x72, 0x52, 0x5e, 0x9a, 0xad, 0x7a, 0x0b, 0x85, 0xa5, 0x7b, 0x6a, 0xef,
+  0xcf, 0xde, 0x26, 0x5b, 0x24, 0x77, 0x93, 0x33, 0x8b, 0x68, 0x47, 0x4f,
+  0x6e, 0x8b, 0x7d, 0x51, 0xb3, 0x4e, 0x22, 0xb3, 0x19, 0x24, 0x47, 0x3f,
+  0x1c, 0xbe, 0x39, 0x3b, 0x39, 0xfa, 0x91, 0x4d, 0x8c, 0x60, 0x39, 0xf4,
+  0xe3, 0x2f, 0x3d, 0x9b, 0x0b, 0x11, 0x1a, 0xca, 0x48, 0x34, 0xf3, 0x88,
+  0xc2, 0xd9, 0x30, 0x7d, 0x32, 0x6b, 0x54, 0x12, 0x1c, 0x8f, 0xcf, 0x8e,
+  0x87, 0x0a, 0x47, 0xc7, 0xbd, 0x50, 0xf3, 0x82, 0x0c, 0x24, 0xc8, 0x23,
+  0x69, 0xa3, 0xf2, 0x6d, 0x18, 0x8c, 0xd2, 0x1b, 0x31, 0x48, 0xde, 0x6a,
+  0xa2, 0xe3, 0x00, 0x27, 0x4e, 0x57, 0xf0, 0x55, 0x7e, 0x89, 0x80, 0x52,
+  0x27, 0x3d, 0x8d, 0x88, 0x03, 0x53, 0x98, 0x06, 0xc5, 0x42, 0x68, 0x61,
+  0xe7, 0xb0, 0xf8, 0xea, 0x6c, 0xce, 0xee, 0xcb, 0x5e, 0x09, 0x09, 0x66,
+  0x80, 0x63, 0xa4, 0x2a, 0x94, 0x20, 0x54, 0x26, 0x55, 0x29, 0x93, 0x3b,
+  0xbf, 0x77, 0x9e, 0xa5, 0x11, 0x96, 0x0b, 0xa2, 0x4d, 0x58, 0xb6, 0x7f,
+  0x90, 0x6c, 0x0c, 0x57, 0xc9, 0xc1, 0xc6, 0x27, 0x54, 0x11, 0x7c, 0x4f,
+  0x6f, 0xa4, 0x15, 0x97, 0xc4, 0xcb, 0xd4, 0x15, 0x2c, 0x0d, 0x24, 0xe0,
+  0xaf, 0x56, 0x6f, 0x1b, 0x7b, 0xcc, 0xcd, 0x55, 0x17, 0xe9, 0x8b, 0xc2,
+  0xb7, 0xcb, 0x08, 0x58, 0x4c, 0x01, 0xbe, 0x94, 0x71, 0xdc, 0xd4, 0x68,
+  0xa8, 0x9b, 0x86, 0x0d, 0xb0, 0x1b, 0x9f, 0x58, 0xfc, 0x06, 0x62, 0x93,
+  0x62, 0x41, 0x95, 0x33, 0xa3, 0xab, 0x1e, 0x72, 0x0c, 0xa2, 0xa6, 0xfc,
+  0xf6, 0x70, 0x38, 0xec, 0xd5, 0xe6, 0x9f, 0x36, 0x25, 0xbe, 0xba, 0x21,
+  0x4a, 0x15, 0xf1, 0xea, 0x0d, 0x56, 0x60, 0x49, 0x31, 0xa6, 0xd9, 0x9b,
+  0x1b, 0xbf, 0xf9, 0x62, 0x53, 0xdb, 0xd5, 0xe8, 0x93, 0x5d, 0x86, 0x83,
+  0xf7, 0x24, 0xc4, 0xa7, 0x6a, 0xb5, 0x9c, 0xbe, 0x64, 0xae, 0x1b, 0xa9,
+  0x39, 0xcb, 0x20, 0xbc, 0xb9, 0x2b, 0x25, 0x23, 0x48, 0x72, 0x08, 0xb1,
+  0xab, 0x72, 0xb4, 0x66, 0x2e, 0x73, 0xfd, 0x77, 0x9d, 0xab, 0xd7, 0xb9,
+  0x99, 0x82, 0x12, 0xae, 0x83, 0xe0, 0x84, 0x9b, 0xff, 0xf6, 0xe9, 0x43,
+  0x9c, 0xb8, 0x4a, 0xc6, 0x31, 0x34, 0xe1, 0x68, 0x81, 0xe2, 0xa0, 0x53,
+  0xf9, 0x87, 0xb8, 0x56, 0xe8, 0xbe, 0x6c, 0x2c, 0x5e, 0x2a, 0x8d, 0xbc,
+  0x59, 0x51, 0x73, 0xa8, 0xf2, 0x23, 0x3a, 0xc6, 0x96, 0x55, 0xef, 0x4d,
+  0x55, 0xd7, 0xae, 0xa3, 0x3c, 0x96, 0xb6, 0x9a, 0x4f, 0x46, 0xea, 0x04,
+  0x1e, 0x14, 0x75, 0x40, 0x6c, 0xbb, 0x41, 0x88, 0x95, 0xc3, 0x8d, 0xeb,
+  0xb4, 0x65, 0x8d, 0x8d, 0x3e, 0xb5, 0x63, 0xa5, 0x5a, 0x84, 0x1c, 0xc5,
+  0xe8, 0xf7, 0x8a, 0x79, 0xdb, 0xbd, 0x11, 0xc5, 0x97, 0x8d, 0xe6, 0x05,
+  0xfd, 0x55, 0x93, 0xd8, 0x26, 0xb7, 0x4f, 0x41, 0xdd, 0xa9, 0x0b, 0x86,
+  0xd8, 0xf9, 0xc5, 0x53, 0x4b, 0xa3, 0x61, 0x91, 0xef, 0xe4, 0x56, 0xd5,
+  0xa1, 0x9d, 0xf5, 0x4a, 0x02, 0x67, 0x7e, 0x3c, 0x4a, 0x0a, 0x11, 0xd9,
+  0x71, 0x28, 0x36, 0x8a, 0x86, 0xe7, 0x35, 0x69, 0x20, 0x87, 0x77, 0xbf,
+  0x1e, 0xc5, 0x54, 0x58, 0x69, 0x72, 0xc4, 0x21, 0x3b, 0x59, 0x11, 0x7b,
+  0xd8, 0x11, 0x4d, 0xd3, 0x21, 0x24, 0x6f, 0x67, 0x60, 0xc7, 0x8e, 0x84,
+  0x56, 0x21, 0x3d, 0x1e, 0x55, 0x33, 0x04, 0x2b, 0xee, 0x24, 0xb1, 0x86,
+  0x9b, 0x82, 0x17, 0x1f, 0x35, 0x3b, 0x91, 0x46, 0xce, 0x6e, 0xb3, 0xe9,
+  0xaa, 0x69, 0x17, 0xd8, 0x79, 0x73, 0x12, 0xd8, 0x28, 0x4c, 0x69, 0x0b,
+  0x17, 0x41, 0x8d, 0xd1, 0x33, 0xc5, 0xfc, 0x39, 0xd8, 0xd8, 0xd6, 0x20,
+  0x6e, 0x2a, 0x3a, 0x3c, 0xff, 0x22, 0x16, 0x9f, 0xd5, 0x29, 0x57, 0x19,
+  0x7b, 0x54, 0x5d, 0xaa, 0x42, 0xf4, 0xf3, 0x86, 0x46, 0xab, 0xe8, 0xd7,
+  0x5f, 0xb3, 0xef, 0xcd, 0xfb, 0xb8, 0xed, 0x05, 0x2a, 0x6e, 0xb9, 0x3a,
+  0xb8, 0xca, 0xc1, 0x97, 0xd1, 0x14, 0xdd, 0x30, 0xa8, 0x6b, 0x43, 0xdd,
+  0x30, 0xe4, 0xf5, 0x55, 0xdd, 0xfc, 0xc0, 0x1d, 0x7a, 0x7c, 0x76, 0xfd,
+  0xd4, 0xf3, 0x66, 0x93, 0xc4, 0xc3, 0x8f, 0x2c, 0xc7, 0x0f, 0x56, 0xf1,
+  0xb1, 0x9a, 0x3c, 0x36, 0x7f, 0x7c, 0x4b, 0x7f, 0x5c, 0xb0, 0x5f, 0x40,
+  0x20, 0xfb, 0xd8, 0x0f, 0x1b, 0x92, 0x36, 0x41, 0x2e, 0x24, 0x3e, 0x6e,
+  0x03, 0x32, 0xb5, 0xa8, 0x0c, 0x92, 0xf0, 0xfd, 0x1c, 0xd4, 0x12, 0xac,
+  0x1a, 0x1d, 0x66, 0xc0, 0xa5, 0xc9, 0x61, 0x90, 0x52, 0xfe, 0x07, 0x3c,
+  0x3a, 0xc6, 0x7b, 0x1b, 0xc0, 0xe7, 0x34, 0xe6, 0x86, 0xad, 0x65, 0xac,
+  0x3a, 0xd5, 0x6c, 0xd5, 0xdf, 0x29, 0x50, 0x61, 0xeb, 0xe4, 0x0d, 0x07,
+  0xd0, 0xd4, 0x0a, 0x25, 0x40, 0x97, 0xd0, 0xc1, 0xee, 0x69, 0xba, 0x68,
+  0xcc, 0xcf, 0xf2, 0x9e, 0x29, 0xf4, 0x2f, 0x19, 0xd2, 0x5d, 0xfe, 0x08,
+  0x21, 0x6d, 0xfb, 0xdf, 0x7b, 0x85, 0xda, 0x6c, 0xbe, 0xf1, 0xda, 0x25,
+  0x91, 0x14, 0x36, 0x3d, 0x6a, 0x87, 0x4e, 0xc1, 0x8f, 0x5a, 0xee, 0xc0,
+  0x6a, 0x49, 0xcf, 0x3c, 0x17, 0xdc, 0x94, 0x92, 0x7a, 0x7a, 0x80, 0x2d,
+  0x7c, 0x64, 0x9f, 0x0c, 0xa5, 0x34, 0x65, 0x0b, 0x0a, 0x7d, 0x59, 0xc9,
+  0xc8, 0x20, 0x61, 0xa4, 0x59, 0xd1, 0xe7, 0x86, 0xf1, 0xe1, 0x66, 0xa4,
+  0xbd, 0x91, 0x94, 0xe5, 0xf4, 0xad, 0x7f, 0x0b, 0xa2, 0x9d, 0xf5, 0x5d,
+  0x31, 0xbd, 0x7a, 0xf5, 0x76, 0x1c, 0x7f, 0xbd, 0xbb, 0x38, 0x3c, 0x6d,
+  0xb4, 0x10, 0xa2, 0x05, 0x36, 0x39, 0x05, 0x23, 0x93, 0xdc, 0x67, 0x87,
+  0xde, 0x6f, 0xe3, 0xc3, 0xb5, 0x5f, 0xb1, 0xae, 0x40, 0xd2, 0x2c, 0x98,
+  0x8b, 0x8b, 0xe2, 0x89, 0x3a, 0x94, 0x61, 0x4a, 0x77, 0x81, 0xbd, 0x1e,
+  0xf1, 0xe1, 0x9a, 0x2b, 0x8a, 0x16, 0x19, 0x22, 0x90, 0x11, 0x2b, 0x2f,
+  0x01, 0xad, 0x4b, 0xd7, 0x68, 0xe7, 0xa3, 0x7f, 0xfc, 0x9c, 0x63, 0x3e,
+  0x31, 0x16, 0x6d, 0x16, 0x09, 0x2e, 0x06, 0x3b, 0x64, 0xe3, 0x34, 0x2e,
+  0xf6, 0x6b, 0x48, 0x75, 0x4e, 0xaf, 0x33, 0x95, 0x0e, 0x84, 0x58, 0xf1,
+  0xa3, 0xaa, 0x6f, 0x49, 0x66, 0x4f, 0xf6, 0xbf, 0xfe, 0x2a, 0x94, 0x9e,
+  0xaf, 0xde, 0xf6, 0x7c, 0x8e, 0x7e, 0x33, 0xd4, 0x5a, 0x45, 0xd1, 0x08,
+  0x3c, 0x85, 0x3e, 0xdc, 0x0b, 0x01, 0x5a, 0x8e, 0x4f, 0x40, 0x51, 0x98,
+  0xef, 0xe1, 0x12, 0x04, 0x3f, 0xcf, 0x7f, 0xac, 0x7d, 0x50, 0x2a, 0x06,
+  0xe2, 0x9f, 0xe2, 0x32, 0x0c, 0xce, 0xf0, 0x4b, 0xde, 0x71, 0x14, 0xf7,
+  0x4c, 0x14, 0xe1, 0xed, 0x75, 0x67, 0x14, 0x1f, 0x8e, 0xf8, 0x5b, 0x0c,
+  0xf0, 0x8a, 0xd8, 0xc2, 0x3e, 0xff, 0xb1, 0xb3, 0x6f, 0x53, 0xd3, 0x6c,
+  0xc1, 0x29, 0xae, 0xa9, 0x91, 0xe0, 0xa1, 0x82, 0x50, 0xe4, 0xb7, 0x63,
+  0xe4, 0x13, 0xf4, 0x50, 0x33, 0x12, 0x0f, 0x38, 0xe3, 0xc0, 0x4e, 0x8e,
+  0xe6, 0xa9, 0x9a, 0x58, 0x74, 0x26, 0x63, 0x76, 0xdf, 0xdd, 0x47, 0x4c,
+  0x79, 0x24, 0x9b, 0x6e, 0x1d, 0xaa, 0xe7, 0x1b, 0xa3, 0x24, 0x91, 0x70,
+  0x7d, 0x30, 0x91, 0xea, 0x0b, 0xc9, 0xd6, 0xc4, 0x88, 0x6b, 0x0f, 0xa4,
+  0x87, 0x55, 0xec, 0xc7, 0x5c, 0x20, 0x13, 0x1f, 0xee, 0xc9, 0xe7, 0x4f,
+  0x1e, 0x6f, 0x6f, 0x0f, 0xd4, 0x57, 0x25, 0x09, 0x32, 0x13, 0x94, 0x7b,
+  0xe5, 0xc4, 0xb9, 0xb8, 0x19, 0xbb, 0xd9, 0xe2, 0x2b, 0x30, 0x06, 0xeb,
+  0x33, 0x8a, 0x0f, 0x47, 0x72, 0x4c, 0xdf, 0xa3, 0x43, 0x24, 0x13, 0x1c,
+  0x0c, 0xdd, 0x1a, 0xc2, 0x24, 0x6c, 0x32, 0x7e, 0xc0, 0xc6, 0x5c, 0x7a,
+  0xb9, 0x02, 0x1c, 0x29, 0xce, 0xc3, 0x48, 0x8e, 0x25, 0x0e, 0x17, 0xa7,
+  0x2a, 0x69, 0xc3, 0x44, 0xd0, 0x33, 0x16, 0x7b, 0xf8, 0x03, 0xa5, 0x95,
+  0x57, 0xda, 0x20, 0xfa, 0x6c, 0x35, 0x99, 0x1b, 0x19, 0x34, 0x5e, 0x5d,
+  0x5c, 0x98, 0xd3, 0x3e, 0xc9, 0xa5, 0xd3, 0x37, 0xeb, 0xe0, 0x92, 0xdc,
+  0xd0, 0x27, 0x73, 0xb0, 0xee, 0x36, 0xa1, 0x49, 0xae, 0xa7, 0x2b, 0x0f,
+  0x17, 0xad, 0x2d, 0xd9, 0x58, 0xf2, 0x87, 0xcc, 0x09, 0x5d, 0x0c, 0xfb,
+  0x16, 0x76, 0x9b, 0xd5, 0xa1, 0x19, 0xf7, 0x86, 0xe2, 0xb6, 0x46, 0x60,
+  0x3f, 0xf8, 0xe8, 0x6d, 0x4b, 0xed, 0x76, 0xca, 0xae, 0xd5, 0x3b, 0x6f,
+  0x48, 0xef, 0x04, 0xc4, 0x0f, 0xc5, 0x32, 0x92, 0x17, 0xac, 0x61, 0xf6,
+  0xf7, 0x58, 0x56, 0xa8, 0x05, 0x5f, 0x17, 0x85, 0x56, 0x0f, 0xbf, 0x7f,
+  0x4a, 0xdd, 0x15, 0x25, 0x09, 0x73, 0x9e, 0x51, 0xac, 0x11, 0xfc, 0x31,
+  0xc4, 0x3c, 0xa9, 0xd8, 0x3f, 0xc9, 0x63, 0x88, 0xef, 0x43, 0x3c, 0xf8,
+  0xc8, 0xad, 0x4b, 0x81, 0xd9, 0xc4, 0x5e, 0x20, 0xc6, 0x0a, 0x62, 0x9f,
+  0x97, 0xa1, 0x9d, 0xdb, 0x80, 0x27, 0x48, 0x4a, 0x6d, 0x71, 0x97, 0x78,
+  0x71, 0x1e, 0x05, 0x73, 0xa8, 0x5b, 0x5f, 0x0a, 0x5c, 0x37, 0x54, 0xdb,
+  0x1d, 0xe8, 0x24, 0x0d, 0x6c, 0xe2, 0x0d, 0x9e, 0xd1, 0x06, 0x8a, 0xd7,
+  0x35, 0x7e, 0x8e, 0xec, 0x2b, 0xb5, 0x1a, 0x58, 0xef, 0xd6, 0xb1, 0xc5,
+  0x43, 0x99, 0x46, 0x62, 0xea, 0x3a, 0xc7, 0x8d, 0x2f, 0x35, 0x93, 0x6b,
+  0x43, 0x53, 0x00, 0x3a, 0x8d, 0xef, 0x65, 0x4c, 0x19, 0x32, 0x82, 0xe7,
+  0xc0, 0x69, 0x11, 0x48, 0x52, 0xa7, 0x53, 0x33, 0x43, 0x0e, 0x37, 0xa2,
+  0x0a, 0xad, 0xdd, 0x00, 0xdb, 0xc1, 0xb2, 0x65, 0xf6, 0xe9, 0x27, 0x5c,
+  0xd4, 0x8f, 0xd2, 0xbb, 0x9b, 0xbc, 0x59, 0x85, 0x4c, 0x77, 0xa2, 0xe8,
+  0xa3, 0xc0, 0xbf, 0x80, 0x98, 0xa6, 0xc3, 0x70, 0x20, 0x15, 0x30, 0xf3,
+  0x28, 0xe1, 0x93, 0x5a, 0xb9, 0xd6, 0x96, 0x47, 0x90, 0xf3, 0x73, 0x5e,
+  0xde, 0x04, 0x19, 0xe2, 0x64, 0x61, 0xd8, 0xd9, 0xb5, 0xab, 0xeb, 0xcc,
+  0xdb, 0xbf, 0xff, 0x87, 0xfe, 0xf2, 0x03, 0xed, 0xd4, 0x3f, 0x75, 0xa7,
+  0x34, 0xe9, 0x2e, 0x0d, 0x40, 0x18, 0x60, 0x5b, 0x27, 0xbf, 0xc7, 0xae,
+  0xfc, 0x95, 0xb2, 0x9a, 0x78, 0x6b, 0x08, 0xff, 0x08, 0x03, 0xfe, 0x7e,
+  0x64, 0xf5, 0x68, 0x19, 0x24, 0xa5, 0xaa, 0x72, 0x28, 0xfb, 0x93, 0xbb,
+  0xc0, 0x25, 0x45, 0x64, 0xf8, 0x63, 0x31, 0x00, 0x90, 0xb3, 0x31, 0xe9,
+  0x08, 0x03, 0x86, 0x5b, 0xf5, 0xf2, 0x29, 0xfe, 0x58, 0x09, 0x9a, 0x91,
+  0xb1, 0x65, 0xcc, 0xcc, 0xc9, 0xd0, 0xe3, 0x9f, 0xc7, 0x0d, 0x0b, 0x4d,
+  0x6a, 0x11, 0x6f, 0x4a, 0x0b, 0xe0, 0xca, 0x8c, 0x43, 0x0d, 0xe8, 0xd5,
+  0x10, 0x9f, 0x28, 0xb6, 0x0c, 0xa6, 0x6a, 0x9e, 0xee, 0x9e, 0x3d, 0x10,
+  0x60, 0x04, 0x7a, 0x48, 0x5f, 0xe6, 0x96, 0x70, 0x36, 0x47, 0xe3, 0xf7,
+  0xff, 0xe0, 0x44, 0xc0, 0x7f, 0x86, 0xba, 0xef, 0xe9, 0xf9, 0xd1, 0x01,
+  0xa6, 0xf4, 0xfb, 0x61, 0x7d, 0xb7, 0x98, 0x94, 0x73, 0xb9, 0x78, 0xb4,
+  0xf9, 0x66, 0x03, 0xf5, 0x67, 0x4c, 0x25, 0x88, 0xd5, 0x0d, 0x3d, 0x78,
+  0x94, 0x41, 0xb4, 0xf3, 0x05, 0xd9, 0x61, 0xe5, 0x94, 0xeb, 0x65, 0xa9,
+  0x70, 0xc1, 0xdc, 0xbc, 0xdf, 0x27, 0x8a, 0x78, 0xc2, 0x5d, 0x6f, 0xa5,
+  0xbf, 0xb1, 0x78, 0x54, 0xb5, 0x04, 0x24, 0x1a, 0x02, 0x5a, 0x4f, 0xc7,
+  0x96, 0xa7, 0x47, 0x81, 0x65, 0x88, 0x5f, 0x98, 0x69, 0x7e, 0x40, 0x49,
+  0xa6, 0x98, 0xb9, 0x2f, 0xf9, 0x67, 0xc3, 0x73, 0xfc, 0x4c, 0xf3, 0x68,
+  0x04, 0xca, 0x80, 0x32, 0x33, 0xa4, 0xf8, 0x64, 0x10, 0x96, 0x3f, 0x27,
+  0xb1, 0xd4, 0x3c, 0x4a, 0x7c, 0x37, 0x7c, 0x26, 0x98, 0xa7, 0xde, 0xea,
+  0x0f, 0x19, 0xe0, 0x7e, 0xf3, 0xeb, 0x6c, 0xfd, 0x68, 0xe8, 0x1f, 0x64,
+  0x18, 0xf3, 0x22, 0x95, 0x64, 0x36, 0xce, 0x5e, 0xb3, 0xf7, 0x49, 0x41,
+  0xd7, 0x90, 0xdb, 0x6c, 0x4e, 0x7b, 0x74, 0xdf, 0x70, 0xb4, 0xa7, 0x5a,
+  0xb5, 0x21, 0x99, 0x3f, 0xe4, 0x5f, 0xcb, 0x2f, 0xac, 0x86, 0xd1, 0x50,
+  0x41, 0x0e, 0xa5, 0x1c, 0xd1, 0xc8, 0xf7, 0xac, 0xb5, 0xd4, 0x10, 0x85,
+  0xb0, 0x2d, 0x0e, 0x57, 0x9e, 0x0e, 0x12, 0x17, 0xdd, 0xd6, 0xa4, 0xbe,
+  0x84, 0x02, 0xe1, 0xeb, 0x87, 0xb3, 0x51, 0x72, 0x1b, 0x9a, 0x3a, 0x46,
+  0x33, 0xf0, 0x92, 0xd3, 0x0f, 0x31, 0x4f, 0xaa, 0x63, 0x59, 0x90, 0xd7,
+  0x36, 0x12, 0x67, 0x4e, 0x22, 0xdc, 0x1e, 0xc1, 0xd1, 0xff, 0xf4, 0xa2,
+  0xed, 0xec, 0xda, 0x1a, 0x7a, 0x51, 0x76, 0xa3, 0x8b, 0x30, 0xa4, 0xe6,
+  0xfa, 0xe1, 0x38, 0xff, 0xfe, 0xe9, 0x68, 0x77, 0x3b, 0x38, 0xd4, 0x66,
+  0xf9, 0xc1, 0xd0, 0x46, 0x75, 0xf7, 0x81, 0xb2, 0x54, 0x71, 0x66, 0x1a,
+  0x55, 0xc0, 0x0f, 0xb0, 0xb3, 0x8c, 0x8d, 0xb0, 0x5a, 0xd2, 0x38, 0x20,
+  0xf3, 0x79, 0xc9, 0x06, 0xdb, 0x7d, 0xcb, 0x68, 0xe7, 0x83, 0xfa, 0x10,
+  0x3d, 0x5b, 0xed, 0x0e, 0x73, 0x8f, 0x83, 0x89, 0x51, 0x02, 0xca, 0x07,
+  0x44, 0xae, 0x2d, 0x31, 0x19, 0xb9, 0x97, 0x55, 0xf9, 0xd4, 0x6f, 0xb7,
+  0x8a, 0x07, 0x40, 0x52, 0x8c, 0x3c, 0x4a, 0xa1, 0xec, 0x28, 0xc4, 0x72,
+  0xe7, 0x7f, 0xf0, 0xff, 0x7a, 0x21, 0x2b, 0x9b, 0xee, 0x88, 0xd3, 0x36,
+  0x13, 0xa5, 0xcc, 0x1a, 0x97, 0x81, 0x70, 0x7c, 0xcf, 0x3a, 0x81, 0xe1,
+  0xbe, 0xcf, 0x68, 0x78, 0xf3, 0x3c, 0xad, 0xed, 0x04, 0x79, 0x05, 0xb8,
+  0x51, 0x58, 0x2f, 0x90, 0xeb, 0xae, 0x82, 0xda, 0xaf, 0x24, 0x12, 0x35,
+  0xe2, 0x58, 0xd3, 0x45, 0x39, 0xea, 0xd9, 0x19, 0x4e, 0x1c, 0xee, 0xee,
+  0x4c, 0xff, 0x86, 0xf0, 0x9a, 0xc3, 0xe0, 0x63, 0xd7, 0xad, 0xc0, 0x1b,
+  0xbb, 0x25, 0x41, 0x3c, 0x28, 0xe7, 0xdb, 0x7c, 0x5b, 0x40, 0x0b, 0x1e,
+  0x48, 0x1d, 0x18, 0xcc, 0x3d, 0xb7, 0x76, 0xab, 0xdd, 0xbd, 0xb9, 0xe7,
+  0x9c, 0x2d, 0x0a, 0x08, 0x73, 0x34, 0xfa, 0x59, 0xe2, 0xa0, 0x41, 0x38,
+  0xb9, 0x0f, 0x85, 0x74, 0x96, 0xf5, 0xcc, 0xef, 0x92, 0x28, 0x7a, 0xff,
+  0x9a, 0xcf, 0x3f, 0xd9, 0x8d, 0xd0, 0x3f, 0xd2, 0x87, 0x3f, 0xe4, 0x4b,
+  0x8f, 0x67, 0x1d, 0x9f, 0xd1, 0x61, 0xa1, 0xee, 0x45, 0xca, 0x26, 0x38,
+  0xc7, 0x98, 0x52, 0x2e, 0xb4, 0x07, 0x16, 0xe7, 0x2a, 0xdd, 0xbb, 0x99,
+  0x53, 0xc6, 0x57, 0x60, 0x87, 0x80, 0x0f, 0x44, 0x61, 0xec, 0x5b, 0xd1,
+  0xd2, 0xc4, 0x41, 0x70, 0x7c, 0x76, 0xfd, 0x38, 0x0c, 0x44, 0x25, 0x11,
+  0x77, 0x99, 0xbf, 0xa4, 0xfd, 0xe7, 0xbd, 0x4b, 0xe2, 0x7e, 0x1d, 0xb2,
+  0x24, 0x5e, 0x80, 0xdf, 0x64, 0x47, 0x16, 0xa2, 0xeb, 0xf0, 0x27, 0x7a,
+  0xcf, 0x92, 0xdc, 0x22, 0xee, 0x9d, 0x89, 0xf9, 0xd6, 0x07, 0x8b, 0x00,
+  0x6f, 0x64, 0x33, 0x7f, 0x9a, 0xbe, 0x6d, 0x14, 0x13, 0x87, 0x0d, 0x4f,
+  0xe8, 0x88, 0x4a, 0xa4, 0x3c, 0x95, 0xb8, 0x46, 0x9d, 0x44, 0x14, 0xec,
+  0x0e, 0x7d, 0x3d, 0x8a, 0xce, 0x41, 0xfb, 0xdc, 0xd6, 0x76, 0x0e, 0x66,
+  0x0a, 0xee, 0x87, 0x7c, 0x5d, 0x48, 0xf4, 0x5d, 0x94, 0xd2, 0x93, 0xdd,
+  0xce, 0xe6, 0x9e, 0x39, 0xf0, 0x15, 0xb8, 0x7f, 0x16, 0xb8, 0x46, 0x1f,
+  0xea, 0x7a, 0x4e, 0xa4, 0x9e, 0x5f, 0xdc, 0x99, 0x29, 0xd5, 0xbd, 0xd0,
+  0x34, 0xbe, 0x00, 0xe5, 0xe7, 0xf4, 0xb8, 0x3c, 0x83, 0x79, 0xb3, 0x86,
+  0x4f, 0x73, 0x99, 0x51, 0xfa, 0x0d, 0x43, 0x8f, 0xdf, 0x47, 0x8c, 0x24,
+  0x87, 0xf1, 0x79, 0x17, 0xe8, 0x13, 0x3e, 0x61, 0x95, 0x85, 0x51, 0xb2,
+  0x6b, 0x2d, 0xc1, 0x7b, 0x08, 0xa1, 0x35, 0x12, 0x0d, 0xe2, 0xa2, 0xdb,
+  0xed, 0x0d, 0xa1, 0x42, 0xc4, 0x60, 0x43, 0x74, 0xf7, 0x3f, 0x40, 0x13,
+  0xe0, 0x78, 0xb4, 0x64, 0x9d, 0x5b, 0x14, 0x26, 0x1a, 0x14, 0xb4, 0xa1,
+  0x31, 0xe5, 0xe1, 0x09, 0x09, 0xc3, 0x79, 0x04, 0x5a, 0x3d, 0x89, 0x40,
+  0x65, 0xa0, 0x95, 0x16, 0x72, 0xb0, 0xdd, 0x51, 0x6f, 0x95, 0x52, 0x51,
+  0x3a, 0xa4, 0x4a, 0xd8, 0x21, 0x7e, 0x91, 0xf4, 0xba, 0x58, 0x5d, 0xba,
+  0x47, 0xb3, 0x3d, 0x50, 0xad, 0x4e, 0x55, 0x35, 0xc9, 0xb1, 0x01, 0x3a,
+  0x26, 0x18, 0xff, 0x94, 0xba, 0xce, 0x20, 0xd3, 0x2c, 0x5d, 0x3f, 0x9c,
+  0x4e, 0x47, 0xba, 0xb1, 0xc1, 0xda, 0xba, 0x04, 0x70, 0x58, 0xd9, 0x21,
+  0x25, 0x23, 0x54, 0x22, 0x3b, 0x47, 0xc2, 0xd4, 0xb2, 0xac, 0x73, 0x27,
+  0x5f, 0x43, 0xc6, 0xf5, 0x2f, 0x5d, 0xef, 0x1e, 0x16, 0xd5, 0xe1, 0x42,
+  0xf7, 0x09, 0xc6, 0x28, 0x63, 0x90, 0x35, 0x28, 0x8f, 0xf2, 0xd6, 0xd0,
+  0xc7, 0xa3, 0x3e, 0x15, 0x8b, 0x92, 0xec, 0xd7, 0x56, 0xdc, 0x08, 0xc9,
+  0x82, 0xf2, 0x8b, 0xad, 0xda, 0x81, 0x34, 0x53, 0xb1, 0xdc, 0xcc, 0x46,
+  0x0c, 0xb6, 0x63, 0x38, 0x6e, 0x5d, 0x35, 0xce, 0x50, 0xb0, 0x2f, 0xb2,
+  0x10, 0x8e, 0xbe, 0xf7, 0x6e, 0x10, 0x10, 0xde, 0x07, 0xdb, 0x2b, 0x84,
+  0x03, 0x37, 0x65, 0x43, 0x79, 0x1e, 0x0b, 0x23, 0xcf, 0xc1, 0x0c, 0x18,
+  0xd2, 0xd0, 0x31, 0x2e, 0x7d, 0x3a, 0xe2, 0xa3, 0xc3, 0x68, 0x12, 0x06,
+  0x4e, 0xd6, 0x8d, 0xa6, 0x35, 0x82, 0x76, 0x28, 0x84, 0x52, 0xef, 0xb9,
+  0x69, 0x84, 0x35, 0x14, 0xfd, 0xa2, 0x5e, 0x62, 0xd9, 0x53, 0xfe, 0xe4,
+  0x9a, 0x15, 0x78, 0xc6, 0xfb, 0xfa, 0x2f, 0xfa, 0x2c, 0x22, 0xfe, 0x69,
+  0x49, 0xff, 0x4f, 0x1e, 0xb6, 0x75, 0x9a, 0xc1, 0x1e, 0x8e, 0x45, 0x6d,
+  0x52, 0xdc, 0x39, 0xd0, 0x58, 0x29, 0x25, 0x12, 0x5c, 0x7a, 0x8d, 0x5c,
+  0xb8, 0xb9, 0x8e, 0xb3, 0x69, 0x0c, 0xef, 0xac, 0x57, 0x84, 0xc0, 0x7d,
+  0x71, 0x9f, 0x2c, 0x67, 0x64, 0x2a, 0xf6, 0x20, 0xd9, 0xf1, 0x08, 0xba,
+  0xb2, 0xdd, 0x61, 0xa6, 0x67, 0x56, 0x76, 0x89, 0xd8, 0x5c, 0x9d, 0x96,
+  0x16, 0x3e, 0xfc, 0x4a, 0xb3, 0xe2, 0xd1, 0x1e, 0x32, 0xa7, 0x7f, 0x55,
+  0xae, 0x75, 0x25, 0x19, 0x44, 0x95, 0x95, 0x30, 0x0f, 0x62, 0xf6, 0xeb,
+  0x45, 0x59, 0x4b, 0x5a, 0xdd, 0x7f, 0x67, 0xfb, 0x44, 0xd9, 0x5e, 0x94,
+  0x85, 0x30, 0x62, 0xb8, 0xfe, 0xef, 0x35, 0x29, 0xce, 0x10, 0x15, 0xcb,
+  0x32, 0x27, 0x92, 0x2b, 0x06, 0x62, 0x5b, 0xde, 0xc0, 0xb6, 0x74, 0x7e,
+  0xc8, 0x78, 0xdd, 0x6d, 0x12, 0xc9, 0x40, 0x87, 0xeb, 0x4a, 0x9d, 0x2a,
+  0x6c, 0x44, 0xa8, 0x67, 0x84, 0x5d, 0x23, 0xa3, 0x87, 0x33, 0xe4, 0xa7,
+  0x8f, 0xe2, 0x6b, 0xc0, 0x8c, 0x3e, 0xf1, 0x1a, 0xfa, 0xfd, 0x42, 0xa3,
+  0xc4, 0xc7, 0x8c, 0x5d, 0x3f, 0x9c, 0xe4, 0xc9, 0xb3, 0x2b, 0xc9, 0x6f,
+  0x89, 0xd6, 0x02, 0x06, 0x27, 0x3f, 0x70, 0xc2, 0xce, 0xda, 0x7b, 0x2c,
+  0x1e, 0xbc, 0xa0, 0x89, 0xd5, 0x5c, 0x60, 0xda, 0xb6, 0x1c, 0xa2, 0x5b,
+  0x46, 0x42, 0xe1, 0x43, 0xba, 0x5c, 0x8a, 0xb4, 0xb9, 0x9f, 0xe4, 0x13,
+  0x86, 0x85, 0xe4, 0x26, 0xc0, 0xd4, 0x86, 0x0a, 0x00, 0x9c, 0x4d, 0x59,
+  0x7e, 0x64, 0xa7, 0x2a, 0xa7, 0x60, 0x53, 0x31, 0x64, 0x88, 0x43, 0x1d,
+  0x90, 0xfc, 0x5c, 0xef, 0xcd, 0xce, 0x78, 0xfc, 0xcd, 0x4e, 0xd6, 0x4c,
+  0x55, 0xea, 0xed, 0xb8, 0xec, 0x3f, 0xb1, 0xbe, 0xef, 0xd7, 0x62, 0x21,
+  0x79, 0xd1, 0x0f, 0x90, 0x88, 0xdf, 0xfa, 0xb5, 0x1f, 0x40, 0xfb, 0xd8,
+  0x84, 0xb6, 0x2d, 0xfa, 0x09, 0x96, 0x49, 0x68, 0xda, 0xfa, 0x91, 0xb6,
+  0x4b, 0x01, 0x93, 0xde, 0x62, 0x44, 0x5a, 0x63, 0xa7, 0xde, 0x7f, 0xb3,
+  0xdd, 0xe2, 0xa2, 0x4b, 0x21, 0xd7, 0x0a, 0xa5, 0xfc, 0xac, 0x96, 0xff,
+  0x4b, 0xce, 0x13, 0x9e, 0x1d, 0x8e, 0xfd, 0x22, 0x41, 0xea, 0xfe, 0x09,
+  0x2f, 0xc9, 0x87, 0xc1, 0x6e, 0x8a, 0xfb, 0x67, 0xfc, 0xe0, 0x09, 0x3f,
+  0x6c, 0xc6, 0x12, 0x18, 0x80, 0x0f, 0x4d, 0x27, 0x81, 0x39, 0xc3, 0x3d,
+  0x2d, 0x28, 0xe2, 0x54, 0x13, 0x70, 0x99, 0x17, 0x0f, 0x71, 0xee, 0xd9,
+  0x14, 0x1d, 0xf2, 0xb7, 0x52, 0x03, 0x7b, 0x3b, 0xa8, 0x24, 0x00, 0xd7,
+  0x92, 0x2b, 0x7c, 0x59, 0xde, 0x3b, 0xbb, 0x54, 0x60, 0xbc, 0x49, 0x2c,
+  0x78, 0xce, 0xf7, 0xa9, 0xd2, 0x0f, 0xe5, 0xf1, 0xe4, 0xd3, 0x15, 0xe5,
+  0x1f, 0x47, 0xfa, 0x59, 0x07, 0x6e, 0x2c, 0xa3, 0xef, 0x71, 0xad, 0xd5,
+  0x35, 0x85, 0xe5, 0x7b, 0xce, 0xc2, 0xea, 0xf5, 0xf7, 0x6d, 0x36, 0xa5,
+  0x5e, 0xcf, 0xe7, 0xd6, 0x0e, 0xb8, 0x57, 0x24, 0x19, 0x71, 0xb6, 0xd4,
+  0xed, 0x21, 0xba, 0x00, 0x99, 0x30, 0x99, 0x0e, 0xf4, 0x62, 0x0c, 0x92,
+  0x07, 0x93, 0x02, 0x42, 0x0d, 0xba, 0xb5, 0x0e, 0x94, 0x18, 0x67, 0x49,
+  0xb1, 0x76, 0xfe, 0x65, 0x3a, 0xb5, 0x00, 0x46, 0xf7, 0xcd, 0x2e, 0xe5,
+  0x3e, 0x76, 0x9d, 0x5d, 0xe0, 0x3c, 0xa2, 0x96, 0x46, 0x81, 0xec, 0xa8,
+  0x07, 0x89, 0xf3, 0x5c, 0xba, 0x79, 0xdb, 0xd0, 0x9e, 0xbf, 0x5b, 0xb5,
+  0xe3, 0xcf, 0x0f, 0x10, 0x78, 0x51, 0x83, 0x1c, 0x53, 0xc5, 0xcc, 0x1f,
+  0x7e, 0x7d, 0x3e, 0xc1, 0x85, 0xe7, 0x14, 0x35, 0x52, 0x49, 0xbb, 0x17,
+  0x47, 0x5b, 0x39, 0x3c, 0xd4, 0x15, 0x82, 0x0c, 0x7d, 0x75, 0x92, 0xdb,
+  0x5c, 0xb7, 0x0e, 0x8b, 0xe0, 0x98, 0xce, 0xbc, 0x2e, 0xef, 0xd7, 0x02,
+  0x71, 0x02, 0x5e, 0xfa, 0x3a, 0x41, 0xf7, 0xb3, 0x03, 0xd3, 0xd8, 0x41,
+  0x74, 0x71, 0x1a, 0x25, 0x9a, 0xfb, 0x5d, 0x8a, 0xe6, 0x0c, 0xe3, 0x37,
+  0x46, 0xac, 0x82, 0xb6, 0x91, 0x10, 0xee, 0xb2, 0xc5, 0xa1, 0x45, 0xde,
+  0x1e, 0x52, 0x6c, 0x1f, 0x42, 0x44, 0xe4, 0xf0, 0x8c, 0xdc, 0x55, 0x34,
+  0x45, 0x50, 0xa3, 0x8c, 0xbf, 0x8c, 0xfa, 0x4c, 0xeb, 0x34, 0xcd, 0x38,
+  0xfe, 0x44, 0xaf, 0xbb, 0x72, 0x0e, 0x58, 0xa1, 0xa4, 0x4f, 0x0e, 0xef,
+  0x73, 0xb5, 0x23, 0x28, 0x41, 0x51, 0x09, 0xe4, 0x90, 0xa2, 0x09, 0x36,
+  0x85, 0x25, 0x34, 0xfc, 0x29, 0x3e, 0x09, 0x85, 0xf1, 0x3f, 0x58, 0x3f,
+  0x9c, 0x36, 0x00, 0xf9, 0x84, 0x38, 0xa6, 0xb7, 0xa9, 0xb9, 0x03, 0xb1,
+  0xfa, 0x80, 0x3a, 0x85, 0x14, 0x72, 0x4d, 0x57, 0x38, 0x60, 0xd2, 0xee,
+  0x97, 0xdb, 0x74, 0xbb, 0xb3, 0xd7, 0x4d, 0xa4, 0x84, 0xc4, 0xa8, 0xf5,
+  0x88, 0x6f, 0xb3, 0xb0, 0x30, 0x16, 0x75, 0x8a, 0xea, 0x11, 0x3a, 0xe5,
+  0xec, 0xb6, 0xe1, 0xf8, 0x02, 0x7e, 0x47, 0x73, 0xc9, 0x8d, 0x5e, 0x47,
+  0x21, 0x6d, 0x07, 0x90, 0x1a, 0xa9, 0xaa, 0x90, 0x3a, 0x56, 0x7c, 0xcd,
+  0xfa, 0xeb, 0x6e, 0x67, 0x97, 0xa3, 0xb2, 0xca, 0x49, 0xde, 0x20, 0x91,
+  0x53, 0x07, 0x23, 0xba, 0x1f, 0x80, 0x9f, 0x90, 0xf5, 0x18, 0x1b, 0x4e,
+  0x23, 0x6b, 0x49, 0xc2, 0xa1, 0xb5, 0x60, 0xe8, 0x05, 0xe8, 0x95, 0x7e,
+  0x67, 0x47, 0x15, 0xe8, 0x84, 0x58, 0x7d, 0xb9, 0xd6, 0xe0, 0xd8, 0x4e,
+  0xb1, 0x9a, 0xf2, 0x62, 0x57, 0xeb, 0x16, 0x4a, 0x31, 0x58, 0x43, 0x78,
+  0x15, 0x57, 0xb2, 0x07, 0xbe, 0xa8, 0xbc, 0xae, 0x57, 0x38, 0xb0, 0xd7,
+  0xc7, 0x27, 0x47, 0x36, 0xab, 0xed, 0x7f, 0xee, 0x8c, 0x68, 0xcb, 0xab,
+  0x69, 0x90, 0xc3, 0xc7, 0x35, 0xa4, 0x5e, 0x41, 0xb0, 0x14, 0x99, 0x7e,
+  0x3b, 0xe0, 0xbe, 0x9a, 0xf8, 0x71, 0xab, 0xc2, 0xf4, 0xe8, 0xed, 0x77,
+  0xc7, 0xef, 0x4e, 0xdf, 0xbe, 0x39, 0x7a, 0x7b, 0xfe, 0x99, 0xc7, 0xee,
+  0x62, 0x5d, 0x23, 0xea, 0x30, 0xb9, 0x20, 0xa7, 0x70, 0xd0, 0x0d, 0x8a,
+  0x00, 0xb9, 0x77, 0x8b, 0x59, 0xa9, 0xfc, 0x6b, 0xe4, 0x0f, 0xe7, 0x3d,
+  0xa4, 0x9e, 0x7d, 0xca, 0x24, 0x59, 0x92, 0x67, 0x67, 0x46, 0x71, 0xd5,
+  0x11, 0xc7, 0x02, 0x6c, 0x5f, 0x62, 0x6a, 0x5c, 0x71, 0x4b, 0x40, 0xe1,
+  0x48, 0x05, 0xa6, 0xda, 0xb1, 0xcf, 0xec, 0x96, 0x70, 0x10, 0xd0, 0xc5,
+  0x4a, 0x5b, 0x93, 0x70, 0xc4, 0xfd, 0x5e, 0x0a, 0x40, 0x8b, 0x24, 0xba,
+  0x1a, 0x45, 0xbf, 0x83, 0x42, 0x80, 0xcf, 0x5e, 0x71, 0x1e, 0x0e, 0x47,
+  0x5f, 0x98, 0x49, 0x78, 0x39, 0xa0, 0x1e, 0xea, 0xb0, 0xd7, 0x42, 0xb9,
+  0x8b, 0x34, 0xec, 0xad, 0xe2, 0x2f, 0xea, 0x2c, 0x3a, 0xd8, 0xd9, 0xf9,
+  0x09, 0xdd, 0xbb, 0xff, 0x24, 0xed, 0xbb, 0x43, 0xc4, 0xd4, 0xda, 0x9b,
+  0x86, 0x2b, 0x19, 0xd2, 0xea, 0x42, 0xa2, 0x5b, 0xbb, 0x9d, 0x70, 0x03,
+  0x7f, 0x38, 0x7b, 0x77, 0xfa, 0xc3, 0x9f, 0x7f, 0xe5, 0x4f, 0x78, 0xc9,
+  0x66, 0x7f, 0xa1, 0x1c, 0x4c, 0x1d, 0xfc, 0xa7, 0x5f, 0xfd, 0x6b, 0xed,
+  0xe1, 0x07, 0x12, 0x69, 0xe7, 0x56, 0xe3, 0xa1, 0x42, 0xc6, 0xc5, 0xdb,
+  0x0c, 0xa5, 0xef, 0x52, 0xa2, 0x13, 0xcf, 0xc7, 0x61, 0x93, 0x81, 0x20,
+  0xe2, 0xea, 0x36, 0x81, 0xa6, 0x21, 0xb0, 0xf6, 0x88, 0x4b, 0x8a, 0x5d,
+  0x06, 0xaf, 0x56, 0x95, 0x53, 0xe5, 0x38, 0xd7, 0x96, 0x23, 0x1f, 0xd5,
+  0xee, 0xc7, 0xe1, 0xc9, 0xc9, 0xaf, 0xba, 0x09, 0xe8, 0x80, 0xec, 0xd6,
+  0x32, 0xb4, 0x1a, 0xaa, 0x3c, 0x7d, 0x0f, 0x70, 0xed, 0xdb, 0x53, 0x99,
+  0xcd, 0x0b, 0x28, 0xc7, 0xc3, 0x3a, 0x33, 0x2a, 0x6d, 0x4a, 0xf1, 0x7e,
+  0x05, 0x2e, 0xa7, 0x89, 0xd5, 0x3b, 0x9c, 0x38, 0x19, 0xe0, 0xa8, 0xe3,
+  0x21, 0x24, 0x0b, 0xc0, 0x84, 0x42, 0x5e, 0x25, 0xef, 0x26, 0x97, 0xc5,
+  0xa1, 0x6e, 0xa1, 0xb4, 0xb8, 0x44, 0xdc, 0x8f, 0x9d, 0xfb, 0x81, 0x5f,
+  0x44, 0xda, 0x3d, 0x33, 0x3a, 0x04, 0xc9, 0xdb, 0x2a, 0xaf, 0x3f, 0xa2,
+  0xa8, 0x83, 0x6e, 0x28, 0x14, 0x24, 0xad, 0xdf, 0x27, 0x95, 0x17, 0x73,
+  0x1a, 0x31, 0xc4, 0x88, 0xab, 0xa6, 0xcb, 0xeb, 0xd8, 0xec, 0xd0, 0x37,
+  0x8b, 0x45, 0x31, 0xb9, 0x51, 0xd9, 0x09, 0x9d, 0xb6, 0x4a, 0xbb, 0x04,
+  0xfc, 0x9d, 0x93, 0xa8, 0x6a, 0x8b, 0x33, 0x10, 0x2b, 0x4b, 0x1f, 0x68,
+  0xb9, 0x31, 0x3d, 0xc0, 0x9f, 0x6e, 0xea, 0x6c, 0x7e, 0x11, 0xaf, 0xb0,
+  0x8f, 0x72, 0x0b, 0xa9, 0xf0, 0xb7, 0x0d, 0xe9, 0x95, 0x58, 0xe9, 0xb0,
+  0x32, 0x60, 0xd2, 0x50, 0x68, 0x21, 0xf4, 0xd7, 0x09, 0x1d, 0xb6, 0xf2,
+  0x0c, 0x6e, 0x5d, 0x1b, 0xb1, 0xc4, 0xab, 0x66, 0xe5, 0x3c, 0x31, 0x3d,
+  0xdb, 0x2f, 0x66, 0x61, 0xc1, 0x94, 0xe1, 0x48, 0x3e, 0x7e, 0x87, 0x4a,
+  0xde, 0xe1, 0x6d, 0xa2, 0xc0, 0x21, 0x7c, 0x4e, 0xad, 0x67, 0xe4, 0x37,
+  0x0f, 0x19, 0x0e, 0xcd, 0x19, 0x6a, 0xca, 0x8d, 0x96, 0xa9, 0x26, 0x0d,
+  0x65, 0xf7, 0x36, 0x89, 0xf8, 0xc5, 0x59, 0x09, 0x07, 0xd6, 0x4e, 0x58,
+  0x27, 0xe1, 0x4d, 0x7c, 0xdd, 0x44, 0x7b, 0x67, 0x1a, 0x89, 0x0d, 0x9b,
+  0xc7, 0xc8, 0x05, 0xcf, 0x20, 0x32, 0xfe, 0x78, 0x76, 0x9e, 0xd0, 0x56,
+  0x79, 0x8e, 0xac, 0xc7, 0x29, 0x94, 0x56, 0x16, 0x0b, 0xc2, 0x45, 0xd3,
+  0x6f, 0xfc, 0x2b, 0x23, 0x77, 0xc1, 0x96, 0xb4, 0x43, 0x09, 0xb7, 0x65,
+  0xa1, 0x2e, 0xd2, 0x4e, 0xe1, 0x96, 0x24, 0xf4, 0x8f, 0x23, 0xfe, 0x42,
+  0x42, 0x1d, 0x8c, 0x08, 0xb1, 0x12, 0x5b, 0x77, 0x20, 0xc5, 0xb2, 0xa8,
+  0xaf, 0x9b, 0x68, 0x99, 0xb1, 0x06, 0xb7, 0x8c, 0x08, 0x9c, 0x97, 0x75,
+  0x0c, 0x4e, 0x73, 0x42, 0x59, 0xf3, 0x19, 0x1a, 0xfd, 0xf0, 0x95, 0x37,
+  0xff, 0x3d, 0x3f, 0x7d, 0x79, 0x7a, 0x62, 0xfe, 0x72, 0xf4, 0xfa, 0xf8,
+  0x07, 0xa7, 0x15, 0x30, 0x40, 0x45, 0xab, 0x40, 0x06, 0xb8, 0x8b, 0xcf,
+  0x06, 0x3e, 0x1b, 0xe2, 0x1c, 0x44, 0x4a, 0x3f, 0xe4, 0x94, 0xb8, 0x2e,
+  0x85, 0x5a, 0x6e, 0xe9, 0xf1, 0x39, 0x92, 0xd3, 0x94, 0x2f, 0xea, 0xe1,
+  0x8f, 0xa4, 0x02, 0xbc, 0x44, 0x5a, 0x34, 0x8f, 0x6c, 0x8b, 0x29, 0xdc,
+  0x26, 0x53, 0x8d, 0x94, 0xcf, 0xe6, 0x24, 0x1b, 0xd5, 0x7d, 0x32, 0x57,
+  0x58, 0xa2, 0xd6, 0xe4, 0xca, 0xca, 0x76, 0xc1, 0x6d, 0xfc, 0x0e, 0xeb,
+  0x9d, 0x96, 0x36, 0x3e, 0x5e, 0x7e, 0x91, 0xf9, 0x8b, 0xb4, 0x6d, 0xd1,
+  0x9b, 0x2a, 0x03, 0x57, 0x04, 0x50, 0x1d, 0x29, 0x02, 0x3e, 0xca, 0x47,
+  0x87, 0x22, 0x50, 0xa1, 0x63, 0x47, 0x6c, 0xaf, 0x49, 0x36, 0x40, 0x72,
+  0xf9, 0x90, 0x5b, 0x41, 0x7a, 0xbc, 0x07, 0xf1, 0x23, 0xd4, 0x1a, 0x2d,
+  0x17, 0x94, 0x3a, 0x25, 0xfa, 0x03, 0xd9, 0x55, 0x1c, 0xc5, 0x10, 0x8e,
+  0x7a, 0xee, 0xb5, 0x76, 0x67, 0xa9, 0x20, 0xc1, 0xa7, 0x65, 0x68, 0x5a,
+  0xd1, 0x19, 0x88, 0xb2, 0xdf, 0xd6, 0x38, 0xea, 0xbe, 0x4f, 0x93, 0x89,
+  0x2a, 0x7b, 0xe0, 0x3e, 0x1d, 0x64, 0x5d, 0x53, 0xd6, 0x77, 0xfd, 0x78,
+  0xdd, 0x18, 0xa4, 0x11, 0xfe, 0x6d, 0x95, 0x5f, 0xa7, 0xa8, 0x2d, 0x33,
+  0x97, 0x65, 0x38, 0xe4, 0x97, 0x3a, 0x63, 0xa4, 0xbf, 0x68, 0x90, 0xb4,
+  0x3d, 0xca, 0x93, 0x5f, 0x32, 0xc8, 0x93, 0xce, 0x18, 0x57, 0xbf, 0x68,
+  0x90, 0xa1, 0x0a, 0x08, 0xa3, 0x18, 0xff, 0x70, 0x7c, 0x9e, 0xbc, 0x3c,
+  0x7d, 0xe5, 0x2e, 0xd8, 0xb9, 0xcd, 0xde, 0x4e, 0x93, 0xc9, 0xaa, 0x30,
+  0x34, 0x48, 0xbd, 0x98, 0x6c, 0x77, 0x0b, 0x4e, 0x53, 0xa4, 0x1c, 0x9c,
+  0x5a, 0x2b, 0xd6, 0xf2, 0x8a, 0xa1, 0x88, 0x28, 0xaf, 0x86, 0x91, 0x94,
+  0xbc, 0x1a, 0x5d, 0x7a, 0x7a, 0x41, 0x40, 0x47, 0x97, 0x2a, 0x7d, 0xe9,
+  0x56, 0x12, 0xd6, 0x5d, 0x5a, 0x69, 0x55, 0xe9, 0x24, 0x25, 0x30, 0xa3,
+  0x82, 0x6b, 0x23, 0x8d, 0xec, 0x8c, 0x40, 0x0f, 0xeb, 0x70, 0x3e, 0x02,
+  0xb1, 0xd1, 0x9d, 0xf3, 0x46, 0xa7, 0xe2, 0x67, 0x12, 0xee, 0x69, 0xae,
+  0x7f, 0x8b, 0xd2, 0xa5, 0xbd, 0x1d, 0x84, 0x1f, 0xe5, 0x75, 0xcf, 0x2c,
+  0x9c, 0x35, 0xa9, 0xc4, 0x85, 0xcb, 0xd9, 0xe7, 0x26, 0xd7, 0x81, 0xc4,
+  0xb6, 0x43, 0xd8, 0xef, 0xec, 0x4b, 0x28, 0xc1, 0xa8, 0xe8, 0xec, 0x37,
+  0x90, 0xbc, 0xb2, 0xfc, 0xef, 0x9e, 0x82, 0xfe, 0xc8, 0xea, 0x63, 0x66,
+  0xe5, 0x73, 0x74, 0x8e, 0x9e, 0xf1, 0x85, 0xa8, 0xef, 0x8c, 0x50, 0xbf,
+  0x85, 0x41, 0x4e, 0xf6, 0x93, 0xc0, 0x39, 0xb9, 0x37, 0x1f, 0x8b, 0x56,
+  0x96, 0x58, 0xdc, 0x28, 0xb4, 0xdf, 0x5a, 0xb6, 0xa3, 0x41, 0xce, 0x6b,
+  0xa1, 0x25, 0xd2, 0x08, 0x71, 0x66, 0x35, 0x75, 0xb2, 0x8e, 0x78, 0x2e,
+  0x5c, 0xe2, 0x01, 0xc3, 0x37, 0x70, 0xb9, 0xb5, 0xc0, 0x6f, 0x7b, 0x6d,
+  0x0a, 0x2d, 0xd8, 0x0f, 0x65, 0x26, 0x61, 0xbf, 0x86, 0xdc, 0xa3, 0x29,
+  0xa8, 0x4b, 0x77, 0x15, 0x98, 0x6a, 0x71, 0xcc, 0x4a, 0x6c, 0xe0, 0x00,
+  0x99, 0xbc, 0x66, 0xdf, 0x26, 0x29, 0x41, 0x3d, 0xa0, 0x35, 0x62, 0x5a,
+  0x70, 0xa5, 0xa1, 0x9e, 0x40, 0xbc, 0xe6, 0xce, 0xd5, 0x3c, 0x3d, 0xe1,
+  0x3f, 0x5e, 0xaa, 0xc6, 0x26, 0x65, 0x43, 0x3e, 0x63, 0x61, 0x21, 0x23,
+  0xd6, 0x4d, 0x09, 0x8c, 0x0e, 0x92, 0x41, 0x58, 0x1f, 0x18, 0x64, 0xb8,
+  0x09, 0x75, 0xc7, 0xc7, 0xf9, 0xb4, 0xe7, 0x2b, 0x0c, 0xe9, 0xe4, 0x3e,
+  0xe2, 0xfb, 0xe4, 0x75, 0x0b, 0xe5, 0x59, 0x6f, 0xb4, 0x67, 0x5d, 0xba,
+  0xf0, 0x3c, 0xfb, 0x18, 0xd1, 0x3e, 0xf9, 0xb9, 0xf8, 0x22, 0x32, 0x2a,
+  0x5a, 0x14, 0xe5, 0xb9, 0xca, 0x96, 0x73, 0x59, 0x99, 0xfc, 0x04, 0x81,
+  0x63, 0x78, 0x13, 0xb0, 0xcb, 0x53, 0x9d, 0xa5, 0x51, 0x87, 0x7d, 0x53,
+  0xf0, 0xb9, 0x7c, 0x96, 0x9a, 0xc0, 0xb1, 0xea, 0x00, 0xdc, 0x8d, 0xdc,
+  0xd2, 0x9b, 0x34, 0x9d, 0xc7, 0x8f, 0x28, 0xc1, 0x11, 0xa8, 0x0e, 0xfa,
+  0x6f, 0x79, 0x23, 0x40, 0xba, 0xeb, 0xb8, 0x92, 0x69, 0xb5, 0xab, 0x8a,
+  0x8b, 0x76, 0x1d, 0xb6, 0xa3, 0x82, 0xad, 0x4b, 0xfe, 0x5f, 0x45, 0x90,
+  0x7c, 0x23, 0xc3, 0x8b, 0xca, 0x00, 0x7d, 0xb2, 0xbc, 0x68, 0x04, 0xfb,
+  0x8b, 0xfb, 0xad, 0xf1, 0xfe, 0x5c, 0xa5, 0xc5, 0x65, 0xc6, 0xfe, 0x17,
+  0x0f, 0x9e, 0x92, 0x7b, 0xf5, 0xb1, 0x38, 0x34, 0x77, 0x1d, 0x4e, 0x9e,
+  0x5e, 0xf4, 0x09, 0xb7, 0x0f, 0x7b, 0xbb, 0x76, 0x1f, 0xb8, 0x0d, 0x17,
+  0xaa, 0x53, 0x68, 0x17, 0xbe, 0x07, 0x22, 0xe1, 0x4d, 0xca, 0x6d, 0x7a,
+  0xb5, 0x99, 0xbd, 0x33, 0x5a, 0x6c, 0x98, 0x87, 0x22, 0x6b, 0x61, 0x9e,
+  0x34, 0x90, 0x1c, 0x28, 0x0b, 0x86, 0xf4, 0x01, 0x4e, 0xf5, 0xe4, 0xf2,
+  0x46, 0x11, 0x57, 0x03, 0x18, 0xf4, 0x96, 0x41, 0x72, 0x9c, 0x15, 0xbc,
+  0xf7, 0x3a, 0x8b, 0xc1, 0x66, 0x28, 0x6e, 0x95, 0x97, 0xcd, 0xe1, 0x40,
+  0x43, 0xbc, 0xf5, 0xec, 0xd9, 0xf5, 0xdc, 0x80, 0x50, 0xce, 0x0e, 0xc7,
+  0x63, 0x25, 0x93, 0x97, 0x21, 0x45, 0x48, 0xf4, 0x08, 0x08, 0x3a, 0x52,
+  0x24, 0x1d, 0x51, 0x15, 0x65, 0x90, 0x4e, 0x92, 0xc1, 0x1e, 0xf3, 0xb4,
+  0x57, 0xcc, 0x98, 0xa1, 0x4d, 0xc8, 0x7a, 0x99, 0xae, 0x74, 0xc5, 0x37,
+  0xeb, 0x77, 0xf2, 0xb3, 0x68, 0xba, 0x0a, 0x07, 0x2c, 0x69, 0x9f, 0x51,
+  0x8c, 0xac, 0x3c, 0x1e, 0xaa, 0xe1, 0xed, 0x32, 0x6f, 0x75, 0x44, 0xdc,
+  0x7b, 0x14, 0x2e, 0xfa, 0x3b, 0x5e, 0xd5, 0xe0, 0x5f, 0x5a, 0xf4, 0x77,
+  0x91, 0x45, 0x3f, 0x76, 0x17, 0x87, 0x3f, 0x96, 0xec, 0xef, 0x3f, 0xd3,
+  0x82, 0x10, 0x43, 0xc7, 0xf8, 0x9e, 0xfb, 0xa0, 0xf7, 0x45, 0xf3, 0xdc,
+  0x10, 0xf5, 0x07, 0xe1, 0xb7, 0xbc, 0xcb, 0xeb, 0x7d, 0xea, 0x89, 0xfd,
+  0x94, 0x51, 0xbf, 0xc9, 0x02, 0x35, 0x3a, 0x3d, 0x73, 0x99, 0x80, 0xf9,
+  0xa8, 0x29, 0x47, 0x6a, 0xf8, 0x0d, 0xe5, 0x4f, 0x35, 0x56, 0x97, 0xec,
+  0x7c, 0x4a, 0x67, 0xe1, 0x7d, 0xe7, 0xa9, 0x75, 0xa3, 0xec, 0xec, 0x6b,
+  0x00, 0xfd, 0x10, 0xbc, 0x78, 0x9e, 0x2d, 0x40, 0x99, 0xb3, 0x8c, 0xd0,
+  0x7a, 0x9c, 0xfb, 0x8f, 0x6b, 0xee, 0x2e, 0xaa, 0x14, 0x68, 0xcb, 0xf3,
+  0xf4, 0x2e, 0x02, 0xb6, 0x25, 0x9e, 0x62, 0x36, 0x57, 0x52, 0x9a, 0x7d,
+  0x41, 0xb6, 0x02, 0x34, 0x01, 0x71, 0x9b, 0x91, 0x1f, 0x96, 0x4e, 0xb4,
+  0xbc, 0xb0, 0xae, 0x5a, 0xf9, 0x6a, 0x00, 0x07, 0x50, 0x4b, 0x7b, 0x44,
+  0xbe, 0x32, 0xa2, 0x25, 0xc4, 0xb1, 0xe1, 0xf6, 0x9e, 0xb9, 0x23, 0xb2,
+  0xe7, 0x40, 0x8e, 0x2d, 0x86, 0x08, 0xf1, 0x76, 0x4f, 0x79, 0x89, 0xc6,
+  0x03, 0xa4, 0xed, 0x0e, 0x45, 0xe9, 0xf2, 0xd0, 0x6a, 0xae, 0x3c, 0x05,
+  0x71, 0x8f, 0xb9, 0xf1, 0x19, 0x31, 0x3b, 0x01, 0xdc, 0x1d, 0x25, 0xa7,
+  0xf0, 0xc2, 0xb5, 0x20, 0xc6, 0x2f, 0x98, 0xf4, 0x5d, 0xd1, 0x68, 0x9b,
+  0x70, 0x9f, 0xbb, 0x13, 0xd6, 0x39, 0x69, 0xf2, 0xcb, 0x8e, 0x32, 0x59,
+  0x2b, 0x50, 0xd4, 0xdb, 0x9c, 0x25, 0xef, 0x8e, 0xce, 0xdf, 0x21, 0xce,
+  0x0b, 0x06, 0x10, 0x80, 0xa4, 0xa6, 0xd5, 0xb6, 0x05, 0x09, 0x12, 0x76,
+  0xe6, 0xf4, 0x10, 0xc7, 0x20, 0x18, 0xbf, 0xcc, 0x9e, 0x37, 0xff, 0x53,
+  0xdf, 0xe3, 0xea, 0x97, 0x4c, 0x6b, 0x4d, 0x5c, 0x44, 0xa7, 0x8d, 0xac,
+  0xb6, 0xbf, 0xef, 0xb2, 0x90, 0xb8, 0x75, 0x32, 0x8b, 0x39, 0xc9, 0x24,
+  0x1f, 0x49, 0x76, 0x8b, 0x16, 0x5f, 0x68, 0xab, 0x3c, 0x7a, 0x88, 0xb3,
+  0xb1, 0xcb, 0x2a, 0x22, 0x72, 0xe5, 0xd3, 0x2a, 0xff, 0x79, 0x0a, 0x0e,
+  0x45, 0x8d, 0xbf, 0xc6, 0x3f, 0x65, 0xee, 0x29, 0x15, 0x80, 0xc9, 0xe3,
+  0xdd, 0xdd, 0x08, 0xec, 0x70, 0x3a, 0x31, 0x4c, 0x55, 0xb4, 0x39, 0xa9,
+  0xea, 0xc1, 0x5b, 0xec, 0x35, 0x85, 0x7a, 0x59, 0x93, 0xa9, 0x31, 0xbc,
+  0x20, 0x37, 0x26, 0xed, 0x58, 0x68, 0x54, 0xec, 0x33, 0x8f, 0xf9, 0x1e,
+  0x55, 0x46, 0xba, 0x69, 0x1d, 0xe6, 0xc2, 0x25, 0x48, 0xda, 0x9b, 0x37,
+  0xf5, 0xc0, 0x98, 0xc5, 0xff, 0x1d, 0xcc, 0x2c, 0xe0, 0xdf, 0xfb, 0x4f,
+  0x42, 0x8a, 0x18, 0x9f, 0x9f, 0xbe, 0x13, 0x0a, 0x0b, 0x45, 0x33, 0xef,
+  0x08, 0x1e, 0x71, 0x68, 0x2b, 0x83, 0x10, 0x72, 0x67, 0x66, 0xf1, 0x01,
+  0x2c, 0x8a, 0xa9, 0xf7, 0x55, 0xe6, 0x00, 0x68, 0xcf, 0x27, 0x4b, 0xfb,
+  0x4e, 0x10, 0x01, 0x14, 0xaf, 0x57, 0xef, 0xa5, 0xf7, 0x12, 0x5f, 0xb3,
+  0x53, 0xbe, 0xbf, 0x5c, 0xbd, 0x4e, 0x74, 0x24, 0x75, 0xec, 0x84, 0xf7,
+  0x2b, 0xe9, 0xb0, 0xb6, 0x8f, 0x68, 0x97, 0x16, 0xf9, 0x12, 0x9d, 0x3a,
+  0x48, 0x66, 0xe6, 0xf0, 0xb2, 0x4e, 0x6b, 0x15, 0xa3, 0x97, 0x2d, 0xf1,
+  0x09, 0x86, 0x2c, 0x96, 0xc4, 0xa6, 0x94, 0x7d, 0x61, 0xd3, 0x00, 0xd6,
+  0xbd, 0xac, 0x66, 0x92, 0xbe, 0x22, 0x82, 0x53, 0x8d, 0x05, 0xa7, 0x67,
+  0x3b, 0xa9, 0x7f, 0x76, 0xfa, 0xee, 0xdc, 0xca, 0x7c, 0xfa, 0x2c, 0x7e,
+  0xd0, 0xb9, 0x3d, 0xd4, 0x2f, 0x45, 0xf0, 0x27, 0x44, 0xb2, 0xa1, 0x43,
+  0xf0, 0x67, 0x51, 0x08, 0x02, 0x39, 0x12, 0x8c, 0xa3, 0x03, 0x0d, 0xd0,
+  0xc7, 0x6f, 0x56, 0x32, 0x9c, 0x8f, 0xe5, 0x37, 0xec, 0x41, 0x87, 0xa0,
+  0xe9, 0x41, 0x06, 0x73, 0xca, 0xed, 0xa3, 0xbd, 0x90, 0x32, 0xc8, 0x86,
+  0x7e, 0x77, 0x34, 0x3e, 0xe7, 0x99, 0xd3, 0xdf, 0x82, 0x99, 0x73, 0x7d,
+  0xa8, 0xfc, 0x30, 0x74, 0xa2, 0x5a, 0xca, 0xa0, 0x0c, 0x34, 0x63, 0x6d,
+  0x60, 0x7c, 0x5b, 0xe0, 0xee, 0xed, 0xd8, 0x23, 0x2f, 0xdb, 0x10, 0x4c,
+  0x53, 0xe8, 0x04, 0xf7, 0x1b, 0x3f, 0xd8, 0x90, 0xaf, 0x6c, 0x18, 0xb5,
+  0x6c, 0xa6, 0x8d, 0xc3, 0xbc, 0x11, 0x1e, 0xbb, 0x11, 0x96, 0x24, 0xa9,
+  0x64, 0x80, 0x63, 0x6d, 0xc2, 0x4b, 0x3f, 0x1c, 0x2a, 0xa9, 0x40, 0x58,
+  0x30, 0x51, 0xf0, 0x73, 0x6e, 0x9c, 0x27, 0x52, 0xa2, 0x7e, 0x62, 0x55,
+  0x05, 0x6f, 0x2a, 0xf4, 0x63, 0x4d, 0xf9, 0x81, 0xb6, 0xd1, 0x21, 0xb9,
+  0x47, 0x4c, 0xe9, 0x5f, 0x51, 0xb6, 0xa0, 0x4d, 0x5b, 0xe4, 0xb5, 0xfb,
+  0x72, 0xc1, 0x28, 0x5b, 0x79, 0xb1, 0xca, 0xa0, 0xa3, 0xa5, 0xd5, 0x9c,
+  0x7a, 0x3d, 0x18, 0x26, 0x52, 0x71, 0xfd, 0xd8, 0x4d, 0x11, 0x83, 0xa5,
+  0xf6, 0xbe, 0x21, 0xf2, 0xe7, 0xf8, 0xe4, 0xc8, 0x1d, 0x15, 0xf7, 0x89,
+  0xc0, 0x25, 0x76, 0xba, 0xbe, 0xb9, 0xb0, 0x85, 0x15, 0x13, 0xa3, 0xe4,
+  0x8c, 0x3a, 0xa2, 0x43, 0x67, 0xaa, 0xff, 0xc3, 0x8d, 0xc6, 0x97, 0x04,
+  0x1e, 0x78, 0x23, 0x36, 0x51, 0xee, 0x9c, 0x17, 0xe6, 0x64, 0xf1, 0x13,
+  0xfa, 0xab, 0x87, 0x69, 0x1e, 0x2c, 0xf7, 0xb9, 0x7b, 0xb9, 0x36, 0x2b,
+  0x31, 0x16, 0x7a, 0xf7, 0x91, 0xc7, 0x42, 0x57, 0xc6, 0x7c, 0xc7, 0x10,
+  0x96, 0x35, 0xd3, 0x5d, 0x96, 0x66, 0x31, 0x33, 0x1e, 0xe1, 0x42, 0x9f,
+  0x69, 0xb1, 0x70, 0x6f, 0x28, 0x16, 0x06, 0x87, 0x13, 0xdb, 0x40, 0x88,
+  0x92, 0x84, 0x49, 0x91, 0x33, 0x63, 0x15, 0xc4, 0x69, 0xe7, 0x36, 0xd7,
+  0xde, 0x8f, 0x01, 0x63, 0x6b, 0x2d, 0x5e, 0x54, 0x77, 0x73, 0x3b, 0xed,
+  0xdd, 0x1f, 0x33, 0x25, 0x5a, 0xb2, 0xb1, 0xf2, 0xab, 0x35, 0x3b, 0xc9,
+  0x4e, 0x16, 0xdc, 0x3b, 0x72, 0x1a, 0x50, 0x3c, 0xc0, 0xc8, 0x77, 0x5f,
+  0xf9, 0x7f, 0xfc, 0xc4, 0x0d, 0x75, 0x01, 0xf0, 0x1e, 0xe5, 0xeb, 0x87,
+  0x2d, 0xa7, 0x9c, 0xed, 0x24, 0x91, 0xdb, 0x27, 0xd9, 0x6c, 0xe4, 0xda,
+  0xf3, 0xc8, 0x95, 0xf2, 0xbe, 0xf1, 0x4c, 0x4c, 0x5f, 0xb2, 0x7d, 0x8b,
+  0x3b, 0x97, 0x7c, 0x3f, 0xe2, 0xa8, 0x32, 0xfb, 0xcd, 0xb8, 0x51, 0x8d,
+  0xfc, 0x46, 0x40, 0x18, 0xaf, 0xc4, 0x2f, 0x43, 0xad, 0xa8, 0x02, 0xc4,
+  0xc5, 0xd5, 0x42, 0x72, 0x78, 0xbd, 0x2f, 0x7d, 0x2e, 0x9e, 0x0c, 0x2a,
+  0x3e, 0x2f, 0x1c, 0x48, 0x91, 0xb7, 0x10, 0x52, 0x74, 0xc5, 0x6a, 0xd6,
+  0x50, 0xbe, 0x61, 0x8e, 0xd3, 0xd4, 0xa6, 0x00, 0x87, 0x18, 0x7b, 0x84,
+  0x5c, 0x46, 0x6c, 0x56, 0x94, 0x5d, 0xf5, 0x28, 0x94, 0x5a, 0x04, 0x2c,
+  0x9e, 0x05, 0x79, 0x8c, 0x7f, 0x65, 0x9b, 0x06, 0x85, 0x2e, 0xf1, 0x2a,
+  0xfb, 0x2b, 0x14, 0xc9, 0x91, 0xed, 0x05, 0xab, 0x01, 0xe5, 0xb4, 0x58,
+  0xa5, 0x9e, 0x2d, 0xff, 0xf8, 0xb9, 0x78, 0xa8, 0xc4, 0x0d, 0x42, 0x91,
+  0xf5, 0x82, 0xc0, 0xaf, 0x3b, 0xe1, 0xc5, 0x27, 0x7b, 0xd6, 0x57, 0x49,
+  0x29, 0xb3, 0x52, 0x07, 0xe2, 0x27, 0xce, 0x12, 0xfc, 0xf1, 0xf8, 0x9b,
+  0xe4, 0xcd, 0xab, 0x27, 0x94, 0xd0, 0x73, 0x99, 0x55, 0xcb, 0x8a, 0x92,
+  0x38, 0x95, 0x86, 0x4f, 0xbf, 0xf5, 0x06, 0xdb, 0x77, 0xd9, 0x17, 0x0a,
+  0x8e, 0x28, 0xcc, 0x4c, 0xec, 0x05, 0x73, 0x84, 0x54, 0xf8, 0x7c, 0xa9,
+  0x0d, 0x36, 0x15, 0xc7, 0x4f, 0xd1, 0xaa, 0xa0, 0xb5, 0x7c, 0xd6, 0x4d,
+  0x0a, 0x6f, 0x31, 0xb0, 0x27, 0x8f, 0x1c, 0x03, 0xab, 0xee, 0x96, 0xd4,
+  0x5c, 0xa5, 0xb8, 0x24, 0xb3, 0x20, 0x72, 0xa3, 0x9e, 0x30, 0xd3, 0x7c,
+  0xc9, 0xf7, 0x9e, 0x74, 0xd8, 0xf0, 0x35, 0xa8, 0xe7, 0x70, 0x97, 0x7a,
+  0xef, 0x3d, 0xf1, 0xbd, 0x0a, 0xb5, 0x74, 0x46, 0x93, 0x96, 0x18, 0xd0,
+  0x50, 0xbc, 0x67, 0x9f, 0xda, 0x67, 0xc9, 0x6f, 0x94, 0x17, 0x5e, 0x0b,
+  0xa3, 0x9e, 0x37, 0x44, 0xf9, 0x55, 0x03, 0x41, 0x15, 0x33, 0xd6, 0x77,
+  0xbc, 0xbd, 0xf7, 0x5e, 0x79, 0xde, 0x76, 0x9a, 0xa0, 0xb7, 0x81, 0x25,
+  0x4c, 0x2c, 0x0a, 0x7d, 0x6b, 0x3d, 0x37, 0x0b, 0xcb, 0xe8, 0xb3, 0x6e,
+  0x1e, 0xb4, 0xf2, 0xc0, 0xcc, 0x47, 0x10, 0xd1, 0xab, 0xce, 0xa4, 0xff,
+  0xf2, 0x30, 0xe9, 0x2b, 0x02, 0x02, 0xad, 0x7b, 0x1f, 0xd9, 0x93, 0x3b,
+  0x43, 0x5d, 0xaf, 0x2f, 0x8b, 0xfc, 0xef, 0x99, 0x97, 0x0b, 0xa6, 0xed,
+  0xa7, 0xbc, 0xc7, 0xf7, 0x85, 0x61, 0x70, 0x67, 0x63, 0x30, 0x45, 0x0a,
+  0x9e, 0xba, 0x07, 0x1e, 0x09, 0xd5, 0x72, 0xf7, 0x38, 0xce, 0x7d, 0x30,
+  0xa3, 0x22, 0x74, 0x9f, 0xb5, 0xd2, 0xea, 0x9f, 0x3e, 0x16, 0x9d, 0x4b,
+  0x75, 0x63, 0x92, 0xbc, 0xb4, 0x11, 0x73, 0x00, 0x32, 0x76, 0xd9, 0xf4,
+  0x53, 0x11, 0x7b, 0x72, 0x94, 0xb6, 0x05, 0x95, 0x6d, 0xe7, 0x45, 0x7f,
+  0xbd, 0xc9, 0x0b, 0x49, 0x74, 0x0f, 0x5e, 0x7f, 0xda, 0xe3, 0x7e, 0xac,
+  0x59, 0x66, 0x1e, 0x81, 0x96, 0xbc, 0xe7, 0x9f, 0xb9, 0x9b, 0xe0, 0x10,
+  0x68, 0x07, 0x0e, 0xf7, 0x76, 0xe0, 0x63, 0x96, 0xea, 0x5d, 0x62, 0x17,
+  0x4a, 0xc6, 0xbd, 0x0e, 0x22, 0xc8, 0xf2, 0x17, 0xf6, 0xf3, 0xf3, 0x92,
+  0xb8, 0xa9, 0xf7, 0x3d, 0x26, 0xa9, 0xd7, 0xe8, 0x55, 0xe1, 0x8c, 0x83,
+  0x22, 0x39, 0xf7, 0xca, 0x64, 0xdd, 0xd3, 0xcf, 0x85, 0x36, 0x54, 0x5e,
+  0x5a, 0x63, 0xb5, 0xef, 0x8d, 0x67, 0xbb, 0xbe, 0xb2, 0x3a, 0xa3, 0xa8,
+  0x2c, 0x97, 0xf1, 0xf7, 0xbe, 0xc0, 0x94, 0x71, 0x6c, 0xc4, 0xc8, 0xa5,
+  0x21, 0x6a, 0x3c, 0xe3, 0xd0, 0x0c, 0xdd, 0x63, 0xfb, 0x2d, 0xa6, 0x7b,
+  0xee, 0xab, 0x4f, 0xc9, 0xf1, 0x2b, 0xef, 0xc1, 0x47, 0x6e, 0x81, 0xe9,
+  0x9c, 0xb4, 0x81, 0x3b, 0xf6, 0x53, 0xd5, 0xc9, 0x16, 0xbd, 0xe5, 0x61,
+  0x96, 0x3c, 0x63, 0xca, 0x78, 0x5b, 0x32, 0xea, 0x16, 0xb6, 0x3f, 0x78,
+  0x86, 0xc9, 0xe1, 0xe5, 0x95, 0x91, 0x6a, 0xd3, 0x06, 0x39, 0xa1, 0x85,
+  0xc6, 0xb8, 0xba, 0x67, 0xff, 0xec, 0xe9, 0x9a, 0x67, 0x45, 0x68, 0xd6,
+  0x56, 0xd4, 0x7b, 0xef, 0x3d, 0x0b, 0xaf, 0xb9, 0x9a, 0x03, 0x5a, 0xa6,
+  0x60, 0xae, 0x1a, 0xdd, 0xb4, 0x64, 0x8b, 0xca, 0xa3, 0xff, 0x43, 0x1d,
+  0x83, 0x15, 0xe1, 0x09, 0xd6, 0xff, 0xe1, 0xcf, 0xf7, 0x73, 0xbf, 0xd6,
+  0x81, 0xbd, 0x82, 0x55, 0x86, 0x38, 0xc1, 0xb4, 0xd5, 0x2e, 0xc2, 0xe5,
+  0x08, 0x61, 0x77, 0xbc, 0x11, 0xf8, 0xcc, 0x8d, 0x1e, 0xb1, 0x2a, 0x1c,
+  0xe7, 0x60, 0x23, 0x50, 0xd0, 0x08, 0x66, 0x3e, 0xf4, 0x24, 0xf1, 0x7c,
+  0xf1, 0x40, 0x79, 0x3e, 0xd4, 0xdd, 0xce, 0x35, 0xa8, 0xaf, 0x56, 0x6c,
+  0x72, 0xdb, 0x15, 0x39, 0x07, 0x9b, 0xf7, 0xda, 0xbe, 0xe3, 0x5e, 0x98,
+  0x1b, 0xd4, 0xc6, 0x97, 0x66, 0xb6, 0x6c, 0x93, 0xdb, 0xfe, 0x01, 0xa8,
+  0x97, 0xbe, 0xa9, 0x4a, 0xfa, 0xab, 0x42, 0x84, 0x6c, 0xa5, 0x3d, 0xa9,
+  0x99, 0x92, 0x44, 0xee, 0x7d, 0x46, 0x54, 0x1b, 0x4a, 0x71, 0x32, 0xa7,
+  0x74, 0x95, 0x4d, 0x3f, 0xea, 0x95, 0x91, 0x41, 0x5c, 0xea, 0xb9, 0xf7,
+  0xd6, 0x63, 0xbb, 0xb5, 0x30, 0x68, 0xde, 0x1d, 0x75, 0xad, 0x00, 0xf7,
+  0x28, 0x53, 0xcd, 0xbb, 0xf3, 0xf1, 0xd9, 0x01, 0xcd, 0x99, 0xe3, 0x86,
+  0xe6, 0x42, 0xbc, 0x1c, 0x67, 0x7f, 0x93, 0x3a, 0xb3, 0xda, 0x3d, 0xfd,
+  0xb4, 0xe7, 0xe9, 0xb1, 0x38, 0xf6, 0x8e, 0x81, 0xd4, 0x6c, 0xce, 0xc1,
+  0x7f, 0x89, 0x89, 0x66, 0x55, 0xa8, 0x7f, 0x9f, 0xfd, 0x5f, 0x34, 0x33,
+  0x70, 0x43, 0x8a, 0x2d, 0xbb, 0x87, 0x3f, 0x77, 0x36, 0xcd, 0xd5, 0xaa,
+  0xf8, 0x68, 0xf5, 0x45, 0xc1, 0xd1, 0xd3, 0x03, 0x76, 0x2f, 0x3c, 0xd7,
+  0xab, 0xe1, 0xf9, 0x41, 0x6d, 0xde, 0xd3, 0x40, 0x3c, 0x14, 0xe2, 0x76,
+  0x94, 0x98, 0xa7, 0xe1, 0xaf, 0x2b, 0x6f, 0x0f, 0x9e, 0xef, 0x5a, 0xf1,
+  0x2b, 0x90, 0x3c, 0x1f, 0xb3, 0x3b, 0x47, 0x75, 0x9a, 0x63, 0xb1, 0xcc,
+  0x0b, 0x72, 0x41, 0xb8, 0x47, 0xdc, 0x00, 0x7b, 0x2d, 0x21, 0xd0, 0x55,
+  0x37, 0xea, 0x26, 0x6d, 0x56, 0x9e, 0x88, 0x79, 0xce, 0xb4, 0x33, 0xa6,
+  0xa8, 0xe3, 0x42, 0xe8, 0x35, 0x2f, 0xd4, 0xdb, 0xd6, 0x71, 0xa1, 0xe9,
+  0x4b, 0x3f, 0xfc, 0xc0, 0x72, 0xa4, 0x54, 0x60, 0x24, 0x09, 0x5d, 0xd9,
+  0xe6, 0x4f, 0x86, 0xe9, 0xb2, 0xea, 0x41, 0x57, 0x18, 0xf1, 0x9e, 0x2a,
+  0xa3, 0xfe, 0x94, 0x8a, 0x7d, 0x83, 0xcb, 0x13, 0x8b, 0x9e, 0x97, 0x85,
+  0xc4, 0x6c, 0x29, 0x79, 0x13, 0xae, 0x4f, 0x06, 0x9b, 0x66, 0x57, 0x98,
+  0x99, 0xc1, 0xe1, 0xfb, 0xf3, 0x6f, 0x4e, 0xdf, 0x8d, 0x93, 0x1d, 0xaa,
+  0x6d, 0x3f, 0x7f, 0x77, 0xfc, 0xd5, 0xfb, 0x73, 0xf3, 0x4f, 0x1d, 0xe9,
+  0x55, 0x5a, 0xe4, 0x46, 0x3a, 0x8d, 0x9b, 0xac, 0x30, 0xb4, 0x72, 0xa9,
+  0x3d, 0x9a, 0x90, 0x83, 0x42, 0xf2, 0xb8, 0xac, 0x14, 0xd2, 0x84, 0xd2,
+  0x51, 0xca, 0xb9, 0x4b, 0x26, 0x60, 0x0f, 0x36, 0xe5, 0xf8, 0x95, 0xce,
+  0x72, 0xce, 0x3b, 0x45, 0xf9, 0x9a, 0xb6, 0x93, 0x9c, 0x7f, 0x73, 0xf8,
+  0xf6, 0xdb, 0xb1, 0x76, 0xf0, 0xf8, 0xfe, 0xfb, 0xef, 0xbb, 0xc1, 0x5d,
+  0xe8, 0xb0, 0x57, 0xe9, 0xed, 0xed, 0xa8, 0xce, 0x3e, 0xfb, 0x6c, 0x7c,
+  0x74, 0x94, 0x1c, 0x9e, 0x8c, 0x4f, 0x3f, 0x73, 0x38, 0x0e, 0x5b, 0x7b,
+  0xdb, 0x46, 0x49, 0xbb, 0xcc, 0x1a, 0xf3, 0x97, 0xcf, 0x3e, 0xfb, 0xff,
+  0x00, 0x57, 0x6e, 0x39, 0x73, 0x0a, 0xa4, 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 16520b6..9f93969 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 19ec65a..de7ec4d 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 b3a9b9c..9563cc3 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 4803adb..2504289 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 @@
         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;
   }
 
@@ -279,6 +279,24 @@
   struct GlobalConfig global;
   memset(&global, 0, sizeof(global));
 
+#ifdef WIN32
+  /* Undocumented diagnostic option to list the full paths of all loaded
+     modules. This is purposely pre-init. */
+  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);
+    return head ? 0 : 1;
+  }
+  /* 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,21 +312,6 @@
   /* 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);
diff --git a/src/tool_metalink.c b/src/tool_metalink.c
index 889da4b..f87f686 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 @@
     *(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 @@
   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,
@@ -895,7 +832,7 @@
 {
   struct per_transfer *per = userdata;
   struct OutStruct *outs = &per->outs;
-  struct OperationConfig *config = outs->config;
+  struct OperationConfig *config = per->config;
   int rv;
 
   /*
diff --git a/src/tool_msgs.c b/src/tool_msgs.c
index f5e1df2..48877b3 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 @@
   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 @@
 #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 d1cc7f8..2c4afd1 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 3087d2d..4b3caa8 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
@@ -380,7 +380,7 @@
     /* 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;
   }
 
@@ -644,6 +644,12 @@
   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);
@@ -700,7 +706,7 @@
         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 +720,10 @@
       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 */
@@ -762,7 +770,7 @@
     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 +798,12 @@
           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 +837,12 @@
       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 +866,13 @@
         /* 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 +891,6 @@
           }
         }
 
-
         hdrcbdata = &per->hdrcbdata;
 
         outs = &per->outs;
@@ -900,7 +902,76 @@
 
         /* default output stream is stdout */
         outs->stream = stdout;
-        outs->config = config;
+
+        /* --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);
+          }
+        }
+
+        /* --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) {
+            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);
+          }
+        }
 
         if(metalink) {
           /* For Metalink download, use name in Metalink file as
@@ -959,7 +1030,7 @@
             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;
             }
@@ -1016,7 +1087,7 @@
             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 +1157,11 @@
            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 +1356,9 @@
                     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;
@@ -1521,7 +1595,7 @@
           if(!config->insecure_ok) {
             char *home;
             char *file;
-            result = CURLE_OUT_OF_MEMORY;
+            result = CURLE_FAILED_INIT;
             home = homedir();
             if(home) {
               file = aprintf("%s/.ssh/known_hosts", home);
@@ -1535,6 +1609,9 @@
               }
               Curl_safefree(home);
             }
+            else {
+              errorf(global, "Failed to figure out user's home dir!");
+            }
             if(result)
               break;
           }
@@ -1579,7 +1656,14 @@
           /* 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: */
@@ -1751,6 +1835,10 @@
         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 +1856,7 @@
 
         hdrcbdata->outs = outs;
         hdrcbdata->heads = heads;
+        hdrcbdata->etag_save = etag_save;
         hdrcbdata->global = global;
         hdrcbdata->config = config;
 
@@ -1877,11 +1966,8 @@
         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 +1994,15 @@
         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
@@ -1973,6 +2068,10 @@
     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);
@@ -2009,8 +2108,10 @@
 
   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);
@@ -2193,7 +2294,7 @@
         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 +2315,7 @@
             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;
             }
           }
@@ -2401,7 +2502,7 @@
 #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 60257fc..39227c0 100644
--- a/src/tool_operate.h
+++ b/src/tool_operate.h
@@ -44,9 +44,11 @@
   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;
   char errorbuffer[CURL_ERROR_SIZE];
diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c
index 543bf43..05c9d86 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 @@
   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 @@
         urlbuffer = aprintf("%s/%s", url, encfile);
 
       curl_free(encfile);
+
+      if(!urlbuffer) {
+        url = NULL;
+        goto end;
+      }
+
       Curl_safefree(url);
-
-      if(!urlbuffer)
-        return NULL;
-
       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 b0e5563..7c51902 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 - 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_panykey.h b/src/tool_panykey.h
index 6371a88..e5c6f39 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 - 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_paramhlp.c b/src/tool_paramhlp.c
index af47516..67702eb 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
@@ -65,7 +65,7 @@
     size_t alloc_needed;
     char buffer[256];
     size_t stringlen = 0;
-    string = malloc(alloc);
+    string = calloc(1, alloc);
     if(!string)
       return PARAM_NO_MEM;
 
@@ -560,7 +560,7 @@
   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 +606,7 @@
   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 f13a114..d925b84 100644
--- a/src/tool_paramhlp.h
+++ b/src/tool_paramhlp.h
@@ -50,7 +50,7 @@
 
 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 9b32e54..a9057ea 100644
--- a/src/tool_parsecfg.c
+++ b/src/tool_parsecfg.c
@@ -97,6 +97,8 @@
       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) {
@@ -285,7 +287,7 @@
   else
     rc = 1; /* couldn't open the file */
 
-  free(pathalloc);
+  curl_free(pathalloc);
   return rc;
 }
 
diff --git a/src/tool_parsecfg.h b/src/tool_parsecfg.h
index 3406261..49919a7 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 a2667f3..31cd56a 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 @@
                 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 ebec9ee..ccc9f5a 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 @@
   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 4c98d90..9b308bf 100644
--- a/src/tool_setopt.c
+++ b/src/tool_setopt.c
@@ -124,6 +124,7 @@
 const NameValueUnsigned setopt_nv_CURLSSLOPT[] = {
   NV(CURLSSLOPT_ALLOW_BEAST),
   NV(CURLSSLOPT_NO_REVOKE),
+  NV(CURLSSLOPT_NO_PARTIALCHAIN),
   NVEND,
 };
 
@@ -181,18 +182,18 @@
   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))
diff --git a/src/tool_setopt.h b/src/tool_setopt.h
index 6340133..48e9e81 100644
--- a/src/tool_setopt.h
+++ b/src/tool_setopt.h
@@ -35,7 +35,7 @@
       if(result)                                \
         break;                                  \
     }                                           \
-  } WHILE_FALSE
+  } while(0)
 
 /* allow removed features to simulate success: */
 bool tool_setopt_skip(CURLoption tag);
diff --git a/src/tool_setup.h b/src/tool_setup.h
index 854973e..60a7ccd 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 edb5aed..67a5443 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 - 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.h b/src/tool_sleep.h
index 3aaab52..59be6aa 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.h b/src/tool_strdup.h
index f84b202..e30e403 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 450cdcf..6c87161 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
@@ -627,7 +627,7 @@
       unsigned long num = strtoul(&filename[1], &filename, 10);
       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 */
diff --git a/src/tool_urlglob.h b/src/tool_urlglob.h
index 55ac346..82326c0 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 - 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_util.c b/src/tool_util.c
index 9990a46..8bbfae0 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 Curl_freq;
+extern bool Curl_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(Curl_isVistaOrGreater) { /* QPC timer might have issues pre-Vista */
+    LARGE_INTEGER count;
+    QueryPerformanceCounter(&count);
+    now.tv_sec = (long)(count.QuadPart / Curl_freq.QuadPart);
+    now.tv_usec = (long)((count.QuadPart % Curl_freq.QuadPart) * 1000000 /
+                         Curl_freq.QuadPart);
+  }
+  else {
+    /* Disable /analyze warning that GetTickCount64 is preferred  */
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:28159)
 #endif
-  now.tv_sec = (long)(milliseconds / 1000);
-  now.tv_usec = (long)((milliseconds % 1000) * 1000);
+    DWORD milliseconds = GetTickCount();
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+
+    now.tv_sec = (long)(milliseconds / 1000);
+    now.tv_usec = (long)((milliseconds % 1000) * 1000);
+  }
   return now;
 }
 
diff --git a/src/tool_util.h b/src/tool_util.h
index 5339c11..8e4a3f4 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 7c8087f..4c8d670 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.69.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 54871a6..7fa0dd6 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 - 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_vms.h b/src/tool_vms.h
index 96c86f1..1359369 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.h b/src/tool_writeout.h
index 8d3f645..ee8990f 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 - 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_xattr.h b/src/tool_xattr.h
index 56bd9e4..0339b9b 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/tests/FILEFORMAT b/tests/FILEFORMAT
index 8a9eb35..42ebe28 100644
--- a/tests/FILEFORMAT
+++ b/tests/FILEFORMAT
@@ -156,18 +156,17 @@
 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
-
+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
@@ -217,6 +216,7 @@
 
 Features testable here are:
 
+alt-svc
 crypto
 debug
 getrlimit
@@ -227,6 +227,7 @@
 ipv6
 Kerberos
 large_file
+ld_preload
 libz
 manual
 Metalink
@@ -239,14 +240,13 @@
 SSL
 SSLpinning
 SSPI
+threaded-resolver
 TLS-SRP
 TrackMemory
-threaded-resolver
 unittest
 unix-sockets
+win32
 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
diff --git a/tests/Makefile.am b/tests/Makefile.am
index f830ae4..95ee872 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
@@ -38,7 +38,8 @@
  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
+ objnames.inc disable-scan.pl manpage-syntax.pl error-codes.pl badsymbols.pl  \
+ azure.pm appveyor.pm
 
 DISTCLEANFILES = configurehelp.pm
 
diff --git a/tests/appveyor.pm b/tests/appveyor.pm
new file mode 100644
index 0000000..4906d2c
--- /dev/null
+++ b/tests/appveyor.pm
@@ -0,0 +1,114 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  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 ($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_result;
+    $APPVEYOR_TEST_NAMES{$testnum}=$testname;
+}
+
+sub appveyor_update_test_result {
+    my ($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 = 'Warning';
+    }
+    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
+        }
+    " \\
+    "$appveyor_baseurl/api/tests"`;
+    print $appveyor_result;
+    if($appveyor_category eq 'Error') {
+        $appveyor_result=`curl --silent --noproxy "*" \\
+        --header "Content-Type: application/json" \\
+        --data "
+            {
+                'message': '$testname $appveyor_outcome',
+                'category': '$appveyor_category',
+                'details': 'Test $testnum $appveyor_outcome'
+            }
+        " \\
+        "$appveyor_baseurl/api/build/messages"`;
+        print $appveyor_result;
+    }
+}
+
+1;
diff --git a/tests/azure.pm b/tests/azure.pm
new file mode 100644
index 0000000..9dcb56c
--- /dev/null
+++ b/tests/azure.pm
@@ -0,0 +1,146 @@
+#***************************************************************************
+#                                  _   _ ____  _
+#  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 $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.0"`;
+    if($azure_run =~ /"id":(\d+)/) {
+        return $1;
+    }
+    return "";
+}
+
+sub azure_create_test_result {
+    my ($azure_run_id, $testnum, $testname)=@_;
+    $testname =~ s/\\/\\\\/g;
+    $testname =~ s/\'/\\\'/g;
+    $testname =~ s/\"/\\\"/g;
+    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': '$testname',
+                'automatedTestName': 'curl.tests.$testnum',
+                'outcome': 'InProgress'
+            }
+        ]
+    " \\
+    "$azure_baseurl/_apis/test/runs/$azure_run_id/results?api-version=5.0"`;
+    if($azure_result =~ /\[\{"id":(\d+)/) {
+        return $1;
+    }
+    return "";
+}
+
+sub azure_update_test_result {
+    my ($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 = 'Not applicable';
+    }
+    elsif($error < 0) {
+        $azure_outcome = 'Not executed';
+    }
+    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.0"`;
+    if($azure_result =~ /\[\{"id":(\d+)/) {
+        return $1;
+    }
+    return "";
+}
+
+sub azure_update_test_run {
+    my ($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.0"`;
+    if($azure_run =~ /"id":(\d+)/) {
+        return $1;
+    }
+    return "";
+}
+
+1;
diff --git a/tests/badsymbols.pl b/tests/badsymbols.pl
new file mode 100755
index 0000000..05d325c
--- /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,
+        }
+        if($skipit) {
+            next;
+        }
+        if ( /enum\s+(\S+\s+)?{/ .. /}/ ) {
+            s/^\s+//;
+            chomp;
+            s/[,\s].*//;
+            if(($_ !~ /\}(;|)/) &&
+               ($_ ne "typedef") &&
+               ($_ ne "enum") &&
+               ($_ !~ /^[ \t]*$/) &&
+               ($_ ne "#")) {
+                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/data/Makefile.inc b/tests/data/Makefile.inc
index 557f928..dfc7432 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,15 +57,16 @@
 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 \
+test334 test335 test336 test337 test338 test339 test340 test341 test342 \
+test343 \
+test350 test351 test352 test353 test354 test355 test356 test357 \
 test393 test394 test395 \
 \
 test400 test401 test402 test403 test404 test405 test406 test407 test408 \
 test409 \
 \
+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 \
@@ -95,12 +96,11 @@
 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 \
+test886 test887 test888 test889 test890 test891 test892 test893 test894 \
 \
 test900 test901 test902 test903 test904 test905 test906 test907 test908 \
 test909 test910 test911 test912 test913 test914 test915 test916 test917 \
@@ -108,7 +108,8 @@
 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 \
 \
 test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
 test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
@@ -130,8 +131,9 @@
 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 \
+\
+test1170 test1171 test1172 test1173 test1174 test1175 test1176 \
 \
 test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
 test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
@@ -142,10 +144,10 @@
 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 \
+test1268 test1269 test1270 test1271 \
 \
 test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
-test1288 test1289 test1290 test1291 test1292 \
+test1288 test1289 test1290 test1291 test1292 test1293 \
 test1298 test1299 \
 test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
 test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
@@ -177,12 +179,14 @@
 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 \
 \
 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 \
 \
 test1650 test1651 test1652 test1653 test1654 test1655 \
 \
@@ -191,6 +195,7 @@
 test1800 test1801 \
 \
 test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 \
+test1908 \
 \
 test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
 test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
@@ -206,4 +211,5 @@
 test2080 \
 test2100 \
 \
-test3000 test3001
+test3000 test3001 \
+test3002 test3003 test3004 test3005 test3006 test3007
diff --git a/tests/data/test1008 b/tests/data/test1008
index 9fca722..a1ef0dd 100644
--- a/tests/data/test1008
+++ b/tests/data/test1008
@@ -86,6 +86,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test1021 b/tests/data/test1021
index 689341d..84d1e62 100644
--- a/tests/data/test1021
+++ b/tests/data/test1021
@@ -91,6 +91,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test1070 b/tests/data/test1070
index d202a9c..81b473d 100644
--- a/tests/data/test1070
+++ b/tests/data/test1070
@@ -32,7 +32,7 @@
 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,
@@ -55,9 +55,9 @@
 POST /1070 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

 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/test1097 b/tests/data/test1097
index 7eb7b5f..70a8990 100644
--- a/tests/data/test1097
+++ b/tests/data/test1097
@@ -45,6 +45,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
diff --git a/tests/data/test1100 b/tests/data/test1100
index d60a93a..101b1e7 100644
--- a/tests/data/test1100
+++ b/tests/data/test1100
@@ -63,6 +63,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test1129 b/tests/data/test1129
index f47141c..2ab3dea 100644
--- a/tests/data/test1129
+++ b/tests/data/test1129
@@ -33,17 +33,18 @@
 # 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: 1053896
 </servercmd>
 </reply>
 
 #
 # Client-side
 <client>
-# 1025 x 'x'
+# 1053896 x 'x'
 <file name="log/file1129">
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-</file>
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+</File>
 <server>
 http
 </server>
@@ -81,14 +82,14 @@
 POST /1129 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

 Accept: */*

-Content-Length: 1025

+Content-Length: 1053896

 Content-Type: application/x-www-form-urlencoded

 Expect: 100-continue

 

 POST /11290001 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

 Accept: */*

-Content-Length: 1025

+Content-Length: 1053896

 Content-Type: application/x-www-form-urlencoded

 Expect: 100-continue

 

diff --git a/tests/data/test1133 b/tests/data/test1133
index 737f9d9..738e806 100644
--- a/tests/data/test1133
+++ b/tests/data/test1133
@@ -48,7 +48,6 @@
 Host: %HOSTIP:%HTTPPORT

 Accept: */*

 Content-Length: 1264

-Expect: 100-continue

 Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32

 

 ------------------------------24e78000bd32

diff --git a/tests/data/test1135 b/tests/data/test1135
index eca6860..37a5542 100644
--- a/tests/data/test1135
+++ b/tests/data/test1135
@@ -92,6 +92,7 @@
 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/test1167 b/tests/data/test1167
new file mode 100644
index 0000000..9eebe1c
--- /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/test1175 b/tests/data/test1175
new file mode 100644
index 0000000..61f0689
--- /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 0000000..491bee1
--- /dev/null
+++ b/tests/data/test1176
@@ -0,0 +1,68 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /1176 HTTP/1.1

+Host: %HOSTIP:%HTTPPORT

+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/test1215 b/tests/data/test1215
index 8edfd9b..ed50da0 100644
--- a/tests/data/test1215
+++ b/tests/data/test1215
@@ -58,6 +58,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test1270 b/tests/data/test1270
new file mode 100644
index 0000000..2579981
--- /dev/null
+++ b/tests/data/test1270
@@ -0,0 +1,69 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/our/1270 HTTP/1.1

+Host: %HOSTIP:%HTTPPORT

+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 0000000..687a6a9
--- /dev/null
+++ b/tests/data/test1271
@@ -0,0 +1,48 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /we/want/our/1271 HTTP/1.1

+Host: %HOSTIP:%HTTPPORT

+Accept: */*

+

+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1293 b/tests/data/test1293
new file mode 100644
index 0000000..11a28a3
--- /dev/null
+++ b/tests/data/test1293
@@ -0,0 +1,67 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<strippart>
+s/^--------------------------[a-z0-9]*/------------------------------/
+s/boundary=------------------------[a-z0-9]*/boundary=----------------------------/
+</strippart>
+<protocol>
+POST /1293 HTTP/1.1

+Host: 127.0.0.1:8990

+Accept: */*

+Content-Length: 126

+Content-Type: multipart/form-data; boundary=----------------------------

+

+------------------------------

+Content-Disposition: form-data

+

+

+--------------------------------

+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1300 b/tests/data/test1300
index 1008885..1183412 100644
--- a/tests/data/test1300
+++ b/tests/data/test1300
@@ -18,9 +18,5 @@
  <name>
 llist unit tests
  </name>
-<tool>
-unit1300
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1301 b/tests/data/test1301
index 8506c00..5aea24b 100644
--- a/tests/data/test1301
+++ b/tests/data/test1301
@@ -18,9 +18,5 @@
  <name>
 curl_strcasecompare unit tests
  </name>
-<tool>
-unit1301
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1302 b/tests/data/test1302
index 27ea862..9e9039c 100644
--- a/tests/data/test1302
+++ b/tests/data/test1302
@@ -18,9 +18,5 @@
  <name>
 base64 encode/decode unit tests
  </name>
-<tool>
-unit1302
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1303 b/tests/data/test1303
index 925b47e..bb23352 100644
--- a/tests/data/test1303
+++ b/tests/data/test1303
@@ -18,9 +18,5 @@
  <name>
 Curl_timeleft unit tests
  </name>
-<tool>
-unit1303
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1304 b/tests/data/test1304
index d518de9..b402bfc 100644
--- a/tests/data/test1304
+++ b/tests/data/test1304
@@ -18,13 +18,9 @@
  <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 91149b3..52efbcb 100644
--- a/tests/data/test1305
+++ b/tests/data/test1305
@@ -19,12 +19,8 @@
  <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 c4f7ac7..f0e96bf 100644
--- a/tests/data/test1307
+++ b/tests/data/test1307
@@ -20,9 +20,5 @@
  <name>
 internal Curl_fnmatch() testing
  </name>
-<tool>
-unit1307
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1308 b/tests/data/test1308
index 88e9771..3755ef8 100644
--- a/tests/data/test1308
+++ b/tests/data/test1308
@@ -20,12 +20,8 @@
  <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 0e0cad1..7005d5f 100644
--- a/tests/data/test1309
+++ b/tests/data/test1309
@@ -18,9 +18,6 @@
  <name>
 splay unit tests
  </name>
-<tool>
-unit1309
-</tool>
 </client>
 
 <verify>
@@ -1564,5 +1561,4 @@
 removed payload 1013[2]
 </stdout>
 </verify>
-
 </testcase>
diff --git a/tests/data/test1323 b/tests/data/test1323
index c5e598c..66bac61 100644
--- a/tests/data/test1323
+++ b/tests/data/test1323
@@ -17,12 +17,12 @@
 <server>
 none
 </server>
+<features>
+unittest
+</features>
 <name>
 curlx_tvdiff
 </name>
-<tool>
-unit1323
-</tool>
 </client>
 
 #
diff --git a/tests/data/test1330 b/tests/data/test1330
index 1fb5a66..ce04e33 100644
--- a/tests/data/test1330
+++ b/tests/data/test1330
@@ -20,11 +20,6 @@
 unittest
 TrackMemory
 </features>
-# tool is what to use instead of 'curl'
-<tool>
-unit1330
-</tool>
-
 <name>
 unit tests memory tracking operational
 </name>
@@ -45,7 +40,7 @@
 s/\(.*\)/()/
 s/:\d+/:/
 s:^(MEM )(.*/)(.*):$1$3:
+s/\r\n/\n/
 </stripfile>
 </verify>
-
 </testcase>
diff --git a/tests/data/test1394 b/tests/data/test1394
index 34d4a0e..d3ffb2d 100644
--- a/tests/data/test1394
+++ b/tests/data/test1394
@@ -17,14 +17,10 @@
  <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 967c8d4..409e0d6 100644
--- a/tests/data/test1395
+++ b/tests/data/test1395
@@ -17,10 +17,5 @@
  <name>
 Curl_dedotdotify
  </name>
-<tool>
-unit1395
-</tool>
-
 </client>
-
 </testcase>
diff --git a/tests/data/test1396 b/tests/data/test1396
index 8ffe35f..d8b432d 100644
--- a/tests/data/test1396
+++ b/tests/data/test1396
@@ -19,9 +19,6 @@
  <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 5f479b4..84f962a 100644
--- a/tests/data/test1397
+++ b/tests/data/test1397
@@ -19,9 +19,6 @@
  <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 dd50baa..436cac8 100644
--- a/tests/data/test1398
+++ b/tests/data/test1398
@@ -18,9 +18,6 @@
  <name>
 curl_msnprintf unit tests
  </name>
-<tool>
-unit1398
-</tool>
 </client>
 
 </testcase>
diff --git a/tests/data/test1399 b/tests/data/test1399
index fe3879d..6d6ec7a 100644
--- a/tests/data/test1399
+++ b/tests/data/test1399
@@ -18,9 +18,5 @@
  <name>
 Curl_pgrsTime unit tests
  </name>
-<tool>
-unit1399
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1437 b/tests/data/test1437
index 19ccece..6a48444 100644
--- a/tests/data/test1437
+++ b/tests/data/test1437
@@ -75,7 +75,7 @@
 

 GET /1437 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

-Authorization: Digest username="testuser", realm="testrealm", nonce="2", uri="/1437", response="4376eb639bf8e7343a6e7b56e1b89c4f", algorithm="MD5"

+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

 Accept: */*

 

diff --git a/tests/data/test1448 b/tests/data/test1448
index e04f47b..8de2fd1 100644
--- a/tests/data/test1448
+++ b/tests/data/test1448
@@ -41,7 +41,7 @@
 idn
 </features>
 <setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
 LC_CTYPE=en_US.UTF-8
 </setenv>
 <precheck>
diff --git a/tests/data/test1455 b/tests/data/test1455
index cbe6fe2..8483d7b 100644
--- a/tests/data/test1455
+++ b/tests/data/test1455
@@ -37,7 +37,7 @@
 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
@@ -58,6 +58,7 @@
 GET /1455 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

 Accept: */*

+Testno: 1455

 

 </protocol>
 </verify>
diff --git a/tests/data/test1456 b/tests/data/test1456
index 27d63f5..16a78b2 100644
--- a/tests/data/test1456
+++ b/tests/data/test1456
@@ -40,7 +40,7 @@
 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
@@ -53,8 +53,14 @@
 <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

 Accept: */*

diff --git a/tests/data/test150 b/tests/data/test150
index f28be04..e9fde39 100644
--- a/tests/data/test150
+++ b/tests/data/test150
@@ -57,6 +57,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test153 b/tests/data/test153
index 77f7adb..1f55f39 100644
--- a/tests/data/test153
+++ b/tests/data/test153
@@ -115,7 +115,7 @@
 

 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"

+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

 Accept: */*

 

diff --git a/tests/data/test1538 b/tests/data/test1538
index 9374deb..ea8eddb 100644
--- a/tests/data/test1538
+++ b/tests/data/test1538
@@ -127,7 +127,9 @@
 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: Unknown error
 m-1: Please call curl_multi_perform() soon
 m0: No error
 m1: Invalid multi handle
@@ -138,7 +140,9 @@
 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/test155 b/tests/data/test155
index 0a2bb0f..0cfd10e 100644
--- a/tests/data/test155
+++ b/tests/data/test155
@@ -76,6 +76,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test1554 b/tests/data/test1554
index be48e02..06f1897 100644
--- a/tests/data/test1554
+++ b/tests/data/test1554
@@ -38,6 +38,8 @@
 <- Mutex unlock
 -> Mutex lock
 <- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
 run 1: foobar and so on fun!
 -> Mutex lock
 <- Mutex unlock
@@ -47,6 +49,8 @@
 <- Mutex unlock
 -> Mutex lock
 <- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
 run 1: foobar and so on fun!
 -> Mutex lock
 <- Mutex unlock
@@ -54,6 +58,8 @@
 <- Mutex unlock
 -> Mutex lock
 <- Mutex unlock
+-> Mutex lock
+<- Mutex unlock
 </datacheck>
 </reply>
 
diff --git a/tests/data/test1558 b/tests/data/test1558
index 8436c06..f1538c2 100644
--- a/tests/data/test1558
+++ b/tests/data/test1558
@@ -23,12 +23,8 @@
 <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/test1560 b/tests/data/test1560
index a0e603b..0a132a1 100644
--- a/tests/data/test1560
+++ b/tests/data/test1560
@@ -22,6 +22,7 @@
 ldap
 dict
 ftp
+ipv6
 </features>
  <name>
 URL API
diff --git a/tests/data/test1564 b/tests/data/test1564
new file mode 100644
index 0000000..279665b
--- /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/test1565 b/tests/data/test1565
new file mode 100644
index 0000000..f554e0f
--- /dev/null
+++ b/tests/data/test1565
@@ -0,0 +1,41 @@
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+multi
+multi-threaded
+wakeup
+</keywords>
+</info>
+
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Content-Length: 3
+
+OK
+</data>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<tool>
+lib1565
+</tool>
+<name>
+wakeup from another thread
+</name>
+<command>
+http://%HOSTIP:%HTTPPORT/1
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+</verify>
+</testcase>
diff --git a/tests/data/test159 b/tests/data/test159
index 5a06217..a56986f 100644
--- a/tests/data/test159
+++ b/tests/data/test159
@@ -43,6 +43,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test1600 b/tests/data/test1600
index 8804074..33413d7 100644
--- a/tests/data/test1600
+++ b/tests/data/test1600
@@ -19,9 +19,5 @@
  <name>
 NTLM unit tests
  </name>
-<tool>
-unit1600
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1601 b/tests/data/test1601
index 125493b..2065fdd 100644
--- a/tests/data/test1601
+++ b/tests/data/test1601
@@ -18,9 +18,5 @@
  <name>
 MD5 unit tests
  </name>
-<tool>
-unit1601
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1602 b/tests/data/test1602
index 4717058..56e243f 100644
--- a/tests/data/test1602
+++ b/tests/data/test1602
@@ -18,9 +18,5 @@
  <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 805c9e3..406d197 100644
--- a/tests/data/test1603
+++ b/tests/data/test1603
@@ -18,9 +18,5 @@
  <name>
 Internal hash add, retrieval, deletion testing
  </name>
-<tool>
-unit1603
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1604 b/tests/data/test1604
index cf20775..39daf9d 100644
--- a/tests/data/test1604
+++ b/tests/data/test1604
@@ -17,9 +17,5 @@
  <name>
 Test WIN32/MSDOS filename sanitization
  </name>
-<tool>
-unit1604
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1605 b/tests/data/test1605
index 09ef669..a123b01 100644
--- a/tests/data/test1605
+++ b/tests/data/test1605
@@ -17,9 +17,5 @@
  <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 15488d4..83e9844 100644
--- a/tests/data/test1606
+++ b/tests/data/test1606
@@ -18,9 +18,5 @@
  <name>
 verify speedcheck
  </name>
-<tool>
-unit1606
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1607 b/tests/data/test1607
index 9628324..6d28d6e 100644
--- a/tests/data/test1607
+++ b/tests/data/test1607
@@ -18,9 +18,5 @@
  <name>
 CURLOPT_RESOLVE parsing
  </name>
-<tool>
-unit1607
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1608 b/tests/data/test1608
index 7023107..fbc6238 100644
--- a/tests/data/test1608
+++ b/tests/data/test1608
@@ -18,9 +18,5 @@
  <name>
 verify DNS shuffling
  </name>
-<tool>
-unit1608
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1609 b/tests/data/test1609
index c1b7c7a..6d28d6e 100644
--- a/tests/data/test1609
+++ b/tests/data/test1609
@@ -18,9 +18,5 @@
  <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 0000000..fff9733
--- /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 0000000..008aea7
--- /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 0000000..3e92b67
--- /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 099641a..29791d9 100644
--- a/tests/data/test162
+++ b/tests/data/test162
@@ -27,6 +27,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 proxy
 </features>
diff --git a/tests/data/test1620 b/tests/data/test1620
index 83b08c7..038bbcc 100644
--- a/tests/data/test1620
+++ b/tests/data/test1620
@@ -18,9 +18,5 @@
  <name>
 unit tests for url.c
  </name>
-<tool>
-unit1620
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1621 b/tests/data/test1621
index 1117d1b..62c8105 100644
--- a/tests/data/test1621
+++ b/tests/data/test1621
@@ -19,9 +19,5 @@
  <name>
 unit tests for stripcredentials from URL
  </name>
-<tool>
-unit1621
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test165 b/tests/data/test165
index 9009425..47de391 100644
--- a/tests/data/test165
+++ b/tests/data/test165
@@ -32,7 +32,7 @@
 proxy
 </features>
 <setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
 LC_CTYPE=en_US.UTF-8
 </setenv>
 <precheck>
diff --git a/tests/data/test1650 b/tests/data/test1650
index 13ca023..6248b98 100644
--- a/tests/data/test1650
+++ b/tests/data/test1650
@@ -14,14 +14,10 @@
 </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 28a9b71..d29974b 100644
--- a/tests/data/test1651
+++ b/tests/data/test1651
@@ -18,9 +18,5 @@
  <name>
 x509 parsing
  </name>
-<tool>
-unit1651
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test1652 b/tests/data/test1652
index c411690..678d195 100644
--- a/tests/data/test1652
+++ b/tests/data/test1652
@@ -16,8 +16,5 @@
 <name>
 infof
 </name>
-<tool>
-unit1652
-</tool>
 </client>
 </testcase>
diff --git a/tests/data/test1653 b/tests/data/test1653
index 0de2c14..59ec3f3 100644
--- a/tests/data/test1653
+++ b/tests/data/test1653
@@ -16,8 +16,5 @@
 <name>
 urlapi
 </name>
-<tool>
-unit1653
-</tool>
 </client>
 </testcase>
diff --git a/tests/data/test1654 b/tests/data/test1654
index 6a82daa..6155635 100644
--- a/tests/data/test1654
+++ b/tests/data/test1654
@@ -26,9 +26,6 @@
 <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 0c10bed..e161fb6 100644
--- a/tests/data/test1655
+++ b/tests/data/test1655
@@ -14,13 +14,10 @@
 </server>
 <features>
 unittest
+DoH
 </features>
  <name>
 unit test for doh_encode
  </name>
-<tool>
-unit1655
-</tool>
 </client>
-
 </testcase>
diff --git a/tests/data/test169 b/tests/data/test169
index 8013bcc..209dd9d 100644
--- a/tests/data/test169
+++ b/tests/data/test169
@@ -77,6 +77,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test170 b/tests/data/test170
index 49d595b..9b41ddd 100644
--- a/tests/data/test170
+++ b/tests/data/test170
@@ -19,6 +19,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 proxy
 </features>
diff --git a/tests/data/test176 b/tests/data/test176
index 73c53ca..e18837a 100644
--- a/tests/data/test176
+++ b/tests/data/test176
@@ -48,6 +48,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
diff --git a/tests/data/test1800 b/tests/data/test1800
index 0110184..c308c99 100644
--- a/tests/data/test1800
+++ b/tests/data/test1800
@@ -48,7 +48,7 @@
 Accept: */*

 Connection: Upgrade, HTTP2-Settings

 Upgrade: %H2CVER

-HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA

+HTTP2-Settings: AAMAAABkAAQCAAAAAAIAAAAA

 

 </protocol>
 </verify>
diff --git a/tests/data/test1908 b/tests/data/test1908
new file mode 100644
index 0000000..de34d0e
--- /dev/null
+++ b/tests/data/test1908
@@ -0,0 +1,71 @@
+<testcase>
+<info>
+<keywords>
+CURLINFO_EFFECTIVE_URL
+</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
+Content-Type: text/html
+Funny-head: yesyes swsclose
+Content-Length: 0
+alt-svc: h2="3dbbdetxoyw4nsp6c3cc456oj2ays6s43ezxzsfxxri3h5xqd.example:443"; ma=315360000; persist=1
+
+</data>
+</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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+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">
+# 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 8990 h2 3dbbdetxoyw4nsp6c3cc456oj2ays6s43ezxzsfxxri3h5xqd.example 443 TIMESTAMP 1 0
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test2006 b/tests/data/test2006
index 1f59717..0b84937 100644
--- a/tests/data/test2006
+++ b/tests/data/test2006
@@ -86,6 +86,10 @@
 Some data delivered from an HTTP resource
 </file1>
 <file2 name="log/heads2006">
+Content-Length: 496

+Accept-ranges: bytes

+
+

 HTTP/1.1 200 OK
 Date: Thu, 21 Jun 2012 14:49:01 GMT
 Server: test-server/fake
diff --git a/tests/data/test2007 b/tests/data/test2007
index a8e5f1b..c8c023e 100644
--- a/tests/data/test2007
+++ b/tests/data/test2007
@@ -90,6 +90,10 @@
 s/Last-Modified:.*//
 </stripfile2>
 <file2 name="log/heads2007">
+Content-Length: 496

+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 1a00332..570cdba 100644
--- a/tests/data/test2008
+++ b/tests/data/test2008
@@ -82,6 +82,10 @@
 s/Last-Modified:.*//
 </stripfile2>
 <file2 name="log/heads2008">
+Content-Length: 496

+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 08308d0..10f95df 100644
--- a/tests/data/test2009
+++ b/tests/data/test2009
@@ -83,6 +83,10 @@
 s/Last-Modified:.*//
 </stripfile2>
 <file2 name="log/heads2009">
+Content-Length: 496

+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 068c481..d43f4f1 100644
--- a/tests/data/test2010
+++ b/tests/data/test2010
@@ -82,6 +82,10 @@
 s/Last-Modified:.*//
 </stripfile2>
 <file2 name="log/heads2010">
+Content-Length: 496

+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/test2025 b/tests/data/test2025
index 6dfc70a..282c698 100644
--- a/tests/data/test2025
+++ b/tests/data/test2025
@@ -195,6 +195,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
diff --git a/tests/data/test2028 b/tests/data/test2028
index 2042eec..92a6371 100644
--- a/tests/data/test2028
+++ b/tests/data/test2028
@@ -231,6 +231,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
diff --git a/tests/data/test2029 b/tests/data/test2029
index 82d8085..59a793e 100644
--- a/tests/data/test2029
+++ b/tests/data/test2029
@@ -168,6 +168,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
diff --git a/tests/data/test2030 b/tests/data/test2030
index 893f986..a158a90 100644
--- a/tests/data/test2030
+++ b/tests/data/test2030
@@ -220,6 +220,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
diff --git a/tests/data/test2031 b/tests/data/test2031
index 9799621..9acfeef 100644
--- a/tests/data/test2031
+++ b/tests/data/test2031
@@ -234,6 +234,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
diff --git a/tests/data/test2032 b/tests/data/test2032
index ec5771f..8200b8d 100644
--- a/tests/data/test2032
+++ b/tests/data/test2032
@@ -66,6 +66,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
diff --git a/tests/data/test2033 b/tests/data/test2033
index a13c1d4..5293b66 100644
--- a/tests/data/test2033
+++ b/tests/data/test2033
@@ -67,6 +67,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
 <server>
diff --git a/tests/data/test2046 b/tests/data/test2046
index dcd202f..ec49c86 100644
--- a/tests/data/test2046
+++ b/tests/data/test2046
@@ -41,7 +41,7 @@
 idn
 </features>
 <setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
 LC_CTYPE=en_US.UTF-8
 </setenv>
 <precheck>
diff --git a/tests/data/test2047 b/tests/data/test2047
index bc73509..d3654c7 100644
--- a/tests/data/test2047
+++ b/tests/data/test2047
@@ -42,7 +42,7 @@
 idn
 </features>
 <setenv>
-LC_ALL=
+LC_ALL=en_US.UTF-8
 LC_CTYPE=en_US.UTF-8
 </setenv>
 <precheck>
diff --git a/tests/data/test2058 b/tests/data/test2058
index 65a907f..613dff0 100644
--- a/tests/data/test2058
+++ b/tests/data/test2058
@@ -95,7 +95,7 @@
 

 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

 Accept: */*

 Proxy-Connection: Keep-Alive

diff --git a/tests/data/test2059 b/tests/data/test2059
index 4272a7b..15799ae 100644
--- a/tests/data/test2059
+++ b/tests/data/test2059
@@ -95,7 +95,7 @@
 

 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

 Accept: */*

 Proxy-Connection: Keep-Alive

diff --git a/tests/data/test2060 b/tests/data/test2060
index a0b291d..05ce351 100644
--- a/tests/data/test2060
+++ b/tests/data/test2060
@@ -95,7 +95,7 @@
 

 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

 Accept: */*

 Proxy-Connection: Keep-Alive

diff --git a/tests/data/test2061 b/tests/data/test2061
index af3758c..bee88e3 100644
--- a/tests/data/test2061
+++ b/tests/data/test2061
@@ -75,7 +75,7 @@
 

 GET /2061 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

-Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2061", response="9dc55255f1a2537b838311674b621d45346b862a81631bb20e4ce356ef25062d", algorithm="SHA-256"

+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

 Accept: */*

 

diff --git a/tests/data/test2062 b/tests/data/test2062
index d5ce689..f6d4aff 100644
--- a/tests/data/test2062
+++ b/tests/data/test2062
@@ -75,7 +75,7 @@
 

 GET /2062 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

-Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/2062", response="2af735ec3508f4dff99248ffbbe9de9002bfd7cc770cfa2b026cb334042a54e3", algorithm="SHA-512-256"

+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

 Accept: */*

 

diff --git a/tests/data/test2063 b/tests/data/test2063
index 220fe4e..af9a9f0 100644
--- a/tests/data/test2063
+++ b/tests/data/test2063
@@ -75,7 +75,7 @@
 

 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

+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

 Accept: */*

 

diff --git a/tests/data/test2064 b/tests/data/test2064
index aa20c0b..bfaaa05 100644
--- a/tests/data/test2064
+++ b/tests/data/test2064
@@ -75,7 +75,7 @@
 

 GET /2064 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

-Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2064", response="a9c3ec1036068b336cbabefe9dfcad52ee8b89bc7c91ddbb5bb415c6acdf38a5", algorithm="SHA-256"

+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

 Accept: */*

 

diff --git a/tests/data/test2065 b/tests/data/test2065
index d3afe0b..d18b008 100644
--- a/tests/data/test2065
+++ b/tests/data/test2065
@@ -75,7 +75,7 @@
 

 GET /2065 HTTP/1.1

 Host: %HOSTIP:%HTTPPORT

-Authorization: Digest username="testuser", realm="testrealm", nonce="2053604145", uri="/2065", response="5a5f20b0e601aeddc6f96422c2332d49ff431c49ab143b5f836ef76e9ac78f5e", algorithm="SHA-512-256"

+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

 Accept: */*

 

diff --git a/tests/data/test2066 b/tests/data/test2066
index e6ec28a..b6effee 100644
--- a/tests/data/test2066
+++ b/tests/data/test2066
@@ -75,7 +75,7 @@
 

 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

+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

 Accept: */*

 

diff --git a/tests/data/test2067 b/tests/data/test2067
index faa7c57..c203343 100644
--- a/tests/data/test2067
+++ b/tests/data/test2067
@@ -78,7 +78,7 @@
 

 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

 Accept: */*

 Content-Length: 11

 Content-Type: application/x-www-form-urlencoded

diff --git a/tests/data/test2068 b/tests/data/test2068
index 43a50e6..5a197ce 100644
--- a/tests/data/test2068
+++ b/tests/data/test2068
@@ -78,7 +78,7 @@
 

 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

 Accept: */*

 Content-Length: 11

 Content-Type: application/x-www-form-urlencoded

diff --git a/tests/data/test2069 b/tests/data/test2069
index e8040a5..99fd71d 100644
--- a/tests/data/test2069
+++ b/tests/data/test2069
@@ -78,7 +78,7 @@
 

 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

 Accept: */*

 Content-Length: 11

 Content-Type: application/x-www-form-urlencoded

diff --git a/tests/data/test209 b/tests/data/test209
index aded6d2..67a7fc5 100644
--- a/tests/data/test209
+++ b/tests/data/test209
@@ -77,6 +77,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test2100 b/tests/data/test2100
index 0414b58..6dce69b 100644
--- a/tests/data/test2100
+++ b/tests/data/test2100
Binary files differ
diff --git a/tests/data/test213 b/tests/data/test213
index 82d82c4..e6d7cd5 100644
--- a/tests/data/test213
+++ b/tests/data/test213
@@ -77,6 +77,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test239 b/tests/data/test239
index a6f1fd5..b6f3879 100644
--- a/tests/data/test239
+++ b/tests/data/test239
@@ -52,6 +52,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test243 b/tests/data/test243
index f83218e..f7b2386 100644
--- a/tests/data/test243
+++ b/tests/data/test243
@@ -73,6 +73,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test265 b/tests/data/test265
index ff7d594..a27633a 100644
--- a/tests/data/test265
+++ b/tests/data/test265
@@ -78,6 +78,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test267 b/tests/data/test267
index 06b662c..a0c3d33 100644
--- a/tests/data/test267
+++ b/tests/data/test267
@@ -56,6 +56,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test3002 b/tests/data/test3002
new file mode 100644
index 0000000..ac68202
--- /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 0000000..7515aff
--- /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 0000000..e021cde
--- /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 0000000..256555a
--- /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 0000000..f54d71c
--- /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 0000000..b0d6902
--- /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/test304 b/tests/data/test304
index fedf18f..01d3a2d 100644
--- a/tests/data/test304
+++ b/tests/data/test304
@@ -49,7 +49,6 @@
 Host: %HOSTIP:%HTTPSPORT

 Accept: */*

 Content-Length: 1386

-Expect: 100-continue

 Content-Type: multipart/form-data; boundary=----------------------------c3b2ef7f0bb8

 

 ------------------------------c3b2ef7f0bb8

diff --git a/tests/data/test339 b/tests/data/test339
new file mode 100644
index 0000000..cd6e498
--- /dev/null
+++ b/tests/data/test339
@@ -0,0 +1,63 @@
+<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>
+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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /339 HTTP/1.1

+Host: %HOSTIP:%HTTPPORT

+Accept: */*

+

+</protocol>
+<file name="log/etag339">
+asdf
+</file>
+</verify>
+
+</testcase>
diff --git a/tests/data/test341 b/tests/data/test341
new file mode 100644
index 0000000..5e952ad
--- /dev/null
+++ b/tests/data/test341
@@ -0,0 +1,57 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<errorcode>
+26
+</errorcode>
+</verify>
+
+</testcase>
diff --git a/tests/data/test342 b/tests/data/test342
new file mode 100644
index 0000000..95297ba
--- /dev/null
+++ b/tests/data/test342
@@ -0,0 +1,58 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /342 HTTP/1.1

+Host: %HOSTIP:%HTTPPORT

+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 0000000..e55a181
--- /dev/null
+++ b/tests/data/test343
@@ -0,0 +1,61 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET /343 HTTP/1.1

+Host: %HOSTIP:%HTTPPORT

+Accept: */*

+If-None-Match: "21025-dc7-39462498"

+

+</protocol>
+<file name="log/out343">
+21025-dc7-11111
+</file>
+</verify>
+</testcase>
diff --git a/tests/data/test357 b/tests/data/test357
new file mode 100644
index 0000000..d0437c6
--- /dev/null
+++ b/tests/data/test357
@@ -0,0 +1,97 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+PUT /we/want/357 HTTP/1.1

+Host: %HOSTIP:%HTTPPORT

+Accept: */*

+Content-Length: 78

+Expect: 100-continue

+

+PUT /we/want/357 HTTP/1.1

+Host: %HOSTIP:%HTTPPORT

+Accept: */*

+Content-Length: 78

+

+Weird
+     file
+         to
+   upload
+for
+   testing
+the
+   PUT
+      feature
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test39 b/tests/data/test39
index 1867b60..3c6c573 100644
--- a/tests/data/test39
+++ b/tests/data/test39
@@ -48,7 +48,6 @@
 Host: %HOSTIP:%HTTPPORT

 Accept: */*

 Content-Length: 1184

-Expect: 100-continue

 Content-Type: multipart/form-data; boundary=----------------------------24e78000bd32

 

 ------------------------------24e78000bd32

diff --git a/tests/data/test490 b/tests/data/test490
new file mode 100644
index 0000000..a3383a9
--- /dev/null
+++ b/tests/data/test490
@@ -0,0 +1,68 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+PUT /490 HTTP/1.1

+Host: 127.0.0.1:8990

+Accept: */*

+Content-Length: 10

+Expect: 100-continue

+

+surprise!
+PUT /490 HTTP/1.1

+Host: 127.0.0.1:8990

+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 0000000..b49c06c
--- /dev/null
+++ b/tests/data/test491
@@ -0,0 +1,64 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+PUT /491 HTTP/1.1

+Host: 127.0.0.1:8990

+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 0000000..12edd8b
--- /dev/null
+++ b/tests/data/test492
@@ -0,0 +1,89 @@
+<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>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+PUT /one/first492 HTTP/1.1

+Host: 127.0.0.1:8990

+Accept: */*

+Testno: 492

+Content-Length: 19

+Expect: 100-continue

+

+first 492 contents
+PUT /two/first492 HTTP/1.1

+Host: 127.0.0.1:8990

+Accept: */*

+Testno: 492

+Content-Length: 19

+Expect: 100-continue

+

+first 492 contents
+PUT /one/second492 HTTP/1.1

+Host: 127.0.0.1:8990

+Accept: */*

+Testno: 492

+Content-Length: 20

+Expect: 100-continue

+

+second 492 contents
+PUT /two/second492 HTTP/1.1

+Host: 127.0.0.1:8990

+Accept: */*

+Testno: 492

+Content-Length: 20

+Expect: 100-continue

+

+second 492 contents
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test547 b/tests/data/test547
index 781799b..e4ec398 100644
--- a/tests/data/test547
+++ b/tests/data/test547
@@ -76,6 +76,7 @@
 </tool>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test548 b/tests/data/test548
index fa98cd4..d636ab1 100644
--- a/tests/data/test548
+++ b/tests/data/test548
@@ -76,6 +76,7 @@
 </tool>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test552 b/tests/data/test552
index 5d1478b..47dd41a 100644
--- a/tests/data/test552
+++ b/tests/data/test552
Binary files differ
diff --git a/tests/data/test555 b/tests/data/test555
index d4b9466..ed8117f 100644
--- a/tests/data/test555
+++ b/tests/data/test555
@@ -81,6 +81,7 @@
 </tool>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test558 b/tests/data/test558
index 4436186..dccb808 100644
--- a/tests/data/test558
+++ b/tests/data/test558
@@ -36,8 +36,6 @@
 # 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()
@@ -51,6 +49,7 @@
 s/\(.*\)/()/
 s/:\d+/:/
 s:^(MEM |FD )(.*/)(.*):$1$3:
+s/\r\n/\n/
 </stripfile>
 </verify>
 
diff --git a/tests/data/test590 b/tests/data/test590
index 6f62507..5ddc823 100644
--- a/tests/data/test590
+++ b/tests/data/test590
@@ -74,6 +74,7 @@
 </tool>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test651 b/tests/data/test651
index ae64094..dd5736a 100644
--- a/tests/data/test651
+++ b/tests/data/test651
@@ -61,7 +61,6 @@
 Accept: */*

 Content-Length: 17139

 Content-Type: multipart/form-data; boundary=----------------------------

-Expect: 100-continue

 

 ------------------------------

 Content-Disposition: form-data; name="hello"

diff --git a/tests/data/test67 b/tests/data/test67
index 1c64a2f..c0ccaf8 100644
--- a/tests/data/test67
+++ b/tests/data/test67
@@ -56,6 +56,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test68 b/tests/data/test68
index 91d16ad..1eaff6e 100644
--- a/tests/data/test68
+++ b/tests/data/test68
@@ -55,6 +55,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test69 b/tests/data/test69
index 7af662f..309f039 100644
--- a/tests/data/test69
+++ b/tests/data/test69
@@ -72,6 +72,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test81 b/tests/data/test81
index 4cc0397..29e558d 100644
--- a/tests/data/test81
+++ b/tests/data/test81
@@ -55,6 +55,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 proxy
diff --git a/tests/data/test822 b/tests/data/test822
index 5fea05b..aa264ed 100644
--- a/tests/data/test822
+++ b/tests/data/test822
@@ -35,6 +35,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test827 b/tests/data/test827
index d271121..9cefb50 100644
--- a/tests/data/test827
+++ b/tests/data/test827
@@ -36,6 +36,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test831 b/tests/data/test831
index fdcae29..eae10f0 100644
--- a/tests/data/test831
+++ b/tests/data/test831
@@ -28,6 +28,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
diff --git a/tests/data/test834 b/tests/data/test834
index 35ab06a..8ecc223 100644
--- a/tests/data/test834
+++ b/tests/data/test834
@@ -39,6 +39,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
diff --git a/tests/data/test868 b/tests/data/test868
index fc05892..2fa2405 100644
--- a/tests/data/test868
+++ b/tests/data/test868
@@ -37,6 +37,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test873 b/tests/data/test873
index 9c068dc..2cabf1f 100644
--- a/tests/data/test873
+++ b/tests/data/test873
@@ -37,6 +37,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test877 b/tests/data/test877
index c477594..114707a 100644
--- a/tests/data/test877
+++ b/tests/data/test877
@@ -29,6 +29,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
diff --git a/tests/data/test880 b/tests/data/test880
index 738817c..e0609bb 100644
--- a/tests/data/test880
+++ b/tests/data/test880
@@ -41,6 +41,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
diff --git a/tests/data/test89 b/tests/data/test89
index 65b96db..fc620cb 100644
--- a/tests/data/test89
+++ b/tests/data/test89
@@ -89,6 +89,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test894 b/tests/data/test894
new file mode 100644
index 0000000..db79830
--- /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/test90 b/tests/data/test90
index 1c8f139..d40b5a5 100644
--- a/tests/data/test90
+++ b/tests/data/test90
@@ -127,6 +127,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test906 b/tests/data/test906
index c038f7f..6ec59c7 100644
--- a/tests/data/test906
+++ b/tests/data/test906
@@ -27,6 +27,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test91 b/tests/data/test91
index d540655..4942bfd 100644
--- a/tests/data/test91
+++ b/tests/data/test91
@@ -73,6 +73,7 @@
 <client>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test921 b/tests/data/test921
index 5771027..f9e5673 100644
--- a/tests/data/test921
+++ b/tests/data/test921
@@ -27,6 +27,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 debug
 </features>
diff --git a/tests/data/test923 b/tests/data/test923
index cb811bb..9d9722f 100644
--- a/tests/data/test923
+++ b/tests/data/test923
@@ -9,9 +9,6 @@
 #
 # Server-side
 <reply>
-<data>
-250 <recipient@example.com>

-</data>
 </reply>
 
 #
diff --git a/tests/data/test933 b/tests/data/test933
index 08b4e9d..e091de3 100644
--- a/tests/data/test933
+++ b/tests/data/test933
@@ -28,6 +28,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
diff --git a/tests/data/test936 b/tests/data/test936
index 5fde3c9..b123499 100644
--- a/tests/data/test936
+++ b/tests/data/test936
@@ -31,6 +31,7 @@
 </server>
 <features>
 NTLM
+SSL
 !SSPI
 </features>
  <name>
diff --git a/tests/data/test955 b/tests/data/test955
new file mode 100644
index 0000000..57d618c
--- /dev/null
+++ b/tests/data/test955
@@ -0,0 +1,56 @@
+<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 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 0000000..7fc9bc9
--- /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 0000000..28c9c47
--- /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 0000000..66ba414
--- /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 0000000..a61c3d1
--- /dev/null
+++ b/tests/data/test959
@@ -0,0 +1,57 @@
+<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 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 0000000..32834cd
--- /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 0000000..2148a0c
--- /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 0000000..35b368c
--- /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 0000000..7ea1215
--- /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 0000000..5448d0f
--- /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 0000000..8c93bc0
--- /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 0000000..499fdda
--- /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 0000000..2813f50
--- /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 0000000..ca58970
--- /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 0000000..9d3fa93
--- /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/disable-scan.pl b/tests/disable-scan.pl
index e57fdc6..45373ca 100755
--- a/tests/disable-scan.pl
+++ b/tests/disable-scan.pl
@@ -29,9 +29,12 @@
 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 @@
     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 @@
         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 @@
         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 0000000..0d555f6
--- /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/ftpserver.pl b/tests/ftpserver.pl
index d401be2..63dc334 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 @@
     datasockf_logfilename
     );
 
+use sshhelp qw(
+    exe_ext
+    );
+
 #**********************************************************************
 # global vars...
 #
@@ -411,7 +415,7 @@
 }
 
 sub startsf {
-    my $mainsockfcmd = "./server/sockfilt " .
+    my $mainsockfcmd = "./server/sockfilt".exe_ext('SRV')." " .
         "--ipv$ipvnum --port $port " .
         "--pidfile \"$mainsockf_pidfile\" " .
         "--logfile \"$mainsockf_logfile\"";
@@ -809,6 +813,7 @@
     else {
         my $from;
         my $size;
+        my $smtputf8 = grep /^SMTPUTF8$/, @capabilities;
         my @elements = split(/ /, $args);
 
         # Get the FROM and SIZE parameters
@@ -823,11 +828,11 @@
 
         # 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 {
+        if (($from eq "<>") ||
+            (!$smtputf8 && $from =~
+              /^<([a-zA-Z0-9._%+-]+)\@(([a-zA-Z0-9-]+)\.)+([a-zA-Z]{2,4})>$/) ||
+            ($smtputf8 && $from =~
+              /^<([a-zA-Z0-9\x{80}-\x{ff}._%+-]+)\@(([a-zA-Z0-9\x{80}-\x{ff}-]+)\.)+([a-zA-Z]{2,4})>$/)) {
             my @found;
             my $valid = 1;
 
@@ -848,6 +853,9 @@
                 sendcontrol "250 Sender OK\r\n";
             }
         }
+        else {
+            sendcontrol "501 Invalid address\r\n";
+        }
     }
 
     return 0;
@@ -863,16 +871,19 @@
         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 +1037,33 @@
         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";
         }
     }
 
@@ -2401,7 +2435,7 @@
     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 +2654,7 @@
     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\"";
diff --git a/tests/httpserver.pl b/tests/httpserver.pl
index 7f6c86a..8b789a9 100755
--- a/tests/httpserver.pl
+++ b/tests/httpserver.pl
@@ -34,6 +34,10 @@
     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
@@ -133,7 +137,7 @@
 $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 aa70d05..6b14ad3 100644
--- a/tests/libtest/CMakeLists.txt
+++ b/tests/libtest/CMakeLists.txt
@@ -1,9 +1,5 @@
 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} )
   string(TOUPPER ${TEST_NAME} UPPER_TEST_NAME)
diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am
index 29ab0a9..ca7c01c 100644
--- a/tests/libtest/Makefile.am
+++ b/tests/libtest/Makefile.am
@@ -137,7 +137,7 @@
 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/libtest/Makefile.inc b/tests/libtest/Makefile.inc
index 9ba72d7..95ef830 100644
--- a/tests/libtest/Makefile.inc
+++ b/tests/libtest/Makefile.inc
@@ -31,9 +31,9 @@
  lib1534 lib1535 lib1536 lib1537 lib1538 \
  lib1540 lib1541 \
  lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \
- lib1558 lib1559 lib1560 \
+ lib1558 lib1559 lib1560 lib1564 lib1565 \
  lib1591 lib1592 lib1593 lib1594 lib1596 \
- lib1900 lib1905 lib1906 lib1907 \
+ lib1900 lib1905 lib1906 lib1907 lib1908 \
  lib2033
 
 chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \
@@ -536,6 +536,14 @@
 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)
+
 lib1591_SOURCES = lib1591.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib1591_LDADD = $(TESTUTIL_LIBS)
 lib1591_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1591
@@ -570,6 +578,10 @@
 lib1907_LDADD = $(TESTUTIL_LIBS)
 lib1907_CPPFLAGS = $(AM_CPPFLAGS)
 
+lib1908_SOURCES = lib1908.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1908_LDADD = $(TESTUTIL_LIBS)
+lib1908_CPPFLAGS = $(AM_CPPFLAGS)
+
 lib2033_SOURCES = libntlmconnect.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
 lib2033_LDADD = $(TESTUTIL_LIBS)
 lib2033_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PIPELINING
diff --git a/tests/libtest/lib1557.c b/tests/libtest/lib1557.c
index bd0f20a..d7132ad 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 @@
   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 2aa3615..e1b4175 100644
--- a/tests/libtest/lib1559.c
+++ b/tests/libtest/lib1559.c
@@ -34,6 +34,9 @@
   CURLU *u;
   (void)URL;
 
+  if(!longurl)
+    return 1;
+
   memset(longurl, 'a', EXCESSIVE);
   longurl[EXCESSIVE-1] = 0;
 
@@ -62,15 +65,8 @@
     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 7f8accc..6228a13 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
@@ -129,6 +129,14 @@
 };
 
 static struct testcase get_parts_list[] ={
+  {"user:moo@ftp.example.com/color/#green?no-black",
+   "ftp | user | moo | [13] | ftp.example.com | [15] | /color/ | [16] | "
+   "green?no-black",
+   CURLU_GUESS_SCHEME, 0, CURLUE_OK },
+  {"ftp.user:moo@example.com/color/#green?no-black",
+   "http | ftp.user | moo | [13] | example.com | [15] | /color/ | [16] | "
+   "green?no-black",
+   CURLU_GUESS_SCHEME, 0, CURLUE_OK },
 #ifdef WIN32
   {"file:/C:\\programs\\foo",
    "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
diff --git a/tests/libtest/lib1564.c b/tests/libtest/lib1564.c
new file mode 100644
index 0000000..225c8c6
--- /dev/null
+++ b/tests/libtest/lib1564.c
@@ -0,0 +1,142 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  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"
+
+#define TEST_HANG_TIMEOUT 60 * 1000
+#define WAKEUP_NUM 1234567
+
+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 0000000..b2fa40a
--- /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/lib1591.c b/tests/libtest/lib1591.c
index f0c6b4c..cc1c5b2 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 @@
   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/lib/vtls/polarssl.h b/tests/libtest/lib1908.c
similarity index 60%
copy from lib/vtls/polarssl.h
copy to tests/libtest/lib1908.c
index 23c3636..bacbc97 100644
--- a/lib/vtls/polarssl.h
+++ b/tests/libtest/lib1908.c
@@ -1,5 +1,3 @@
-#ifndef HEADER_CURL_POLARSSL_H
-#define HEADER_CURL_POLARSSL_H
 /***************************************************************************
  *                                  _   _ ____  _
  *  Project                     ___| | | |  _ \| |
@@ -7,8 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2012 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
- * Copyright (C) 2010, Hoi-Ho Chan, <hoiho.chan@gmail.com>
+ * 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
@@ -22,11 +19,29 @@
  * KIND, either express or implied.
  *
  ***************************************************************************/
-#include "curl_setup.h"
+#include "test.h"
 
-#ifdef USE_POLARSSL
+#include "testutil.h"
+#include "warnless.h"
+#include "memdebug.h"
 
-extern const struct Curl_ssl Curl_ssl_polarssl;
+int test(char *URL)
+{
+  CURLcode ret = CURLE_OK;
+  CURL *hnd;
+  start_test_timing();
 
-#endif /* USE_POLARSSL */
-#endif /* HEADER_CURL_POLARSSL_H */
+  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);
+    curl_easy_reset(hnd);
+    curl_easy_cleanup(hnd);
+  }
+  curl_global_cleanup();
+  return (int)ret;
+}
diff --git a/tests/libtest/mk-lib1521.pl b/tests/libtest/mk-lib1521.pl
index f4add1a..e4ac6a1 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
@@ -173,45 +173,45 @@
     ;
 
 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") {
             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") {
             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,20 +219,21 @@
             }
             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";
@@ -249,7 +250,7 @@
           ($_ =~ /^  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";
        }
diff --git a/tests/libtest/test.h b/tests/libtest/test.h
index bb1acca..3937439 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 - 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 @@
  *
  ***************************************************************************/
 
-/* !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
@@ -131,7 +131,7 @@
     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 +140,7 @@
   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__))
@@ -152,7 +152,7 @@
     fprintf(stderr, "%s:%d curl_multi_init() failed\n", (Y), (Z)); \
     res = TEST_ERR_MULTI_INIT;                                     \
   }                                                                \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_init(A) \
   exe_multi_init((A), (__FILE__), (__LINE__))
@@ -161,7 +161,7 @@
   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__))
@@ -176,7 +176,7 @@
             (Y), (Z), (int)ec, curl_easy_strerror(ec));    \
     res = (int)ec;                                         \
   }                                                        \
-} WHILE_FALSE
+} while(0)
 
 #define res_easy_setopt(A, B, C) \
   exe_easy_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -185,7 +185,7 @@
   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__))
@@ -200,7 +200,7 @@
             (Y), (Z), (int)ec, curl_multi_strerror(ec));    \
     res = (int)ec;                                          \
   }                                                         \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_setopt(A,B,C) \
   exe_multi_setopt((A), (B), (C), (__FILE__), (__LINE__))
@@ -209,7 +209,7 @@
   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__))
@@ -224,7 +224,7 @@
             (Y), (Z), (int)ec, curl_multi_strerror(ec));     \
     res = (int)ec;                                           \
   }                                                          \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_add_handle(A, B) \
   exe_multi_add_handle((A), (B), (__FILE__), (__LINE__))
@@ -233,7 +233,7 @@
   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__))
@@ -248,7 +248,7 @@
             (Y), (Z), (int)ec, curl_multi_strerror(ec));        \
     res = (int)ec;                                              \
   }                                                             \
-} WHILE_FALSE
+} while(0)
 
 #define res_multi_remove_handle(A, B) \
   exe_multi_remove_handle((A), (B), (__FILE__), (__LINE__))
@@ -257,7 +257,7 @@
   exe_multi_remove_handle((A), (B), (Y), (Z));   \
   if(res)                                        \
     goto test_cleanup;                           \
-} WHILE_FALSE
+} while(0)
 
 
 #define multi_remove_handle(A, B) \
@@ -279,7 +279,7 @@
             (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 +288,7 @@
   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__))
@@ -309,7 +309,7 @@
             (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 +318,7 @@
     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__))
@@ -339,7 +339,7 @@
             (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 +348,67 @@
     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 = (int)ec;                                                  \
+  }                                                                 \
+  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 = (int)ec;                                       \
+  }                                                      \
+} 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 +418,7 @@
               (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 +427,7 @@
     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 +436,7 @@
 
 #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 +444,7 @@
                     "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 +453,7 @@
     exe_test_timedout(Y, Z);         \
     if(res)                          \
       goto test_cleanup;             \
-  } WHILE_FALSE
+  } while(0)
 
 #define abort_on_test_timeout() \
   chk_test_timedout((__FILE__), (__LINE__))
@@ -414,7 +468,7 @@
             (Y), (Z), (int)ec, curl_easy_strerror(ec)); \
     res = (int)ec;                                      \
   }                                                     \
-} WHILE_FALSE
+} while(0)
 
 #define res_global_init(A) \
   exe_global_init((A), (__FILE__), (__LINE__))
@@ -423,7 +477,7 @@
     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/python_dependencies/impacket/smbserver.py b/tests/python_dependencies/impacket/smbserver.py
index 3473c9f..c481b27 100644
--- a/tests/python_dependencies/impacket/smbserver.py
+++ b/tests/python_dependencies/impacket/smbserver.py
@@ -26,7 +26,10 @@
 import time
 import datetime
 import struct
-import ConfigParser
+try: # Python 3
+    import configparser
+except ImportError: # Python 2
+    import ConfigParser as configparser
 import SocketServer
 import threading
 import logging
@@ -4130,7 +4133,7 @@
         if self.__serverConfig is None:
             if configFile is None:
                 configFile = 'smb.conf'
-            self.__serverConfig = ConfigParser.ConfigParser()
+            self.__serverConfig = configparser.ConfigParser()
             self.__serverConfig.read(configFile)
 
         self.__serverName   = self.__serverConfig.get('global','server_name')
diff --git a/tests/runtests.1 b/tests/runtests.1
index 8491de3..a7288fc 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 - 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 runtests.pl 1 "May 05, 2017" "Curl 7.67.0" "runtests"
+.TH runtests.pl 1 "December 18, 2019" "Curl 7.69.0" "runtests"
 
 .SH NAME
 runtests.pl \- run one or more test cases
@@ -79,12 +79,34 @@
 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 63bd2da..3306de3 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
@@ -69,6 +69,7 @@
 use strict;
 use warnings;
 use Cwd;
+use Digest::MD5 qw(md5);
 
 # Subs imported from serverhelp module
 use serverhelp qw(
@@ -110,6 +111,8 @@
 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
@@ -150,7 +153,7 @@
 my $NEGTELNETPORT;       # TELNET server port with negotiation
 
 my $srcdir = $ENV{'srcdir'} || '.';
-my $CURL="../src/curl".exe_ext(); # what curl executable to run on the tests
+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
@@ -163,7 +166,7 @@
 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 $CURLLOG="commands.log"; # all command lines run
 my $FTPDCMD="$LOGDIR/ftpserver.cmd"; # copy ftp 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 +189,7 @@
 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 +210,9 @@
 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
@@ -237,6 +244,7 @@
 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
 
 # this version is decided by the particular nghttp2 library that is being used
 my $h2cver = "h2c";
@@ -268,8 +276,10 @@
 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 +301,8 @@
 
 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
@@ -318,13 +329,24 @@
 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";
     }
 }
 
@@ -590,13 +612,34 @@
         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;
         }
@@ -2527,7 +2570,7 @@
     opendir(DIR, $dir) ||
         return 0; # can't open dir
     while($file = readdir(DIR)) {
-        if($file !~ /^\./) {
+        if(($file !~ /^\./)) {
             unlink("$dir/$file");
             $count++;
         }
@@ -2600,6 +2643,7 @@
     $feature{"alt-svc"} = $has_altsvc;
     $feature{"manual"} = $has_manual;
     $feature{"unix-sockets"} = $has_unix;
+    $feature{"win32"} = $has_win32;
 
     # make each protocol an enabled "feature"
     for my $p (@protocols) {
@@ -2679,6 +2723,7 @@
                 # Win32-style path.
                 $pwd = pathhelp::sys_native_current_path();
                 $has_textaware = 1;
+                $has_win32 = 1;
             }
            if ($libcurl =~ /(winssl|schannel)/i) {
                $has_winssl=1;
@@ -2907,7 +2952,8 @@
         # 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 +2961,8 @@
         }
 
         # 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 +2971,8 @@
 
     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/);
     }
 
@@ -2973,6 +3021,7 @@
     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";
@@ -3115,7 +3164,7 @@
   $$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
+  # 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.
 
@@ -3203,6 +3252,7 @@
     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 +3270,10 @@
     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 +3323,30 @@
     }
 
     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 +3369,19 @@
         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($AZURE_RUN_ID, $testnum, $testname);
+    }
+    elsif(appveyor_check_environment()) {
+        appveyor_create_test_result($testnum, $testname);
+    }
+
     # remove test server commands file before servers are started/verified
     unlink($FTPDCMD) if(-f $FTPDCMD);
 
@@ -3334,7 +3410,7 @@
                 }
                 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;
                         }
@@ -3465,9 +3541,6 @@
     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 +3554,7 @@
     if(@codepieces) {
         $tool = $codepieces[0];
         chomp $tool;
+        $tool .= exe_ext('TOOL');
     }
 
     # remove server output logfile
@@ -3578,7 +3652,7 @@
         $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/)) {
@@ -3598,6 +3672,11 @@
         $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 +3746,9 @@
         logmsg "$CMDLINE\n";
     }
 
+    open(CMDLOG, ">", "$LOGDIR/$CURLLOG");
     print CMDLOG "$CMDLINE\n";
+    close(CMDLOG);
 
     unlink("core");
 
@@ -3848,7 +3929,7 @@
                 logmsg " postcheck FAILED\n";
                 # timestamp test result verification end
                 $timevrfyend{$testnum} = Time::HiRes::time();
-                return 1;
+                return $errorreturncode;
             }
         }
     }
@@ -3920,7 +4001,7 @@
 
         $res = compare($testnum, $testname, "stdout", \@actual, \@validstdout);
         if($res) {
-            return 1;
+            return $errorreturncode;
         }
         $ok .= "s";
     }
@@ -3971,7 +4052,7 @@
 
         $res = compare($testnum, $testname, "stderr", \@actual, \@validstderr);
         if($res) {
-            return 1;
+            return $errorreturncode;
         }
         $ok .= "r";
     }
@@ -4017,7 +4098,7 @@
 
         $res = compare($testnum, $testname, "protocol", \@out, \@protstrip);
         if($res) {
-            return 1;
+            return $errorreturncode;
         }
 
         $ok .= "p";
@@ -4032,7 +4113,7 @@
         my @out = loadarray($CURLOUT);
         $res = compare($testnum, $testname, "data", \@out, \@reply);
         if ($res) {
-            return 1;
+            return $errorreturncode;
         }
         $ok .= "d";
     }
@@ -4056,7 +4137,7 @@
 
         $res = compare($testnum, $testname, "upload", \@out, \@upload);
         if ($res) {
-            return 1;
+            return $errorreturncode;
         }
         $ok .= "u";
     }
@@ -4102,7 +4183,7 @@
 
         $res = compare($testnum, $testname, "proxy", \@out, \@protstrip);
         if($res) {
-            return 1;
+            return $errorreturncode;
         }
 
         $ok .= "P";
@@ -4160,7 +4241,7 @@
             $res = compare($testnum, $testname, "output ($filename)",
                            \@generated, \@outfile);
             if($res) {
-                return 1;
+                return $errorreturncode;
             }
 
             $outputok = 1; # output checked
@@ -4190,7 +4271,7 @@
         logmsg " exit FAILED\n";
         # timestamp test result verification end
         $timevrfyend{$testnum} = Time::HiRes::time();
-        return 1;
+        return $errorreturncode;
     }
 
     if($has_memory_tracking) {
@@ -4213,7 +4294,7 @@
                 logmsg @memdata;
                 # timestamp test result verification end
                 $timevrfyend{$testnum} = Time::HiRes::time();
-                return 1;
+                return $errorreturncode;
             }
             else {
                 $ok .= "m";
@@ -4230,7 +4311,7 @@
                 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 +4326,7 @@
                 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,7 +4339,7 @@
                 }
                 # timestamp test result verification end
                 $timevrfyend{$testnum} = Time::HiRes::time();
-                return 1;
+                return $errorreturncode;
             }
             $ok .= "v";
         }
@@ -4297,6 +4378,9 @@
         logmsg "PASS: $testnum - $testname\n";
     }
 
+    if($errorreturncode==2) {
+        logmsg "Warning: test$testnum result is ignored, but passed!\n";
+    }
 
     return 0;
 }
@@ -5010,6 +5094,20 @@
             $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,6 +5156,7 @@
         print <<EOHELP
 Usage: runtests.pl [options] [test selection(s)]
   -a       continue even if a test fails
+  -am      automake style output PASS/FAIL: [number] [name]
   -bN      use base port number N for test servers (default $base)
   -c path  use this curl executable
   -d       display server debug info
@@ -5069,18 +5168,21 @@
   -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 +5215,16 @@
         $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 +5235,20 @@
     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);
 }
@@ -5298,6 +5421,13 @@
     }
     $TESTCASES = $verified;
 }
+if($repeat) {
+    my $s;
+    for(1 .. $repeat) {
+        $s .= $TESTCASES;
+    }
+    $TESTCASES = $s;
+}
 
 if($scrambleorder) {
     # scramble the order of the test cases
@@ -5316,14 +5446,6 @@
     $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 {
@@ -5419,12 +5541,22 @@
 }
 
 #######################################################################
+# Setup Azure Pipelines Test Run (if running in Azure DevOps)
+#
+
+if(azure_check_environment()) {
+    $AZURE_RUN_ID = azure_create_test_run();
+    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 +5570,16 @@
     $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($AZURE_RUN_ID, $AZURE_RESULT_ID, $testnum, $error,
+                                                    $timeprepini{$testnum}, $timevrfyend{$testnum});
+    }
+    elsif(appveyor_check_environment()) {
+        appveyor_update_test_result($testnum, $error, $timeprepini{$testnum}, $timevrfyend{$testnum});
+    }
+
     if($error < 0) {
         # not a test we can run
         next;
@@ -5451,7 +5593,10 @@
             # 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 +5612,12 @@
 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($AZURE_RUN_ID);
+}
 
 # Tests done, stop the servers
 stopservers($verbose);
@@ -5524,6 +5672,6 @@
     }
 }
 
-if($total && ($ok != $total)) {
+if($total && (($ok+$ign) != $total)) {
     exit 1;
 }
diff --git a/tests/server/CMakeLists.txt b/tests/server/CMakeLists.txt
index 78b9b70..d532436 100644
--- a/tests/server/CMakeLists.txt
+++ b/tests/server/CMakeLists.txt
@@ -1,7 +1,7 @@
 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
diff --git a/tests/server/Makefile.am b/tests/server/Makefile.am
index ef3303e..ca306e2 100644
--- a/tests/server/Makefile.am
+++ b/tests/server/Makefile.am
@@ -62,7 +62,7 @@
 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/resolve.c b/tests/server/resolve.c
index 4cbdba6..993e031 100644
--- a/tests/server/resolve.c
+++ b/tests/server/resolve.c
@@ -68,7 +68,7 @@
   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 @@
     puts("Usage: resolve [option] <host>\n"
          " --version\n"
          " --ipv4"
-#ifdef ENABLE_IPV6
+#if defined(CURLRES_IPV6)
          "\n --ipv6"
 #endif
          );
@@ -107,7 +107,7 @@
   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);
diff --git a/tests/server/sws.c b/tests/server/sws.c
index 9633577..eed2d5f 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 @@
   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 */
@@ -179,6 +181,9 @@
 /* close connection */
 #define CMD_SWSCLOSE "swsclose"
 
+/* deny Expect: requests */
+#define CMD_NOEXPECT "no-expect"
+
 #define END_OF_HEADERS "\r\n\r\n"
 
 enum {
@@ -367,6 +372,8 @@
 
   filename = test2file(req->testno);
   req->close = FALSE;
+  req->connmon = FALSE;
+
   stream = fopen(filename, "rb");
   if(!stream) {
     error = errno;
@@ -391,8 +398,6 @@
       return 1; /* done */
     }
 
-    req->connmon = FALSE;
-
     cmd = orgcmd;
     while(cmd && cmdsize) {
       char *check;
@@ -427,6 +432,10 @@
         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 +549,11 @@
         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 +614,7 @@
     }
 
     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". */
 
@@ -653,8 +653,8 @@
     }
   }
   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 +662,22 @@
     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 +744,28 @@
         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 +957,8 @@
   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;
@@ -1236,6 +1262,8 @@
     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;
diff --git a/tests/server/util.c b/tests/server/util.c
index cc53d3b..263f0ce 100644
--- a/tests/server/util.c
+++ b/tests/server/util.c
@@ -150,7 +150,8 @@
   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)
diff --git a/tests/sshhelp.pm b/tests/sshhelp.pm
index 47ea232..248be67 100644
--- a/tests/sshhelp.pm
+++ b/tests/sshhelp.pm
@@ -106,12 +106,12 @@
 #***************************************************************************
 # 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
@@ -180,6 +180,13 @@
 # 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 +321,7 @@
     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 bcb2f1b..197e8b8 100644
--- a/tests/sshserver.pl
+++ b/tests/sshserver.pl
@@ -371,6 +371,9 @@
         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";
 }
 
 
diff --git a/tests/testcurl.1 b/tests/testcurl.1
index 0cb4150..3a056d0 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.69.0" "testcurl"
 
 .SH NAME
 testcurl.pl \- (automatically) test curl
diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am
index 6996cad..4bcd47d 100644
--- a/tests/unit/Makefile.am
+++ b/tests/unit/Makefile.am
@@ -70,7 +70,7 @@
 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 45278ba..4fe80d5 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 @@
  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 @@
 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 = unit1611.c $(UNITFILES)
+unit1612_CPPFLAGS = $(AM_CPPFLAGS)
+
 unit1620_SOURCES = unit1620.c $(UNITFILES)
 unit1620_CPPFLAGS = $(AM_CPPFLAGS)
 
diff --git a/tests/unit/curlcheck.h b/tests/unit/curlcheck.h
index c358afa..ecc5565 100644
--- a/tests/unit/curlcheck.h
+++ b/tests/unit/curlcheck.h
@@ -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 5cfa6da..5d87997 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
@@ -54,7 +54,6 @@
   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;
@@ -216,55 +215,6 @@
   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/unit1601.c b/tests/unit/unit1601.c
index a6120e1..bf00bc7 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 @@
 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/unit1607.c b/tests/unit/unit1607.c
index a8b0331..e8d4120 100644
--- a/tests/unit/unit1607.c
+++ b/tests/unit/unit1607.c
@@ -99,23 +99,23 @@
 };
 
 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 @@
 
     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 @@
     }
 
     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/unit1609.c b/tests/unit/unit1609.c
index 8223a14..ce3ddf9 100644
--- a/tests/unit/unit1609.c
+++ b/tests/unit/unit1609.c
@@ -100,6 +100,9 @@
 {
   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 @@
     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 @@
     /* 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 @@
     }
 
     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 0000000..bb9c937
--- /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 0000000..bc19f8a
--- /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/unit1620.c b/tests/unit/unit1620.c
index c6aa721..6e572c6 100644
--- a/tests/unit/unit1620.c
+++ b/tests/unit/unit1620.c
@@ -46,6 +46,8 @@
   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);
diff --git a/tests/unit/unit1650.c b/tests/unit/unit1650.c
index cd6f519..35ac12c 100644
--- a/tests/unit/unit1650.c
+++ b/tests/unit/unit1650.c
@@ -33,7 +33,7 @@
 
 }
 
-#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"
@@ -283,7 +283,7 @@
 }
 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 3652601..44dbf4b 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 @@
   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 a800d9c..d05d0b2 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
@@ -124,7 +124,7 @@
   }
   fail_unless(asi->num == 10, "wrong number of entries");
 
-  Curl_altsvc_save(asi, outname);
+  Curl_altsvc_save(curl, asi, outname);
 
   curl_easy_cleanup(curl);
   fail:
diff --git a/tests/unit/unit1655.c b/tests/unit/unit1655.c
index 7fea134..a06b23a 100644
--- a/tests/unit/unit1655.c
+++ b/tests/unit/unit1655.c
@@ -34,45 +34,103 @@
     /* 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.";
+
+  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(int 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 +142,7 @@
   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 +153,13 @@
   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 +177,13 @@
   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/winbuild/BUILD.WINDOWS.txt b/winbuild/BUILD.WINDOWS.txt
index 1ede14f..0e88e64 100644
--- a/winbuild/BUILD.WINDOWS.txt
+++ b/winbuild/BUILD.WINDOWS.txt
@@ -114,6 +114,12 @@
 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

diff --git a/winbuild/MakefileBuild.vc b/winbuild/MakefileBuild.vc
index 8267250..4e39be6 100644
--- a/winbuild/MakefileBuild.vc
+++ b/winbuild/MakefileBuild.vc
@@ -61,11 +61,11 @@
 !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 @@
 

 !IFDEF USE_CARES

 CARES_CFLAGS   = /DUSE_ARES /I"$(CARES_INC_DIR)"

+!IF "$(CARES)"=="static"

+CARES_CFLAGS   = $(CARES_CFLAGS) /DCARES_STATICLIB

+!ENDIF

 !ENDIF