diff --git a/Makefile b/Makefile index 857c68e0..f81b5420 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,8 @@ all: pack @echo ================= @ls -l $(MODULES_SUMO_DIR)/ +esm: $(MODULES_DIR)/libsodium.esm.js $(MODULES_DIR)/libsodium-esm-wrappers.js + @echo + Building standard ESM distribution standard: $(MODULES_DIR)/libsodium.js $(MODULES_DIR)/libsodium-wrappers.js @echo + Building standard distribution @@ -49,11 +51,21 @@ $(MODULES_DIR)/libsodium-wrappers.js: wrapper/build-wrappers.js wrapper/build-do mkdir -p $(MODULES_DIR) $(NODE) wrapper/build-wrappers.js libsodium API.md $(MODULES_DIR)/libsodium-wrappers.js +$(MODULES_DIR)/libsodium-esm-wrappers.js: wrapper/build-wrappers.js wrapper/build-doc.js wrapper/wrap-esm-template.js + @echo +++ Building standard/libsodium-esm-wrappers.js + mkdir -p $(MODULES_DIR) + $(NODE) wrapper/build-wrappers.js libsodium API.md $(MODULES_DIR)/libsodium-esm-wrappers.js --esm + $(MODULES_SUMO_DIR)/libsodium-wrappers.js: wrapper/build-wrappers.js wrapper/build-doc.js wrapper/wrap-template.js @echo +++ Building sumo/libsodium-wrappers.js mkdir -p $(MODULES_SUMO_DIR) $(NODE) wrapper/build-wrappers.js libsodium-sumo API_sumo.md $(MODULES_SUMO_DIR)/libsodium-wrappers.js +$(MODULES_DIR)/libsodium.esm.js: wrapper/libsodium-pre.js wrapper/libsodium-post.js $(MODULES_DIR)/libsodium-esm-wrappers.js $(LIBSODIUM_JS_DIR)/lib/libsodium.js + @echo +++ Building standard/libsodium ESM + mkdir -p $(MODULES_DIR) + cp $(LIBSODIUM_JS_DIR)/lib/libsodium.esm.js $(MODULES_DIR)/libsodium.esm.js + $(MODULES_DIR)/libsodium.js: wrapper/libsodium-pre.js wrapper/libsodium-post.js $(MODULES_DIR)/libsodium-wrappers.js $(LIBSODIUM_JS_DIR)/lib/libsodium.js @echo +++ Building standard/libsodium mkdir -p $(MODULES_DIR) @@ -78,6 +90,9 @@ $(LIBSODIUM_DIR)/test/default/browser/sodium_core.html: $(LIBSODIUM_DIR)/configu $(LIBSODIUM_JS_DIR)/lib/libsodium.js: $(LIBSODIUM_DIR)/configure cd $(LIBSODIUM_DIR) && env CPPFLAGS="-DFAVOR_PERFORMANCE" ./dist-build/emscripten.sh --standard +$(LIBSODIUM_JS_DIR)/lib/libsodium.esm.js: $(LIBSODIUM_DIR)/configure + cd $(LIBSODIUM_DIR) && env CPPFLAGS="-DFAVOR_PERFORMANCE" ./dist-build/emscripten.sh --standard + $(LIBSODIUM_JS_SUMO_DIR)/lib/libsodium.js: $(LIBSODIUM_DIR)/configure cd $(LIBSODIUM_DIR) && env CPPFLAGS="-DFAVOR_PERFORMANCE" ./dist-build/emscripten.sh --sumo diff --git a/dist/modules/libsodium-esm-wrappers.js b/dist/modules/libsodium-esm-wrappers.js new file mode 100644 index 00000000..412bbf78 --- /dev/null +++ b/dist/modules/libsodium-esm-wrappers.js @@ -0,0 +1,7889 @@ +"use strict"; + +import initSodiumESM from "./libsodium.esm.js"; + +const output_format = "uint8array"; + +export const libsodium = await initSodiumESM(); + +/* Initialize. */ +if (libsodium._sodium_init() !== 0) { + throw new Error("libsodium was not correctly initialized."); +} + +export const SODIUM_LIBRARY_VERSION_MAJOR = libsodium._sodium_library_version_major?.(); +export const SODIUM_LIBRARY_VERSION_MINOR = libsodium._sodium_library_version_minor?.(); +export const crypto_aead_aegis128l_ABYTES = libsodium._crypto_aead_aegis128l_abytes?.(); +export const crypto_aead_aegis128l_KEYBYTES = libsodium._crypto_aead_aegis128l_keybytes?.(); +export const crypto_aead_aegis128l_MESSAGEBYTES_MAX = libsodium._crypto_aead_aegis128l_messagebytes_max?.(); +export const crypto_aead_aegis128l_NPUBBYTES = libsodium._crypto_aead_aegis128l_npubbytes?.(); +export const crypto_aead_aegis128l_NSECBYTES = libsodium._crypto_aead_aegis128l_nsecbytes?.(); +export const crypto_aead_aegis256_ABYTES = libsodium._crypto_aead_aegis256_abytes?.(); +export const crypto_aead_aegis256_KEYBYTES = libsodium._crypto_aead_aegis256_keybytes?.(); +export const crypto_aead_aegis256_MESSAGEBYTES_MAX = libsodium._crypto_aead_aegis256_messagebytes_max?.(); +export const crypto_aead_aegis256_NPUBBYTES = libsodium._crypto_aead_aegis256_npubbytes?.(); +export const crypto_aead_aegis256_NSECBYTES = libsodium._crypto_aead_aegis256_nsecbytes?.(); +export const crypto_aead_aes256gcm_ABYTES = libsodium._crypto_aead_aes256gcm_abytes?.(); +export const crypto_aead_aes256gcm_KEYBYTES = libsodium._crypto_aead_aes256gcm_keybytes?.(); +export const crypto_aead_aes256gcm_MESSAGEBYTES_MAX = libsodium._crypto_aead_aes256gcm_messagebytes_max?.(); +export const crypto_aead_aes256gcm_NPUBBYTES = libsodium._crypto_aead_aes256gcm_npubbytes?.(); +export const crypto_aead_aes256gcm_NSECBYTES = libsodium._crypto_aead_aes256gcm_nsecbytes?.(); +export const crypto_aead_chacha20poly1305_ABYTES = libsodium._crypto_aead_chacha20poly1305_abytes?.(); +export const crypto_aead_chacha20poly1305_IETF_ABYTES = libsodium._crypto_aead_chacha20poly1305_ietf_abytes?.(); +export const crypto_aead_chacha20poly1305_IETF_KEYBYTES = libsodium._crypto_aead_chacha20poly1305_ietf_keybytes?.(); +export const crypto_aead_chacha20poly1305_IETF_MESSAGEBYTES_MAX = libsodium._crypto_aead_chacha20poly1305_ietf_messagebytes_max?.(); +export const crypto_aead_chacha20poly1305_IETF_NPUBBYTES = libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes?.(); +export const crypto_aead_chacha20poly1305_IETF_NSECBYTES = libsodium._crypto_aead_chacha20poly1305_ietf_nsecbytes?.(); +export const crypto_aead_chacha20poly1305_KEYBYTES = libsodium._crypto_aead_chacha20poly1305_keybytes?.(); +export const crypto_aead_chacha20poly1305_MESSAGEBYTES_MAX = libsodium._crypto_aead_chacha20poly1305_messagebytes_max?.(); +export const crypto_aead_chacha20poly1305_NPUBBYTES = libsodium._crypto_aead_chacha20poly1305_npubbytes?.(); +export const crypto_aead_chacha20poly1305_NSECBYTES = libsodium._crypto_aead_chacha20poly1305_nsecbytes?.(); +export const crypto_aead_chacha20poly1305_ietf_ABYTES = libsodium._crypto_aead_chacha20poly1305_ietf_abytes?.(); +export const crypto_aead_chacha20poly1305_ietf_KEYBYTES = libsodium._crypto_aead_chacha20poly1305_ietf_keybytes?.(); +export const crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX = libsodium._crypto_aead_chacha20poly1305_ietf_messagebytes_max?.(); +export const crypto_aead_chacha20poly1305_ietf_NPUBBYTES = libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes?.(); +export const crypto_aead_chacha20poly1305_ietf_NSECBYTES = libsodium._crypto_aead_chacha20poly1305_ietf_nsecbytes?.(); +export const crypto_aead_xchacha20poly1305_IETF_ABYTES = libsodium._crypto_aead_xchacha20poly1305_ietf_abytes?.(); +export const crypto_aead_xchacha20poly1305_IETF_KEYBYTES = libsodium._crypto_aead_xchacha20poly1305_ietf_keybytes?.(); +export const crypto_aead_xchacha20poly1305_IETF_MESSAGEBYTES_MAX = libsodium._crypto_aead_xchacha20poly1305_ietf_messagebytes_max?.(); +export const crypto_aead_xchacha20poly1305_IETF_NPUBBYTES = libsodium._crypto_aead_xchacha20poly1305_ietf_npubbytes?.(); +export const crypto_aead_xchacha20poly1305_IETF_NSECBYTES = libsodium._crypto_aead_xchacha20poly1305_ietf_nsecbytes?.(); +export const crypto_aead_xchacha20poly1305_ietf_ABYTES = libsodium._crypto_aead_xchacha20poly1305_ietf_abytes?.(); +export const crypto_aead_xchacha20poly1305_ietf_KEYBYTES = libsodium._crypto_aead_xchacha20poly1305_ietf_keybytes?.(); +export const crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX = libsodium._crypto_aead_xchacha20poly1305_ietf_messagebytes_max?.(); +export const crypto_aead_xchacha20poly1305_ietf_NPUBBYTES = libsodium._crypto_aead_xchacha20poly1305_ietf_npubbytes?.(); +export const crypto_aead_xchacha20poly1305_ietf_NSECBYTES = libsodium._crypto_aead_xchacha20poly1305_ietf_nsecbytes?.(); +export const crypto_auth_BYTES = libsodium._crypto_auth_bytes?.(); +export const crypto_auth_KEYBYTES = libsodium._crypto_auth_keybytes?.(); +export const crypto_auth_hmacsha256_BYTES = libsodium._crypto_auth_hmacsha256_bytes?.(); +export const crypto_auth_hmacsha256_KEYBYTES = libsodium._crypto_auth_hmacsha256_keybytes?.(); +export const crypto_auth_hmacsha512256_BYTES = libsodium._crypto_auth_hmacsha512256_bytes?.(); +export const crypto_auth_hmacsha512256_KEYBYTES = libsodium._crypto_auth_hmacsha512256_keybytes?.(); +export const crypto_auth_hmacsha512_BYTES = libsodium._crypto_auth_hmacsha512_bytes?.(); +export const crypto_auth_hmacsha512_KEYBYTES = libsodium._crypto_auth_hmacsha512_keybytes?.(); +export const crypto_box_BEFORENMBYTES = libsodium._crypto_box_beforenmbytes?.(); +export const crypto_box_MACBYTES = libsodium._crypto_box_macbytes?.(); +export const crypto_box_MESSAGEBYTES_MAX = libsodium._crypto_box_messagebytes_max?.(); +export const crypto_box_NONCEBYTES = libsodium._crypto_box_noncebytes?.(); +export const crypto_box_PUBLICKEYBYTES = libsodium._crypto_box_publickeybytes?.(); +export const crypto_box_SEALBYTES = libsodium._crypto_box_sealbytes?.(); +export const crypto_box_SECRETKEYBYTES = libsodium._crypto_box_secretkeybytes?.(); +export const crypto_box_SEEDBYTES = libsodium._crypto_box_seedbytes?.(); +export const crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES = libsodium._crypto_box_curve25519xchacha20poly1305_beforenmbytes?.(); +export const crypto_box_curve25519xchacha20poly1305_MACBYTES = libsodium._crypto_box_curve25519xchacha20poly1305_macbytes?.(); +export const crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX = libsodium._crypto_box_curve25519xchacha20poly1305_messagebytes_max?.(); +export const crypto_box_curve25519xchacha20poly1305_NONCEBYTES = libsodium._crypto_box_curve25519xchacha20poly1305_noncebytes?.(); +export const crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES = libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes?.(); +export const crypto_box_curve25519xchacha20poly1305_SEALBYTES = libsodium._crypto_box_curve25519xchacha20poly1305_sealbytes?.(); +export const crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES = libsodium._crypto_box_curve25519xchacha20poly1305_secretkeybytes?.(); +export const crypto_box_curve25519xchacha20poly1305_SEEDBYTES = libsodium._crypto_box_curve25519xchacha20poly1305_seedbytes?.(); +export const crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES = libsodium._crypto_box_curve25519xsalsa20poly1305_beforenmbytes?.(); +export const crypto_box_curve25519xsalsa20poly1305_MACBYTES = libsodium._crypto_box_curve25519xsalsa20poly1305_macbytes?.(); +export const crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX = libsodium._crypto_box_curve25519xsalsa20poly1305_messagebytes_max?.(); +export const crypto_box_curve25519xsalsa20poly1305_NONCEBYTES = libsodium._crypto_box_curve25519xsalsa20poly1305_noncebytes?.(); +export const crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES = libsodium._crypto_box_curve25519xsalsa20poly1305_publickeybytes?.(); +export const crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES = libsodium._crypto_box_curve25519xsalsa20poly1305_secretkeybytes?.(); +export const crypto_box_curve25519xsalsa20poly1305_SEEDBYTES = libsodium._crypto_box_curve25519xsalsa20poly1305_seedbytes?.(); +export const crypto_core_ed25519_BYTES = libsodium._crypto_core_ed25519_bytes?.(); +export const crypto_core_ed25519_HASHBYTES = libsodium._crypto_core_ed25519_hashbytes?.(); +export const crypto_core_ed25519_NONREDUCEDSCALARBYTES = libsodium._crypto_core_ed25519_nonreducedscalarbytes?.(); +export const crypto_core_ed25519_SCALARBYTES = libsodium._crypto_core_ed25519_scalarbytes?.(); +export const crypto_core_ed25519_UNIFORMBYTES = libsodium._crypto_core_ed25519_uniformbytes?.(); +export const crypto_core_hchacha20_CONSTBYTES = libsodium._crypto_core_hchacha20_constbytes?.(); +export const crypto_core_hchacha20_INPUTBYTES = libsodium._crypto_core_hchacha20_inputbytes?.(); +export const crypto_core_hchacha20_KEYBYTES = libsodium._crypto_core_hchacha20_keybytes?.(); +export const crypto_core_hchacha20_OUTPUTBYTES = libsodium._crypto_core_hchacha20_outputbytes?.(); +export const crypto_core_hsalsa20_CONSTBYTES = libsodium._crypto_core_hsalsa20_constbytes?.(); +export const crypto_core_hsalsa20_INPUTBYTES = libsodium._crypto_core_hsalsa20_inputbytes?.(); +export const crypto_core_hsalsa20_KEYBYTES = libsodium._crypto_core_hsalsa20_keybytes?.(); +export const crypto_core_hsalsa20_OUTPUTBYTES = libsodium._crypto_core_hsalsa20_outputbytes?.(); +export const crypto_core_ristretto255_BYTES = libsodium._crypto_core_ristretto255_bytes?.(); +export const crypto_core_ristretto255_HASHBYTES = libsodium._crypto_core_ristretto255_hashbytes?.(); +export const crypto_core_ristretto255_NONREDUCEDSCALARBYTES = libsodium._crypto_core_ristretto255_nonreducedscalarbytes?.(); +export const crypto_core_ristretto255_SCALARBYTES = libsodium._crypto_core_ristretto255_scalarbytes?.(); +export const crypto_core_salsa2012_CONSTBYTES = libsodium._crypto_core_salsa2012_constbytes?.(); +export const crypto_core_salsa2012_INPUTBYTES = libsodium._crypto_core_salsa2012_inputbytes?.(); +export const crypto_core_salsa2012_KEYBYTES = libsodium._crypto_core_salsa2012_keybytes?.(); +export const crypto_core_salsa2012_OUTPUTBYTES = libsodium._crypto_core_salsa2012_outputbytes?.(); +export const crypto_core_salsa208_CONSTBYTES = libsodium._crypto_core_salsa208_constbytes?.(); +export const crypto_core_salsa208_INPUTBYTES = libsodium._crypto_core_salsa208_inputbytes?.(); +export const crypto_core_salsa208_KEYBYTES = libsodium._crypto_core_salsa208_keybytes?.(); +export const crypto_core_salsa208_OUTPUTBYTES = libsodium._crypto_core_salsa208_outputbytes?.(); +export const crypto_core_salsa20_CONSTBYTES = libsodium._crypto_core_salsa20_constbytes?.(); +export const crypto_core_salsa20_INPUTBYTES = libsodium._crypto_core_salsa20_inputbytes?.(); +export const crypto_core_salsa20_KEYBYTES = libsodium._crypto_core_salsa20_keybytes?.(); +export const crypto_core_salsa20_OUTPUTBYTES = libsodium._crypto_core_salsa20_outputbytes?.(); +export const crypto_generichash_BYTES = libsodium._crypto_generichash_bytes?.(); +export const crypto_generichash_BYTES_MAX = libsodium._crypto_generichash_bytes_max?.(); +export const crypto_generichash_BYTES_MIN = libsodium._crypto_generichash_bytes_min?.(); +export const crypto_generichash_KEYBYTES = libsodium._crypto_generichash_keybytes?.(); +export const crypto_generichash_KEYBYTES_MAX = libsodium._crypto_generichash_keybytes_max?.(); +export const crypto_generichash_KEYBYTES_MIN = libsodium._crypto_generichash_keybytes_min?.(); +export const crypto_generichash_blake2b_BYTES = libsodium._crypto_generichash_blake2b_bytes?.(); +export const crypto_generichash_blake2b_BYTES_MAX = libsodium._crypto_generichash_blake2b_bytes_max?.(); +export const crypto_generichash_blake2b_BYTES_MIN = libsodium._crypto_generichash_blake2b_bytes_min?.(); +export const crypto_generichash_blake2b_KEYBYTES = libsodium._crypto_generichash_blake2b_keybytes?.(); +export const crypto_generichash_blake2b_KEYBYTES_MAX = libsodium._crypto_generichash_blake2b_keybytes_max?.(); +export const crypto_generichash_blake2b_KEYBYTES_MIN = libsodium._crypto_generichash_blake2b_keybytes_min?.(); +export const crypto_generichash_blake2b_PERSONALBYTES = libsodium._crypto_generichash_blake2b_personalbytes?.(); +export const crypto_generichash_blake2b_SALTBYTES = libsodium._crypto_generichash_blake2b_saltbytes?.(); +export const crypto_hash_BYTES = libsodium._crypto_hash_bytes?.(); +export const crypto_hash_sha256_BYTES = libsodium._crypto_hash_sha256_bytes?.(); +export const crypto_hash_sha512_BYTES = libsodium._crypto_hash_sha512_bytes?.(); +export const crypto_kdf_BYTES_MAX = libsodium._crypto_kdf_bytes_max?.(); +export const crypto_kdf_BYTES_MIN = libsodium._crypto_kdf_bytes_min?.(); +export const crypto_kdf_CONTEXTBYTES = libsodium._crypto_kdf_contextbytes?.(); +export const crypto_kdf_KEYBYTES = libsodium._crypto_kdf_keybytes?.(); +export const crypto_kdf_blake2b_BYTES_MAX = libsodium._crypto_kdf_blake2b_bytes_max?.(); +export const crypto_kdf_blake2b_BYTES_MIN = libsodium._crypto_kdf_blake2b_bytes_min?.(); +export const crypto_kdf_blake2b_CONTEXTBYTES = libsodium._crypto_kdf_blake2b_contextbytes?.(); +export const crypto_kdf_blake2b_KEYBYTES = libsodium._crypto_kdf_blake2b_keybytes?.(); +export const crypto_kdf_hkdf_sha256_BYTES_MAX = libsodium._crypto_kdf_hkdf_sha256_bytes_max?.(); +export const crypto_kdf_hkdf_sha256_BYTES_MIN = libsodium._crypto_kdf_hkdf_sha256_bytes_min?.(); +export const crypto_kdf_hkdf_sha256_KEYBYTES = libsodium._crypto_kdf_hkdf_sha256_keybytes?.(); +export const crypto_kdf_hkdf_sha512_BYTES_MAX = libsodium._crypto_kdf_hkdf_sha512_bytes_max?.(); +export const crypto_kdf_hkdf_sha512_BYTES_MIN = libsodium._crypto_kdf_hkdf_sha512_bytes_min?.(); +export const crypto_kdf_hkdf_sha512_KEYBYTES = libsodium._crypto_kdf_hkdf_sha512_keybytes?.(); +export const crypto_kx_PUBLICKEYBYTES = libsodium._crypto_kx_publickeybytes?.(); +export const crypto_kx_SECRETKEYBYTES = libsodium._crypto_kx_secretkeybytes?.(); +export const crypto_kx_SEEDBYTES = libsodium._crypto_kx_seedbytes?.(); +export const crypto_kx_SESSIONKEYBYTES = libsodium._crypto_kx_sessionkeybytes?.(); +export const crypto_onetimeauth_BYTES = libsodium._crypto_onetimeauth_bytes?.(); +export const crypto_onetimeauth_KEYBYTES = libsodium._crypto_onetimeauth_keybytes?.(); +export const crypto_onetimeauth_poly1305_BYTES = libsodium._crypto_onetimeauth_poly1305_bytes?.(); +export const crypto_onetimeauth_poly1305_KEYBYTES = libsodium._crypto_onetimeauth_poly1305_keybytes?.(); +export const crypto_pwhash_ALG_ARGON2I13 = libsodium._crypto_pwhash_alg_argon2i13?.(); +export const crypto_pwhash_ALG_ARGON2ID13 = libsodium._crypto_pwhash_alg_argon2id13?.(); +export const crypto_pwhash_ALG_DEFAULT = libsodium._crypto_pwhash_alg_default?.(); +export const crypto_pwhash_BYTES_MAX = libsodium._crypto_pwhash_bytes_max?.(); +export const crypto_pwhash_BYTES_MIN = libsodium._crypto_pwhash_bytes_min?.(); +export const crypto_pwhash_MEMLIMIT_INTERACTIVE = libsodium._crypto_pwhash_memlimit_interactive?.(); +export const crypto_pwhash_MEMLIMIT_MAX = libsodium._crypto_pwhash_memlimit_max?.(); +export const crypto_pwhash_MEMLIMIT_MIN = libsodium._crypto_pwhash_memlimit_min?.(); +export const crypto_pwhash_MEMLIMIT_MODERATE = libsodium._crypto_pwhash_memlimit_moderate?.(); +export const crypto_pwhash_MEMLIMIT_SENSITIVE = libsodium._crypto_pwhash_memlimit_sensitive?.(); +export const crypto_pwhash_OPSLIMIT_INTERACTIVE = libsodium._crypto_pwhash_opslimit_interactive?.(); +export const crypto_pwhash_OPSLIMIT_MAX = libsodium._crypto_pwhash_opslimit_max?.(); +export const crypto_pwhash_OPSLIMIT_MIN = libsodium._crypto_pwhash_opslimit_min?.(); +export const crypto_pwhash_OPSLIMIT_MODERATE = libsodium._crypto_pwhash_opslimit_moderate?.(); +export const crypto_pwhash_OPSLIMIT_SENSITIVE = libsodium._crypto_pwhash_opslimit_sensitive?.(); +export const crypto_pwhash_PASSWD_MAX = libsodium._crypto_pwhash_passwd_max?.(); +export const crypto_pwhash_PASSWD_MIN = libsodium._crypto_pwhash_passwd_min?.(); +export const crypto_pwhash_SALTBYTES = libsodium._crypto_pwhash_saltbytes?.(); +export const crypto_pwhash_STRBYTES = libsodium._crypto_pwhash_strbytes?.(); +export const crypto_pwhash_argon2i_BYTES_MAX = libsodium._crypto_pwhash_argon2i_bytes_max?.(); +export const crypto_pwhash_argon2i_BYTES_MIN = libsodium._crypto_pwhash_argon2i_bytes_min?.(); +export const crypto_pwhash_argon2i_MEMLIMIT_INTERACTIVE = libsodium._crypto_pwhash_argon2i_memlimit_interactive?.(); +export const crypto_pwhash_argon2i_MEMLIMIT_MAX = libsodium._crypto_pwhash_argon2i_memlimit_max?.(); +export const crypto_pwhash_argon2i_MEMLIMIT_MIN = libsodium._crypto_pwhash_argon2i_memlimit_min?.(); +export const crypto_pwhash_argon2i_MEMLIMIT_MODERATE = libsodium._crypto_pwhash_argon2i_memlimit_moderate?.(); +export const crypto_pwhash_argon2i_MEMLIMIT_SENSITIVE = libsodium._crypto_pwhash_argon2i_memlimit_sensitive?.(); +export const crypto_pwhash_argon2i_OPSLIMIT_INTERACTIVE = libsodium._crypto_pwhash_argon2i_opslimit_interactive?.(); +export const crypto_pwhash_argon2i_OPSLIMIT_MAX = libsodium._crypto_pwhash_argon2i_opslimit_max?.(); +export const crypto_pwhash_argon2i_OPSLIMIT_MIN = libsodium._crypto_pwhash_argon2i_opslimit_min?.(); +export const crypto_pwhash_argon2i_OPSLIMIT_MODERATE = libsodium._crypto_pwhash_argon2i_opslimit_moderate?.(); +export const crypto_pwhash_argon2i_OPSLIMIT_SENSITIVE = libsodium._crypto_pwhash_argon2i_opslimit_sensitive?.(); +export const crypto_pwhash_argon2i_PASSWD_MAX = libsodium._crypto_pwhash_argon2i_passwd_max?.(); +export const crypto_pwhash_argon2i_PASSWD_MIN = libsodium._crypto_pwhash_argon2i_passwd_min?.(); +export const crypto_pwhash_argon2i_SALTBYTES = libsodium._crypto_pwhash_argon2i_saltbytes?.(); +export const crypto_pwhash_argon2i_STRBYTES = libsodium._crypto_pwhash_argon2i_strbytes?.(); +export const crypto_pwhash_argon2id_BYTES_MAX = libsodium._crypto_pwhash_argon2id_bytes_max?.(); +export const crypto_pwhash_argon2id_BYTES_MIN = libsodium._crypto_pwhash_argon2id_bytes_min?.(); +export const crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE = libsodium._crypto_pwhash_argon2id_memlimit_interactive?.(); +export const crypto_pwhash_argon2id_MEMLIMIT_MAX = libsodium._crypto_pwhash_argon2id_memlimit_max?.(); +export const crypto_pwhash_argon2id_MEMLIMIT_MIN = libsodium._crypto_pwhash_argon2id_memlimit_min?.(); +export const crypto_pwhash_argon2id_MEMLIMIT_MODERATE = libsodium._crypto_pwhash_argon2id_memlimit_moderate?.(); +export const crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE = libsodium._crypto_pwhash_argon2id_memlimit_sensitive?.(); +export const crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE = libsodium._crypto_pwhash_argon2id_opslimit_interactive?.(); +export const crypto_pwhash_argon2id_OPSLIMIT_MAX = libsodium._crypto_pwhash_argon2id_opslimit_max?.(); +export const crypto_pwhash_argon2id_OPSLIMIT_MIN = libsodium._crypto_pwhash_argon2id_opslimit_min?.(); +export const crypto_pwhash_argon2id_OPSLIMIT_MODERATE = libsodium._crypto_pwhash_argon2id_opslimit_moderate?.(); +export const crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE = libsodium._crypto_pwhash_argon2id_opslimit_sensitive?.(); +export const crypto_pwhash_argon2id_PASSWD_MAX = libsodium._crypto_pwhash_argon2id_passwd_max?.(); +export const crypto_pwhash_argon2id_PASSWD_MIN = libsodium._crypto_pwhash_argon2id_passwd_min?.(); +export const crypto_pwhash_argon2id_SALTBYTES = libsodium._crypto_pwhash_argon2id_saltbytes?.(); +export const crypto_pwhash_argon2id_STRBYTES = libsodium._crypto_pwhash_argon2id_strbytes?.(); +export const crypto_pwhash_scryptsalsa208sha256_BYTES_MAX = libsodium._crypto_pwhash_scryptsalsa208sha256_bytes_max?.(); +export const crypto_pwhash_scryptsalsa208sha256_BYTES_MIN = libsodium._crypto_pwhash_scryptsalsa208sha256_bytes_min?.(); +export const crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE = libsodium._crypto_pwhash_scryptsalsa208sha256_memlimit_interactive?.(); +export const crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MAX = libsodium._crypto_pwhash_scryptsalsa208sha256_memlimit_max?.(); +export const crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN = libsodium._crypto_pwhash_scryptsalsa208sha256_memlimit_min?.(); +export const crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE = libsodium._crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive?.(); +export const crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE = libsodium._crypto_pwhash_scryptsalsa208sha256_opslimit_interactive?.(); +export const crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MAX = libsodium._crypto_pwhash_scryptsalsa208sha256_opslimit_max?.(); +export const crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN = libsodium._crypto_pwhash_scryptsalsa208sha256_opslimit_min?.(); +export const crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE = libsodium._crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive?.(); +export const crypto_pwhash_scryptsalsa208sha256_PASSWD_MAX = libsodium._crypto_pwhash_scryptsalsa208sha256_passwd_max?.(); +export const crypto_pwhash_scryptsalsa208sha256_PASSWD_MIN = libsodium._crypto_pwhash_scryptsalsa208sha256_passwd_min?.(); +export const crypto_pwhash_scryptsalsa208sha256_SALTBYTES = libsodium._crypto_pwhash_scryptsalsa208sha256_saltbytes?.(); +export const crypto_pwhash_scryptsalsa208sha256_STRBYTES = libsodium._crypto_pwhash_scryptsalsa208sha256_strbytes?.(); +export const crypto_scalarmult_BYTES = libsodium._crypto_scalarmult_bytes?.(); +export const crypto_scalarmult_SCALARBYTES = libsodium._crypto_scalarmult_scalarbytes?.(); +export const crypto_scalarmult_curve25519_BYTES = libsodium._crypto_scalarmult_curve25519_bytes?.(); +export const crypto_scalarmult_curve25519_SCALARBYTES = libsodium._crypto_scalarmult_curve25519_scalarbytes?.(); +export const crypto_scalarmult_ed25519_BYTES = libsodium._crypto_scalarmult_ed25519_bytes?.(); +export const crypto_scalarmult_ed25519_SCALARBYTES = libsodium._crypto_scalarmult_ed25519_scalarbytes?.(); +export const crypto_scalarmult_ristretto255_BYTES = libsodium._crypto_scalarmult_ristretto255_bytes?.(); +export const crypto_scalarmult_ristretto255_SCALARBYTES = libsodium._crypto_scalarmult_ristretto255_scalarbytes?.(); +export const crypto_secretbox_KEYBYTES = libsodium._crypto_secretbox_keybytes?.(); +export const crypto_secretbox_MACBYTES = libsodium._crypto_secretbox_macbytes?.(); +export const crypto_secretbox_MESSAGEBYTES_MAX = libsodium._crypto_secretbox_messagebytes_max?.(); +export const crypto_secretbox_NONCEBYTES = libsodium._crypto_secretbox_noncebytes?.(); +export const crypto_secretbox_xchacha20poly1305_KEYBYTES = libsodium._crypto_secretbox_xchacha20poly1305_keybytes?.(); +export const crypto_secretbox_xchacha20poly1305_MACBYTES = libsodium._crypto_secretbox_xchacha20poly1305_macbytes?.(); +export const crypto_secretbox_xchacha20poly1305_MESSAGEBYTES_MAX = libsodium._crypto_secretbox_xchacha20poly1305_messagebytes_max?.(); +export const crypto_secretbox_xchacha20poly1305_NONCEBYTES = libsodium._crypto_secretbox_xchacha20poly1305_noncebytes?.(); +export const crypto_secretbox_xsalsa20poly1305_KEYBYTES = libsodium._crypto_secretbox_xsalsa20poly1305_keybytes?.(); +export const crypto_secretbox_xsalsa20poly1305_MACBYTES = libsodium._crypto_secretbox_xsalsa20poly1305_macbytes?.(); +export const crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX = libsodium._crypto_secretbox_xsalsa20poly1305_messagebytes_max?.(); +export const crypto_secretbox_xsalsa20poly1305_NONCEBYTES = libsodium._crypto_secretbox_xsalsa20poly1305_noncebytes?.(); +export const crypto_secretstream_xchacha20poly1305_ABYTES = libsodium._crypto_secretstream_xchacha20poly1305_abytes?.(); +export const crypto_secretstream_xchacha20poly1305_HEADERBYTES = libsodium._crypto_secretstream_xchacha20poly1305_headerbytes?.(); +export const crypto_secretstream_xchacha20poly1305_KEYBYTES = libsodium._crypto_secretstream_xchacha20poly1305_keybytes?.(); +export const crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX = libsodium._crypto_secretstream_xchacha20poly1305_messagebytes_max?.(); +export const crypto_secretstream_xchacha20poly1305_TAG_FINAL = libsodium._crypto_secretstream_xchacha20poly1305_tag_final?.(); +export const crypto_secretstream_xchacha20poly1305_TAG_MESSAGE = libsodium._crypto_secretstream_xchacha20poly1305_tag_message?.(); +export const crypto_secretstream_xchacha20poly1305_TAG_PUSH = libsodium._crypto_secretstream_xchacha20poly1305_tag_push?.(); +export const crypto_secretstream_xchacha20poly1305_TAG_REKEY = libsodium._crypto_secretstream_xchacha20poly1305_tag_rekey?.(); +export const crypto_shorthash_BYTES = libsodium._crypto_shorthash_bytes?.(); +export const crypto_shorthash_KEYBYTES = libsodium._crypto_shorthash_keybytes?.(); +export const crypto_shorthash_siphash24_BYTES = libsodium._crypto_shorthash_siphash24_bytes?.(); +export const crypto_shorthash_siphash24_KEYBYTES = libsodium._crypto_shorthash_siphash24_keybytes?.(); +export const crypto_shorthash_siphashx24_BYTES = libsodium._crypto_shorthash_siphashx24_bytes?.(); +export const crypto_shorthash_siphashx24_KEYBYTES = libsodium._crypto_shorthash_siphashx24_keybytes?.(); +export const crypto_sign_BYTES = libsodium._crypto_sign_bytes?.(); +export const crypto_sign_MESSAGEBYTES_MAX = libsodium._crypto_sign_messagebytes_max?.(); +export const crypto_sign_PUBLICKEYBYTES = libsodium._crypto_sign_publickeybytes?.(); +export const crypto_sign_SECRETKEYBYTES = libsodium._crypto_sign_secretkeybytes?.(); +export const crypto_sign_SEEDBYTES = libsodium._crypto_sign_seedbytes?.(); +export const crypto_sign_ed25519_BYTES = libsodium._crypto_sign_ed25519_bytes?.(); +export const crypto_sign_ed25519_MESSAGEBYTES_MAX = libsodium._crypto_sign_ed25519_messagebytes_max?.(); +export const crypto_sign_ed25519_PUBLICKEYBYTES = libsodium._crypto_sign_ed25519_publickeybytes?.(); +export const crypto_sign_ed25519_SECRETKEYBYTES = libsodium._crypto_sign_ed25519_secretkeybytes?.(); +export const crypto_sign_ed25519_SEEDBYTES = libsodium._crypto_sign_ed25519_seedbytes?.(); +export const crypto_stream_KEYBYTES = libsodium._crypto_stream_keybytes?.(); +export const crypto_stream_MESSAGEBYTES_MAX = libsodium._crypto_stream_messagebytes_max?.(); +export const crypto_stream_NONCEBYTES = libsodium._crypto_stream_noncebytes?.(); +export const crypto_stream_chacha20_IETF_KEYBYTES = libsodium._crypto_stream_chacha20_ietf_keybytes?.(); +export const crypto_stream_chacha20_IETF_MESSAGEBYTES_MAX = libsodium._crypto_stream_chacha20_ietf_messagebytes_max?.(); +export const crypto_stream_chacha20_IETF_NONCEBYTES = libsodium._crypto_stream_chacha20_ietf_noncebytes?.(); +export const crypto_stream_chacha20_KEYBYTES = libsodium._crypto_stream_chacha20_keybytes?.(); +export const crypto_stream_chacha20_MESSAGEBYTES_MAX = libsodium._crypto_stream_chacha20_messagebytes_max?.(); +export const crypto_stream_chacha20_NONCEBYTES = libsodium._crypto_stream_chacha20_noncebytes?.(); +export const crypto_stream_chacha20_ietf_KEYBYTES = libsodium._crypto_stream_chacha20_ietf_keybytes?.(); +export const crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX = libsodium._crypto_stream_chacha20_ietf_messagebytes_max?.(); +export const crypto_stream_chacha20_ietf_NONCEBYTES = libsodium._crypto_stream_chacha20_ietf_noncebytes?.(); +export const crypto_stream_salsa2012_KEYBYTES = libsodium._crypto_stream_salsa2012_keybytes?.(); +export const crypto_stream_salsa2012_MESSAGEBYTES_MAX = libsodium._crypto_stream_salsa2012_messagebytes_max?.(); +export const crypto_stream_salsa2012_NONCEBYTES = libsodium._crypto_stream_salsa2012_noncebytes?.(); +export const crypto_stream_salsa208_KEYBYTES = libsodium._crypto_stream_salsa208_keybytes?.(); +export const crypto_stream_salsa208_MESSAGEBYTES_MAX = libsodium._crypto_stream_salsa208_messagebytes_max?.(); +export const crypto_stream_salsa208_NONCEBYTES = libsodium._crypto_stream_salsa208_noncebytes?.(); +export const crypto_stream_salsa20_KEYBYTES = libsodium._crypto_stream_salsa20_keybytes?.(); +export const crypto_stream_salsa20_MESSAGEBYTES_MAX = libsodium._crypto_stream_salsa20_messagebytes_max?.(); +export const crypto_stream_salsa20_NONCEBYTES = libsodium._crypto_stream_salsa20_noncebytes?.(); +export const crypto_stream_xchacha20_KEYBYTES = libsodium._crypto_stream_xchacha20_keybytes?.(); +export const crypto_stream_xchacha20_MESSAGEBYTES_MAX = libsodium._crypto_stream_xchacha20_messagebytes_max?.(); +export const crypto_stream_xchacha20_NONCEBYTES = libsodium._crypto_stream_xchacha20_noncebytes?.(); +export const crypto_stream_xsalsa20_KEYBYTES = libsodium._crypto_stream_xsalsa20_keybytes?.(); +export const crypto_stream_xsalsa20_MESSAGEBYTES_MAX = libsodium._crypto_stream_xsalsa20_messagebytes_max?.(); +export const crypto_stream_xsalsa20_NONCEBYTES = libsodium._crypto_stream_xsalsa20_noncebytes?.(); +export const crypto_verify_16_BYTES = libsodium._crypto_verify_16_bytes?.(); +export const crypto_verify_32_BYTES = libsodium._crypto_verify_32_bytes?.(); +export const crypto_verify_64_BYTES = libsodium._crypto_verify_64_bytes?.(); +export const SODIUM_VERSION_STRING = libsodium.UTF8ToString(libsodium._sodium_version_string?.()); +export const crypto_pwhash_STRPREFIX = libsodium.UTF8ToString(libsodium._crypto_pwhash_strprefix?.()); +export const crypto_pwhash_argon2i_STRPREFIX = libsodium.UTF8ToString(libsodium._crypto_pwhash_argon2i_strprefix?.()); +export const crypto_pwhash_argon2id_STRPREFIX = libsodium.UTF8ToString(libsodium._crypto_pwhash_argon2id_strprefix?.()); +export const crypto_pwhash_scryptsalsa208sha256_STRPREFIX = libsodium.UTF8ToString(libsodium._crypto_pwhash_scryptsalsa208sha256_strprefix?.()); + + +// List of functions and constants defined in the wrapped libsodium +export function symbols() { + return Object.keys(exports).sort(); +} + +export function increment(bytes) { + if (!(bytes instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be incremented"); + } + var c = 1 << 8; + for (var i = 0 | 0, j = bytes.length; i < j; i++) { + c >>= 8; + c += bytes[i]; + bytes[i] = c & 0xff; + } +} + +export function add(a, b) { + if (!(a instanceof Uint8Array) || !(b instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can added"); + } + var j = a.length, + c = 0 | 0, + i = 0 | 0; + if (b.length != a.length) { + throw new TypeError("Arguments must have the same length"); + } + for (i = 0; i < j; i++) { + c >>= 8; + c += a[i] + b[i]; + a[i] = c & 0xff; + } +} + +export function is_zero(bytes) { + if (!(bytes instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be checked"); + } + var d = 0 | 0; + for (var i = 0 | 0, j = bytes.length; i < j; i++) { + d |= bytes[i]; + } + return d === 0; +} + +export function memzero(bytes) { + if (!(bytes instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be wiped"); + } + for (var i = 0 | 0, j = bytes.length; i < j; i++) { + bytes[i] = 0; + } +} + +export function memcmp(b1, b2) { + if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be compared"); + } + if (b1.length !== b2.length) { + throw new TypeError( + "Only instances of identical length can be compared" + ); + } + for (var d = 0 | 0, i = 0 | 0, j = b1.length; i < j; i++) { + d |= b1[i] ^ b2[i]; + } + return d === 0; +} + +export function compare(b1, b2) { + if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be compared"); + } + if (b1.length !== b2.length) { + throw new TypeError( + "Only instances of identical length can be compared" + ); + } + for (var gt = 0 | 0, eq = 1 | 1, i = b1.length; i-- > 0;) { + gt |= ((b2[i] - b1[i]) >> 8) & eq; + eq &= ((b2[i] ^ b1[i]) - 1) >> 8; + } + return gt + gt + eq - 1; +} + +export function pad(buf, blocksize) { + if (!(buf instanceof Uint8Array)) { + throw new TypeError("buffer must be a Uint8Array"); + } + blocksize |= 0; + if (blocksize <= 0) { + throw new Error("block size must be > 0"); + } + var address_pool = [], + padded, + padded_buflen_p = _malloc(4), + st = 1 | 0, + i = 0 | 0, + k = buf.length | 0, + bufx = new AllocatedBuf(k + blocksize); + address_pool.push(padded_buflen_p); + address_pool.push(bufx.address); + for ( + var j = bufx.address, jmax = bufx.address + k + blocksize; j < jmax; j++ + ) { + libsodium.HEAPU8[j] = buf[i]; + k -= st; + st = ~(((((k >>> 48) | (k >>> 32) | (k >>> 16) | k) & 0xffff) - 1) >> 16) & + 1; + i += st; + } + if ( + libsodium._sodium_pad( + padded_buflen_p, + bufx.address, + buf.length, + blocksize, + bufx.length + ) !== 0 + ) { + _free_and_throw_error(address_pool, "internal error"); + } + bufx.length = libsodium.getValue(padded_buflen_p, "i32"); + padded = bufx.to_Uint8Array(); + _free_all(address_pool); + return padded; +} + +export function unpad(buf, blocksize) { + if (!(buf instanceof Uint8Array)) { + throw new TypeError("buffer must be a Uint8Array"); + } + blocksize |= 0; + if (blocksize <= 0) { + throw new Error("block size must be > 0"); + } + var address_pool = [], + unpadded_address = _to_allocated_buf_address(buf), + unpadded_buflen_p = _malloc(4); + address_pool.push(unpadded_address); + address_pool.push(unpadded_buflen_p); + if ( + libsodium._sodium_unpad( + unpadded_buflen_p, + unpadded_address, + buf.length, + blocksize + ) !== 0 + ) { + _free_and_throw_error(address_pool, "unsupported/invalid padding"); + } + buf = new Uint8Array(buf); + buf = buf.subarray(0, libsodium.getValue(unpadded_buflen_p, "i32")); + _free_all(address_pool); + return buf; +} + +//--------------------------------------------------------------------------- +// Codecs +// +export function from_string(str) { + if (typeof TextEncoder === "function") { + return new TextEncoder().encode(str); + } + str = unescape(encodeURIComponent(str)); + var bytes = new Uint8Array(str.length); + for (var i = 0, j = str.length; i < j; i++) { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} + +export function to_string(bytes) { + if (typeof TextDecoder === "function") { + return new TextDecoder("utf-8", { + fatal: true + }).decode(bytes); + } + + var toStringChunkSize = 8192, + numChunks = Math.ceil(bytes.length / toStringChunkSize); + if (numChunks <= 1) { + try { + return decodeURIComponent( + escape(String.fromCharCode.apply(null, bytes)) + ); + } catch (_) { + throw new TypeError("The encoded data was not valid."); + } + } + var totalString = ""; + var sequenceReadOffset = 0; + for (var i = 0; i < numChunks; i++) { + var currentChunk = Array.prototype.slice.call( + bytes, + i * toStringChunkSize + sequenceReadOffset, + (i + 1) * toStringChunkSize + sequenceReadOffset + ); + //Depending on how much we have shifted + if (currentChunk.length == 0) { + continue; + } + + //Checking that we didn't cut the buffer in the middle of a UTF8 sequence. + //If we did, remove the bytes of the "cut" sequence and + //decrement sequenceReadOffset for each removed byte + var sequenceDetectionComplete, + sequenceIndex = currentChunk.length, + sequenceLength = 0; + + //This loop will read the chunk from its end, looking for sequence start bytes + do { + sequenceIndex--; + var currentByte = currentChunk[sequenceIndex]; + + if (currentByte >= 240) { + //Beginning of a 4-byte UTF-8 sequence + sequenceLength = 4; + sequenceDetectionComplete = true; + } else if (currentByte >= 224) { + //Beginning of a 3-byte UTF-8 sequence + sequenceLength = 3; + sequenceDetectionComplete = true; + } else if (currentByte >= 192) { + //Beginning of a 2-byte UTF-8 sequence + sequenceLength = 2; + sequenceDetectionComplete = true; + } else if (currentByte < 128) { + //A one byte UTF-8 char + sequenceLength = 1; + sequenceDetectionComplete = true; + } + //The values between [128, 192[ are part of a UTF-8 sequence. + //The loop will not exit in that case, and will iterate one byte backwards instead + } while (!sequenceDetectionComplete); + + var extraBytes = sequenceLength - (currentChunk.length - sequenceIndex); + for (var j = 0; j < extraBytes; j++) { + sequenceReadOffset--; + currentChunk.pop(); + } + + totalString += to_string(currentChunk); + } + return totalString; +} + +export function from_hex(input) { + var address_pool = [], + input = _any_to_Uint8Array(address_pool, input, "input"), + result = new AllocatedBuf(input.length / 2), + result_str, + input_address = _to_allocated_buf_address(input), + hex_end_p = _malloc(4), + hex_end; + address_pool.push(input_address); + address_pool.push(result.address); + address_pool.push(result.hex_end_p); + if ( + libsodium._sodium_hex2bin( + result.address, + result.length, + input_address, + input.length, + 0, + 0, + hex_end_p + ) !== 0 + ) { + _free_and_throw_error(address_pool, "invalid input"); + } + hex_end = libsodium.getValue(hex_end_p, "i32"); + if (hex_end - input_address !== input.length) { + _free_and_throw_error(address_pool, "incomplete input"); + } + result_str = result.to_Uint8Array(); + _free_all(address_pool); + return result_str; +} + +export function to_hex(input) { + input = _any_to_Uint8Array(null, input, "input"); + var str = "", + b, + c, + x; + for (var i = 0; i < input.length; i++) { + c = input[i] & 0xf; + b = input[i] >>> 4; + x = + ((87 + c + (((c - 10) >> 8) & ~38)) << 8) | + (87 + b + (((b - 10) >> 8) & ~38)); + str += String.fromCharCode(x & 0xff) + String.fromCharCode(x >>> 8); + } + return str; +} + +var base64_variants = { + ORIGINAL: 1 | 0, + ORIGINAL_NO_PADDING: 3 | 0, + URLSAFE: 5 | 0, + URLSAFE_NO_PADDING: 7 | 0 +}; + +export function check_base64_variant(variant) { + if (variant == undefined) { + return base64_variants.URLSAFE_NO_PADDING; + } + if ( + variant !== base64_variants.ORIGINAL && + variant !== base64_variants.ORIGINAL_NO_PADDING && + variant !== base64_variants.URLSAFE && + variant != base64_variants.URLSAFE_NO_PADDING + ) { + throw new Error("unsupported base64 variant"); + } + return variant; +} + +export function from_base64(input, variant) { + variant = check_base64_variant(variant); + var address_pool = [], + input = _any_to_Uint8Array(address_pool, input, "input"), + result = new AllocatedBuf(input.length * 3 / 4), + result_bin, + input_address = _to_allocated_buf_address(input), + result_bin_len_p = _malloc(4), + b64_end_p = _malloc(4), + b64_end; + address_pool.push(input_address); + address_pool.push(result.address); + address_pool.push(result.result_bin_len_p); + address_pool.push(result.b64_end_p); + if ( + libsodium._sodium_base642bin( + result.address, + result.length, + input_address, + input.length, + 0, + result_bin_len_p, + b64_end_p, + variant + ) !== 0 + ) { + _free_and_throw_error(address_pool, "invalid input"); + } + b64_end = libsodium.getValue(b64_end_p, "i32"); + if (b64_end - input_address !== input.length) { + _free_and_throw_error(address_pool, "incomplete input"); + } + result.length = libsodium.getValue(result_bin_len_p, "i32"); + result_bin = result.to_Uint8Array(); + _free_all(address_pool); + return result_bin; +} + +export function to_base64(input, variant) { + variant = check_base64_variant(variant); + input = _any_to_Uint8Array(address_pool, input, "input"); + var address_pool = [], + nibbles = Math.floor(input.length / 3) | 0, + remainder = input.length - 3 * nibbles, + b64_len = + nibbles * 4 + + (remainder !== 0 ? + (variant & 2) === 0 ? 4 : 2 + (remainder >>> 1) : + 0), + result = new AllocatedBuf(b64_len + 1), + result_b64, + input_address = _to_allocated_buf_address(input); + address_pool.push(input_address); + address_pool.push(result.address); + if ( + libsodium._sodium_bin2base64( + result.address, + result.length, + input_address, + input.length, + variant + ) === 0 + ) { + _free_and_throw_error(address_pool, "conversion failed"); + } + result.length = b64_len; + result_b64 = to_string(result.to_Uint8Array()); + _free_all(address_pool); + return result_b64; +} + +export function output_formats() { + return ["uint8array", "text", "hex", "base64"]; +} + +export function _format_output(output, optionalOutputFormat) { + var selectedOutputFormat = optionalOutputFormat || output_format; + if (!_is_output_format(selectedOutputFormat)) { + throw new Error( + selectedOutputFormat + " output format is not available" + ); + } + if (output instanceof AllocatedBuf) { + if (selectedOutputFormat === "uint8array") { + return output.to_Uint8Array(); + } else if (selectedOutputFormat === "text") { + return to_string(output.to_Uint8Array()); + } else if (selectedOutputFormat === "hex") { + return to_hex(output.to_Uint8Array()); + } else if (selectedOutputFormat === "base64") { + return to_base64( + output.to_Uint8Array(), + base64_variants.URLSAFE_NO_PADDING + ); + } else { + throw new Error( + 'What is output format "' + selectedOutputFormat + '"?' + ); + } + } else if (typeof output === "object") { + // Composed output. Example: key pairs + var props = Object.keys(output); + var formattedOutput = {}; + for (var i = 0; i < props.length; i++) { + formattedOutput[props[i]] = _format_output( + output[props[i]], + selectedOutputFormat + ); + } + return formattedOutput; + } else if (typeof output === "string") { + return output; + } else { + throw new TypeError("Cannot format output"); + } +} + +export function _is_output_format(format) { + var formats = output_formats(); + for (var i = 0; i < formats.length; i++) { + if (formats[i] === format) { + return true; + } + } + return false; +} + +export function _check_output_format(format) { + if (!format) { + return; + } else if (typeof format !== "string") { + throw new TypeError("When defined, the output format must be a string"); + } else if (!_is_output_format(format)) { + throw new Error(format + " is not a supported output format"); + } +} + +//--------------------------------------------------------------------------- +// Memory management +// +// AllocatedBuf: address allocated using _malloc() + length +export function AllocatedBuf(length) { + this.length = length; + this.address = _malloc(length); +} + +// Copy the content of a AllocatedBuf (_malloc()'d memory) into a Uint8Array +AllocatedBuf.prototype.to_Uint8Array = function() { + var result = new Uint8Array(this.length); + result.set( + libsodium.HEAPU8.subarray(this.address, this.address + this.length) + ); + return result; +}; + +// _malloc() a region and initialize it with the content of a Uint8Array +export function _to_allocated_buf_address(bytes) { + var address = _malloc(bytes.length); + libsodium.HEAPU8.set(bytes, address); + return address; +} + +export function _malloc(length) { + var result = libsodium._malloc(length); + if (result === 0) { + throw { + message: "_malloc() failed", + length: length + }; + } + return result; +} + +export function _free(address) { + libsodium._free(address); +} + +export function _free_all(addresses) { + if (addresses) { + for (var i = 0; i < addresses.length; i++) { + _free(addresses[i]); + } + } +} + +export function _free_and_throw_error(address_pool, err) { + _free_all(address_pool); + throw new Error(err); +} + +export function _free_and_throw_type_error(address_pool, err) { + _free_all(address_pool); + throw new TypeError(err); +} + +export function _require_defined(address_pool, varValue, varName) { + if (varValue == undefined) { + _free_and_throw_type_error( + address_pool, + varName + " cannot be null or undefined" + ); + } +} + +export function _any_to_Uint8Array(address_pool, varValue, varName) { + _require_defined(address_pool, varValue, varName); + if (varValue instanceof Uint8Array) { + return varValue; + } else if (typeof varValue === "string") { + return from_string(varValue); + } + _free_and_throw_type_error( + address_pool, + "unsupported input type for " + varName + ); +} + + +export function crypto_aead_aegis128l_decrypt(secret_nonce, ciphertext, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_aead_aegis128l_abytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_aegis128l_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_aegis128l_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length - libsodium._crypto_aead_aegis128l_abytes()) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_aegis128l_decrypt(message_address, null, secret_nonce_address, ciphertext_address, ciphertext_length, 0, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_aegis128l_decrypt_detached(secret_nonce, ciphertext, mac, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: mac (buf) + + mac = _any_to_Uint8Array(address_pool, mac, "mac"); + var mac_address, mac_length = (libsodium._crypto_box_macbytes()) | 0; + if (mac.length !== mac_length) { + _free_and_throw_type_error(address_pool, "invalid mac length"); + } + mac_address = _to_allocated_buf_address(mac); + address_pool.push(mac_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_aegis128l_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_aegis128l_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_aegis128l_decrypt_detached(message_address, secret_nonce_address, ciphertext_address, ciphertext_length, 0, mac_address, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_aegis128l_encrypt(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_aegis128l_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_aegis128l_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_aead_aegis128l_abytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_aead_aegis128l_encrypt(ciphertext_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_aegis128l_encrypt_detached(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_aegis128l_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_aegis128l_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + // ---------- output mac (buf) + + var mac_length = (libsodium._crypto_aead_aegis128l_abytes()) | 0, + mac = new AllocatedBuf(mac_length), + mac_address = mac.address; + + address_pool.push(mac_address); + + if ((libsodium._crypto_aead_aegis128l_encrypt_detached(ciphertext_address, mac_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_aegis128l_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_aead_aegis128l_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_aead_aegis128l_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_aead_aegis256_decrypt(secret_nonce, ciphertext, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_aead_aegis256_abytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_aegis256_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_aegis256_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length - libsodium._crypto_aead_aegis256_abytes()) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_aegis256_decrypt(message_address, null, secret_nonce_address, ciphertext_address, ciphertext_length, 0, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_aegis256_decrypt_detached(secret_nonce, ciphertext, mac, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: mac (buf) + + mac = _any_to_Uint8Array(address_pool, mac, "mac"); + var mac_address, mac_length = (libsodium._crypto_box_macbytes()) | 0; + if (mac.length !== mac_length) { + _free_and_throw_type_error(address_pool, "invalid mac length"); + } + mac_address = _to_allocated_buf_address(mac); + address_pool.push(mac_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_aegis256_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_aegis256_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_aegis256_decrypt_detached(message_address, secret_nonce_address, ciphertext_address, ciphertext_length, 0, mac_address, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_aegis256_encrypt(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_aegis256_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_aegis256_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_aead_aegis256_abytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_aead_aegis256_encrypt(ciphertext_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_aegis256_encrypt_detached(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_aegis256_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_aegis256_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + // ---------- output mac (buf) + + var mac_length = (libsodium._crypto_aead_aegis256_abytes()) | 0, + mac = new AllocatedBuf(mac_length), + mac_address = mac.address; + + address_pool.push(mac_address); + + if ((libsodium._crypto_aead_aegis256_encrypt_detached(ciphertext_address, mac_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_aegis256_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_aead_aegis256_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_aead_aegis256_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_aead_chacha20poly1305_decrypt(secret_nonce, ciphertext, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_aead_chacha20poly1305_abytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length - libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_chacha20poly1305_decrypt(message_address, null, secret_nonce_address, ciphertext_address, ciphertext_length, 0, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_chacha20poly1305_decrypt_detached(secret_nonce, ciphertext, mac, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: mac (buf) + + mac = _any_to_Uint8Array(address_pool, mac, "mac"); + var mac_address, mac_length = (libsodium._crypto_box_macbytes()) | 0; + if (mac.length !== mac_length) { + _free_and_throw_type_error(address_pool, "invalid mac length"); + } + mac_address = _to_allocated_buf_address(mac); + address_pool.push(mac_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_chacha20poly1305_decrypt_detached(message_address, secret_nonce_address, ciphertext_address, ciphertext_length, 0, mac_address, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_chacha20poly1305_encrypt(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_aead_chacha20poly1305_encrypt(ciphertext_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_chacha20poly1305_encrypt_detached(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + // ---------- output mac (buf) + + var mac_length = (libsodium._crypto_aead_chacha20poly1305_abytes()) | 0, + mac = new AllocatedBuf(mac_length), + mac_address = mac.address; + + address_pool.push(mac_address); + + if ((libsodium._crypto_aead_chacha20poly1305_encrypt_detached(ciphertext_address, mac_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_chacha20poly1305_ietf_decrypt(secret_nonce, ciphertext, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_aead_chacha20poly1305_ietf_abytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length - libsodium._crypto_aead_chacha20poly1305_ietf_abytes()) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_chacha20poly1305_ietf_decrypt(message_address, null, secret_nonce_address, ciphertext_address, ciphertext_length, 0, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_chacha20poly1305_ietf_decrypt_detached(secret_nonce, ciphertext, mac, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: mac (buf) + + mac = _any_to_Uint8Array(address_pool, mac, "mac"); + var mac_address, mac_length = (libsodium._crypto_box_macbytes()) | 0; + if (mac.length !== mac_length) { + _free_and_throw_type_error(address_pool, "invalid mac length"); + } + mac_address = _to_allocated_buf_address(mac); + address_pool.push(mac_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_chacha20poly1305_ietf_decrypt_detached(message_address, secret_nonce_address, ciphertext_address, ciphertext_length, 0, mac_address, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_chacha20poly1305_ietf_encrypt(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_aead_chacha20poly1305_ietf_abytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_aead_chacha20poly1305_ietf_encrypt(ciphertext_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_chacha20poly1305_ietf_encrypt_detached(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_chacha20poly1305_ietf_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_chacha20poly1305_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + // ---------- output mac (buf) + + var mac_length = (libsodium._crypto_aead_chacha20poly1305_ietf_abytes()) | 0, + mac = new AllocatedBuf(mac_length), + mac_address = mac.address; + + address_pool.push(mac_address); + + if ((libsodium._crypto_aead_chacha20poly1305_ietf_encrypt_detached(ciphertext_address, mac_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_chacha20poly1305_ietf_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_aead_chacha20poly1305_ietf_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_aead_chacha20poly1305_ietf_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_aead_chacha20poly1305_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_aead_chacha20poly1305_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_aead_chacha20poly1305_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_aead_xchacha20poly1305_ietf_decrypt(secret_nonce, ciphertext, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_aead_xchacha20poly1305_ietf_abytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length - libsodium._crypto_aead_xchacha20poly1305_ietf_abytes()) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_xchacha20poly1305_ietf_decrypt(message_address, null, secret_nonce_address, ciphertext_address, ciphertext_length, 0, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_xchacha20poly1305_ietf_decrypt_detached(secret_nonce, ciphertext, mac, additional_data, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: mac (buf) + + mac = _any_to_Uint8Array(address_pool, mac, "mac"); + var mac_address, mac_length = (libsodium._crypto_box_macbytes()) | 0; + if (mac.length !== mac_length) { + _free_and_throw_type_error(address_pool, "invalid mac length"); + } + mac_address = _to_allocated_buf_address(mac); + address_pool.push(mac_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_aead_xchacha20poly1305_ietf_decrypt_detached(message_address, secret_nonce_address, ciphertext_address, ciphertext_length, 0, mac_address, additional_data_address, additional_data_length, 0, public_nonce_address, key_address)) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "ciphertext cannot be decrypted using that key"); +} + +export function crypto_aead_xchacha20poly1305_ietf_encrypt(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_aead_xchacha20poly1305_ietf_abytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_aead_xchacha20poly1305_ietf_encrypt(ciphertext_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_xchacha20poly1305_ietf_encrypt_detached(message, additional_data, secret_nonce, public_nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: additional_data (unsized_buf_optional) + + var additional_data_address = null, additional_data_length = 0; + if (additional_data != undefined) { + additional_data = _any_to_Uint8Array(address_pool, additional_data, "additional_data"); + additional_data_address = _to_allocated_buf_address(additional_data); + additional_data_length = additional_data.length; + address_pool.push(additional_data_address); + } + + // ---------- input: secret_nonce (unsized_buf_optional) + + var secret_nonce_address = null, secret_nonce_length = 0; + if (secret_nonce != undefined) { + secret_nonce = _any_to_Uint8Array(address_pool, secret_nonce, "secret_nonce"); + secret_nonce_address = _to_allocated_buf_address(secret_nonce); + secret_nonce_length = secret_nonce.length; + address_pool.push(secret_nonce_address); + } + + // ---------- input: public_nonce (buf) + + public_nonce = _any_to_Uint8Array(address_pool, public_nonce, "public_nonce"); + var public_nonce_address, public_nonce_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_npubbytes()) | 0; + if (public_nonce.length !== public_nonce_length) { + _free_and_throw_type_error(address_pool, "invalid public_nonce length"); + } + public_nonce_address = _to_allocated_buf_address(public_nonce); + address_pool.push(public_nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + // ---------- output mac (buf) + + var mac_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_abytes()) | 0, + mac = new AllocatedBuf(mac_length), + mac_address = mac.address; + + address_pool.push(mac_address); + + if ((libsodium._crypto_aead_xchacha20poly1305_ietf_encrypt_detached(ciphertext_address, mac_address, null, message_address, message_length, 0, additional_data_address, additional_data_length, 0, secret_nonce_address, public_nonce_address, key_address)) === 0) { + var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_aead_xchacha20poly1305_ietf_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_aead_xchacha20poly1305_ietf_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_aead_xchacha20poly1305_ietf_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_auth(message, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_auth_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output tag (buf) + + var tag_length = (libsodium._crypto_auth_bytes()) | 0, + tag = new AllocatedBuf(tag_length), + tag_address = tag.address; + + address_pool.push(tag_address); + + if ((libsodium._crypto_auth(tag_address, message_address, message_length, 0, key_address) | 0) === 0) { + var ret = _format_output(tag, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_auth_hmacsha256(message, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_auth_hmacsha256_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_auth_hmacsha256_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_auth_hmacsha256(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_auth_hmacsha256_final(state_address, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (auth_hmacsha256_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_auth_hmacsha256_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_auth_hmacsha256_final(state_address, hash_address) | 0) === 0) { + var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_auth_hmacsha256_init(key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: key (unsized_buf_optional) + + var key_address = null, key_length = 0; + if (key != undefined) { + key = _any_to_Uint8Array(address_pool, key, "key"); + key_address = _to_allocated_buf_address(key); + key_length = key.length; + address_pool.push(key_address); + } + + // ---------- output state (auth_hmacsha256_state) + + var state_address = new AllocatedBuf(208).address; + + if ((libsodium._crypto_auth_hmacsha256_init(state_address, key_address, key_length) | 0) === 0) { + var ret = state_address; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_auth_hmacsha256_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_auth_hmacsha256_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_auth_hmacsha256_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_auth_hmacsha256_update(state_address, message_chunk, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (auth_hmacsha256_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: message_chunk (unsized_buf) + + message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); + var message_chunk_address = _to_allocated_buf_address(message_chunk), + message_chunk_length = message_chunk.length; + address_pool.push(message_chunk_address); + + if (!((libsodium._crypto_auth_hmacsha256_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0)) { + _free_and_throw_error(address_pool, "invalid usage"); + } + _free_all(address_pool); +} + +export function crypto_auth_hmacsha256_verify(tag, message, key) { + var address_pool = []; + + // ---------- input: tag (buf) + + tag = _any_to_Uint8Array(address_pool, tag, "tag"); + var tag_address, tag_length = (libsodium._crypto_auth_hmacsha256_bytes()) | 0; + if (tag.length !== tag_length) { + _free_and_throw_type_error(address_pool, "invalid tag length"); + } + tag_address = _to_allocated_buf_address(tag); + address_pool.push(tag_address); + + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_auth_hmacsha256_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + var result = libsodium._crypto_auth_hmacsha256_verify(tag_address, message_address, message_length, 0, key_address) | 0; + var ret = (result === 0); + _free_all(address_pool); + return ret; +} + +export function crypto_auth_hmacsha512(message, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_auth_hmacsha512_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_auth_hmacsha512_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_auth_hmacsha512(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_auth_hmacsha512_final(state_address, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (auth_hmacsha512_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_auth_hmacsha512_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_auth_hmacsha512_final(state_address, hash_address) | 0) === 0) { + var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_auth_hmacsha512_init(key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: key (unsized_buf_optional) + + var key_address = null, key_length = 0; + if (key != undefined) { + key = _any_to_Uint8Array(address_pool, key, "key"); + key_address = _to_allocated_buf_address(key); + key_length = key.length; + address_pool.push(key_address); + } + + // ---------- output state (auth_hmacsha512_state) + + var state_address = new AllocatedBuf(416).address; + + if ((libsodium._crypto_auth_hmacsha512_init(state_address, key_address, key_length) | 0) === 0) { + var ret = state_address; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_auth_hmacsha512_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_auth_hmacsha512_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_auth_hmacsha512_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_auth_hmacsha512_update(state_address, message_chunk, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (auth_hmacsha512_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: message_chunk (unsized_buf) + + message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); + var message_chunk_address = _to_allocated_buf_address(message_chunk), + message_chunk_length = message_chunk.length; + address_pool.push(message_chunk_address); + + if (!((libsodium._crypto_auth_hmacsha512_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0)) { + _free_and_throw_error(address_pool, "invalid usage"); + } + _free_all(address_pool); +} + +export function crypto_auth_hmacsha512_verify(tag, message, key) { + var address_pool = []; + + // ---------- input: tag (buf) + + tag = _any_to_Uint8Array(address_pool, tag, "tag"); + var tag_address, tag_length = (libsodium._crypto_auth_hmacsha512_bytes()) | 0; + if (tag.length !== tag_length) { + _free_and_throw_type_error(address_pool, "invalid tag length"); + } + tag_address = _to_allocated_buf_address(tag); + address_pool.push(tag_address); + + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_auth_hmacsha512_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + var result = libsodium._crypto_auth_hmacsha512_verify(tag_address, message_address, message_length, 0, key_address) | 0; + var ret = (result === 0); + _free_all(address_pool); + return ret; +} + +export function crypto_auth_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_auth_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_auth_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_auth_verify(tag, message, key) { + var address_pool = []; + + // ---------- input: tag (buf) + + tag = _any_to_Uint8Array(address_pool, tag, "tag"); + var tag_address, tag_length = (libsodium._crypto_auth_bytes()) | 0; + if (tag.length !== tag_length) { + _free_and_throw_type_error(address_pool, "invalid tag length"); + } + tag_address = _to_allocated_buf_address(tag); + address_pool.push(tag_address); + + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_auth_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + var result = libsodium._crypto_auth_verify(tag_address, message_address, message_length, 0, key_address) | 0; + var ret = (result === 0); + _free_all(address_pool); + return ret; +} + +export function crypto_box_beforenm(publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output sharedKey (buf) + + var sharedKey_length = (libsodium._crypto_box_beforenmbytes()) | 0, + sharedKey = new AllocatedBuf(sharedKey_length), + sharedKey_address = sharedKey.address; + + address_pool.push(sharedKey_address); + + if ((libsodium._crypto_box_beforenm(sharedKey_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(sharedKey, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_curve25519xchacha20poly1305_beforenm(publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output sharedKey (buf) + + var sharedKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_beforenmbytes()) | 0, + sharedKey = new AllocatedBuf(sharedKey_length), + sharedKey_address = sharedKey.address; + + address_pool.push(sharedKey_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_beforenm(sharedKey_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(sharedKey, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_curve25519xchacha20poly1305_detached(message, nonce, publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_curve25519xchacha20poly1305_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + // ---------- output mac (buf) + + var mac_length = (libsodium._crypto_box_curve25519xchacha20poly1305_macbytes()) | 0, + mac = new AllocatedBuf(mac_length), + mac_address = mac.address; + + address_pool.push(mac_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_detached(ciphertext_address, mac_address, message_address, message_length, 0, nonce_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_curve25519xchacha20poly1305_detached_afternm(message, nonce, sharedKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_curve25519xchacha20poly1305_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: sharedKey (buf) + + sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); + var sharedKey_address, sharedKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_beforenmbytes()) | 0; + if (sharedKey.length !== sharedKey_length) { + _free_and_throw_type_error(address_pool, "invalid sharedKey length"); + } + sharedKey_address = _to_allocated_buf_address(sharedKey); + address_pool.push(sharedKey_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + // ---------- output mac (buf) + + var mac_length = (libsodium._crypto_box_curve25519xchacha20poly1305_macbytes()) | 0, + mac = new AllocatedBuf(mac_length), + mac_address = mac.address; + + address_pool.push(mac_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_detached_afternm(ciphertext_address, mac_address, message_address, message_length, 0, nonce_address, sharedKey_address) | 0) === 0) { + var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_curve25519xchacha20poly1305_easy(message, nonce, publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_curve25519xchacha20poly1305_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_box_curve25519xchacha20poly1305_macbytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_easy(ciphertext_address, message_address, message_length, 0, nonce_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_curve25519xchacha20poly1305_easy_afternm(message, nonce, sharedKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_curve25519xchacha20poly1305_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: sharedKey (buf) + + sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); + var sharedKey_address, sharedKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_beforenmbytes()) | 0; + if (sharedKey.length !== sharedKey_length) { + _free_and_throw_type_error(address_pool, "invalid sharedKey length"); + } + sharedKey_address = _to_allocated_buf_address(sharedKey); + address_pool.push(sharedKey_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_box_curve25519xchacha20poly1305_macbytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_easy_afternm(ciphertext_address, message_address, message_length, 0, nonce_address, sharedKey_address) | 0) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_curve25519xchacha20poly1305_keypair(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + // ---------- output secretKey (buf) + + var secretKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_secretkeybytes()) | 0, + secretKey = new AllocatedBuf(secretKey_length), + secretKey_address = secretKey.address; + + address_pool.push(secretKey_address); + + libsodium._crypto_box_curve25519xchacha20poly1305_keypair(publicKey_address, secretKey_address) | 0; + var ret = (_format_output({publicKey: publicKey, privateKey: secretKey, keyType: "curve25519"}, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_box_curve25519xchacha20poly1305_open_detached(ciphertext, mac, nonce, publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: mac (buf) + + mac = _any_to_Uint8Array(address_pool, mac, "mac"); + var mac_address, mac_length = (libsodium._crypto_box_curve25519xchacha20poly1305_macbytes()) | 0; + if (mac.length !== mac_length) { + _free_and_throw_type_error(address_pool, "invalid mac length"); + } + mac_address = _to_allocated_buf_address(mac); + address_pool.push(mac_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_curve25519xchacha20poly1305_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output plaintext (buf) + + var plaintext_length = (ciphertext_length) | 0, + plaintext = new AllocatedBuf(plaintext_length), + plaintext_address = plaintext.address; + + address_pool.push(plaintext_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_open_detached(plaintext_address, ciphertext_address, mac_address, ciphertext_length, 0, nonce_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(plaintext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "incorrect key pair for the given ciphertext"); +} + +export function crypto_box_curve25519xchacha20poly1305_open_detached_afternm(ciphertext, mac, nonce, sharedKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: mac (buf) + + mac = _any_to_Uint8Array(address_pool, mac, "mac"); + var mac_address, mac_length = (libsodium._crypto_box_curve25519xchacha20poly1305_macbytes()) | 0; + if (mac.length !== mac_length) { + _free_and_throw_type_error(address_pool, "invalid mac length"); + } + mac_address = _to_allocated_buf_address(mac); + address_pool.push(mac_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_curve25519xchacha20poly1305_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: sharedKey (buf) + + sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); + var sharedKey_address, sharedKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_beforenmbytes()) | 0; + if (sharedKey.length !== sharedKey_length) { + _free_and_throw_type_error(address_pool, "invalid sharedKey length"); + } + sharedKey_address = _to_allocated_buf_address(sharedKey); + address_pool.push(sharedKey_address); + + // ---------- output plaintext (buf) + + var plaintext_length = (ciphertext_length) | 0, + plaintext = new AllocatedBuf(plaintext_length), + plaintext_address = plaintext.address; + + address_pool.push(plaintext_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_open_detached_afternm(plaintext_address, ciphertext_address, mac_address, ciphertext_length, 0, nonce_address, sharedKey_address) | 0) === 0) { + var ret = _format_output(plaintext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "incorrect secret key for the given ciphertext"); +} + +export function crypto_box_curve25519xchacha20poly1305_open_easy(ciphertext, nonce, publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_box_curve25519xchacha20poly1305_macbytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_curve25519xchacha20poly1305_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output plaintext (buf) + + var plaintext_length = (ciphertext_length - libsodium._crypto_box_curve25519xchacha20poly1305_macbytes()) | 0, + plaintext = new AllocatedBuf(plaintext_length), + plaintext_address = plaintext.address; + + address_pool.push(plaintext_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_open_easy(plaintext_address, ciphertext_address, ciphertext_length, 0, nonce_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(plaintext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "incorrect key pair for the given ciphertext"); +} + +export function crypto_box_curve25519xchacha20poly1305_open_easy_afternm(ciphertext, nonce, sharedKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_curve25519xchacha20poly1305_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: sharedKey (buf) + + sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); + var sharedKey_address, sharedKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_beforenmbytes()) | 0; + if (sharedKey.length !== sharedKey_length) { + _free_and_throw_type_error(address_pool, "invalid sharedKey length"); + } + sharedKey_address = _to_allocated_buf_address(sharedKey); + address_pool.push(sharedKey_address); + + // ---------- output plaintext (buf) + + var plaintext_length = (ciphertext_length - libsodium._crypto_box_curve25519xchacha20poly1305_macbytes()) | 0, + plaintext = new AllocatedBuf(plaintext_length), + plaintext_address = plaintext.address; + + address_pool.push(plaintext_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_open_easy_afternm(plaintext_address, ciphertext_address, ciphertext_length, 0, nonce_address, sharedKey_address) | 0) === 0) { + var ret = _format_output(plaintext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "incorrect secret key for the given ciphertext"); +} + +export function crypto_box_curve25519xchacha20poly1305_seal(message, publicKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_box_curve25519xchacha20poly1305_sealbytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + libsodium._crypto_box_curve25519xchacha20poly1305_seal(ciphertext_address, message_address, message_length, 0, publicKey_address) | 0; + var ret = (_format_output(ciphertext, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_box_curve25519xchacha20poly1305_seal_open(ciphertext, publicKey, secretKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_box_curve25519xchacha20poly1305_sealbytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: secretKey (buf) + + secretKey = _any_to_Uint8Array(address_pool, secretKey, "secretKey"); + var secretKey_address, secretKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_secretkeybytes()) | 0; + if (secretKey.length !== secretKey_length) { + _free_and_throw_type_error(address_pool, "invalid secretKey length"); + } + secretKey_address = _to_allocated_buf_address(secretKey); + address_pool.push(secretKey_address); + + // ---------- output plaintext (buf) + + var plaintext_length = (ciphertext_length - libsodium._crypto_box_curve25519xchacha20poly1305_sealbytes()) | 0, + plaintext = new AllocatedBuf(plaintext_length), + plaintext_address = plaintext.address; + + address_pool.push(plaintext_address); + + libsodium._crypto_box_curve25519xchacha20poly1305_seal_open(plaintext_address, ciphertext_address, ciphertext_length, 0, publicKey_address, secretKey_address) | 0; + var ret = (_format_output(plaintext, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_box_curve25519xchacha20poly1305_seed_keypair(seed, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: seed (buf) + + seed = _any_to_Uint8Array(address_pool, seed, "seed"); + var seed_address, seed_length = (libsodium._crypto_box_curve25519xchacha20poly1305_seedbytes()) | 0; + if (seed.length !== seed_length) { + _free_and_throw_type_error(address_pool, "invalid seed length"); + } + seed_address = _to_allocated_buf_address(seed); + address_pool.push(seed_address); + + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_publickeybytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + // ---------- output privateKey (buf) + + var privateKey_length = (libsodium._crypto_box_curve25519xchacha20poly1305_secretkeybytes()) | 0, + privateKey = new AllocatedBuf(privateKey_length), + privateKey_address = privateKey.address; + + address_pool.push(privateKey_address); + + if ((libsodium._crypto_box_curve25519xchacha20poly1305_seed_keypair(publicKey_address, privateKey_address, seed_address) | 0) === 0) { + var ret = {publicKey: _format_output(publicKey, outputFormat), privateKey: _format_output(privateKey, outputFormat), keyType: 'x25519'}; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_detached(message, nonce, publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + // ---------- output mac (buf) + + var mac_length = (libsodium._crypto_box_macbytes()) | 0, + mac = new AllocatedBuf(mac_length), + mac_address = mac.address; + + address_pool.push(mac_address); + + if ((libsodium._crypto_box_detached(ciphertext_address, mac_address, message_address, message_length, 0, nonce_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output({ciphertext: ciphertext, mac: mac}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_easy(message, nonce, publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_box_macbytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_box_easy(ciphertext_address, message_address, message_length, 0, nonce_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_easy_afternm(message, nonce, sharedKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: sharedKey (buf) + + sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); + var sharedKey_address, sharedKey_length = (libsodium._crypto_box_beforenmbytes()) | 0; + if (sharedKey.length !== sharedKey_length) { + _free_and_throw_type_error(address_pool, "invalid sharedKey length"); + } + sharedKey_address = _to_allocated_buf_address(sharedKey); + address_pool.push(sharedKey_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_box_macbytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_box_easy_afternm(ciphertext_address, message_address, message_length, 0, nonce_address, sharedKey_address) | 0) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_keypair(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + // ---------- output privateKey (buf) + + var privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0, + privateKey = new AllocatedBuf(privateKey_length), + privateKey_address = privateKey.address; + + address_pool.push(privateKey_address); + + if ((libsodium._crypto_box_keypair(publicKey_address, privateKey_address) | 0) === 0) { + var ret = {publicKey: _format_output(publicKey, outputFormat), privateKey: _format_output(privateKey, outputFormat), keyType: 'x25519'}; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "internal error"); +} + +export function crypto_box_open_detached(ciphertext, mac, nonce, publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: mac (buf) + + mac = _any_to_Uint8Array(address_pool, mac, "mac"); + var mac_address, mac_length = (libsodium._crypto_box_macbytes()) | 0; + if (mac.length !== mac_length) { + _free_and_throw_type_error(address_pool, "invalid mac length"); + } + mac_address = _to_allocated_buf_address(mac); + address_pool.push(mac_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output plaintext (buf) + + var plaintext_length = (ciphertext_length) | 0, + plaintext = new AllocatedBuf(plaintext_length), + plaintext_address = plaintext.address; + + address_pool.push(plaintext_address); + + if ((libsodium._crypto_box_open_detached(plaintext_address, ciphertext_address, mac_address, ciphertext_length, 0, nonce_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(plaintext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "incorrect key pair for the given ciphertext"); +} + +export function crypto_box_open_easy(ciphertext, nonce, publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_box_macbytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output plaintext (buf) + + var plaintext_length = (ciphertext_length - libsodium._crypto_box_macbytes()) | 0, + plaintext = new AllocatedBuf(plaintext_length), + plaintext_address = plaintext.address; + + address_pool.push(plaintext_address); + + if ((libsodium._crypto_box_open_easy(plaintext_address, ciphertext_address, ciphertext_length, 0, nonce_address, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(plaintext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "incorrect key pair for the given ciphertext"); +} + +export function crypto_box_open_easy_afternm(ciphertext, nonce, sharedKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_box_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: sharedKey (buf) + + sharedKey = _any_to_Uint8Array(address_pool, sharedKey, "sharedKey"); + var sharedKey_address, sharedKey_length = (libsodium._crypto_box_beforenmbytes()) | 0; + if (sharedKey.length !== sharedKey_length) { + _free_and_throw_type_error(address_pool, "invalid sharedKey length"); + } + sharedKey_address = _to_allocated_buf_address(sharedKey); + address_pool.push(sharedKey_address); + + // ---------- output plaintext (buf) + + var plaintext_length = (ciphertext_length - libsodium._crypto_box_macbytes()) | 0, + plaintext = new AllocatedBuf(plaintext_length), + plaintext_address = plaintext.address; + + address_pool.push(plaintext_address); + + if ((libsodium._crypto_box_open_easy_afternm(plaintext_address, ciphertext_address, ciphertext_length, 0, nonce_address, sharedKey_address) | 0) === 0) { + var ret = _format_output(plaintext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "incorrect secret key for the given ciphertext"); +} + +export function crypto_box_seal(message, publicKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- output ciphertext (buf) + + var ciphertext_length = (message_length + libsodium._crypto_box_sealbytes()) | 0, + ciphertext = new AllocatedBuf(ciphertext_length), + ciphertext_address = ciphertext.address; + + address_pool.push(ciphertext_address); + + if ((libsodium._crypto_box_seal(ciphertext_address, message_address, message_length, 0, publicKey_address) | 0) === 0) { + var ret = _format_output(ciphertext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_box_seal_open(ciphertext, publicKey, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_box_sealbytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output plaintext (buf) + + var plaintext_length = (ciphertext_length - libsodium._crypto_box_sealbytes()) | 0, + plaintext = new AllocatedBuf(plaintext_length), + plaintext_address = plaintext.address; + + address_pool.push(plaintext_address); + + if ((libsodium._crypto_box_seal_open(plaintext_address, ciphertext_address, ciphertext_length, 0, publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(plaintext, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "incorrect key pair for the given ciphertext"); +} + +export function crypto_box_seed_keypair(seed, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: seed (buf) + + seed = _any_to_Uint8Array(address_pool, seed, "seed"); + var seed_address, seed_length = (libsodium._crypto_box_seedbytes()) | 0; + if (seed.length !== seed_length) { + _free_and_throw_type_error(address_pool, "invalid seed length"); + } + seed_address = _to_allocated_buf_address(seed); + address_pool.push(seed_address); + + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_box_publickeybytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + // ---------- output privateKey (buf) + + var privateKey_length = (libsodium._crypto_box_secretkeybytes()) | 0, + privateKey = new AllocatedBuf(privateKey_length), + privateKey_address = privateKey.address; + + address_pool.push(privateKey_address); + + if ((libsodium._crypto_box_seed_keypair(publicKey_address, privateKey_address, seed_address) | 0) === 0) { + var ret = {publicKey: _format_output(publicKey, outputFormat), privateKey: _format_output(privateKey, outputFormat), keyType: 'x25519'}; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_core_ed25519_add(p, q, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: p (buf) + + p = _any_to_Uint8Array(address_pool, p, "p"); + var p_address, p_length = (libsodium._crypto_core_ed25519_bytes()) | 0; + if (p.length !== p_length) { + _free_and_throw_type_error(address_pool, "invalid p length"); + } + p_address = _to_allocated_buf_address(p); + address_pool.push(p_address); + + // ---------- input: q (buf) + + q = _any_to_Uint8Array(address_pool, q, "q"); + var q_address, q_length = (libsodium._crypto_core_ed25519_bytes()) | 0; + if (q.length !== q_length) { + _free_and_throw_type_error(address_pool, "invalid q length"); + } + q_address = _to_allocated_buf_address(q); + address_pool.push(q_address); + + // ---------- output r (buf) + + var r_length = (libsodium._crypto_core_ed25519_bytes()) | 0, + r = new AllocatedBuf(r_length), + r_address = r.address; + + address_pool.push(r_address); + + if ((libsodium._crypto_core_ed25519_add(r_address, p_address, q_address) | 0) === 0) { + var ret = _format_output(r, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "input is an invalid element"); +} + +export function crypto_core_ed25519_from_hash(r, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: r (unsized_buf) + + r = _any_to_Uint8Array(address_pool, r, "r"); + var r_address = _to_allocated_buf_address(r), + r_length = r.length; + address_pool.push(r_address); + + // ---------- output point (buf) + + var point_length = (libsodium._crypto_core_ed25519_bytes()) | 0, + point = new AllocatedBuf(point_length), + point_address = point.address; + + address_pool.push(point_address); + + if ((libsodium._crypto_core_ed25519_from_hash(point_address, r_address) | 0) === 0) { + var ret = _format_output(point, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_core_ed25519_from_uniform(r, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: r (unsized_buf) + + r = _any_to_Uint8Array(address_pool, r, "r"); + var r_address = _to_allocated_buf_address(r), + r_length = r.length; + address_pool.push(r_address); + + // ---------- output point (buf) + + var point_length = (libsodium._crypto_core_ed25519_bytes()) | 0, + point = new AllocatedBuf(point_length), + point_address = point.address; + + address_pool.push(point_address); + + if ((libsodium._crypto_core_ed25519_from_uniform(point_address, r_address) | 0) === 0) { + var ret = _format_output(point, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_core_ed25519_is_valid_point(repr, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: repr (buf) + + repr = _any_to_Uint8Array(address_pool, repr, "repr"); + var repr_address, repr_length = (libsodium._crypto_core_ed25519_bytes()) | 0; + if (repr.length !== repr_length) { + _free_and_throw_type_error(address_pool, "invalid repr length"); + } + repr_address = _to_allocated_buf_address(repr); + address_pool.push(repr_address); + + var result = libsodium._crypto_core_ed25519_is_valid_point(repr_address) | 0; + var ret = (result === 1); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ed25519_random(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output p (buf) + + var p_length = (libsodium._crypto_core_ed25519_bytes()) | 0, + p = new AllocatedBuf(p_length), + p_address = p.address; + + address_pool.push(p_address); + + libsodium._crypto_core_ed25519_random(p_address); + var ret = (_format_output(p, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ed25519_scalar_add(x, y, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: x (buf) + + x = _any_to_Uint8Array(address_pool, x, "x"); + var x_address, x_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0; + if (x.length !== x_length) { + _free_and_throw_type_error(address_pool, "invalid x length"); + } + x_address = _to_allocated_buf_address(x); + address_pool.push(x_address); + + // ---------- input: y (buf) + + y = _any_to_Uint8Array(address_pool, y, "y"); + var y_address, y_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0; + if (y.length !== y_length) { + _free_and_throw_type_error(address_pool, "invalid y length"); + } + y_address = _to_allocated_buf_address(y); + address_pool.push(y_address); + + // ---------- output z (buf) + + var z_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0, + z = new AllocatedBuf(z_length), + z_address = z.address; + + address_pool.push(z_address); + + libsodium._crypto_core_ed25519_scalar_add(z_address, x_address, y_address); + var ret = (_format_output(z, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ed25519_scalar_complement(s, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: s (buf) + + s = _any_to_Uint8Array(address_pool, s, "s"); + var s_address, s_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0; + if (s.length !== s_length) { + _free_and_throw_type_error(address_pool, "invalid s length"); + } + s_address = _to_allocated_buf_address(s); + address_pool.push(s_address); + + // ---------- output comp (buf) + + var comp_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0, + comp = new AllocatedBuf(comp_length), + comp_address = comp.address; + + address_pool.push(comp_address); + + libsodium._crypto_core_ed25519_scalar_complement(comp_address, s_address); + var ret = (_format_output(comp, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ed25519_scalar_invert(s, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: s (buf) + + s = _any_to_Uint8Array(address_pool, s, "s"); + var s_address, s_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0; + if (s.length !== s_length) { + _free_and_throw_type_error(address_pool, "invalid s length"); + } + s_address = _to_allocated_buf_address(s); + address_pool.push(s_address); + + // ---------- output recip (buf) + + var recip_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0, + recip = new AllocatedBuf(recip_length), + recip_address = recip.address; + + address_pool.push(recip_address); + + if ((libsodium._crypto_core_ed25519_scalar_invert(recip_address, s_address) | 0) === 0) { + var ret = _format_output(recip, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid reciprocate"); +} + +export function crypto_core_ed25519_scalar_mul(x, y, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: x (buf) + + x = _any_to_Uint8Array(address_pool, x, "x"); + var x_address, x_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0; + if (x.length !== x_length) { + _free_and_throw_type_error(address_pool, "invalid x length"); + } + x_address = _to_allocated_buf_address(x); + address_pool.push(x_address); + + // ---------- input: y (buf) + + y = _any_to_Uint8Array(address_pool, y, "y"); + var y_address, y_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0; + if (y.length !== y_length) { + _free_and_throw_type_error(address_pool, "invalid y length"); + } + y_address = _to_allocated_buf_address(y); + address_pool.push(y_address); + + // ---------- output z (buf) + + var z_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0, + z = new AllocatedBuf(z_length), + z_address = z.address; + + address_pool.push(z_address); + + libsodium._crypto_core_ed25519_scalar_mul(z_address, x_address, y_address); + var ret = (_format_output(z, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ed25519_scalar_negate(s, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: s (buf) + + s = _any_to_Uint8Array(address_pool, s, "s"); + var s_address, s_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0; + if (s.length !== s_length) { + _free_and_throw_type_error(address_pool, "invalid s length"); + } + s_address = _to_allocated_buf_address(s); + address_pool.push(s_address); + + // ---------- output neg (buf) + + var neg_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0, + neg = new AllocatedBuf(neg_length), + neg_address = neg.address; + + address_pool.push(neg_address); + + libsodium._crypto_core_ed25519_scalar_negate(neg_address, s_address); + var ret = (_format_output(neg, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ed25519_scalar_random(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output r (buf) + + var r_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0, + r = new AllocatedBuf(r_length), + r_address = r.address; + + address_pool.push(r_address); + + libsodium._crypto_core_ed25519_scalar_random(r_address); + var ret = (_format_output(r, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ed25519_scalar_reduce(sample, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: sample (buf) + + sample = _any_to_Uint8Array(address_pool, sample, "sample"); + var sample_address, sample_length = (libsodium._crypto_core_ed25519_nonreducedscalarbytes()) | 0; + if (sample.length !== sample_length) { + _free_and_throw_type_error(address_pool, "invalid sample length"); + } + sample_address = _to_allocated_buf_address(sample); + address_pool.push(sample_address); + + // ---------- output result (buf) + + var result_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0, + result = new AllocatedBuf(result_length), + result_address = result.address; + + address_pool.push(result_address); + + libsodium._crypto_core_ed25519_scalar_reduce(result_address, sample_address); + var ret = (_format_output(result, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ed25519_scalar_sub(x, y, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: x (buf) + + x = _any_to_Uint8Array(address_pool, x, "x"); + var x_address, x_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0; + if (x.length !== x_length) { + _free_and_throw_type_error(address_pool, "invalid x length"); + } + x_address = _to_allocated_buf_address(x); + address_pool.push(x_address); + + // ---------- input: y (buf) + + y = _any_to_Uint8Array(address_pool, y, "y"); + var y_address, y_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0; + if (y.length !== y_length) { + _free_and_throw_type_error(address_pool, "invalid y length"); + } + y_address = _to_allocated_buf_address(y); + address_pool.push(y_address); + + // ---------- output z (buf) + + var z_length = (libsodium._crypto_core_ed25519_scalarbytes()) | 0, + z = new AllocatedBuf(z_length), + z_address = z.address; + + address_pool.push(z_address); + + libsodium._crypto_core_ed25519_scalar_sub(z_address, x_address, y_address); + var ret = (_format_output(z, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ed25519_sub(p, q, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: p (buf) + + p = _any_to_Uint8Array(address_pool, p, "p"); + var p_address, p_length = (libsodium._crypto_core_ed25519_bytes()) | 0; + if (p.length !== p_length) { + _free_and_throw_type_error(address_pool, "invalid p length"); + } + p_address = _to_allocated_buf_address(p); + address_pool.push(p_address); + + // ---------- input: q (buf) + + q = _any_to_Uint8Array(address_pool, q, "q"); + var q_address, q_length = (libsodium._crypto_core_ed25519_bytes()) | 0; + if (q.length !== q_length) { + _free_and_throw_type_error(address_pool, "invalid q length"); + } + q_address = _to_allocated_buf_address(q); + address_pool.push(q_address); + + // ---------- output r (buf) + + var r_length = (libsodium._crypto_core_ed25519_bytes()) | 0, + r = new AllocatedBuf(r_length), + r_address = r.address; + + address_pool.push(r_address); + + if ((libsodium._crypto_core_ed25519_sub(r_address, p_address, q_address) | 0) === 0) { + var ret = _format_output(r, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "input is an invalid element"); +} + +export function crypto_core_hchacha20(input, privateKey, constant, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: input (buf) + + input = _any_to_Uint8Array(address_pool, input, "input"); + var input_address, input_length = (libsodium._crypto_core_hchacha20_inputbytes()) | 0; + if (input.length !== input_length) { + _free_and_throw_type_error(address_pool, "invalid input length"); + } + input_address = _to_allocated_buf_address(input); + address_pool.push(input_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_core_hchacha20_keybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- input: constant (unsized_buf_optional) + + var constant_address = null, constant_length = 0; + if (constant != undefined) { + constant = _any_to_Uint8Array(address_pool, constant, "constant"); + constant_address = _to_allocated_buf_address(constant); + constant_length = constant.length; + address_pool.push(constant_address); + } + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_core_hchacha20_outputbytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_core_hchacha20(hash_address, input_address, privateKey_address, constant_address) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_core_hsalsa20(input, privateKey, constant, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: input (buf) + + input = _any_to_Uint8Array(address_pool, input, "input"); + var input_address, input_length = (libsodium._crypto_core_hsalsa20_inputbytes()) | 0; + if (input.length !== input_length) { + _free_and_throw_type_error(address_pool, "invalid input length"); + } + input_address = _to_allocated_buf_address(input); + address_pool.push(input_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_core_hsalsa20_keybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- input: constant (unsized_buf_optional) + + var constant_address = null, constant_length = 0; + if (constant != undefined) { + constant = _any_to_Uint8Array(address_pool, constant, "constant"); + constant_address = _to_allocated_buf_address(constant); + constant_length = constant.length; + address_pool.push(constant_address); + } + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_core_hsalsa20_outputbytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_core_hsalsa20(hash_address, input_address, privateKey_address, constant_address) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_core_ristretto255_add(p, q, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: p (buf) + + p = _any_to_Uint8Array(address_pool, p, "p"); + var p_address, p_length = (libsodium._crypto_core_ristretto255_bytes()) | 0; + if (p.length !== p_length) { + _free_and_throw_type_error(address_pool, "invalid p length"); + } + p_address = _to_allocated_buf_address(p); + address_pool.push(p_address); + + // ---------- input: q (buf) + + q = _any_to_Uint8Array(address_pool, q, "q"); + var q_address, q_length = (libsodium._crypto_core_ristretto255_bytes()) | 0; + if (q.length !== q_length) { + _free_and_throw_type_error(address_pool, "invalid q length"); + } + q_address = _to_allocated_buf_address(q); + address_pool.push(q_address); + + // ---------- output r (buf) + + var r_length = (libsodium._crypto_core_ristretto255_bytes()) | 0, + r = new AllocatedBuf(r_length), + r_address = r.address; + + address_pool.push(r_address); + + if ((libsodium._crypto_core_ristretto255_add(r_address, p_address, q_address) | 0) === 0) { + var ret = _format_output(r, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "input is an invalid element"); +} + +export function crypto_core_ristretto255_from_hash(r, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: r (unsized_buf) + + r = _any_to_Uint8Array(address_pool, r, "r"); + var r_address = _to_allocated_buf_address(r), + r_length = r.length; + address_pool.push(r_address); + + // ---------- output point (buf) + + var point_length = (libsodium._crypto_core_ristretto255_bytes()) | 0, + point = new AllocatedBuf(point_length), + point_address = point.address; + + address_pool.push(point_address); + + if ((libsodium._crypto_core_ristretto255_from_hash(point_address, r_address) | 0) === 0) { + var ret = _format_output(point, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_core_ristretto255_is_valid_point(repr, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: repr (buf) + + repr = _any_to_Uint8Array(address_pool, repr, "repr"); + var repr_address, repr_length = (libsodium._crypto_core_ristretto255_bytes()) | 0; + if (repr.length !== repr_length) { + _free_and_throw_type_error(address_pool, "invalid repr length"); + } + repr_address = _to_allocated_buf_address(repr); + address_pool.push(repr_address); + + var result = libsodium._crypto_core_ristretto255_is_valid_point(repr_address) | 0; + var ret = (result === 1); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ristretto255_random(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output p (buf) + + var p_length = (libsodium._crypto_core_ristretto255_bytes()) | 0, + p = new AllocatedBuf(p_length), + p_address = p.address; + + address_pool.push(p_address); + + libsodium._crypto_core_ristretto255_random(p_address); + var ret = (_format_output(p, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ristretto255_scalar_add(x, y, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: x (buf) + + x = _any_to_Uint8Array(address_pool, x, "x"); + var x_address, x_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (x.length !== x_length) { + _free_and_throw_type_error(address_pool, "invalid x length"); + } + x_address = _to_allocated_buf_address(x); + address_pool.push(x_address); + + // ---------- input: y (buf) + + y = _any_to_Uint8Array(address_pool, y, "y"); + var y_address, y_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (y.length !== y_length) { + _free_and_throw_type_error(address_pool, "invalid y length"); + } + y_address = _to_allocated_buf_address(y); + address_pool.push(y_address); + + // ---------- output z (buf) + + var z_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0, + z = new AllocatedBuf(z_length), + z_address = z.address; + + address_pool.push(z_address); + + libsodium._crypto_core_ristretto255_scalar_add(z_address, x_address, y_address); + var ret = (_format_output(z, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ristretto255_scalar_complement(s, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: s (buf) + + s = _any_to_Uint8Array(address_pool, s, "s"); + var s_address, s_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (s.length !== s_length) { + _free_and_throw_type_error(address_pool, "invalid s length"); + } + s_address = _to_allocated_buf_address(s); + address_pool.push(s_address); + + // ---------- output comp (buf) + + var comp_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0, + comp = new AllocatedBuf(comp_length), + comp_address = comp.address; + + address_pool.push(comp_address); + + libsodium._crypto_core_ristretto255_scalar_complement(comp_address, s_address); + var ret = (_format_output(comp, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ristretto255_scalar_invert(s, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: s (buf) + + s = _any_to_Uint8Array(address_pool, s, "s"); + var s_address, s_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (s.length !== s_length) { + _free_and_throw_type_error(address_pool, "invalid s length"); + } + s_address = _to_allocated_buf_address(s); + address_pool.push(s_address); + + // ---------- output recip (buf) + + var recip_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0, + recip = new AllocatedBuf(recip_length), + recip_address = recip.address; + + address_pool.push(recip_address); + + if ((libsodium._crypto_core_ristretto255_scalar_invert(recip_address, s_address) | 0) === 0) { + var ret = _format_output(recip, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid reciprocate"); +} + +export function crypto_core_ristretto255_scalar_mul(x, y, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: x (buf) + + x = _any_to_Uint8Array(address_pool, x, "x"); + var x_address, x_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (x.length !== x_length) { + _free_and_throw_type_error(address_pool, "invalid x length"); + } + x_address = _to_allocated_buf_address(x); + address_pool.push(x_address); + + // ---------- input: y (buf) + + y = _any_to_Uint8Array(address_pool, y, "y"); + var y_address, y_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (y.length !== y_length) { + _free_and_throw_type_error(address_pool, "invalid y length"); + } + y_address = _to_allocated_buf_address(y); + address_pool.push(y_address); + + // ---------- output z (buf) + + var z_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0, + z = new AllocatedBuf(z_length), + z_address = z.address; + + address_pool.push(z_address); + + libsodium._crypto_core_ristretto255_scalar_mul(z_address, x_address, y_address); + var ret = (_format_output(z, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ristretto255_scalar_negate(s, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: s (buf) + + s = _any_to_Uint8Array(address_pool, s, "s"); + var s_address, s_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (s.length !== s_length) { + _free_and_throw_type_error(address_pool, "invalid s length"); + } + s_address = _to_allocated_buf_address(s); + address_pool.push(s_address); + + // ---------- output neg (buf) + + var neg_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0, + neg = new AllocatedBuf(neg_length), + neg_address = neg.address; + + address_pool.push(neg_address); + + libsodium._crypto_core_ristretto255_scalar_negate(neg_address, s_address); + var ret = (_format_output(neg, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ristretto255_scalar_random(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output r (buf) + + var r_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0, + r = new AllocatedBuf(r_length), + r_address = r.address; + + address_pool.push(r_address); + + libsodium._crypto_core_ristretto255_scalar_random(r_address); + var ret = (_format_output(r, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ristretto255_scalar_reduce(sample, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: sample (buf) + + sample = _any_to_Uint8Array(address_pool, sample, "sample"); + var sample_address, sample_length = (libsodium._crypto_core_ristretto255_nonreducedscalarbytes()) | 0; + if (sample.length !== sample_length) { + _free_and_throw_type_error(address_pool, "invalid sample length"); + } + sample_address = _to_allocated_buf_address(sample); + address_pool.push(sample_address); + + // ---------- output result (buf) + + var result_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0, + result = new AllocatedBuf(result_length), + result_address = result.address; + + address_pool.push(result_address); + + libsodium._crypto_core_ristretto255_scalar_reduce(result_address, sample_address); + var ret = (_format_output(result, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ristretto255_scalar_sub(x, y, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: x (buf) + + x = _any_to_Uint8Array(address_pool, x, "x"); + var x_address, x_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (x.length !== x_length) { + _free_and_throw_type_error(address_pool, "invalid x length"); + } + x_address = _to_allocated_buf_address(x); + address_pool.push(x_address); + + // ---------- input: y (buf) + + y = _any_to_Uint8Array(address_pool, y, "y"); + var y_address, y_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (y.length !== y_length) { + _free_and_throw_type_error(address_pool, "invalid y length"); + } + y_address = _to_allocated_buf_address(y); + address_pool.push(y_address); + + // ---------- output z (buf) + + var z_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0, + z = new AllocatedBuf(z_length), + z_address = z.address; + + address_pool.push(z_address); + + libsodium._crypto_core_ristretto255_scalar_sub(z_address, x_address, y_address); + var ret = (_format_output(z, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_core_ristretto255_sub(p, q, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: p (buf) + + p = _any_to_Uint8Array(address_pool, p, "p"); + var p_address, p_length = (libsodium._crypto_core_ristretto255_bytes()) | 0; + if (p.length !== p_length) { + _free_and_throw_type_error(address_pool, "invalid p length"); + } + p_address = _to_allocated_buf_address(p); + address_pool.push(p_address); + + // ---------- input: q (buf) + + q = _any_to_Uint8Array(address_pool, q, "q"); + var q_address, q_length = (libsodium._crypto_core_ristretto255_bytes()) | 0; + if (q.length !== q_length) { + _free_and_throw_type_error(address_pool, "invalid q length"); + } + q_address = _to_allocated_buf_address(q); + address_pool.push(q_address); + + // ---------- output r (buf) + + var r_length = (libsodium._crypto_core_ristretto255_bytes()) | 0, + r = new AllocatedBuf(r_length), + r_address = r.address; + + address_pool.push(r_address); + + if ((libsodium._crypto_core_ristretto255_sub(r_address, p_address, q_address) | 0) === 0) { + var ret = _format_output(r, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "input is an invalid element"); +} + +export function crypto_generichash(hash_length, message, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: hash_length (uint) + + _require_defined(address_pool, hash_length, "hash_length"); + + if (!(typeof hash_length === "number" && (hash_length | 0) === hash_length) || hash_length < 0) { + _free_and_throw_type_error(address_pool, "hash_length must be an unsigned integer"); + } + + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (unsized_buf_optional) + + var key_address = null, key_length = 0; + if (key != undefined) { + key = _any_to_Uint8Array(address_pool, key, "key"); + key_address = _to_allocated_buf_address(key); + key_length = key.length; + address_pool.push(key_address); + } + + // ---------- output hash (buf) + + var hash_length = (hash_length) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_generichash(hash_address, hash_length, message_address, message_length, 0, key_address, key_length) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_generichash_blake2b_salt_personal(subkey_len, key, id, ctx, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: subkey_len (uint) + + _require_defined(address_pool, subkey_len, "subkey_len"); + + if (!(typeof subkey_len === "number" && (subkey_len | 0) === subkey_len) || subkey_len < 0) { + _free_and_throw_type_error(address_pool, "subkey_len must be an unsigned integer"); + } + + // ---------- input: key (unsized_buf_optional) + + var key_address = null, key_length = 0; + if (key != undefined) { + key = _any_to_Uint8Array(address_pool, key, "key"); + key_address = _to_allocated_buf_address(key); + key_length = key.length; + address_pool.push(key_address); + } + + // ---------- input: id (buf_optional) + + var id_address = null, id_length = 0; + if (id != undefined) { + id = _any_to_Uint8Array(address_pool, id, "id"); + id_length = (libsodium._crypto_generichash_blake2b_saltbytes()) | 0; + if (id.length !== id_length) { + _free_and_throw_type_error(address_pool, "invalid id length"); + } + id_address = _to_allocated_buf_address(id); + address_pool.push(id_address); + } + + // ---------- input: ctx (buf_optional) + + var ctx_address = null, ctx_length = 0; + if (ctx != undefined) { + ctx = _any_to_Uint8Array(address_pool, ctx, "ctx"); + ctx_length = (libsodium._crypto_generichash_blake2b_personalbytes()) | 0; + if (ctx.length !== ctx_length) { + _free_and_throw_type_error(address_pool, "invalid ctx length"); + } + ctx_address = _to_allocated_buf_address(ctx); + address_pool.push(ctx_address); + } + + // ---------- output subkey (buf) + + var subkey_length = (subkey_len) | 0, + subkey = new AllocatedBuf(subkey_length), + subkey_address = subkey.address; + + address_pool.push(subkey_address); + + if ((libsodium._crypto_generichash_blake2b_salt_personal(subkey_address, subkey_len, null, 0, 0, key_address, key_length, id_address, ctx_address) | 0) === 0) { + var ret = _format_output(subkey, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_generichash_final(state_address, hash_length, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (generichash_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: hash_length (uint) + + _require_defined(address_pool, hash_length, "hash_length"); + + if (!(typeof hash_length === "number" && (hash_length | 0) === hash_length) || hash_length < 0) { + _free_and_throw_type_error(address_pool, "hash_length must be an unsigned integer"); + } + + // ---------- output hash (buf) + + var hash_length = (hash_length) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_generichash_final(state_address, hash_address, hash_length) | 0) === 0) { + var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_generichash_init(key, hash_length, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: key (unsized_buf_optional) + + var key_address = null, key_length = 0; + if (key != undefined) { + key = _any_to_Uint8Array(address_pool, key, "key"); + key_address = _to_allocated_buf_address(key); + key_length = key.length; + address_pool.push(key_address); + } + + // ---------- input: hash_length (uint) + + _require_defined(address_pool, hash_length, "hash_length"); + + if (!(typeof hash_length === "number" && (hash_length | 0) === hash_length) || hash_length < 0) { + _free_and_throw_type_error(address_pool, "hash_length must be an unsigned integer"); + } + + // ---------- output state (generichash_state) + + var state_address = new AllocatedBuf(357).address; + + if ((libsodium._crypto_generichash_init(state_address, key_address, key_length, hash_length) | 0) === 0) { + var ret = state_address; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_generichash_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_generichash_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_generichash_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_generichash_update(state_address, message_chunk, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (generichash_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: message_chunk (unsized_buf) + + message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); + var message_chunk_address = _to_allocated_buf_address(message_chunk), + message_chunk_length = message_chunk.length; + address_pool.push(message_chunk_address); + + if (!((libsodium._crypto_generichash_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0)) { + _free_and_throw_error(address_pool, "invalid usage"); + } + _free_all(address_pool); +} + +export function crypto_hash(message, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_hash_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_hash(hash_address, message_address, message_length, 0) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_hash_sha256(message, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_hash_sha256_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_hash_sha256(hash_address, message_address, message_length, 0) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_hash_sha256_final(state_address, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (hash_sha256_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_hash_sha256_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_hash_sha256_final(state_address, hash_address) | 0) === 0) { + var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_hash_sha256_init(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output state (hash_sha256_state) + + var state_address = new AllocatedBuf(104).address; + + if ((libsodium._crypto_hash_sha256_init(state_address) | 0) === 0) { + var ret = state_address; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_hash_sha256_update(state_address, message_chunk, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (hash_sha256_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: message_chunk (unsized_buf) + + message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); + var message_chunk_address = _to_allocated_buf_address(message_chunk), + message_chunk_length = message_chunk.length; + address_pool.push(message_chunk_address); + + if (!((libsodium._crypto_hash_sha256_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0)) { + _free_and_throw_error(address_pool, "invalid usage"); + } + _free_all(address_pool); +} + +export function crypto_hash_sha512(message, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_hash_sha512_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_hash_sha512(hash_address, message_address, message_length, 0) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_hash_sha512_final(state_address, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (hash_sha512_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_hash_sha512_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_hash_sha512_final(state_address, hash_address) | 0) === 0) { + var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_hash_sha512_init(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output state (hash_sha512_state) + + var state_address = new AllocatedBuf(208).address; + + if ((libsodium._crypto_hash_sha512_init(state_address) | 0) === 0) { + var ret = state_address; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_hash_sha512_update(state_address, message_chunk, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (hash_sha512_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: message_chunk (unsized_buf) + + message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); + var message_chunk_address = _to_allocated_buf_address(message_chunk), + message_chunk_length = message_chunk.length; + address_pool.push(message_chunk_address); + + if (!((libsodium._crypto_hash_sha512_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0)) { + _free_and_throw_error(address_pool, "invalid usage"); + } + _free_all(address_pool); +} + +export function crypto_kdf_derive_from_key(subkey_len, subkey_id, ctx, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: subkey_len (uint) + + _require_defined(address_pool, subkey_len, "subkey_len"); + + if (!(typeof subkey_len === "number" && (subkey_len | 0) === subkey_len) || subkey_len < 0) { + _free_and_throw_type_error(address_pool, "subkey_len must be an unsigned integer"); + } + + // ---------- input: subkey_id (u64) + + _require_defined(address_pool, subkey_id, "subkey_id"); + var subkey_id_hi = 0, subkey_id_lo; + if (typeof subkey_id === "bigint" && subkey_id >= BigInt(0)) { + const hi = subkey_id >> BigInt(32); + if (hi > BigInt(4294967295)) { + _free_and_throw_type_error(address_pool, "subkey_id cannot be more than 64 bits"); + } + subkey_id_hi = Number(hi); + subkey_id_lo = Number(subkey_id & BigInt(4294967295)); + } else if (typeof subkey_id === "number" && (subkey_id | 0) === subkey_id && subkey_id >= 0) { + subkey_id_lo = subkey_id + } else { + _free_and_throw_type_error(address_pool, "subkey_id must be an unsigned integer or bigint"); + } + + // ---------- input: ctx (string) + + if (typeof ctx !== "string") { + _free_and_throw_type_error(address_pool, "ctx must be a string"); + } + ctx = from_string(ctx + "\0"); + if (ctx_length != undefined && ctx.length - 1 !== ctx_length) { + _free_and_throw_type_error(address_pool, "invalid ctx length"); + } + var ctx_address = _to_allocated_buf_address(ctx), + ctx_length = ctx.length - 1; + address_pool.push(ctx_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_kdf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output subkey (buf) + + var subkey_length = (subkey_len) | 0, + subkey = new AllocatedBuf(subkey_length), + subkey_address = subkey.address; + + address_pool.push(subkey_address); + + libsodium._crypto_kdf_derive_from_key(subkey_address, subkey_len, subkey_id_lo, subkey_id_hi, ctx_address, key_address); + var ret = (_format_output(subkey, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_kdf_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_kdf_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_kdf_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_kx_client_session_keys(clientPublicKey, clientSecretKey, serverPublicKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: clientPublicKey (buf) + + clientPublicKey = _any_to_Uint8Array(address_pool, clientPublicKey, "clientPublicKey"); + var clientPublicKey_address, clientPublicKey_length = (libsodium._crypto_kx_publickeybytes()) | 0; + if (clientPublicKey.length !== clientPublicKey_length) { + _free_and_throw_type_error(address_pool, "invalid clientPublicKey length"); + } + clientPublicKey_address = _to_allocated_buf_address(clientPublicKey); + address_pool.push(clientPublicKey_address); + + // ---------- input: clientSecretKey (buf) + + clientSecretKey = _any_to_Uint8Array(address_pool, clientSecretKey, "clientSecretKey"); + var clientSecretKey_address, clientSecretKey_length = (libsodium._crypto_kx_secretkeybytes()) | 0; + if (clientSecretKey.length !== clientSecretKey_length) { + _free_and_throw_type_error(address_pool, "invalid clientSecretKey length"); + } + clientSecretKey_address = _to_allocated_buf_address(clientSecretKey); + address_pool.push(clientSecretKey_address); + + // ---------- input: serverPublicKey (buf) + + serverPublicKey = _any_to_Uint8Array(address_pool, serverPublicKey, "serverPublicKey"); + var serverPublicKey_address, serverPublicKey_length = (libsodium._crypto_kx_publickeybytes()) | 0; + if (serverPublicKey.length !== serverPublicKey_length) { + _free_and_throw_type_error(address_pool, "invalid serverPublicKey length"); + } + serverPublicKey_address = _to_allocated_buf_address(serverPublicKey); + address_pool.push(serverPublicKey_address); + + // ---------- output sharedRx (buf) + + var sharedRx_length = (libsodium._crypto_kx_sessionkeybytes()) | 0, + sharedRx = new AllocatedBuf(sharedRx_length), + sharedRx_address = sharedRx.address; + + address_pool.push(sharedRx_address); + + // ---------- output sharedTx (buf) + + var sharedTx_length = (libsodium._crypto_kx_sessionkeybytes()) | 0, + sharedTx = new AllocatedBuf(sharedTx_length), + sharedTx_address = sharedTx.address; + + address_pool.push(sharedTx_address); + + if ((libsodium._crypto_kx_client_session_keys(sharedRx_address, sharedTx_address, clientPublicKey_address, clientSecretKey_address, serverPublicKey_address) | 0) === 0) { + var ret = _format_output({sharedRx: sharedRx, sharedTx: sharedTx}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_kx_keypair(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_kx_publickeybytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + // ---------- output privateKey (buf) + + var privateKey_length = (libsodium._crypto_kx_secretkeybytes()) | 0, + privateKey = new AllocatedBuf(privateKey_length), + privateKey_address = privateKey.address; + + address_pool.push(privateKey_address); + + if ((libsodium._crypto_kx_keypair(publicKey_address, privateKey_address) | 0) === 0) { + var ret = {publicKey: _format_output(publicKey, outputFormat), privateKey: _format_output(privateKey, outputFormat), keyType: 'x25519'}; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "internal error"); +} + +export function crypto_kx_seed_keypair(seed, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: seed (buf) + + seed = _any_to_Uint8Array(address_pool, seed, "seed"); + var seed_address, seed_length = (libsodium._crypto_kx_seedbytes()) | 0; + if (seed.length !== seed_length) { + _free_and_throw_type_error(address_pool, "invalid seed length"); + } + seed_address = _to_allocated_buf_address(seed); + address_pool.push(seed_address); + + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_kx_publickeybytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + // ---------- output privateKey (buf) + + var privateKey_length = (libsodium._crypto_kx_secretkeybytes()) | 0, + privateKey = new AllocatedBuf(privateKey_length), + privateKey_address = privateKey.address; + + address_pool.push(privateKey_address); + + if ((libsodium._crypto_kx_seed_keypair(publicKey_address, privateKey_address, seed_address) | 0) === 0) { + var ret = {publicKey: _format_output(publicKey, outputFormat), privateKey: _format_output(privateKey, outputFormat), keyType: 'x25519'}; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "internal error"); +} + +export function crypto_kx_server_session_keys(serverPublicKey, serverSecretKey, clientPublicKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: serverPublicKey (buf) + + serverPublicKey = _any_to_Uint8Array(address_pool, serverPublicKey, "serverPublicKey"); + var serverPublicKey_address, serverPublicKey_length = (libsodium._crypto_kx_publickeybytes()) | 0; + if (serverPublicKey.length !== serverPublicKey_length) { + _free_and_throw_type_error(address_pool, "invalid serverPublicKey length"); + } + serverPublicKey_address = _to_allocated_buf_address(serverPublicKey); + address_pool.push(serverPublicKey_address); + + // ---------- input: serverSecretKey (buf) + + serverSecretKey = _any_to_Uint8Array(address_pool, serverSecretKey, "serverSecretKey"); + var serverSecretKey_address, serverSecretKey_length = (libsodium._crypto_kx_secretkeybytes()) | 0; + if (serverSecretKey.length !== serverSecretKey_length) { + _free_and_throw_type_error(address_pool, "invalid serverSecretKey length"); + } + serverSecretKey_address = _to_allocated_buf_address(serverSecretKey); + address_pool.push(serverSecretKey_address); + + // ---------- input: clientPublicKey (buf) + + clientPublicKey = _any_to_Uint8Array(address_pool, clientPublicKey, "clientPublicKey"); + var clientPublicKey_address, clientPublicKey_length = (libsodium._crypto_kx_publickeybytes()) | 0; + if (clientPublicKey.length !== clientPublicKey_length) { + _free_and_throw_type_error(address_pool, "invalid clientPublicKey length"); + } + clientPublicKey_address = _to_allocated_buf_address(clientPublicKey); + address_pool.push(clientPublicKey_address); + + // ---------- output sharedRx (buf) + + var sharedRx_length = (libsodium._crypto_kx_sessionkeybytes()) | 0, + sharedRx = new AllocatedBuf(sharedRx_length), + sharedRx_address = sharedRx.address; + + address_pool.push(sharedRx_address); + + // ---------- output sharedTx (buf) + + var sharedTx_length = (libsodium._crypto_kx_sessionkeybytes()) | 0, + sharedTx = new AllocatedBuf(sharedTx_length), + sharedTx_address = sharedTx.address; + + address_pool.push(sharedTx_address); + + if ((libsodium._crypto_kx_server_session_keys(sharedRx_address, sharedTx_address, serverPublicKey_address, serverSecretKey_address, clientPublicKey_address) | 0) === 0) { + var ret = _format_output({sharedRx: sharedRx, sharedTx: sharedTx}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_onetimeauth(message, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_onetimeauth_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_onetimeauth_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_onetimeauth(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_onetimeauth_final(state_address, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (onetimeauth_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_onetimeauth_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_onetimeauth_final(state_address, hash_address) | 0) === 0) { + var ret = (libsodium._free(state_address), _format_output(hash, outputFormat)); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_onetimeauth_init(key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: key (unsized_buf_optional) + + var key_address = null, key_length = 0; + if (key != undefined) { + key = _any_to_Uint8Array(address_pool, key, "key"); + key_address = _to_allocated_buf_address(key); + key_length = key.length; + address_pool.push(key_address); + } + + // ---------- output state (onetimeauth_state) + + var state_address = new AllocatedBuf(144).address; + + if ((libsodium._crypto_onetimeauth_init(state_address, key_address) | 0) === 0) { + var ret = state_address; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_onetimeauth_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_onetimeauth_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_onetimeauth_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_onetimeauth_update(state_address, message_chunk, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (onetimeauth_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: message_chunk (unsized_buf) + + message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); + var message_chunk_address = _to_allocated_buf_address(message_chunk), + message_chunk_length = message_chunk.length; + address_pool.push(message_chunk_address); + + if (!((libsodium._crypto_onetimeauth_update(state_address, message_chunk_address, message_chunk_length) | 0) === 0)) { + _free_and_throw_error(address_pool, "invalid usage"); + } + _free_all(address_pool); +} + +export function crypto_onetimeauth_verify(hash, message, key) { + var address_pool = []; + + // ---------- input: hash (buf) + + hash = _any_to_Uint8Array(address_pool, hash, "hash"); + var hash_address, hash_length = (libsodium._crypto_onetimeauth_bytes()) | 0; + if (hash.length !== hash_length) { + _free_and_throw_type_error(address_pool, "invalid hash length"); + } + hash_address = _to_allocated_buf_address(hash); + address_pool.push(hash_address); + + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_onetimeauth_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + var result = libsodium._crypto_onetimeauth_verify(hash_address, message_address, message_length, 0, key_address) | 0; + var ret = (result === 0); + _free_all(address_pool); + return ret; +} + +export function crypto_pwhash(keyLength, password, salt, opsLimit, memLimit, algorithm, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: keyLength (uint) + + _require_defined(address_pool, keyLength, "keyLength"); + + if (!(typeof keyLength === "number" && (keyLength | 0) === keyLength) || keyLength < 0) { + _free_and_throw_type_error(address_pool, "keyLength must be an unsigned integer"); + } + + // ---------- input: password (unsized_buf) + + password = _any_to_Uint8Array(address_pool, password, "password"); + var password_address = _to_allocated_buf_address(password), + password_length = password.length; + address_pool.push(password_address); + + // ---------- input: salt (buf) + + salt = _any_to_Uint8Array(address_pool, salt, "salt"); + var salt_address, salt_length = (libsodium._crypto_pwhash_saltbytes()) | 0; + if (salt.length !== salt_length) { + _free_and_throw_type_error(address_pool, "invalid salt length"); + } + salt_address = _to_allocated_buf_address(salt); + address_pool.push(salt_address); + + // ---------- input: opsLimit (uint) + + _require_defined(address_pool, opsLimit, "opsLimit"); + + if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) || opsLimit < 0) { + _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); + } + + // ---------- input: memLimit (uint) + + _require_defined(address_pool, memLimit, "memLimit"); + + if (!(typeof memLimit === "number" && (memLimit | 0) === memLimit) || memLimit < 0) { + _free_and_throw_type_error(address_pool, "memLimit must be an unsigned integer"); + } + + // ---------- input: algorithm (uint) + + _require_defined(address_pool, algorithm, "algorithm"); + + if (!(typeof algorithm === "number" && (algorithm | 0) === algorithm) || algorithm < 0) { + _free_and_throw_type_error(address_pool, "algorithm must be an unsigned integer"); + } + + // ---------- output derivedKey (buf) + + var derivedKey_length = (keyLength) | 0, + derivedKey = new AllocatedBuf(derivedKey_length), + derivedKey_address = derivedKey.address; + + address_pool.push(derivedKey_address); + + if ((libsodium._crypto_pwhash(derivedKey_address, keyLength, 0, password_address, password_length, 0, salt_address, opsLimit, 0, memLimit, algorithm) | 0) === 0) { + var ret = _format_output(derivedKey, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_pwhash_scryptsalsa208sha256(keyLength, password, salt, opsLimit, memLimit, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: keyLength (uint) + + _require_defined(address_pool, keyLength, "keyLength"); + + if (!(typeof keyLength === "number" && (keyLength | 0) === keyLength) || keyLength < 0) { + _free_and_throw_type_error(address_pool, "keyLength must be an unsigned integer"); + } + + // ---------- input: password (unsized_buf) + + password = _any_to_Uint8Array(address_pool, password, "password"); + var password_address = _to_allocated_buf_address(password), + password_length = password.length; + address_pool.push(password_address); + + // ---------- input: salt (buf) + + salt = _any_to_Uint8Array(address_pool, salt, "salt"); + var salt_address, salt_length = (libsodium._crypto_pwhash_scryptsalsa208sha256_saltbytes()) | 0; + if (salt.length !== salt_length) { + _free_and_throw_type_error(address_pool, "invalid salt length"); + } + salt_address = _to_allocated_buf_address(salt); + address_pool.push(salt_address); + + // ---------- input: opsLimit (uint) + + _require_defined(address_pool, opsLimit, "opsLimit"); + + if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) || opsLimit < 0) { + _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); + } + + // ---------- input: memLimit (uint) + + _require_defined(address_pool, memLimit, "memLimit"); + + if (!(typeof memLimit === "number" && (memLimit | 0) === memLimit) || memLimit < 0) { + _free_and_throw_type_error(address_pool, "memLimit must be an unsigned integer"); + } + + // ---------- output derivedKey (buf) + + var derivedKey_length = (keyLength) | 0, + derivedKey = new AllocatedBuf(derivedKey_length), + derivedKey_address = derivedKey.address; + + address_pool.push(derivedKey_address); + + if ((libsodium._crypto_pwhash_scryptsalsa208sha256(derivedKey_address, keyLength, 0, password_address, password_length, 0, salt_address, opsLimit, 0, memLimit) | 0) === 0) { + var ret = _format_output(derivedKey, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_pwhash_scryptsalsa208sha256_ll(password, salt, opsLimit, r, p, keyLength, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: password (unsized_buf) + + password = _any_to_Uint8Array(address_pool, password, "password"); + var password_address = _to_allocated_buf_address(password), + password_length = password.length; + address_pool.push(password_address); + + // ---------- input: salt (unsized_buf) + + salt = _any_to_Uint8Array(address_pool, salt, "salt"); + var salt_address = _to_allocated_buf_address(salt), + salt_length = salt.length; + address_pool.push(salt_address); + + // ---------- input: opsLimit (uint) + + _require_defined(address_pool, opsLimit, "opsLimit"); + + if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) || opsLimit < 0) { + _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); + } + + // ---------- input: r (uint) + + _require_defined(address_pool, r, "r"); + + if (!(typeof r === "number" && (r | 0) === r) || r < 0) { + _free_and_throw_type_error(address_pool, "r must be an unsigned integer"); + } + + // ---------- input: p (uint) + + _require_defined(address_pool, p, "p"); + + if (!(typeof p === "number" && (p | 0) === p) || p < 0) { + _free_and_throw_type_error(address_pool, "p must be an unsigned integer"); + } + + // ---------- input: keyLength (uint) + + _require_defined(address_pool, keyLength, "keyLength"); + + if (!(typeof keyLength === "number" && (keyLength | 0) === keyLength) || keyLength < 0) { + _free_and_throw_type_error(address_pool, "keyLength must be an unsigned integer"); + } + + // ---------- output derivedKey (buf) + + var derivedKey_length = (keyLength) | 0, + derivedKey = new AllocatedBuf(derivedKey_length), + derivedKey_address = derivedKey.address; + + address_pool.push(derivedKey_address); + + if ((libsodium._crypto_pwhash_scryptsalsa208sha256_ll(password_address, password_length, salt_address, salt_length, opsLimit, 0, r, p, derivedKey_address, keyLength) | 0) === 0) { + var ret = _format_output(derivedKey, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_pwhash_scryptsalsa208sha256_str(password, opsLimit, memLimit, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: password (unsized_buf) + + password = _any_to_Uint8Array(address_pool, password, "password"); + var password_address = _to_allocated_buf_address(password), + password_length = password.length; + address_pool.push(password_address); + + // ---------- input: opsLimit (uint) + + _require_defined(address_pool, opsLimit, "opsLimit"); + + if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) || opsLimit < 0) { + _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); + } + + // ---------- input: memLimit (uint) + + _require_defined(address_pool, memLimit, "memLimit"); + + if (!(typeof memLimit === "number" && (memLimit | 0) === memLimit) || memLimit < 0) { + _free_and_throw_type_error(address_pool, "memLimit must be an unsigned integer"); + } + + // ---------- output hashed_password (buf) + + var hashed_password_length = (libsodium._crypto_pwhash_scryptsalsa208sha256_strbytes()) | 0, + hashed_password = new AllocatedBuf(hashed_password_length), + hashed_password_address = hashed_password.address; + + address_pool.push(hashed_password_address); + + if ((libsodium._crypto_pwhash_scryptsalsa208sha256_str(hashed_password_address, password_address, password_length, 0, opsLimit, 0, memLimit) | 0) === 0) { + var ret = libsodium.UTF8ToString(hashed_password_address); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_pwhash_scryptsalsa208sha256_str_verify(hashed_password, password, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: hashed_password (string) + + if (typeof hashed_password !== "string") { + _free_and_throw_type_error(address_pool, "hashed_password must be a string"); + } + hashed_password = from_string(hashed_password + "\0"); + if (hashed_password_length != undefined && hashed_password.length - 1 !== hashed_password_length) { + _free_and_throw_type_error(address_pool, "invalid hashed_password length"); + } + var hashed_password_address = _to_allocated_buf_address(hashed_password), + hashed_password_length = hashed_password.length - 1; + address_pool.push(hashed_password_address); + + // ---------- input: password (unsized_buf) + + password = _any_to_Uint8Array(address_pool, password, "password"); + var password_address = _to_allocated_buf_address(password), + password_length = password.length; + address_pool.push(password_address); + + var result = libsodium._crypto_pwhash_scryptsalsa208sha256_str_verify(hashed_password_address, password_address, password_length, 0) | 0; + var ret = (result === 0); + _free_all(address_pool); + return ret; +} + +export function crypto_pwhash_str(password, opsLimit, memLimit, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: password (unsized_buf) + + password = _any_to_Uint8Array(address_pool, password, "password"); + var password_address = _to_allocated_buf_address(password), + password_length = password.length; + address_pool.push(password_address); + + // ---------- input: opsLimit (uint) + + _require_defined(address_pool, opsLimit, "opsLimit"); + + if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) || opsLimit < 0) { + _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); + } + + // ---------- input: memLimit (uint) + + _require_defined(address_pool, memLimit, "memLimit"); + + if (!(typeof memLimit === "number" && (memLimit | 0) === memLimit) || memLimit < 0) { + _free_and_throw_type_error(address_pool, "memLimit must be an unsigned integer"); + } + + // ---------- output hashed_password (buf) + + var hashed_password_length = (libsodium._crypto_pwhash_strbytes()) | 0, + hashed_password = new AllocatedBuf(hashed_password_length), + hashed_password_address = hashed_password.address; + + address_pool.push(hashed_password_address); + + if ((libsodium._crypto_pwhash_str(hashed_password_address, password_address, password_length, 0, opsLimit, 0, memLimit) | 0) === 0) { + var ret = libsodium.UTF8ToString(hashed_password_address); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_pwhash_str_needs_rehash(hashed_password, opsLimit, memLimit, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: hashed_password (string) + + if (typeof hashed_password !== "string") { + _free_and_throw_type_error(address_pool, "hashed_password must be a string"); + } + hashed_password = from_string(hashed_password + "\0"); + if (hashed_password_length != undefined && hashed_password.length - 1 !== hashed_password_length) { + _free_and_throw_type_error(address_pool, "invalid hashed_password length"); + } + var hashed_password_address = _to_allocated_buf_address(hashed_password), + hashed_password_length = hashed_password.length - 1; + address_pool.push(hashed_password_address); + + // ---------- input: opsLimit (uint) + + _require_defined(address_pool, opsLimit, "opsLimit"); + + if (!(typeof opsLimit === "number" && (opsLimit | 0) === opsLimit) || opsLimit < 0) { + _free_and_throw_type_error(address_pool, "opsLimit must be an unsigned integer"); + } + + // ---------- input: memLimit (uint) + + _require_defined(address_pool, memLimit, "memLimit"); + + if (!(typeof memLimit === "number" && (memLimit | 0) === memLimit) || memLimit < 0) { + _free_and_throw_type_error(address_pool, "memLimit must be an unsigned integer"); + } + + var result = libsodium._crypto_pwhash_str_needs_rehash(hashed_password_address, opsLimit, 0, memLimit) | 0; + var ret = (result !== 0); + _free_all(address_pool); + return ret; +} + +export function crypto_pwhash_str_verify(hashed_password, password, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: hashed_password (string) + + if (typeof hashed_password !== "string") { + _free_and_throw_type_error(address_pool, "hashed_password must be a string"); + } + hashed_password = from_string(hashed_password + "\0"); + if (hashed_password_length != undefined && hashed_password.length - 1 !== hashed_password_length) { + _free_and_throw_type_error(address_pool, "invalid hashed_password length"); + } + var hashed_password_address = _to_allocated_buf_address(hashed_password), + hashed_password_length = hashed_password.length - 1; + address_pool.push(hashed_password_address); + + // ---------- input: password (unsized_buf) + + password = _any_to_Uint8Array(address_pool, password, "password"); + var password_address = _to_allocated_buf_address(password), + password_length = password.length; + address_pool.push(password_address); + + var result = libsodium._crypto_pwhash_str_verify(hashed_password_address, password_address, password_length, 0) | 0; + var ret = (result === 0); + _free_all(address_pool); + return ret; +} + +export function crypto_scalarmult(privateKey, publicKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_scalarmult_bytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- output sharedSecret (buf) + + var sharedSecret_length = (libsodium._crypto_scalarmult_bytes()) | 0, + sharedSecret = new AllocatedBuf(sharedSecret_length), + sharedSecret_address = sharedSecret.address; + + address_pool.push(sharedSecret_address); + + if ((libsodium._crypto_scalarmult(sharedSecret_address, privateKey_address, publicKey_address) | 0) === 0) { + var ret = _format_output(sharedSecret, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "weak public key"); +} + +export function crypto_scalarmult_base(privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_scalarmult_bytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + if ((libsodium._crypto_scalarmult_base(publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(publicKey, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "unknown error"); +} + +export function crypto_scalarmult_ed25519(n, p, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: n (buf) + + n = _any_to_Uint8Array(address_pool, n, "n"); + var n_address, n_length = (libsodium._crypto_scalarmult_ed25519_scalarbytes()) | 0; + if (n.length !== n_length) { + _free_and_throw_type_error(address_pool, "invalid n length"); + } + n_address = _to_allocated_buf_address(n); + address_pool.push(n_address); + + // ---------- input: p (buf) + + p = _any_to_Uint8Array(address_pool, p, "p"); + var p_address, p_length = (libsodium._crypto_scalarmult_ed25519_bytes()) | 0; + if (p.length !== p_length) { + _free_and_throw_type_error(address_pool, "invalid p length"); + } + p_address = _to_allocated_buf_address(p); + address_pool.push(p_address); + + // ---------- output q (buf) + + var q_length = (libsodium._crypto_scalarmult_ed25519_bytes()) | 0, + q = new AllocatedBuf(q_length), + q_address = q.address; + + address_pool.push(q_address); + + if ((libsodium._crypto_scalarmult_ed25519(q_address, n_address, p_address) | 0) === 0) { + var ret = _format_output(q, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid point or scalar is 0"); +} + +export function crypto_scalarmult_ed25519_base(scalar, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: scalar (buf) + + scalar = _any_to_Uint8Array(address_pool, scalar, "scalar"); + var scalar_address, scalar_length = (libsodium._crypto_scalarmult_ed25519_scalarbytes()) | 0; + if (scalar.length !== scalar_length) { + _free_and_throw_type_error(address_pool, "invalid scalar length"); + } + scalar_address = _to_allocated_buf_address(scalar); + address_pool.push(scalar_address); + + // ---------- output point (buf) + + var point_length = (libsodium._crypto_scalarmult_ed25519_bytes()) | 0, + point = new AllocatedBuf(point_length), + point_address = point.address; + + address_pool.push(point_address); + + if ((libsodium._crypto_scalarmult_ed25519_base(point_address, scalar_address) | 0) === 0) { + var ret = _format_output(point, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "scalar is 0"); +} + +export function crypto_scalarmult_ed25519_base_noclamp(scalar, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: scalar (buf) + + scalar = _any_to_Uint8Array(address_pool, scalar, "scalar"); + var scalar_address, scalar_length = (libsodium._crypto_scalarmult_ed25519_scalarbytes()) | 0; + if (scalar.length !== scalar_length) { + _free_and_throw_type_error(address_pool, "invalid scalar length"); + } + scalar_address = _to_allocated_buf_address(scalar); + address_pool.push(scalar_address); + + // ---------- output point (buf) + + var point_length = (libsodium._crypto_scalarmult_ed25519_bytes()) | 0, + point = new AllocatedBuf(point_length), + point_address = point.address; + + address_pool.push(point_address); + + if ((libsodium._crypto_scalarmult_ed25519_base_noclamp(point_address, scalar_address) | 0) === 0) { + var ret = _format_output(point, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "scalar is 0"); +} + +export function crypto_scalarmult_ed25519_noclamp(n, p, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: n (buf) + + n = _any_to_Uint8Array(address_pool, n, "n"); + var n_address, n_length = (libsodium._crypto_scalarmult_ed25519_scalarbytes()) | 0; + if (n.length !== n_length) { + _free_and_throw_type_error(address_pool, "invalid n length"); + } + n_address = _to_allocated_buf_address(n); + address_pool.push(n_address); + + // ---------- input: p (buf) + + p = _any_to_Uint8Array(address_pool, p, "p"); + var p_address, p_length = (libsodium._crypto_scalarmult_ed25519_bytes()) | 0; + if (p.length !== p_length) { + _free_and_throw_type_error(address_pool, "invalid p length"); + } + p_address = _to_allocated_buf_address(p); + address_pool.push(p_address); + + // ---------- output q (buf) + + var q_length = (libsodium._crypto_scalarmult_ed25519_bytes()) | 0, + q = new AllocatedBuf(q_length), + q_address = q.address; + + address_pool.push(q_address); + + if ((libsodium._crypto_scalarmult_ed25519_noclamp(q_address, n_address, p_address) | 0) === 0) { + var ret = _format_output(q, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid point or scalar is 0"); +} + +export function crypto_scalarmult_ristretto255(scalar, element, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: scalar (buf) + + scalar = _any_to_Uint8Array(address_pool, scalar, "scalar"); + var scalar_address, scalar_length = (libsodium._crypto_scalarmult_ristretto255_scalarbytes()) | 0; + if (scalar.length !== scalar_length) { + _free_and_throw_type_error(address_pool, "invalid scalar length"); + } + scalar_address = _to_allocated_buf_address(scalar); + address_pool.push(scalar_address); + + // ---------- input: element (buf) + + element = _any_to_Uint8Array(address_pool, element, "element"); + var element_address, element_length = (libsodium._crypto_scalarmult_ristretto255_bytes()) | 0; + if (element.length !== element_length) { + _free_and_throw_type_error(address_pool, "invalid element length"); + } + element_address = _to_allocated_buf_address(element); + address_pool.push(element_address); + + // ---------- output result (buf) + + var result_length = (libsodium._crypto_scalarmult_ristretto255_bytes()) | 0, + result = new AllocatedBuf(result_length), + result_address = result.address; + + address_pool.push(result_address); + + if ((libsodium._crypto_scalarmult_ristretto255(result_address, scalar_address, element_address) | 0) === 0) { + var ret = _format_output(result, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "result is identity element"); +} + +export function crypto_scalarmult_ristretto255_base(scalar, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: scalar (buf) + + scalar = _any_to_Uint8Array(address_pool, scalar, "scalar"); + var scalar_address, scalar_length = (libsodium._crypto_core_ristretto255_scalarbytes()) | 0; + if (scalar.length !== scalar_length) { + _free_and_throw_type_error(address_pool, "invalid scalar length"); + } + scalar_address = _to_allocated_buf_address(scalar); + address_pool.push(scalar_address); + + // ---------- output element (buf) + + var element_length = (libsodium._crypto_core_ristretto255_bytes()) | 0, + element = new AllocatedBuf(element_length), + element_address = element.address; + + address_pool.push(element_address); + + if ((libsodium._crypto_scalarmult_ristretto255_base(element_address, scalar_address) | 0) === 0) { + var ret = _format_output(element, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "scalar is 0"); +} + +export function crypto_secretbox_detached(message, nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output cipher (buf) + + var cipher_length = (message_length) | 0, + cipher = new AllocatedBuf(cipher_length), + cipher_address = cipher.address; + + address_pool.push(cipher_address); + + // ---------- output mac (buf) + + var mac_length = (libsodium._crypto_secretbox_macbytes()) | 0, + mac = new AllocatedBuf(mac_length), + mac_address = mac.address; + + address_pool.push(mac_address); + + if ((libsodium._crypto_secretbox_detached(cipher_address, mac_address, message_address, message_length, 0, nonce_address, key_address) | 0) === 0) { + var ret = _format_output({mac: mac, cipher: cipher}, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_secretbox_easy(message, nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output cipher (buf) + + var cipher_length = (message_length + libsodium._crypto_secretbox_macbytes()) | 0, + cipher = new AllocatedBuf(cipher_length), + cipher_address = cipher.address; + + address_pool.push(cipher_address); + + if ((libsodium._crypto_secretbox_easy(cipher_address, message_address, message_length, 0, nonce_address, key_address) | 0) === 0) { + var ret = _format_output(cipher, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_secretbox_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_secretbox_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_secretbox_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_secretbox_open_detached(ciphertext, mac, nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (unsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address = _to_allocated_buf_address(ciphertext), + ciphertext_length = ciphertext.length; + address_pool.push(ciphertext_address); + + // ---------- input: mac (buf) + + mac = _any_to_Uint8Array(address_pool, mac, "mac"); + var mac_address, mac_length = (libsodium._crypto_secretbox_macbytes()) | 0; + if (mac.length !== mac_length) { + _free_and_throw_type_error(address_pool, "invalid mac length"); + } + mac_address = _to_allocated_buf_address(mac); + address_pool.push(mac_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_secretbox_open_detached(message_address, ciphertext_address, mac_address, ciphertext_length, 0, nonce_address, key_address) | 0) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "wrong secret key for the given ciphertext"); +} + +export function crypto_secretbox_open_easy(ciphertext, nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: ciphertext (minsized_buf) + + ciphertext = _any_to_Uint8Array(address_pool, ciphertext, "ciphertext"); + var ciphertext_address, ciphertext_min_length = libsodium._crypto_secretbox_macbytes(), ciphertext_length = ciphertext.length; + if (ciphertext_length < ciphertext_min_length) { + _free_and_throw_type_error(address_pool, "ciphertext is too short"); + } + ciphertext_address = _to_allocated_buf_address(ciphertext); + address_pool.push(ciphertext_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_secretbox_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_secretbox_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output message (buf) + + var message_length = (ciphertext_length - libsodium._crypto_secretbox_macbytes()) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_secretbox_open_easy(message_address, ciphertext_address, ciphertext_length, 0, nonce_address, key_address) | 0) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "wrong secret key for the given ciphertext"); +} + +export function crypto_secretstream_xchacha20poly1305_init_pull(header, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: header (buf) + + header = _any_to_Uint8Array(address_pool, header, "header"); + var header_address, header_length = (libsodium._crypto_secretstream_xchacha20poly1305_headerbytes()) | 0; + if (header.length !== header_length) { + _free_and_throw_type_error(address_pool, "invalid header length"); + } + header_address = _to_allocated_buf_address(header); + address_pool.push(header_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_secretstream_xchacha20poly1305_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output state (secretstream_xchacha20poly1305_state) + + var state_address = new AllocatedBuf(52).address; + + if ((libsodium._crypto_secretstream_xchacha20poly1305_init_pull(state_address, header_address, key_address) | 0) === 0) { + var ret = state_address; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_secretstream_xchacha20poly1305_init_push(key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_secretstream_xchacha20poly1305_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output state (secretstream_xchacha20poly1305_state) + + var state_address = new AllocatedBuf(52).address; + + // ---------- output header (buf) + + var header_length = (libsodium._crypto_secretstream_xchacha20poly1305_headerbytes()) | 0, + header = new AllocatedBuf(header_length), + header_address = header.address; + + address_pool.push(header_address); + + if ((libsodium._crypto_secretstream_xchacha20poly1305_init_push(state_address, header_address, key_address) | 0) === 0) { + var ret = { state: state_address, header: _format_output(header, outputFormat) }; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_secretstream_xchacha20poly1305_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_secretstream_xchacha20poly1305_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_secretstream_xchacha20poly1305_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_secretstream_xchacha20poly1305_pull(state_address, cipher, ad, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (secretstream_xchacha20poly1305_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: cipher (minsized_buf) + + cipher = _any_to_Uint8Array(address_pool, cipher, "cipher"); + var cipher_address, cipher_min_length = libsodium._crypto_secretstream_xchacha20poly1305_abytes(), cipher_length = cipher.length; + if (cipher_length < cipher_min_length) { + _free_and_throw_type_error(address_pool, "cipher is too short"); + } + cipher_address = _to_allocated_buf_address(cipher); + address_pool.push(cipher_address); + + // ---------- input: ad (unsized_buf_optional) + + var ad_address = null, ad_length = 0; + if (ad != undefined) { + ad = _any_to_Uint8Array(address_pool, ad, "ad"); + ad_address = _to_allocated_buf_address(ad); + ad_length = ad.length; + address_pool.push(ad_address); + } + + // ---------- output message_chunk (buf) + + var message_chunk_length = (cipher_length - libsodium._crypto_secretstream_xchacha20poly1305_abytes()) | 0, + message_chunk = new AllocatedBuf(message_chunk_length), + message_chunk_address = message_chunk.address; + + address_pool.push(message_chunk_address); + + var ret = (function() { var tag_p = _malloc(1); address_pool.push(tag_p); return libsodium._crypto_secretstream_xchacha20poly1305_pull(state_address, message_chunk_address, 0, tag_p, cipher_address, cipher_length, 0, ad_address, ad_length) === 0 && { tag: libsodium.HEAPU8[tag_p], message: message_chunk } } )(); + var ret = (ret && {message: _format_output(ret.message, outputFormat), tag: ret.tag}); + _free_all(address_pool); + return ret; +} + +export function crypto_secretstream_xchacha20poly1305_push(state_address, message_chunk, ad, tag, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (secretstream_xchacha20poly1305_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: message_chunk (unsized_buf) + + message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); + var message_chunk_address = _to_allocated_buf_address(message_chunk), + message_chunk_length = message_chunk.length; + address_pool.push(message_chunk_address); + + // ---------- input: ad (unsized_buf_optional) + + var ad_address = null, ad_length = 0; + if (ad != undefined) { + ad = _any_to_Uint8Array(address_pool, ad, "ad"); + ad_address = _to_allocated_buf_address(ad); + ad_length = ad.length; + address_pool.push(ad_address); + } + + // ---------- input: tag (uint) + + _require_defined(address_pool, tag, "tag"); + + if (!(typeof tag === "number" && (tag | 0) === tag) || tag < 0) { + _free_and_throw_type_error(address_pool, "tag must be an unsigned integer"); + } + + // ---------- output cipher (buf) + + var cipher_length = (message_chunk_length + libsodium._crypto_secretstream_xchacha20poly1305_abytes()) | 0, + cipher = new AllocatedBuf(cipher_length), + cipher_address = cipher.address; + + address_pool.push(cipher_address); + + if ((libsodium._crypto_secretstream_xchacha20poly1305_push(state_address, cipher_address, 0, message_chunk_address, message_chunk_length, 0, ad_address, ad_length, 0, tag) | 0) === 0) { + var ret = _format_output(cipher, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_secretstream_xchacha20poly1305_rekey(state_address, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (secretstream_xchacha20poly1305_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + libsodium._crypto_secretstream_xchacha20poly1305_rekey(state_address); + var ret = (true); + _free_all(address_pool); + return ret; +} + +export function crypto_shorthash(message, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_shorthash_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_shorthash_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_shorthash(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_shorthash_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_shorthash_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_shorthash_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_shorthash_siphashx24(message, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_shorthash_siphashx24_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output hash (buf) + + var hash_length = (libsodium._crypto_shorthash_siphashx24_bytes()) | 0, + hash = new AllocatedBuf(hash_length), + hash_address = hash.address; + + address_pool.push(hash_address); + + if ((libsodium._crypto_shorthash_siphashx24(hash_address, message_address, message_length, 0, key_address) | 0) === 0) { + var ret = _format_output(hash, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_sign(message, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output signature (buf) + + var signature_length = (message.length + libsodium._crypto_sign_bytes()) | 0, + signature = new AllocatedBuf(signature_length), + signature_address = signature.address; + + address_pool.push(signature_address); + + if ((libsodium._crypto_sign(signature_address, null, message_address, message_length, 0, privateKey_address) | 0) === 0) { + var ret = _format_output(signature, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_sign_detached(message, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output signature (buf) + + var signature_length = (libsodium._crypto_sign_bytes()) | 0, + signature = new AllocatedBuf(signature_length), + signature_address = signature.address; + + address_pool.push(signature_address); + + if ((libsodium._crypto_sign_detached(signature_address, null, message_address, message_length, 0, privateKey_address) | 0) === 0) { + var ret = _format_output(signature, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_sign_ed25519_pk_to_curve25519(edPk, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: edPk (buf) + + edPk = _any_to_Uint8Array(address_pool, edPk, "edPk"); + var edPk_address, edPk_length = (libsodium._crypto_sign_publickeybytes()) | 0; + if (edPk.length !== edPk_length) { + _free_and_throw_type_error(address_pool, "invalid edPk length"); + } + edPk_address = _to_allocated_buf_address(edPk); + address_pool.push(edPk_address); + + // ---------- output cPk (buf) + + var cPk_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0, + cPk = new AllocatedBuf(cPk_length), + cPk_address = cPk.address; + + address_pool.push(cPk_address); + + if ((libsodium._crypto_sign_ed25519_pk_to_curve25519(cPk_address, edPk_address) | 0) === 0) { + var ret = _format_output(cPk, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid key"); +} + +export function crypto_sign_ed25519_sk_to_curve25519(edSk, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: edSk (buf) + + edSk = _any_to_Uint8Array(address_pool, edSk, "edSk"); + var edSk_address, edSk_length = (libsodium._crypto_sign_secretkeybytes()) | 0; + if (edSk.length !== edSk_length) { + _free_and_throw_type_error(address_pool, "invalid edSk length"); + } + edSk_address = _to_allocated_buf_address(edSk); + address_pool.push(edSk_address); + + // ---------- output cSk (buf) + + var cSk_length = (libsodium._crypto_scalarmult_scalarbytes()) | 0, + cSk = new AllocatedBuf(cSk_length), + cSk_address = cSk.address; + + address_pool.push(cSk_address); + + if ((libsodium._crypto_sign_ed25519_sk_to_curve25519(cSk_address, edSk_address) | 0) === 0) { + var ret = _format_output(cSk, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid key"); +} + +export function crypto_sign_ed25519_sk_to_pk(privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + if ((libsodium._crypto_sign_ed25519_sk_to_pk(publicKey_address, privateKey_address) | 0) === 0) { + var ret = _format_output(publicKey, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid key"); +} + +export function crypto_sign_ed25519_sk_to_seed(privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output seed (buf) + + var seed_length = (libsodium._crypto_sign_seedbytes()) | 0, + seed = new AllocatedBuf(seed_length), + seed_address = seed.address; + + address_pool.push(seed_address); + + if ((libsodium._crypto_sign_ed25519_sk_to_seed(seed_address, privateKey_address) | 0) === 0) { + var ret = _format_output(seed, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid key"); +} + +export function crypto_sign_final_create(state_address, privateKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (sign_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: privateKey (buf) + + privateKey = _any_to_Uint8Array(address_pool, privateKey, "privateKey"); + var privateKey_address, privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0; + if (privateKey.length !== privateKey_length) { + _free_and_throw_type_error(address_pool, "invalid privateKey length"); + } + privateKey_address = _to_allocated_buf_address(privateKey); + address_pool.push(privateKey_address); + + // ---------- output signature (buf) + + var signature_length = (libsodium._crypto_sign_bytes()) | 0, + signature = new AllocatedBuf(signature_length), + signature_address = signature.address; + + address_pool.push(signature_address); + + if ((libsodium._crypto_sign_final_create(state_address, signature_address, null, privateKey_address) | 0) === 0) { + var ret = (libsodium._free(state_address), _format_output(signature, outputFormat)); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_sign_final_verify(state_address, signature, publicKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (sign_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: signature (buf) + + signature = _any_to_Uint8Array(address_pool, signature, "signature"); + var signature_address, signature_length = (libsodium._crypto_sign_bytes()) | 0; + if (signature.length !== signature_length) { + _free_and_throw_type_error(address_pool, "invalid signature length"); + } + signature_address = _to_allocated_buf_address(signature); + address_pool.push(signature_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + var verificationResult = libsodium._crypto_sign_final_verify(state_address, signature_address, publicKey_address) | 0; + var ret = (verificationResult === 0); + _free_all(address_pool); + return ret; +} + +export function crypto_sign_init(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output state (sign_state) + + var state_address = new AllocatedBuf(208).address; + + if ((libsodium._crypto_sign_init(state_address) | 0) === 0) { + var ret = state_address; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "internal error"); +} + +export function crypto_sign_keypair(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + // ---------- output privateKey (buf) + + var privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0, + privateKey = new AllocatedBuf(privateKey_length), + privateKey_address = privateKey.address; + + address_pool.push(privateKey_address); + + if ((libsodium._crypto_sign_keypair(publicKey_address, privateKey_address) | 0) === 0) { + var ret = {publicKey: _format_output(publicKey, outputFormat), privateKey: _format_output(privateKey, outputFormat), keyType: 'ed25519'}; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "internal error"); +} + +export function crypto_sign_open(signedMessage, publicKey, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: signedMessage (minsized_buf) + + signedMessage = _any_to_Uint8Array(address_pool, signedMessage, "signedMessage"); + var signedMessage_address, signedMessage_min_length = libsodium._crypto_sign_bytes(), signedMessage_length = signedMessage.length; + if (signedMessage_length < signedMessage_min_length) { + _free_and_throw_type_error(address_pool, "signedMessage is too short"); + } + signedMessage_address = _to_allocated_buf_address(signedMessage); + address_pool.push(signedMessage_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + // ---------- output message (buf) + + var message_length = (signedMessage_length - libsodium._crypto_sign_bytes()) | 0, + message = new AllocatedBuf(message_length), + message_address = message.address; + + address_pool.push(message_address); + + if ((libsodium._crypto_sign_open(message_address, null, signedMessage_address, signedMessage_length, 0, publicKey_address) | 0) === 0) { + var ret = _format_output(message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "incorrect signature for the given public key"); +} + +export function crypto_sign_seed_keypair(seed, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: seed (buf) + + seed = _any_to_Uint8Array(address_pool, seed, "seed"); + var seed_address, seed_length = (libsodium._crypto_sign_seedbytes()) | 0; + if (seed.length !== seed_length) { + _free_and_throw_type_error(address_pool, "invalid seed length"); + } + seed_address = _to_allocated_buf_address(seed); + address_pool.push(seed_address); + + // ---------- output publicKey (buf) + + var publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0, + publicKey = new AllocatedBuf(publicKey_length), + publicKey_address = publicKey.address; + + address_pool.push(publicKey_address); + + // ---------- output privateKey (buf) + + var privateKey_length = (libsodium._crypto_sign_secretkeybytes()) | 0, + privateKey = new AllocatedBuf(privateKey_length), + privateKey_address = privateKey.address; + + address_pool.push(privateKey_address); + + if ((libsodium._crypto_sign_seed_keypair(publicKey_address, privateKey_address, seed_address) | 0) === 0) { + var ret = {publicKey: _format_output(publicKey, outputFormat), privateKey: _format_output(privateKey, outputFormat), keyType: 'ed25519'}; + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_sign_update(state_address, message_chunk, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: state_address (sign_state_address) + + _require_defined(address_pool, state_address, "state_address"); + + // ---------- input: message_chunk (unsized_buf) + + message_chunk = _any_to_Uint8Array(address_pool, message_chunk, "message_chunk"); + var message_chunk_address = _to_allocated_buf_address(message_chunk), + message_chunk_length = message_chunk.length; + address_pool.push(message_chunk_address); + + if (!((libsodium._crypto_sign_update(state_address, message_chunk_address, message_chunk_length, 0) | 0) === 0)) { + _free_and_throw_error(address_pool, "invalid usage"); + } + _free_all(address_pool); +} + +export function crypto_sign_verify_detached(signature, message, publicKey) { + var address_pool = []; + + // ---------- input: signature (buf) + + signature = _any_to_Uint8Array(address_pool, signature, "signature"); + var signature_address, signature_length = (libsodium._crypto_sign_bytes()) | 0; + if (signature.length !== signature_length) { + _free_and_throw_type_error(address_pool, "invalid signature length"); + } + signature_address = _to_allocated_buf_address(signature); + address_pool.push(signature_address); + + // ---------- input: message (unsized_buf) + + message = _any_to_Uint8Array(address_pool, message, "message"); + var message_address = _to_allocated_buf_address(message), + message_length = message.length; + address_pool.push(message_address); + + // ---------- input: publicKey (buf) + + publicKey = _any_to_Uint8Array(address_pool, publicKey, "publicKey"); + var publicKey_address, publicKey_length = (libsodium._crypto_sign_publickeybytes()) | 0; + if (publicKey.length !== publicKey_length) { + _free_and_throw_type_error(address_pool, "invalid publicKey length"); + } + publicKey_address = _to_allocated_buf_address(publicKey); + address_pool.push(publicKey_address); + + var verificationResult = libsodium._crypto_sign_verify_detached(signature_address, message_address, message_length, 0, publicKey_address) | 0; + var ret = (verificationResult === 0); + _free_all(address_pool); + return ret; +} + +export function crypto_stream_chacha20(outLength, key, nonce, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: outLength (uint) + + _require_defined(address_pool, outLength, "outLength"); + + if (!(typeof outLength === "number" && (outLength | 0) === outLength) || outLength < 0) { + _free_and_throw_type_error(address_pool, "outLength must be an unsigned integer"); + } + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_stream_chacha20_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_stream_chacha20_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- output out (buf) + + var out_length = (outLength) | 0, + out = new AllocatedBuf(out_length), + out_address = out.address; + + address_pool.push(out_address); + + libsodium._crypto_stream_chacha20(out_address, outLength, 0, nonce_address, key_address) | 0; + var ret = (_format_output(out, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_stream_chacha20_ietf_xor(input_message, nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: input_message (unsized_buf) + + input_message = _any_to_Uint8Array(address_pool, input_message, "input_message"); + var input_message_address = _to_allocated_buf_address(input_message), + input_message_length = input_message.length; + address_pool.push(input_message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_stream_chacha20_ietf_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_stream_chacha20_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output output_message (buf) + + var output_message_length = (input_message_length) | 0, + output_message = new AllocatedBuf(output_message_length), + output_message_address = output_message.address; + + address_pool.push(output_message_address); + + if ((libsodium._crypto_stream_chacha20_ietf_xor(output_message_address, input_message_address, input_message_length, 0, nonce_address, key_address)) === 0) { + var ret = _format_output(output_message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_stream_chacha20_ietf_xor_ic(input_message, nonce, nonce_increment, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: input_message (unsized_buf) + + input_message = _any_to_Uint8Array(address_pool, input_message, "input_message"); + var input_message_address = _to_allocated_buf_address(input_message), + input_message_length = input_message.length; + address_pool.push(input_message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_stream_chacha20_ietf_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: nonce_increment (uint) + + _require_defined(address_pool, nonce_increment, "nonce_increment"); + + if (!(typeof nonce_increment === "number" && (nonce_increment | 0) === nonce_increment) || nonce_increment < 0) { + _free_and_throw_type_error(address_pool, "nonce_increment must be an unsigned integer"); + } + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_stream_chacha20_ietf_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output output_message (buf) + + var output_message_length = (input_message_length) | 0, + output_message = new AllocatedBuf(output_message_length), + output_message_address = output_message.address; + + address_pool.push(output_message_address); + + if ((libsodium._crypto_stream_chacha20_ietf_xor_ic(output_message_address, input_message_address, input_message_length, 0, nonce_address, nonce_increment, key_address)) === 0) { + var ret = _format_output(output_message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_stream_chacha20_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_stream_chacha20_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_stream_chacha20_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_stream_chacha20_xor(input_message, nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: input_message (unsized_buf) + + input_message = _any_to_Uint8Array(address_pool, input_message, "input_message"); + var input_message_address = _to_allocated_buf_address(input_message), + input_message_length = input_message.length; + address_pool.push(input_message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_stream_chacha20_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_stream_chacha20_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output output_message (buf) + + var output_message_length = (input_message_length) | 0, + output_message = new AllocatedBuf(output_message_length), + output_message_address = output_message.address; + + address_pool.push(output_message_address); + + if ((libsodium._crypto_stream_chacha20_xor(output_message_address, input_message_address, input_message_length, 0, nonce_address, key_address)) === 0) { + var ret = _format_output(output_message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_stream_chacha20_xor_ic(input_message, nonce, nonce_increment, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: input_message (unsized_buf) + + input_message = _any_to_Uint8Array(address_pool, input_message, "input_message"); + var input_message_address = _to_allocated_buf_address(input_message), + input_message_length = input_message.length; + address_pool.push(input_message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_stream_chacha20_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: nonce_increment (uint) + + _require_defined(address_pool, nonce_increment, "nonce_increment"); + + if (!(typeof nonce_increment === "number" && (nonce_increment | 0) === nonce_increment) || nonce_increment < 0) { + _free_and_throw_type_error(address_pool, "nonce_increment must be an unsigned integer"); + } + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_stream_chacha20_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output output_message (buf) + + var output_message_length = (input_message_length) | 0, + output_message = new AllocatedBuf(output_message_length), + output_message_address = output_message.address; + + address_pool.push(output_message_address); + + if ((libsodium._crypto_stream_chacha20_xor_ic(output_message_address, input_message_address, input_message_length, 0, nonce_address, nonce_increment, 0, key_address)) === 0) { + var ret = _format_output(output_message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_stream_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_stream_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_stream_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_stream_xchacha20_keygen(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- output output (buf) + + var output_length = (libsodium._crypto_stream_xchacha20_keybytes()) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._crypto_stream_xchacha20_keygen(output_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function crypto_stream_xchacha20_xor(input_message, nonce, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: input_message (unsized_buf) + + input_message = _any_to_Uint8Array(address_pool, input_message, "input_message"); + var input_message_address = _to_allocated_buf_address(input_message), + input_message_length = input_message.length; + address_pool.push(input_message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_stream_xchacha20_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_stream_xchacha20_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output output_message (buf) + + var output_message_length = (input_message_length) | 0, + output_message = new AllocatedBuf(output_message_length), + output_message_address = output_message.address; + + address_pool.push(output_message_address); + + if ((libsodium._crypto_stream_xchacha20_xor(output_message_address, input_message_address, input_message_length, 0, nonce_address, key_address)) === 0) { + var ret = _format_output(output_message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function crypto_stream_xchacha20_xor_ic(input_message, nonce, nonce_increment, key, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: input_message (unsized_buf) + + input_message = _any_to_Uint8Array(address_pool, input_message, "input_message"); + var input_message_address = _to_allocated_buf_address(input_message), + input_message_length = input_message.length; + address_pool.push(input_message_address); + + // ---------- input: nonce (buf) + + nonce = _any_to_Uint8Array(address_pool, nonce, "nonce"); + var nonce_address, nonce_length = (libsodium._crypto_stream_xchacha20_noncebytes()) | 0; + if (nonce.length !== nonce_length) { + _free_and_throw_type_error(address_pool, "invalid nonce length"); + } + nonce_address = _to_allocated_buf_address(nonce); + address_pool.push(nonce_address); + + // ---------- input: nonce_increment (uint) + + _require_defined(address_pool, nonce_increment, "nonce_increment"); + + if (!(typeof nonce_increment === "number" && (nonce_increment | 0) === nonce_increment) || nonce_increment < 0) { + _free_and_throw_type_error(address_pool, "nonce_increment must be an unsigned integer"); + } + + // ---------- input: key (buf) + + key = _any_to_Uint8Array(address_pool, key, "key"); + var key_address, key_length = (libsodium._crypto_stream_xchacha20_keybytes()) | 0; + if (key.length !== key_length) { + _free_and_throw_type_error(address_pool, "invalid key length"); + } + key_address = _to_allocated_buf_address(key); + address_pool.push(key_address); + + // ---------- output output_message (buf) + + var output_message_length = (input_message_length) | 0, + output_message = new AllocatedBuf(output_message_length), + output_message_address = output_message.address; + + address_pool.push(output_message_address); + + if ((libsodium._crypto_stream_xchacha20_xor_ic(output_message_address, input_message_address, input_message_length, 0, nonce_address, nonce_increment, 0, key_address)) === 0) { + var ret = _format_output(output_message, outputFormat); + _free_all(address_pool); + return ret; + } + _free_and_throw_error(address_pool, "invalid usage"); +} + +export function randombytes_buf(length, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: length (uint) + + _require_defined(address_pool, length, "length"); + + if (!(typeof length === "number" && (length | 0) === length) || length < 0) { + _free_and_throw_type_error(address_pool, "length must be an unsigned integer"); + } + + // ---------- output output (buf) + + var output_length = (length) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._randombytes_buf(output_address, length); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function randombytes_buf_deterministic(length, seed, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: length (uint) + + _require_defined(address_pool, length, "length"); + + if (!(typeof length === "number" && (length | 0) === length) || length < 0) { + _free_and_throw_type_error(address_pool, "length must be an unsigned integer"); + } + + // ---------- input: seed (buf) + + seed = _any_to_Uint8Array(address_pool, seed, "seed"); + var seed_address, seed_length = (libsodium._randombytes_seedbytes()) | 0; + if (seed.length !== seed_length) { + _free_and_throw_type_error(address_pool, "invalid seed length"); + } + seed_address = _to_allocated_buf_address(seed); + address_pool.push(seed_address); + + // ---------- output output (buf) + + var output_length = (length) | 0, + output = new AllocatedBuf(output_length), + output_address = output.address; + + address_pool.push(output_address); + + libsodium._randombytes_buf_deterministic(output_address, length, seed_address); + var ret = (_format_output(output, outputFormat)); + _free_all(address_pool); + return ret; +} + +export function randombytes_close(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + libsodium._randombytes_close(); +} + +export function randombytes_random(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + var random_value = libsodium._randombytes_random() >>> 0; + var ret = (random_value); + _free_all(address_pool); + return ret; +} + +export function randombytes_set_implementation(implementation, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: implementation (randombytes_implementation) + + var implementation_address = libsodium._malloc(6 * 4); + for (var i = 0; i < 6; i++) { + libsodium.setValue(implementation_address + i * 4, + libsodium.Runtime.addFunction(implementation + [["implementation_name", "random", "stir", "uniform", "buf", "close"][i]]), + "i32"); + } + + if (!((libsodium._randombytes_set_implementation(implementation_address) | 0) === 0)) { + _free_and_throw_error(address_pool, "unsupported implementation"); + } + _free_all(address_pool); +} + +export function randombytes_stir(outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + libsodium._randombytes_stir(); +} + +export function randombytes_uniform(upper_bound, outputFormat) { + var address_pool = []; + + _check_output_format(outputFormat); + // ---------- input: upper_bound (uint) + + _require_defined(address_pool, upper_bound, "upper_bound"); + + if (!(typeof upper_bound === "number" && (upper_bound | 0) === upper_bound) || upper_bound < 0) { + _free_and_throw_type_error(address_pool, "upper_bound must be an unsigned integer"); + } + + var random_value = libsodium._randombytes_uniform(upper_bound) >>> 0; + var ret = (random_value); + _free_all(address_pool); + return ret; +} + +export function sodium_version_string() { + var address_pool = []; + + var version = libsodium._sodium_version_string(); + var ret = (libsodium.UTF8ToString(version)); + _free_all(address_pool); + return ret; +} + + + +/* Test to make sure everything works. */ +try { + var message = new Uint8Array([98, 97, 108, 108, 115]); + var nonce = randombytes_buf(crypto_secretbox_NONCEBYTES); + var key = randombytes_buf(crypto_secretbox_KEYBYTES); + var encrypted = crypto_secretbox_easy(message, nonce, key); + var decrypted = crypto_secretbox_open_easy(encrypted, nonce, key); + + if (!memcmp(message, decrypted)) { + throw new Error("Init test failed"); + } +} +catch (err) { + throw new Error("Failed to load" + err) +} diff --git a/dist/modules/libsodium.esm.js b/dist/modules/libsodium.esm.js new file mode 100644 index 00000000..4d1f837b --- /dev/null +++ b/dist/modules/libsodium.esm.js @@ -0,0 +1,16 @@ + +var Module = (() => { + var _scriptName = import.meta.url; + + return ( +function(moduleArg = {}) { + var moduleRtn; + +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";var read_,readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))}).then(onload,onerror)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];function intArrayFromBase64(s){var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;ifilename.startsWith(dataURIPrefix);function findWasmBinary(){var f="data:application/octet-stream;base64,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rCIEIAE0AiAiCn58IAIoAiQiAkETbKwiBSABKAIcIgFBAXSsIhl+fCAHIAt+IAMgK6wiGn58IA0gLqwiG358IAggEH58IBEgMawiHH58IAkgFn58IDJBE2ysIg4gNKwiHX58IAogDH58IAQgAawiHn58IAUgBn58IAsgFX4gAyAHfnwgCCANfnwgECAXfnwgCSARfnwgMEETbKwiHyAYfnwgCiAOfnwgDCAZfnwgBCAGfnwgBSAUfnwiIkKAgIAQfCIjQhqHfCIkQoCAgAh8IiVCGYd8IhIgEkKAgIAQfCITQoCAgOAPg30+AhggACALIBd+IAMgCH58IAkgDX58IC1BE2ysIg8gGH58IAogL0ETbKwiEn58IBkgH358IAYgDn58IAwgFH58IAQgB358IAUgFX58IAkgC34gAyAcfnwgLEETbKwiISAdfnwgCiAPfnwgEiAefnwgBiAffnwgDiAafnwgByAMfnwgBCAbfnwgBSAIfnwgKkETbKwgGH4gAyAJfnwgCiAhfnwgDyAZfnwgBiASfnwgFCAffnwgByAOfnwgDCAVfnwgBCAIfnwgBSAXfnwiIUKAgIAQfCImQhqHfCInQoCAgAh8IihCGYd8Ig8gD0KAgIAQfCIpQoCAgOAPg30+AgggACAGIAt+IAMgHn58IA0gGn58IAcgEH58IBEgG358IAggFn58IBwgIH58IAkgM6wiD358IAQgHX58IAUgCn58IBNCGod8IhMgE0KAgIAIfCITQoCAgPAPg30+AhwgACAIIAt+IAMgG358IA0gHH58IAkgEH58IBIgHX58IAogH358IA4gHn58IAYgDH58IAQgGn58IAUgB358IClCGod8IgQgBEKAgIAIfCIEQoCAgPAPg30+AgwgACALIBl+IAMgCn58IAYgDX58IBAgFH58IAcgEX58IBUgFn58IAggIH58IA8gF358IAkgNawiDH58IAUgGH58IBNCGYd8IgUgBUKAgIAQfCIFQoCAgOAPg30+AiAgACAkICVCgICA8A+DfSAiICNCgICAYIN9IARCGYd8IgRCgICAEHwiDkIaiHw+AhQgACAEIA5CgICA4A+DfT4CECAAIAogC34gAyAdfnwgDSAefnwgBiAQfnwgESAafnwgByAWfnwgGyAgfnwgCCAPfnwgDCAcfnwgCSACrH58IAVCGod8IgMg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IAmnai0AADoAACAKIANCAoQiCSAEfKdqIAEgCadqLQAAOgAAIAogA0IDhCIJIAR8p2ogASAJp2otAAA6AAAgA0IEfCEDIAVCBHwiBSAHUg0ACwsgCEIDgyIFQgBSBEADQCAKIAMgBHynaiABIAOnai0AADoAACADQgF8IQMgBkIBfCIGIAVSDQALCyAAIAogCyALQYAFaiIMECwgASAIp2ohASACIAh9IgJC/wBWBEADQCAAIAEgCyAMECwgAUGAAWohASACQoABfSICQv8AVg0ACwsCQCACUA0AIAJCA4MhBEIAIQZCACEDIAJCBFoEQCACQvwAgyEFQgAhAgNAIAogA6ciAGogACABai0AADoAACAKIABBAXIiDGogASAMai0AADoAACAKIABBAnIiDGogASAMai0AADoAACAKIABBA3IiAGogACABai0AADoAACADQgR8IQMgAkIEfCICIAVSDQALCyAEUA0AA0AgCiADpyIAaiAAIAFqLQAAOgAAIANCAXwhAyAGQgF8IgYgBFINAAsLIAtBwAUQCAwBC0IAIQMgAkIEWgRAIAJCfIMhCANAIAogAyAEfKdqIAEgA6dqLQAAOgAAIAogA0IBhCIHIAR8p2ogASAHp2otAAA6AAAgCiADQgKEIgcgBHynaiABIAenai0AADoAACAKIANCA4QiByAEfKdqIAEgB6dqLQAAOgAAIANCBHwhAyAFQgR8IgUgCFINAAsLIAJCA4MiAlANAANAIAogAyAEfKdqIAEgA6dqLQAAOgAAIANCAXwhAyAGQgF8IgYgAlINAAsLIAtBwAVqJABBAAufBAETfyABKAIEIQIgASgCLCEDIAEoAgghBCABKAIwIQUgASgCDCEGIAEoAjQhByABKAIQIQggASgCOCEJIAEoAhQhCiABKAI8IQsgASgCGCEMIAFBQGsiDSgCACEOIAEoAhwhDyABKAJEIRAgASgCICERIAEoAkghEiABKAIkIRMgASgCTCEUIAAgASgCACABKAIoajYCACAAIBMgFGo2AiQgACARIBJqNgIgIAAgDyAQajYCHCAAIAwgDmo2AhggACAKIAtqNgIUIAAgCCAJajYCECAAIAYgB2o2AgwgACAEIAVqNgIIIAAgAiADajYCBCABKAIEIQIgASgCLCEDIAEoAgghBCABKAIwIQUgASgCDCEGIAEoAjQhByABKAIQIQggASgCOCEJIAEoAhQhCiABKAI8IQsgASgCGCEMIA0oAgAhDSABKAIcIQ4gASgCRCEPIAEoAiAhECABKAJIIREgASgCACESIAEoAighEyAAIAEoAkwgASgCJGs2AkwgACARIBBrNgJIIAAgDyAOazYCRCAAQUBrIA0gDGs2AgAgACALIAprNgI8IAAgCSAIazYCOCAAIAcgBms2AjQgACAFIARrNgIwIAAgAyACazYCLCAAIBMgEms2AiggACABKQJQNwJQIAAgASkCWDcCWCAAIAEpAmA3AmAgACABKQJoNwJoIAAgASkCcDcCcCAAQfgAaiABQfgAakGQCxAGC/AJAR1/IAEoAgQhBCABKAIsIQMgASgCCCEFIAEoAjAhBiABKAIMIQcgASgCNCEIIAEoAhAhCSABKAI4IQogASgCFCELIAEoAjwhDCABKAIYIQ0gAUFAayIOKAIAIQ8gASgCHCEQIAEoAkQhESABKAIgIRIgASgCSCETIAEoAiQhFCABKAJMIRUgACABKAIAIAEoAihqNgIAIAAgFCAVajYCJCAAIBIgE2o2AiAgACAQIBFqNgIcIAAgDSAPajYCGCAAIAsgDGo2AhQgACAJIApqNgIQIAAgByAIajYCDCAAIAUgBmo2AgggACADIARqNgIEIAEoAgQhAyABKAIsIQUgASgCCCEGIAEoAjAhByABKAIMIQggASgCNCEJIAEoAhAhCiABKAI4IQsgASgCFCEMIAEoAjwhDSABKAIYIQ8gDigCACEOIAEoAhwhBCABKAJEIRAgASgCICERIAEoAkghEiABKAIAIRMgASgCKCEUIAAgASgCTCABKAIkazYCTCAAIBIgEWs2AkggACAQIARrNgJEIABBQGsiBCAOIA9rNgIAIAAgDSAMazYCPCAAIAsgCms2AjggACAJIAhrNgI0IAAgByAGazYCMCAAIAUgA2s2AiwgACAUIBNrNgIoIABB0ABqIAAgAhAGIABBKGoiAyADIAJBKGoQBiAAQfgAaiACQfgAaiABQfgAahAGIAAgAUHQAGogAkHQAGoQBiAAKAIEIRQgACgCCCEVIAAoAgwhFiAAKAIQIRcgACgCFCEYIAAoAhghGSAAKAIcIRogACgCICEbIAAoAiQhHCAAKAIsIQEgACgCVCECIAAoAjAhAyAAKAJYIQUgACgCNCEGIAAoAlwhByAAKAI4IQggACgCYCEJIAAoAjwhCiAAKAJkIQsgBCgCACEMIAAoAmghDSAAKAJEIQ4gACgCbCEPIAAoAkghECAAKAJwIREgACgCACEdIAAoAighEiAAKAJQIRMgACAAKAJMIh4gACgCdCIfajYCTCAAIBAgEWo2AkggACAOIA9qNgJEIAQgDCANajYCACAAIAogC2o2AjwgACAIIAlqNgI4IAAgBiAHajYCNCAAIAMgBWo2AjAgACABIAJqNgIsIAAgEiATajYCKCAAIB8gHms2AiQgACARIBBrNgIgIAAgDyAOazYCHCAAIA0gDGs2AhggACALIAprNgIUIAAgCSAIazYCECAAIAcgBms2AgwgACAFIANrNgIIIAAgAiABazYCBCAAIBMgEms2AgAgACAcQQF0IgEgACgCnAEiAms2ApwBIAAgG0EBdCIEIAAoApgBIgNrNgKYASAAIBpBAXQiBSAAKAKUASIGazYClAEgACAZQQF0IgcgACgCkAEiCGs2ApABIAAgGEEBdCIJIAAoAowBIgprNgKMASAAIBdBAXQiCyAAKAKIASIMazYCiAEgACAWQQF0Ig0gACgChAEiDms2AoQBIAAgFUEBdCIPIAAoAoABIhBrNgKAASAAIBRBAXQiESAAKAJ8IhJrNgJ8IAAgHUEBdCITIAAoAngiFGs2AnggACADIARqNgJwIAAgBSAGajYCbCAAIAcgCGo2AmggACAJIApqNgJkIAAgCyAMajYCYCAAIA0gDmo2AlwgACAPIBBqNgJYIAAgESASajYCVCAAIBMgFGo2AlAgACABIAJqNgJ0CwQAQRAL1AECBX8CfgJ/IAJCAFIEQCAAQeABaiEHIABB4ABqIQMgACgA4AIhBANAIAMgBGohBkGAAiAEayIFrSIIIAJaBEAgBiABIAKnIgEQChogACAAKADgAiABajYA4AJBAAwDCyAGIAEgBRAKGiAAIAAoAOACIAVqNgDgAiAAIAApAEAiCUKAAXw3AEAgACAAKQBIIAlC/35WrXw3AEggACADEDwgAyAHQYABEAoaIAAgACgA4AJBgAFrIgQ2AOACIAEgBWohASACIAh9IgJCAFINAAsLQQALCw0AIAAgASACEA0aQQALCAAgAEEgEBcLvQgCAX4DfyMAQcAFayIDJAAgACAAKAJIQQN2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IAEoAjghJSABKAIQISYgASgCPCEnIAEoAhQhKCABQUBrKAIAISkgASgCGCEqIAEoAkQhKyABKAIcISwgASgCSCEtIAEoAiAhLiABKAIoIS8gASgCACEwIAAgASgCTCABKAIkajYCTCAAIC0gLmo2AkggACArICxqNgJEIABBQGsiMSApICpqNgIAIAAgJyAoajYCPCAAICUgJmo2AjggACAjICRqNgI0IAAgISAiajYCMCAAIB8gIGo2AiwgACAvIDBqNgIoIB4gAEEoahAFIAAoAgQhASAAKAJUIR8gACgCCCEgIAAoAlghISAAKAIMISIgACgCXCEjIAAoAhAhJCAAKAJgISUgACgCFCEmIAAoAmQhJyAAKAIYISggACgCaCEpIAAoAhwhKiAAKAJsISsgACgCICEsIAAoAnAhLSAAKAIAIS4gACgCUCEvIAAgACgCdCIwIAAoAiQiMmsiMzYCdCAAIC0gLGsiNDYCcCAAICsgKmsiNTYCbCAAICkgKGsiNjYCaCAAICcgJmsiNzYCZCAAICUgJGsiODYCYCAAICMgImsiOTYCXCAAICEgIGsiOjYCWCAAIB8gAWsiOzYCVCAAIC8gLmsiPDYCUCAAIDAgMmoiMDYCTCAAICwgLWoiLDYCSCAAICogK2oiKjYCRCAxICggKWoiKDYCACAAICYgJ2oiJjYCPCAAICQgJWoiJDYCOCAAICIgI2oiIjYCNCAAICAgIWoiIDYCMCAAIAEgH2oiATYCLCAAIC4gL2oiHzYCKCAeKAIAISEgHigCBCEjIB4oAgghJSAeKAIMIScgHigCECEpIB4oAhQhKyAeKAIYIS0gHigCHCEuIB4oAiAhLyAAIB4oAiQgMGs2AiQgACAvICxrNgIgIAAgLiAqazYCHCAAIC0gKGs2AhggACArICZrNgIUIAAgKSAkazYCECAAICcgIms2AgwgACAlICBrNgIIIAAgIyABazYCBCAAICEgH2s2AgAgACgCfCEBIAAoAoABIR8gACgChAEhICAAKAKIASEhIAAoAowBISIgACgCkAEhIyAAKAKUASEkIAAoApgBISUgACgCeCEmIAAgACgCnAEgM2s2ApwBIAAgJSA0azYCmAEgACAkIDVrNgKUASAAICMgNms2ApABIAAgIiA3azYCjAEgACAhIDhrNgKIASAAICAgOWs2AoQBIAAgHyA6azYCgAEgACABIDtrNgJ8IAAgJiA8azYCeCAeQTBqJAALBABBAAsMACAAIAEgAhAqQQALcAAgAEIANwNAIABCADcDSCAAQfCIAikDADcDACAAQfiIAikDADcDCCAAQYCJAikDADcDECAAQYiJAikDADcDGCAAQZCJAikDADcDICAAQZiJAikDADcDKCAAQaCJAikDADcDMCAAQaiJAikDADcDOAskACABQoCAgIAQWgRAEAsACyAAIAEgAiADQcSbAigCABEOABoLBQBBwAALNwEBfyMAQUBqIgIkACAAIAIQFCAAQdABaiIAIAJCwAAQDRogACABEBQgAkHAABAIIAJBQGskAAvWBAEIfyMAQcABayIFJAAgAkGBAU8EQCAAEBsgACABIAKtEA0aIAAgBRAUQcAAIQIgBSEBCyAAEBsgBUFAa0E2QYABEAkaAkAgAkUNACACQQRPBEAgAkH8AXEhCgNAIAVBQGsiCCADaiIEIAQtAAAgASADai0AAHM6AAAgCCADQQFyIgRqIgYgBi0AACABIARqLQAAczoAACAIIANBAnIiBGoiBiAGLQAAIAEgBGotAABzOgAAIAggA0EDciIEaiIGIAYtAAAgASAEai0AAHM6AAAgA0EEaiEDIAdBBGoiByAKRw0ACwsgAkEDcSIHRQ0AA0AgBUFAayADaiIKIAotAAAgASADai0AAHM6AAAgA0EBaiEDIAlBAWoiCSAHRw0ACwsgACAFQUBrIgNCgAEQDRogAEHQAWoiABAbIANB3ABBgAEQCRoCQCACRQ0AQQAhCUEAIQMgAkEETwRAIAJB/AFxIQpBACEHA0AgBUFAayIIIANqIgQgBC0AACABIANqLQAAczoAACAIIANBAXIiBGoiBiAGLQAAIAEgBGotAABzOgAAIAggA0ECciIEaiIGIAYtAAAgASAEai0AAHM6AAAgCCADQQNyIgRqIgYgBi0AACABIARqLQAAczoAACADQQRqIQMgB0EEaiIHIApHDQALCyACQQNxIgJFDQADQCAFQUBrIANqIgcgBy0AACABIANqLQAAczoAACADQQFqIQMgCUEBaiIJIAJHDQALCyAAIAVBQGsiAEKAARANGiAAQYABEAggBUHAABAIIAVBwAFqJABBAAuVAQEBfyMAQdABayIDJAAgA0IANwNIIANB+IgCKQMANwMIIANBgIkCKQMANwMQIANBiIkCKQMANwMYIANBkIkCKQMANwMgIANBmIkCKQMANwMoIANBoIkCKQMANwMwIANBqIkCKQMANwM4IANCADcDQCADQfCIAikDADcDACADIAEgAhANGiADIAAQFCADQdABaiQAQQALQAACQCAErUKAgICAECACQj98QgaIfVYNACACQoCAgIAQWg0AIAAgASACIAMgBCAFQcybAigCABEKABoPCxALAAvvAwEBfyMAQRBrIgIgADYCDCACIAE2AgggAkEANgIEIAIgAigCBCACKAIMLQAAIAIoAggtAABzcjYCBCACIAIoAgQgAigCDC0AASACKAIILQABc3I2AgQgAiACKAIEIAIoAgwtAAIgAigCCC0AAnNyNgIEIAIgAigCBCACKAIMLQADIAIoAggtAANzcjYCBCACIAIoAgQgAigCDC0ABCACKAIILQAEc3I2AgQgAiACKAIEIAIoAgwtAAUgAigCCC0ABXNyNgIEIAIgAigCBCACKAIMLQAGIAIoAggtAAZzcjYCBCACIAIoAgQgAigCDC0AByACKAIILQAHc3I2AgQgAiACKAIEIAIoAgwtAAggAigCCC0ACHNyNgIEIAIgAigCBCACKAIMLQAJIAIoAggtAAlzcjYCBCACIAIoAgQgAigCDC0ACiACKAIILQAKc3I2AgQgAiACKAIEIAIoAgwtAAsgAigCCC0AC3NyNgIEIAIgAigCBCACKAIMLQAMIAIoAggtAAxzcjYCBCACIAIoAgQgAigCDC0ADSACKAIILQANc3I2AgQgAiACKAIEIAIoAgwtAA4gAigCCC0ADnNyNgIEIAIgAigCBCACKAIMLQAPIAIoAggtAA9zcjYCBCACKAIEQQFrQQh2QQFxQQFrC/cCAQN/An8CQAJAAkAgASIEQf8BcSIBBEAgAEEDcQRAA0AgAC0AACICRQ0FIAEgAkYNBSAAQQFqIgBBA3ENAAsLQYCChAggACgCACICayACckGAgYKEeHFBgIGChHhHDQEgAUGBgoQIbCEDA0BBgIKECCACIANzIgFrIAFyQYCBgoR4cUGAgYKEeEcNAiAAKAIEIQIgAEEEaiIBIQAgAkGAgoQIIAJrckGAgYKEeHFBgIGChHhGDQALDAILAn8CQAJAIAAiAkEDcUUNAEEAIAAtAABFDQIaA0AgAEEBaiIAQQNxRQ0BIAAtAAANAAsMAQsDQCAAIgFBBGohAEGAgoQIIAEoAgAiA2sgA3JBgIGChHhxQYCBgoR4Rg0ACwNAIAEiAEEBaiEBIAAtAAANAAsLIAAgAmsLIAJqDAMLIAAhAQsDQCABIgAtAAAiAkUNASAAQQFqIQEgAiAEQf8BcUcNAAsLIAALIgBBACAALQAAIARB/wFxRhsLUgECf0GAkwIoAgAiASAAQQdqQXhxIgJqIQACQCACQQAgACABTRtFBEAgAD8AQRB0TQ0BIAAQBA0BC0HQoQJBMDYCAEF/DwtBgJMCIAA2AgAgAQvHAQEFfyMAQRBrIgJBADoADwJAIAFFDQAgAUEETwRAIAFBfHEhBgNAIAIgACADaiIELQAAIAItAA9yOgAPIAIgBC0AASACLQAPcjoADyACIAQtAAIgAi0AD3I6AA8gAiAELQADIAItAA9yOgAPIANBBGohAyAFQQRqIgUgBkcNAAsLIAFBA3EiBEUNAEEAIQEDQCACIAAgA2otAAAgAi0AD3I6AA8gA0EBaiEDIAFBAWoiASAERw0ACwsgAi0AD0EBa0EIdkEBcQsyAQJ/IwBBIGsiAyQAQX8hBCADIAIgARAwRQRAIABB8JICIAMQSCEECyADQSBqJAAgBAuEBAECf0F/IQQCQCACQcAASw0AIANBwQBrQUBJDQACQCABQQAgAhtFBEAgA0H/AXEiAUHBAGtB/wFxQb8BTQRAEAsACyAAQUBrQQBBpQIQCRogAEL5wvibkaOz8NsANwA4IABC6/qG2r+19sEfNwAwIABCn9j52cKR2oKbfzcAKCAAQtGFmu/6z5SH0QA3ACAgAELx7fT4paf9p6V/NwAYIABCq/DT9K/uvLc8NwAQIABCu86qptjQ67O7fzcACCAAIAGtQoiS95X/zPmE6gCFNwAADAELAn8gAkH/AXEhAiMAQYABayIFJAACQCADQf8BcSIDQcEAa0H/AXFBvwFNDQAgAUUNACACQcEAa0H/AXFBvwFNDQAgAEFAa0EAQaUCEAkaIABC+cL4m5Gjs/DbADcAOCAAQuv6htq/tfbBHzcAMCAAQp/Y+dnCkdqCm383ACggAELRhZrv+s+Uh9EANwAgIABC8e30+KWn/aelfzcAGCAAQqvw0/Sv7ry3PDcAECAAQrvOqqbY0Ouzu383AAggACADrSACrUIIhoRCiJL3lf/M+YTqAIU3AAAgAiAFakEAQYABIAJrEAkaIABB4ABqIAUgASACEAoiAUGAARAKGiAAIAAoAOACQYABajYA4AIgAUGAARAIIAFBgAFqJABBAAwBCxALAAsNAQtBACEECyAECwQAQW8LhwMCBH8BfiMAQeACayIGJAAgBiAEIAUQSBoCfwJAAkAgACACSyAAIAJrrSADVHFFBEAgACACTw0BIAIgAGutIANaDQELIAAgAiADpxA2IQIgBkIANwM4IAZCADcDMCAGQgA3AyggBkIANwMgQiAgAyADQiBaGyEKIANCIFYhBQwBCyAGQgA3AzggBkIANwMwIAZCADcDKCAGQgA3AyBCICADIANCIFobIQogA0IgViEFIANCAFINAEEBDAELIAZBQGsgAiAKpxAKGkEACyEJIAZBIGoiByAHIApCIHwgBEEQaiIEQgAgBkGkkwIoAgARDAAaIAZB4ABqIAdBjJMCKAIAEQEAGiAJRQRAIAAgBkFAayAKpxAKGgsgBkEgakHAABAIIAUEQCAAIAqnIgVqIAIgBWogAyAKfSAEQgEgBkGkkwIoAgARDAAaCyAGQSAQCCAGQeAAaiICIAAgA0GQkwIoAgARAAAaIAIgAUGUkwIoAgARAQAaIAJBgAIQCCAGQeACaiQAQQAL5gUCB34DfyMAQaACayILJAACQCACUA0AIAAgACkDICIDIAJCA4Z8NwMgIABBKGohCkLAACADQgOIQj+DIgR9IgUgAlgEQEIAIQMgBEI/hUIDWgRAIAVC/ACDIQYDQCAKIAMgBHynaiABIAOnai0AADoAACAKIANCAYQiCCAEfKdqIAEgCKdqLQAAOgAAIAogA0IChCIIIAR8p2ogASAIp2otAAA6AAAgCiADQgOEIgggBHynaiABIAinai0AADoAACADQgR8IQMgCUIEfCIJIAZSDQALCyAFQgODIglCAFIEQANAIAogAyAEfKdqIAEgA6dqLQAAOgAAIANCAXwhAyAHQgF8IgcgCVINAAsLIAAgCiALIAtBgAJqIgwQOSABIAWnaiEBIAIgBX0iAkI/VgRAA0AgACABIAsgDBA5IAFBQGshASACQkB8IgJCP1YNAAsLAkAgAlANACACQgODIQRCACEHQgAhAyACQgRaBEAgAkI8gyEFQgAhAgNAIAogA6ciAGog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IBQgJ2pzNgAMIAUgFSAOIChqczYACCAFIBYgCiApanM2AAQgEiATQQFqIhNFaiESIANCwABYBEACQCADQj9WDQAgA1ANACADpyEBQQAhBANAIAQgK2ogBCAFai0AADoAACAEQQFqIgQgAUkNAAsLIAAgEjYCNCAAIBM2AjAFIAFBQGshASAFQUBrIQIgA0JAfCEDDAELCwvRBgEKfyMAQaACayICJAAgACgAHCEEIAAoABghBSAAKAAUIQYgACgAECEHIAAoAAQhCCAAKAAIIQkgACgADCEKIAAoAAAhCyACIAEpAng3A5gCIAIgASkCcDcDkAIgAiABKQJoNwP4ASACIAEpAmA3A/ABIAIgASkCeDcD6AEgAiABKQJwNwPgASACQYACaiIDIAJB8AFqIAJB4AFqEAcgASACKQKIAjcCeCABIAIpAoACNwJwIAIgASkCWDcD2AEgAiABKQJQNwPQASACIAEpAmg3A8gBIAIgASkCYDcDwAEgAyACQdABaiACQcABahAHIAEgAikCiAI3AmggASACKQKAAjcCYCACIAEpAkg3A7gBIAIgAUFAayIAKQIANwOwASACIAEpAlg3A6gBIAIgASkCUDcDoAEgAyACQbABaiACQaABahAHIAEgAikCiAI3AlggASACKQKAAjcCUCACIAEpAjg3A5gBIAIgASkCMDcDkAEgAiABKQJINwOIASACIAApAgA3A4ABIAMgAkGQAWogAkGAAWoQByABIAIpAogCNwJIIAAgAikCgAI3AgAgAiABKQIoNwN4IAIgASkCIDcDcCACIAEpAjg3A2ggAiABKQIwNwNgIAMgAkHwAGogAkHgAGoQByABIAIpAogCNwI4IAEgAikCgAI3AjAgAiABKQIYNwNYIAIgASkCEDcDUCACIAEpAig3A0ggAiABKQIgNwNAIAMgAkHQAGogAkFAaxAHIAEgAikCiAI3AiggASACKQKAAjcCICACIAEpAgg3AzggAiABKQIANwMwIAIgASkCGDcDKCACIAEpAhA3AyAgAyACQTBqIAJBIGoQByABIAIpAogCNwIYIAEgAikCgAI3AhAgAiACKQOYAjcDGCACIAIpA5ACNwMQIAIgASkCCDcDCCACIAEpAgA3AwAgAyACQRBqIAIQByABIAIpAogCNwIIIAEgAikCgAI3AgAgASAKIAEoAAxzNgIMIAEgCSABKAAIczYCCCABIAggASgABHM2AgQgASALIAEoAABzNgIAIAAgByAAKAAAczYCACABIAYgASgARHM2AkQgASAFIAEoAEhzNgJIIAEgBCABKABMczYCTCACQaACaiQAC70FASB/QeXwwYsGIQQgAigAACIVIQUgAigABCIWIQcgAigACCIXIQggAigADCIYIQlB7siBmQMhDiABKAAAIhkhCiABKAAEIhohCyABKAAIIhshDSABKAAMIhwhEEGy2ojLByEBIAIoABAiHSEDQfTKgdkGIQYgAigAHCIeIREgAigAGCIfIQ8gAigAFCIgIQIDQCAPIBAgBSAOakEHd3MiDCAOakEJd3MiEiACIARqQQd3IAlzIgkgBGpBCXcgDXMiEyAJakENdyACcyIhIAMgBmpBB3cgCHMiCCAGakEJdyALcyILIAhqQQ13IANzIg0gC2pBEncgBnMiBiARIAEgCmpBB3dzIgNqQQd3cyICIAZqQQl3cyIPIAJqQQ13IANzIhEgD2pBEncgBnMhBiADIAEgA2pBCXcgB3MiB2pBDXcgCnMiCiAHakESdyABcyIBIAxqQQd3IA1zIgMgAWpBCXcgE3MiDSADakENdyAMcyIQIA1qQRJ3IAFzIQEgEiAMIBJqQQ13IAVzIgxqQRJ3IA5zIgUgCWpBB3cgCnMiCiAFakEJdyALcyILIApqQQ13IAlzIgkgC2pBEncgBXMhDiATICFqQRJ3IARzIgQgCGpBB3cgDHMiBSAEakEJdyAHcyIHIAVqQQ13IAhzIgggB2pBEncgBHMhBCAUQRJJISIgFEECaiEUICINAAsgACAGQfTKgdkGajYAPCAAIBEgHmo2ADggACAPIB9qNgA0IAAgAiAgajYAMCAAIAMgHWo2ACwgACABQbLaiMsHajYAKCAAIBAgHGo2ACQgACANIBtqNgAgIAAgCyAaajYAHCAAIAogGWo2ABggACAOQe7IgZkDajYAFCAAIAkgGGo2ABAgACAIIBdqNgAMIAAgByAWajYACCAAIAUgFWo2AAQgACAEQeXwwYsGajYAAAvIBAECfyMAQRBrIgMkACADQQA6AA9BfyEEIAAgASACQZiTAigCABEDAEUEQCADIAAtAAAgAy0AD3I6AA8gAyAALQABIAMtAA9yOgAPIAMgAC0AAiADLQAPcjoADyAD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IAIgAhAFIAEgAiABEAYgASABEAUgASABEAUgASABEAUgASABEAUgASABEAUgASABEAUgASABEAUgASABEAUgASABEAUgASABEAUgAyABIAMQBiABIAMQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEQBSABIAEgAxAGIAIgARAFQQEhAQNAIAIgAhAFIAFBAWoiAUHkAEcNAAsgAkEwaiIBIAIgARAGIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAEgARAFIAJB4ABqIgMgASADEAYgAyADEAUgAyADEAUgAyADEAUgAyADEAUgAyADEAUgACADIAJBkAFqEAYgAkHAAWokAAuLAQEBfyMAQRBrIgIgADYCDCACIAE2AghBACEAIAJBADYCBANAIAIgAigCBCACKAIMIABqLQAAIAIoAgggAGotAABzcjYCBCACIAIoAgQgAEEBciIBIAIoAgxqLQAAIAIoAgggAWotAABzcjYCBCAAQQJqIgBBIEcNAAsgAigCBEEBa0EIdkEBcUEBawvTAgIDfwF+IwBB4ABrIgYkACAGIAQgBRBIGiAGQSBqIgdCICAEQRBqIgUgBkGgkwIoAgARDgAaQX8hBAJAAkAgAiABIAMgB0GIkwIoAgARFgANAEEAIQQgAEUNAQJAAn4CQCAAIAFJIAEgAGutIANUcUUEQCAAIAFNDQEgACABa60gA1oNAQsgACABIAOnEDYhAUIgIAMgA0IgWhsMAQsgA1ANAUIgIAMgA0IgWhsLIQkgBkFAayABIAmnIgIQCiEHIAZBIGoiBCAEIAlCIHwgBUIAIAZBpJMCKAIAEQwAGiAAIAcgAhAKIQggBEHAABAIQQAhBCADQiFUDQEgCCACaiABIAJqIAMgCX0gBUIBIAZBpJMCKAIAEQwAGgwBCyAGQSBqIgAgAEIgIAVCACAGQaSTAigCABEMABogAEHAABAICyAGQSAQCAsgBkHgAGokACAEC+gCAQJ/AkAgACABRg0AIAEgACACaiIEa0EAIAJBAXRrTQRAIAAgASACEAoPCyAAIAFzQQNxIQMCQAJAIAAgAUkEQCADBEAgACEDDAMLIABBA3FFBEAgACEDDAILIAAhAwNAIAJFDQQgAyABLQAAOgAAIAFBAWohASACQQFrIQIgA0EBaiIDQQNxDQALDAELAkAgAw0AIARBA3EEQANAIAJFDQUgACACQQFrIgJqIgMgASACai0AADoAACADQQNxDQALCyACQQNNDQADQCAAIAJBBGsiAmogASACaigCADYCACACQQNLDQALCyACRQ0CA0AgACACQQFrIgJqIAEgAmotAAA6AAAgAg0ACwwCCyACQQNNDQADQCADIAEoAgA2AgAgAUEEaiEBIANBBGohAyACQQRrIgJBA0sNAAsLIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALNAEBfyMAQSBrIgIkACAAIAIQSSAAQegAaiIAIAJCIBAqIAAgARBJIAJBIBAIIAJBIGokAAvPBwEJfyMAQeAAayIDJAAgAkHBAE8EQCAAQgA3AyAgAEHAjwIpAwA3AwAgAEHIjwIpAwA3AwggAEHQjwIpAwA3AxAgAEHYjwIpAwA3AxggACABIAKtECogACADEElBICECIAMhAQsgAEIANwMgIABBwI8CKQMANwMAIABByI8CKQMANwMIIABB0I8CKQMANwMQIABB2I8CKQMANwMYIANCtuzYsePGjZs2NwNYIANCtuzYsePGjZs2NwNQIANCtuzYsePGjZs2NwNIIANBQGsiCkK27Nix48aNmzY3AwAgA0K27Nix48aNmzY3AzggA0K27Nix48aNmzY3AzAgA0K27Nix48aNmzY3AyggA0K27Nix48aNmzY3AyACQCACRQ0AIAJBBE8EQCACQfwAcSEGA0AgA0EgaiIHIARqIgUgBS0AACABIARqLQAAczoAACAHIARBAXIiBWoiCyALLQAAIAEgBWotAABzOgAAIAcgBEECciIFaiILIAstAAAgASAFai0AAHM6AAAgByAEQQNyIgVqIgcgBy0AACABIAVqLQAAczoAACAEQQRqIQQgCEEEaiIIIAZHDQALCyACQQNxIghFDQADQCADQSBqIARqIgcgBy0AACABIARqLQAAczoAACAEQQFqIQQgCUEBaiIJIAhHDQALCyAAIANBIGpCwAAQKiAAQegAaiIHIgBCADcDICAAQcCPAikDADcDACAAQciPAikDADcDCCAAQdCPAikDADcDECAAQdiPAikDADcDGCADQty48eLFi5eu3AA3A1ggA0LcuPHixYuXrtwANwNQIANC3Ljx4sWLl67cADcDSCAKQty48eLFi5eu3AA3AwAgA0LcuPHixYuXrtwANwM4IANC3Ljx4sWLl67cADcDMCADQty48eLFi5eu3AA3AyggA0LcuPHixYuXrtwANwMgAkAgAkUNAEEAIQlBACEEIAJBBE8EQCACQfwAcSEKQQAhCANAIANBIGoiACAEaiIGIAYtAAAgASAEai0AAHM6AAAgACAEQQFyIgZqIgUgBS0AACABIAZqLQAAczoAACAAIARBAnIiBmoiBSAFLQAAIAEgBmotAABzOgAAIAAgBEEDciIGaiIAIAAtAAAgASAGai0AAHM6AAAgBEEEaiEEIAhBBGoiCCAKRw0ACwsgAkEDcSIARQ0AA0AgA0EgaiAEaiICIAItAAAgASAEai0AAHM6AAAgBEEBaiEEIAlBAWoiCSAARw0ACwsgByADQSBqIgBCwAAQKiAAQcAAEAggA0EgEAggA0HgAGokAEEAC+4bARl/IAIgASgAACIEQRh0IARBgP4DcUEI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FYd8IgFCBog8ABsgACABQgKGIAJCgIDgAINCE4iEPAAaIAAgCEL///8AgyABQhWHfCICQhGIPAAfIAAgAkIJiDwAHiAAIAJCAYg8AB0gACACQgeGIAFCgID/AINCDoiEPAAcC/gBAQp/A0AgBCAAIANqLQAAIgEgA0GAE2oiAi0AAHNyIQQgCiABIAItAMABc3IhCiAJIAEgAi0AoAFzciEJIAggASACLQCAAXNyIQggByABIAItAGBzciEHIAYgASACQUBrLQAAc3IhBiAFIAEgAi0AIHNyIQUgA0EBaiIDQR9HDQALIAogAC0AH0H/AHEiAEH/AHMiAXJB/wFxQQFrIAEgCXJB/wFxQQFrIAEgCHJB/wFxQQFrIAcgAEH6AHNyQf8BcUEBayAGIABBBXNyQf8BcUEBayAAIAVyQf8BcUEBayAAIARyQf8BcUEBa3JycnJyckEIdkEBcQvgCQEdfyABKAIEIQQgASgCLCEDIAEoAgghBSABKAIwIQYgASgCDCEHIAEoAjQhCCABKAIQIQkgASgCOCEKIAEoAhQhCyABKAI8IQwgASgCGCENIAFBQGsiDigCACEPIAEoAhwhECABKAJEIREgASgCICESIAEoAkghEyABKAIkIRQgASgCTCEVIAAgASgCACABKAIoajYCACAAIBQgFWo2AiQgACASIBNqNgIgIAAgECARajYCHCAAIA0gD2o2AhggACALIAxqNgIUIAAgCSAKajYCECAAIAcgCGo2AgwgACAFIAZqNgIIIAAgAyAEajYCBCABKAIEIQMgASgCLCEFIAEoAgghBiABKAIwIQcgASgCDCEIIAEoAjQhCSABKAIQIQogASgCOCELIAEoAhQhDCABKAI8IQ0gASgCGCEPIA4oAgAhDiABKAIcIQQgASgCRCEQIAEoAiAhESABKAJIIRIgASgCACETIAEoAighFCAAIAEoAkwgASgCJGs2AkwgACASIBFrNgJIIAAgECAEazYCRCAAQUBrIgQgDiAPazYCACAAIA0gDGs2AjwgACALIAprNgI4IAAgCSAIazYCNCAAIAcgBms2AjAgACAFIANrNgIsIAAgFCATazYCKCAAQdAAaiAAIAIQBiAAQShqIgMgAyACQShqEAYgAEH4AGogAkHQAGogAUH4AGoQBiABKAJUIRQgASgCWCEVIAEoAlwhFiAB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IAYgCHM2AgggAyACIAVzNgIEIAMgACABczYCACAEQfABaiQAC6sGARR/IwBB4AFrIgMkACACKAAQIQQgAkFAayIFKAAAIQYgAigAUCEJIAIoACAhCiACKAAwIQsgAigAFCEHIAIoAEQhDCACKABUIQ0gASgABCEOIAIoACQhDyACKAA0IRAgAigAGCEIIAIoAEghESACKABYIRIgASgACCETIAIoACghFCACKAA4IRUgASgAACEWIAAgAigALCACKAA8cSACKAAcIAIoAEwgAigAXCABKAAMc3NzcyIBNgAMIAAgFCAVcSAIIBEgEiATc3NzcyIINgAIIAAgDyAQcSAHIAwgDSAOc3NzcyIHNgAEIAAgCiALcSAEIAYgCSAWc3NzcyIANgAAIAMgAikCWDcD2AEgAyACKQJQNwPQASADIAIpAkg3A7gBIAMgBSkCADcDsAEgAyACKQJYNwOoASADIAIpAlA3A6ABIANBwAFqIgQgA0GwAWogA0GgAWoQByACIAMpAsgBNwJYIAIgAykCwAE3AlAgAyACKQI4NwOYASADIAIpAjA3A5ABIAMgAikCSDcDiAEgAyAFKQIANwOAASAEIANBkAFqIANBgAFqEAcgAiADKQLIATcCSCAFIAMpAsABNwIAIAMgAikCKDcDeCADIAIpAiA3A3AgAyACKQI4NwNoIAMgAikCMDcDYCAEIANB8ABqIANB4ABqEAcgAiADKQLIATcCOCACIAMpAsABNwIwIAMgAikCGDcDWCADIAIpAhA3A1AgAyACKQIoNwNIIAMgAikCIDcDQCAEIANB0ABqIANBQGsQByACIAMpAsgBNwIoIAIgAykCwAE3AiAgAyACKQIINwM4IAMgAikCADcDMCADIAIpAhg3AyggAyACKQIQNwMgIAQgA0EwaiADQSBqEAcgAiADKQLIATcCGCACIAMpAsABNwIQIAMgAykD2AE3AxggAyADKQPQATcDECADIAIpAgg3AwggAyACKQIANwMAIAQgA0EQaiADEAcgAygCwAEhBSADKALEASEEIAMoAsgBIQYgAiADKALMASABczYCDCACIAYgCHM2AgggAiAEIAdzNgIEIAIgACAFczYCACADQeABaiQAC4sJARF/IwBB4AFrIgUkACAEKAA8IANBHXZzIQ4gBCgAOCADQQN0cyEPIAQoADQgAkEddnMhECAEQTBqIgMoAAAgAkEDdHMhESAEQRBqIQIgBEEgaiEGIARBQGshByAEQdAAaiEIA0AgBSAIKQIINwPYASAFIAgpAgA3A9ABIAUgBykCCDcDuAEgBSAHKQIANwOwASAFIAgpAgg3A6gBIAUgCCkCADcDoAEgBUHAAWoiCSAFQbABaiAFQaABahAHIAggBSkCyAE3AgggCCAFKQLAATcCACAFIAMpAgg3A5gBIAUgAykCADcDkAEgBSAHKQIINwOIASAFIAcpAgA3A4ABIAkgBUGQAWogBUGAAWoQByAHIAUpAsgBNwIIIAcgBSkCwAE3AgAgBSAGKQIINwN4IAUgBikCADcDcCAFIAMpAgg3A2ggBSADKQIANwNgIAkgBUHwAGogBUHgAGoQByADIAUpAsgBNwIIIAMgBSkCwAE3AgAgBSACKQIINwNYIAUgAikCADcDUCAFIAYpAgg3A0ggBSAGKQIANwNAIAkgBUHQAGogBUFAaxAHIAYgBSkCyAE3AgggBiAFKQLAATcCACAFIAQpAgg3AzggBSAEKQIANwMwIAUgAikCCDcDKCAFIAIpAgA3AyAgCSAFQTBqIAVBIGoQByACIAUpAsgBNwIIIAIgBSkCwAE3AgAgBSAFKQPYATcDGCAFIAUpA9ABNwMQIAUgBCkCCDcDCCAFIAQpAgA3AwAgCSAFQRBqIAUQByAFKALAASELIAUoAsQBIQwgBSgCyAEhCSAEIA4gBSgCzAFzIg02AgwgBCAJIA9zIgk2AgggBCAMIBBzIgw2AgQgBCALIBFzIgs2AgAgCkEBaiIKQQdHDQALAkACQAJAAkAgAUEQaw4RAAICAgICAgICAgICAgICAgECCyAEKAAQIQEgBCgAMCECIAQoACAhAyAEKABQIQYgBEFAaygAACEHIAQoABQhCCAEKAA0IQogBCgAJCEOIAQoAFQhDyAEKABEIRAgBCgAGCERIAQoADghEiAEKAAoIRMgBCgAWCEUIAQoAEghFSAAIAQoABwgBCgAPCAEKAAsIAQoAFwgBCgATHNzc3MgDXM2AAwgACARIBIgEyAUIBVzc3NzIAlzNgAIIAAgCCAKIA4gDyAQc3NzcyAMczYABCAAIAEgAiADIAYgB3Nzc3MgC3M2AAAMAgsgBCgAICEBIAQoABAhAiAEKAAkIQMgBCgAFCEGIAQoACghByAEKAAYIQggACAEKAAsIAQoABxzIA1zNgAMIAAgByAIcyAJczYACCAAIAMgBnMgDHM2AAQgACABIAJzIAtzNgAAIAQoADAhASAEKABQIQIgBEFAaygAACEDIAQoADQhBiAEKABUIQcgBCgARCEIIAQoADghCiAEKABYIQ0gBCgASCEJIAAgBCgAPCAEKABcIAQoAExzczYAHCAAIAogCSANc3M2ABggACAGIAcgCHNzNgAUIAAgASACIANzczYAEAwBCyAAQQAgARAJGgsgBUHgAWokAAulBgEUfyMAQeABayIDJAAgAigAECEFIAJBQGsiBCgAACEJIAIoAFAhCiACKAAgIQsgAigAMCEMIAEoAAQhBiACKAAUIQ0gAigARCEOIAIoAFQhDyACKAAkIRAgAigANCERIAEoAAghByACKAAYIRIgAigASCETIAIoAFghFCACKAAoIRUgAigAOCEWIAEoAAAhCCAAIAEoAAwiASACKAAsIAIoADxxIAIoABwgAigAXCACKABMc3NzczYADCAAIAcgFSAWcSASIBMgFHNzc3M2AAggACAGIBAgEXEgDSAOIA9zc3NzNgAEIAAgCCALIAxxIAUgCSAKc3NzczYAACADIAIpAlg3A9gBIAMgAikCUDcD0AEgAyACKQJINwO4ASADIAQpAgA3A7ABIAMgAikCWDcDqAEgAyACKQJQNwOgASADQcABaiIAIANBsAFqIANBoAFqEAcgAiADKQLIATcCWCACIAMpAsABNwJQIAMgAikCODcDmAEgAyACKQIwNwOQASADIAIpAkg3A4gBIAMgBCkCADcDgAEgACADQZABaiADQYABahAHIAIgAykCyAE3AkggBCADKQLAATcCACADIAIpAig3A3ggAyACKQIgNwNwIAMgAikCODcDaCADIAIpAjA3A2AgACADQfAAaiADQeAAahAHIAIgAykCyAE3AjggAiADKQLAATcCMCADIAIpAhg3A1ggAyACKQIQNwNQIAMgAikCKDcDSCADIAIpAiA3A0AgACADQdAAaiADQUBrEAcgAiADKQLIATcCKCACIAMpAsABNwIgIAMgAikCCDcDOCADIAIpAgA3AzAgAyACKQIYNwMoIAMgAikCEDcDICAAIANBMGogA0EgahAHIAIgAykCyAE3AhggAiADKQLAATcCECADIAMpA9gBNwMYIAMgAykD0AE3AxAgAyACKQIINwMIIAMgAikCADcDACAAIANBEGogAxAHIAMoAsABIQAgAygCxAEhBCADKALIASEFIAIgASADKALMAXM2AgwgAiAFIAdzNgIIIAIgBCAGczYCBCACIAAgCHM2AgAgA0HgAWokAAulCQENfyMAQaADayICJAAgACgAECEGIAAoABQhByAAKAAYIQggACgAHCEJIAAoAAQhBCAAKAAIIQUgACgADCEKIAAoAAAhCyACIAEpAlg3A5gDIAIgASkCUDcDkAMgAiABKQJINwP4AiACIAFBQGsiACkCADcD8AIgAiABKQJYNwPoAiACIAEpAlA3A+ACIAJBgANqIgMgAkHwAmogAkHgAmoQByABIAIpAogDNwJYIAEgAikCgAM3AlAgAiABKQI4NwPYAiACIAEpAjA3A9ACIAIgASkCSDcDyAIgAiAAKQIANwPAAiADIAJB0AJqIAJBwAJqEAcgASACKQKIAzcCSCAAIAIpAoADNwIAIAIgASkCKDcDuAIgAiABKQIgNwOwAiACIAEpAjg3A6gCIAIgASkCMDcDoAIgAyACQbACaiACQaACahAHIAEgAikCiAM3AjggASACKQKAAzcCMCACIAEpAhg3A5gCIAIgASkCEDcDkAIgAiABKQIoNwOIAiACIAEpAiA3A4ACIAMgAkGQAmogAkGAAmoQByABIAIpAogDNwIoIAEgAikCgAM3AiAgAiABKQIINwP4ASACIAEpAgA3A/ABIAIgASkCGDcD6AEgAiABKQIQNwPgASADIAJB8AFqIAJB4AFqEAcgASACKQKIAzcCGCABIAIpAoADNwIQIAIgAikDmAM3A9gBIAIgAikDkAM3A9ABIAIgASkCCDcDyAEgAiABKQIANwPAASADIAJB0AFqIAJBwAFqEAcgAigCgAMhDCACKAKEAyENIAIoAogDIQ4gASAKIAIoAowDczYCDCABIAUgDnM2AgggASAEIA1zNgIEIAEgCyAMczYCACACIAEpAlg3A5gDIAIgASkCUDcDkAMgAiABKQJINwO4ASACIAApAgA3A7ABIAIgASkCWDcDqAEgAiABKQJQNwOgASADIAJBsAFqIAJBoAFqEAcgASACKQKIAzcCWCABIAIpAoADNwJQIAIgASkCODcDmAEgAiABKQIwNwOQASACIAEpAkg3A4gBIAIgACkCADcDgAEgAyACQZABaiACQYABahAHIAEgAikCiAM3AkggACACKQKAAzcCACACIAEpAig3A3ggAiABKQIgNwNwIAIgASkCODcDaCACIAEpAjA3A2AgAyACQfAAaiACQeAAahAHIAEgAikCiAM3AjggASACKQKAAzcCMCACIAEpAhg3A1ggAiABKQIQNwNQIAIgASkCKDcDSCACIAEpAiA3A0AgAyACQdAAaiACQUBrEAcgASACKQKIAzcCKCABIAIpAoADNwIgIAIgASkCCDcDOCACIAEpAgA3AzAgAiABKQIYNwMoIAIgASkCEDcDICADIAJBMGogAkEgahAHIAEgAikCiAM3AhggASACKQKAAzcCECACIAIpA5gDNwMYIAIgAikDkAM3AxAgAiABKQIINwMIIAIgASkCADcDACADIAJBEGogAhAHIAIoAoADIQAgAigChAMhBCACKAKIAyEFIAEgCSACKAKMA3M2AgwgASAFIAhzNgIIIAEgBCAHczYCBCABIAAgBnM2AgAgAkGgA2okAAvzFAEZfyMAQaAGayIDJAAgASgABCELIAEoAAghDCABKAAMIQ0gASgAECEOIAEoABQhBCABKAAYIQ8gASgAHCEQIAAoAAQhESAAKAAIIRIgACgADCETIAAoABAhFCAAKAAUIRUgACgAGCEWIAAoABwhFyABKAAAIQUgAkFAayIBIAAoAAAiGEGAgoQQczYCACACQpXE3MmFsvq84gA3AjggAkEwaiIAQoCChJCwoIGEDTcCACACQqCixJG0rq2UXTcCKCACQSBqIgZC2/vgqNXN8JdxNwIAIAIgBSAYcyIZNgIAIAIgF0Hz6qLpfXM2AlwgAiAWQaCixJEEczYCWCACIBVB7YS/iX9zNgJUIAJB0ABqIgUgFEHb++CoBXM2AgAgAiATQZDT55MGczYCTCACIBJBlcTcyQVzNgJIIAIgEUGDiqDoAHM2AkQgAiAQIBdzIhA2AhwgAiAPIBZzIg82AhggAiAEIBVzIho2AhQgAkEQaiIEIA4gFHMiDjYCACACIA0gE3MiDTYCDCACIAwgEnMiDDYCCCACIAsgEXMiGzYCBEEAIQsDQCADIAUpAgg3A5gGIAMgBSkCADcDkAYgAyABKQIINwP4BSADIAEpAgA3A/AFIAMgBSkCCDcD6AUgAyAFKQIANwPgBSADQYAGaiIHIANB8AVqIANB4AVqEAcgBSADKQKIBjcCCCAFIAMpAoAGNwIAIAMgACkCCDcD2AUgAyAAKQIANwPQBSADIAEpAgg3A8gFIAMgASkCADcDwAUgByADQdAFaiADQcAFahAHIAEgAykCiAY3AgggASADKQKABjcCACADIAYpAgg3A7gFIAMgBikCADcDsAUgAyAAKQIINwOoBSADIAApAgA3A6AFIAcgA0GwBWogA0GgBWoQByAAIAMpAogGNwIIIAAgAykCgAY3AgAgAyAEKQIINwOYBSADIAQpAgA3A5AFIAMgBikCCDcDiAUgAyAGKQIANwOABSAHIANBkAVqIANBgAVqEAcgBiADKQKIBjcCCCAGIAMpAoAGNwIAIAMgAikCCDcD+AQgAyACKQIANwPwBCADIAQpAgg3A+gEIAMgBCkCADcD4AQgByADQfAEaiADQeAEahAHIAQgAykCiAY3AgggBCADKQKABjcCACADIAMpA5gGNwPYBCADIAMpA5AGNwPQBCADIAIpAgg3A8gEIAMgAikCADcDwAQgByADQdAEaiADQcAEahAHIAMoAoAGIQggAygChAYhCSADKAKIBiEKIAIgAygCjAYgE3M2AgwgAiAKIBJzNgIIIAIgCSARczYCBCACIAggGHM2AgAgAyAFKQIINwOYBiADIAUpAgA3A5AGIAMgASkCCDcDuAQgAyABKQIANwOwBCADIAUpAgg3A6gEIAMgBSkCADcDoAQgByADQbAEaiADQaAEahAHIAUgAykCiAY3AgggBSADKQKABjcCACADIAApAgg3A5gEIAMgACkCADcDkAQgAyABKQIINwOIBCADIAEpAgA3A4AEIAcgA0GQBGogA0GABGoQByABIAMpAogGNwIIIAEgAykCgAY3AgAgAyAGKQIINwP4AyADIAYpAgA3A/ADIAMgACkCCDcD6AMgAyAAKQIANwPgAyAHIANB8ANqIANB4ANqEAcgACADKQKIBjcCCCAAIAMpAoAGNwIAIAMgBCkCCDcD2AMgAyAEKQIANwPQAyADIAYpAgg3A8gDIAMgBikCADcDwAMgByADQdADaiADQcADahAHIAYgAykCiAY3AgggBiADKQKABjcCACADIAIpAgg3A7gDIAMgAikCADcDsAMgAyAEKQIINwOoAyADIAQpAgA3A6ADIAcgA0GwA2ogA0GgA2oQByAEIAMpAogGNwIIIAQgAykCgAY3AgAgAyADKQOYBjcDmAMgAyADKQOQBjcDkAMgAyACKQIINwOIAyADIAIpAgA3A4ADIAcgA0GQA2ogA0GAA2oQByADKAKABiEIIAMoAoQGIQkgAygCiAYhCiACIAMoAowGIBdzNgIMIAIgCiAWczYCCCACIAkgFXM2AgQgAiAIIBRzNgIAIAMgBSkCCDcDmAYgAyAFKQIANwOQBiADIAEpAgg3A/gCIAMgASkCADcD8AIgAyAFKQIINwPoAiADIAUpAgA3A+ACIAcgA0HwAmogA0HgAmoQByAFIAMpAogGNwIIIAUgAykCgAY3AgAgAyAAKQIINwPYAiADIAApAgA3A9ACIAMgASkCCDcDyAIgAyABKQIANwPAAiAHIANB0AJqIANBwAJqEAcgASADKQKIBjcCCCABIAMpAoAGNwIAIAMgBikCCDcDuAIgAyAGKQIANwOwAiADIAApAgg3A6gCIAMgACkCADcDoAIgByADQbACaiADQaACahAHIAAgAykCiAY3AgggACADKQKABjcCACADIAQpAgg3A5gCIAMgBCkCADcDkAIgAyAGKQIINwOIAiADIAYpAgA3A4ACIAcgA0GQAmogA0GAAmoQByAGIAMpAogGNwIIIAYgAykCgAY3AgAgAyACKQIINwP4ASADIAIpAgA3A/ABIAMgBCkCCDcD6AEgAyAEKQIANwPgASAHIANB8AFqIANB4AFqEAcgBCADKQKIBjcCCCAEIAMpAoAGNwIAIAMgAykDmAY3A9gBIAMgAykDkAY3A9ABIAMgAikCCDcDyAEgAyACKQIANwPAASAHIANB0AFqIANBwAFqEAcgAygCgAYhCCADKAKEBiEJIAMoAogGIQogAiADKAKMBiANczYCDCACIAogDHM2AgggAiAJIBtzNgIEIAIgCCAZczYCACADIAUpAgg3A5gGIAMgBSkCADcDkAYgAyABKQIINwO4ASADIAEpAgA3A7ABIAMgBSkCCDcDqAEgAyAFKQIANwOgASAHIANBsAFqIANBoAFqEAcgBSADKQKIBjcCCCAFIAMpAoAGNwIAIAMgACkCCDcDmAEgAyAAKQIANwOQASADIAEpAgg3A4gBIAMgASkCADcDgAEgByADQZABaiADQYABahAHIAEgAykCiAY3AgggASADKQKABjcCACADIAYpAgg3A3ggAyAGKQIANwNwIAMgACkCCDcDaCADIAApAgA3A2AgByADQfAAaiADQeAAahAHIAAgAykCiAY3AgggACADKQKABjcCACADIAQpAgg3A1ggAyAEKQIANwNQIAMgBikCCDcDSCADIAYpAgA3A0AgByADQdAAaiADQUBrEAcgBiADKQKIBjcCCCAGIAMpAoAGNwIAIAMgAikCCDcDOCADIAIpAgA3AzAgAyAEKQIINwMoIAMgBCkCADcDICAHIANBMGogA0EgahAHIAQgAykCiAY3AgggBCADKQKABjcCACADIAMpA5gGNwMYIAMgAykDkAY3AxAgAyACKQIINwMIIAMgAikCADcDACAHIANBEGogAxAHIAMoAoAGIQggAygChAYhCSADKAKIBiEKIAIgAygCjAYgEHM2AgwgAiAKIA9zNgIIIAIgCSAaczYCBCACIAggDnM2AgAgC0EBaiILQQRHDQALIANBoAZqJAALCAAgAEEQEBcLBABBXwuMCgEhfyMAQcACayIEJAAgBEGAAmoiBSACakEAQSAgAmsiC0EAIAJBH00bEAkhJCAFIAEgAhAKGiADKAAQIQ0gAygAMCEOIAMoABQhDyADKAA0IRAgAygAGCERIAMoADghEiADKAAcIRMgAygAPCEUIAMoACAhASADKABQIRUgAygAcCEWIAMoAGAhBiADKAAkIQcgAygAVCEXIAMoAHQhGCADKABkIQggAygAKCEJIAMoAFghGSADKAB4IRogAygAaCEKIAQoAoACIRsgBCgChAIhHCAEKAKIAiEdIAQoAowCIR4gBCgCkAIhHyAEKAKUAiEgIAQoApgCISEgBCADKAAsIiIgAygAbCIjIAMoAHxxIAMoAFwgBCgCnAJzc3M2ApwCIAQgCSAKIBpxIBkgIXNzczYCmAIgBCAHIAggGHEgFyAgc3NzNgKUAiAEIAEgBiAWcSAVIB9zc3M2ApACIAQgIyAUICJxIBMgHnNzczYCjAIgBCAKIAkgEnEgESAdc3NzNgKIAiAEIAggByAQcSAPIBxzc3M2AoQCIAQgBiABIA5xIA0gG3NzczYCgAIgJEEAIAsQCRogACAFIAIQChogBCgCnAIhASAEKAKYAiECIAQoApQCIQYgBCgCkAIhByAEKAKAAiEIIAQoAoQCIQkgBCgCiAIhCiAEKAKMAiELIAQgAykCeDcDuAIgBCADKQJwNwOwAiAEIAMpAmg3A/gBIAQgAykCYDcD8AEgBCADKQJ4NwPoASAEIAMpAnA3A+ABIARBoAJqIgUgBEHwAWogBEHgAWoQByADIAQpAqgCNwJ4IAMgBCkCoAI3AnAgBCADKQJYNwPYASAEIAMpAlA3A9ABIAQgAykCaDcDyAEgBCADKQJgNwPAASAFIARB0AFqIARBwAFqEAcgAyAEKQKoAjcCaCADIAQpAqACNwJgIAQgAykCSDcDuAEgBCADQUBrIgApAgA3A7ABIAQgAykCWDcDqAEgBCADKQJQNwOgASAFIARBsAFqIARBoAFqEAcgAyAEKQKoAjcCWCADIAQpAqACNwJQIAQgAykCODcDmAEgBCADKQIwNwOQASAEIAMpAkg3A4gBIAQgACkCADcDgAEgBSAEQZABaiAEQYABahAHIAMgBCkCqAI3AkggACAEKQKgAjcCACAEIAMpAig3A3ggBCADKQIgNwNwIAQgAykCODcDaCAEIAMpAjA3A2AgBSAEQfAAaiAEQeAAahAHIAMgBCkCqAI3AjggAyAEKQKgAjcCMCAEIAMpAhg3A1ggBCADKQIQNwNQIAQgAykCKDcDSCAEIAMpAiA3A0AgBSAEQdAAaiAEQUBrEAcgAyAEKQKoAjcCKCADIAQpAqACNwIgIAQgAykCCDcDOCAEIAMpAgA3AzAgBCADKQIYNwMoIAQgAykCEDcDICAFIARBMGogBEEgahAHIAMgBCkCqAI3AhggAyAEKQKgAjcCECAEIAQpA7gCNwMYIAQgBCkDsAI3AxAgBCADKQIINwMIIAQgAykCADcDACAFIARBEGogBBAHIAMgBCkCqAI3AgggAyAEKQKgAjcCACADIAsgAygADHM2AgwgAyAKIAMoAAhzNgIIIAMgCSADKAAEczYCBCADIAggAygAAHM2AgAgACAHIAAoAABzNgIAIAMgBiADKABEczYCRCADIAIgAygASHM2AkggAyABIAMoAExzNgJMIARBwAJqJAALkQkBHn8jAEGgAmsiAyQAIAIoABAhDiACKAAwIQ8gAigAFCEQIAEoAAQhESACKAA0IRIgAigAGCETIAEoAAghFCACKAA4IRUgAigAHCEIIAEoAAwhFiACKAA8IRcgAigAICEFIAIoAFAhCSABKAAQIRggAigAcCEZIAIoAGAhBCACKAAkIQYgAigAVCEKIAEoABQhGiACKAB0IRsgAigAZCEMIAIoACghByACKABYIQsgASgAGCEcIAIoAHghHSACKABoIQ0gASgAACEeIAAgAigALCIfIAIoAGwiICACKAB8cSACKABcIAEoABxzc3MiATYAHCAAIAcgDSAdcSALIBxzc3MiCzYAGCAAIAYgDCAbcSAKIBpzc3MiCjYAFCAAIAUgBCAZcSAJIBhzc3MiCTYAECAAICAgFyAfcSAIIBZzc3MiCDYADCAAIA0gByAVcSATIBRzc3MiBzYACCAAIAwgBiAScSAQIBFzc3MiBjYABCAAIAQgBSAPcSAOIB5zc3MiBTYAACADIAIpAng3A5gCIAMgAikCcDcDkAIgAyACKQJoNwP4ASADIAIpAmA3A/ABIAMgAikCeDcD6AEgAyACKQJwNwPgASADQYACaiIEIANB8AFqIANB4AFqEAcgAiADKQKIAjcCeCACIAMpAoACNwJwIAMgAikCWDcD2AEgAyACKQJQNwPQASADIAIpAmg3A8gBIAMgAikCYDcDwAEgBCADQdABaiADQcABahAHIAIgAykCiAI3AmggAiADKQKAAjcCYCADIAIpAkg3A7gBIAMgAkFAayIAKQIANwOwASADIAIpAlg3A6gBIAMgAikCUDcDoAEgBCADQbABaiADQaABahAHIAIgAykCiAI3AlggAiADKQKAAjcCUCADIAIpAjg3A5gBIAMgAikCMDcDkAEgAyACKQJINwOIASADIAApAgA3A4ABIAQgA0GQAWogA0GAAWoQByACIAMpAogCNwJIIAAgAykCgAI3AgAgAyACKQIoNwN4IAMgAikCIDcDcCADIAIpAjg3A2ggAyACKQIwNwNgIAQgA0HwAGogA0HgAGoQByACIAMpAogCNwI4IAIgAykCgAI3AjAgAyACKQIYNwNYIAMgAikCEDcDUCADIAIpAig3A0ggAyACKQIgNwNAIAQgA0HQAGogA0FAaxAHIAIgAykCiAI3AiggAiADKQKAAjcCICADIAIpAgg3AzggAyACKQIANwMwIAMgAikCGDcDKCADIAIpAhA3AyAgBCADQTBqIANBIGoQByACIAMpAogCNwIYIAIgAykCgAI3AhAgAyADKQOYAjcDGCADIAMpA5AC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IQsgAigAVCEbIAIoAHQhHCACKABkIQwgAigAKCENIAEoABghDiACKABYIR0gAigAeCEeIAIoAGghDyABKAAAIRAgACACKAAsIh8gASgAHCIBIAIoAFwgAigAbCIgIAIoAHxxc3NzNgAcIAAgDSAOIB0gDyAecXNzczYAGCAAIAogCyAbIAwgHHFzc3M2ABQgACAEIAggGSAJIBpxc3NzNgAQIAAgICAHIBcgGCAfcXNzczYADCAAIA8gBiAVIA0gFnFzc3M2AAggACAMIAUgEyAKIBRxc3NzNgAEIAAgCSAQIBEgBCAScXNzczYAACADIAIpAng3A5gCIAMgAikCcDcDkAIgAyACKQJoNwP4ASADIAIpAmA3A/ABIAMgAikCeDcD6AEgAyACKQJwNwPgASADQYACaiIEIANB8AFqIANB4AFqEAcgAiADKQKIAjcCeCACIAMpAoACNwJwIAMgAikCWDcD2AEgAyACKQJQNwPQASADIAIpAmg3A8gBIAMgAikCYDcDwAEgBCADQdABaiADQcABahAHIAIgAykCiAI3AmggAiADKQKAAjcCYCADIAIpAkg3A7gBIAMgAkFAayIAKQIANwOwASADIAIpAlg3A6gBIAMgAikCUDcDoAEgBCADQbABaiADQaABahAHIAIgAykCiAI3AlggAiADKQKAAjcCUCADIAIpAjg3A5gBIAMgAikCMDcDkAEgAyACKQJINwOIASADIAApAgA3A4ABIAQgA0GQAWogA0GAAWoQByACIAMpAogCNwJIIAAgAykCgAI3AgAgAyACKQIoNwN4IAMgAikCIDcDcCADIAIpAjg3A2ggAyACKQIwNwNgIAQgA0HwAGogA0HgAGoQByACIAMpAogCNwI4IAIgAykCgAI3AjAgAyACKQIYNwNYIAMgAikCEDcDUCADIAIpAig3A0ggAyACKQIgNwNAIAQgA0HQAGogA0FAaxAHIAIgAykCiAI3AiggAiADKQKAAjcCICADIAIpAgg3AzggAyACKQIANwMwIAMgAikCGDcDKCADIAIpAhA3AyAgBCADQTBqIANBIGoQByACIAMpAogCNwIYIAIgAykCgAI3AhAgAyADKQOYAjcDGCADIAMpA5ACNwMQIAMgAikCCDcDCCADIAIpAgA3AwAgBCADQRBqIAMQByACIAMpAogCNwIIIAIgAykCgAI3AgAgAiAHIAIoAAxzNgIMIAIgBiACKAAIczYCCCACIAUgAigABHM2AgQgAiAQIAIoAABzNgIAIAAgCCAAKAAAczYCACACIAsgAigARHM2AkQgAiAOIAIoAEhzNgJIIAIgASACKABMczYCTCADQaACaiQAC5kNARJ/IwBBoARrIgIkACAAKAA8IQQgACgAOCEFIAAoADQhBiAAKAAwIQcgACgAICEIIAAoACQhCSAAKAAoIQogACgALCELIAAoABwhDCAAKAAYIQ0gACgAFCEOIAAoABAhDyAAKAAEIRAgACgACCERIAAoAAwhEiAAKAAAIRMgAiABKQJ4NwOYBCACIAEpAnA3A5AEIAIgASkCaDcD+AMgAiABKQJgNwPwAyACIAEpAng3A+gDIAIgASkCcDcD4AMgAkGABGoiAyACQfADaiACQeADahAHIAEgAikCiAQ3AnggASACKQKABDcCcCACIAEpAlg3A9gDIAIgASkCUDcD0AMgAiABKQJoNwPIAyACIAEpAmA3A8ADIAMgAkHQA2ogAkHAA2oQByABIAIpAogENwJoIAEgAikCgAQ3AmAgAiABKQJINwO4AyACIAFBQGsiACkCADcDsAMgAiABKQJYNwOoAyACIAEpAlA3A6ADIAMgAkGwA2ogAkGgA2oQByABIAIpAogENwJYIAEgAikCgAQ3AlAgAiABKQI4NwOYAyACIAEpAjA3A5ADIAIgASkCSDcDiAMgAiAAKQIANwOAAyADIAJBkANqIAJBgANqEAcgASACKQKIBDcCSCAAIAIpAoAENwIAIAIgASkCKDcD+AIgAiABKQIgNwPwAiACIAEpAjg3A+gCIAIgASkCMDcD4AIgAyACQfACaiACQeACahAHIAEgAikCiAQ3AjggASACKQKABDcCMCACIAEpAhg3A9gCIAIgASkCEDcD0AIgAiABKQIoNwPIAiACIAEpAiA3A8ACIAMgAkHQAmogAkHAAmoQByABIAIpAogENwIoIAEgAikCgAQ3AiAgAiABKQIINwO4AiACIAEpAgA3A7ACIAIgASkCGDcDqAIgAiABKQIQNwOgAiADIAJBsAJqIAJBoAJqEAcgASACKQKIBDcCGCABIAIpAoAENwIQIAIgAikDmAQ3A5gCIAIgAikDkAQ3A5ACIAIgASkCCDcDiAIgAiABKQIANwOAAiADIAJBkAJqIAJBgAJqEAcgASACKQKIBDcCCCABIAIpAoAENwIAIAEgEiABKAAMczYCDCABIBEgASgACHM2AgggASAQIAEoAARzNgIEIAEgEyABKAAAczYCACAAIA8gACgAAHM2AgAgASAOIAEoAERzNgJEIAEgDSABKABIczYCSCABIAwgASgATHM2AkwgAiABKQJ4NwOYBCACIAEpAnA3A5AEIAIgASkCaDcD+AEgAiABKQJgNwPwASACIAEpAng3A+gBIAIgASkCcDcD4AEgAyACQfABaiACQeABahAHIAEgAikCiAQ3AnggASACKQKABDcCcCACIAEpAlg3A9gBIAIgASkCUDcD0AEgAiABKQJoNwPIASACIAEpAmA3A8ABIAMgAkHQAWogAkHAAWoQByABIAIpAogENwJoIAEgAikCgAQ3AmAgAiABKQJINwO4ASACIAApAgA3A7ABIAIgASkCWDcDqAEgAiABKQJQNwOgASADIAJBsAFqIAJBoAFqEAcgASACKQKIBDcCWCABIAIpAoAENwJQIAIgASkCODcDmAEgAiABKQIwNwOQASACIAEpAkg3A4gBIAIgACkCADcDgAEgAyACQZABaiACQYABahAHIAEgAikCiAQ3AkggACACKQKABDcCACACIAEpAig3A3ggAiABKQIgNwNwIAIgASkCODcDaCACIAEpAjA3A2AgAyACQfAAaiACQeAAahAHIAEgAikCiAQ3AjggASACKQKABDcCMCACIAEpAhg3A1ggAiABKQIQNwNQIAIgASkCKDcDSCACIAEpAiA3A0AgAyACQdAAaiACQUBrEAcgASACKQKIBDcCKCABIAIpAoAENwIgIAIgASkCCDcDOCACIAEpAgA3AzAgAiABKQIYNwMoIAIgASkCEDcDICADIAJBMGogAkEgahAHIAEgAikCiAQ3AhggASACKQKABDcCECACIAIpA5gENwMYIAIgAikDkAQ3AxAgAiABKQIINwMIIAIgASkCADcDACADIAJBEGogAhAHIAEgAikCiAQ3AgggASACKQKABDcCACABIAsgASgADHM2AgwgASAKIAEoAAhzNgIIIAEgCSABKAAEczYCBCABIAggASgAAHM2AgAgACAHIAAoAABzNgIAIAEgBiABKABEczYCRCABIAUgASgASHM2AkggASAEIAEoAExzNgJMIAJBoARqJAALvQkBEX8jAEGgAmsiAyQAIAEoAAQhECABKAAIIREgASgADCESIAAoAAQhCyAAKAAIIQwgACgADCENIAEoAAAhEyACQfAAaiIBIAAoAAAiDkGAgoQQcyIANgIAIAJB4ABqIgYgDkHb++CoBXM2AgAgAkHQAGoiByAANgIAIAJBQGsiACAOIBNzIgU2AgAgAkKgosSRtK6tlF03AjggAkEwaiIIQtv74KjVzfCXcTcCACACQpXE3MmFsvq84gA3AiggAkEgaiIJQoCChJCwoIGEDTcCACACQqCixJG0rq2UXTcCGCACQRBqIgpC2/vgqNXN8JdxNwIAIAIgBTYCACACIA1BkNPnkwZzIgU2AnwgAiAMQZXE3MkFcyIENgJ4IAIgC0GDiqDoAHMiDzYCdCACIA1B8+qi6X1zNgJsIAIgDEGgosSRBHM2AmggAiALQe2Ev4l/czYCZCACIAU2AlwgAiAENgJYIAIgDzYCVCACIA0gEnMiBTYCTCACIAwgEXMiBDYCSCACIAsgEHMiDzYCRCACIAU2AgwgAiAENgIIIAIgDzYCBEEAIQUDQCADIAEpAgg3A5gCIAMgASkCADcDkAIgAyAGKQIINwP4ASADIAYpAgA3A/ABIAMgASkCCDcD6AEgAyABKQIANwPgASADQYACaiIEIANB8AFqIANB4AFqEAcgASADKQKIAjcCCCABIAMpAoACNwIAIAMgBykCCDcD2AEgAyAHKQIANwPQASADIAYpAgg3A8gBIAMgBikCADcDwAEgBCADQdABaiADQcABahAHIAYgAykCiAI3AgggBiADKQKAAjcCACADIAApAgg3A7gBIAMgACkCADcDsAEgAyAHKQIINwOoASADIAcpAgA3A6ABIAQgA0GwAWogA0GgAWoQByAHIAMpAogCNwIIIAcgAykCgAI3AgAgAyAIKQIINwOYASADIAgpAgA3A5ABIAMgACkCCDcDiAEgAyAAKQIANwOAASAEIANBkAFqIANBgAFqEAcgACADKQKIAjcCCCAAIAMpAoACNwIAIAMgCSkCCDcDeCADIAkpAgA3A3AgAyAIKQIINwNoIAMgCCkCADcDYCAEIANB8ABqIANB4ABqEAcgCCADKQKIAjcCCCAIIAMpAoACNwIAIAMgCikCCDcDWCADIAopAgA3A1AgAyAJKQIINwNIIAMgCSkCADcDQCAEIANB0ABqIANBQGsQByAJIAMpAogCNwIIIAkgAykCgAI3AgAgAyACKQIINwM4IAMgAikCADcDMCADIAopAgg3AyggAyAKKQIANwMgIAQgA0EwaiADQSBqEAcgCiADKQKIAjcCCCAKIAMpAoACNwIAIAMgAykDmAI3AxggAyADKQOQAjcDECADIAIpAgg3AwggAyACKQIANwMAIAQgA0EQaiADEAcgAiADKQKIAjcCCCACIAMpAoACNwIAIAIgAigADCASczYCDCACIAIoAAggEXM2AgggAiACKAAEIBBzNgIEIAIgAigAACATczYCACAAIAAoAAAgDnM2AgAgAiACKABEIAtzNgJEIAIgAigASCAMczYCSCACIAIoAEwgDXM2AkwgBUEBaiIFQQpHDQALIANBoAJqJAALzwQBCX8jAEGAAWsiAyQAIABBATYCACAAQgA3AgQgAEIANwIMIABCADcCFCAAQgA3AhwgAEKAgICAEDcCJCAAQSxqQQBBzAAQCRogACABQcAHbEGAFWoiASACIAJBH3UgAnFBAXRrIgRBAXNB/wFxQQFrQR92EBUgACABQfgAaiAEQQJzQf8BcUEBa0EfdhAVIAAgAUHwAWogBEEDc0H/AXFBAWtBH3YQFSAAIAFB6AJqIARBBHNB/wFxQQFrQR92EBUgACABQeADaiAEQQVzQf8BcUEBa0EfdhAVIAAgAUHYBGogBEEGc0H/AXFBAWtBH3YQFSAAIAFB0AVqIARBB3NB/wFxQQFrQR92EBUgACABQcgGaiAEQQhzQf8BcUEBa0EfdhAVIAMgACkCSDcDKCADIABBQGspAgA3AyAgAyAAKQI4NwMYIAMgACkCMDcDECADIAApAig3AwggAyAAKQIINwM4IANBQGsgACkCEDcDACADIAApAhg3A0ggAyAAKQIgNwNQIAMgACkCADcDMCAAKAJUIQEgACgCWCEEIAAoAlwhBSAAKAJgIQYgACgCZCEHIAAoAmghCCAAKAJsIQkgACgCcCEKIAAoAlAhCyADQQAgACgCdGs2AnwgA0EAIAprNgJ4IANBACAJazYCdCADQQAgCGs2AnAgA0EAIAdrNgJsIANBACAGazYCaCADQQAgBWs2AmQgA0EAIARrNgJgIANBACABazYCXCADQQAgC2s2AlggACADQQhqIAJBgAFxQQd2EBUgA0GAAWokAAvwCQEdfyABKAIEIQQgASgCLCEDIAEoAgghBSABKAIwIQYgASgCDCEHIAEoAjQhCCABKAIQIQkgASgCOCEKIAEoAhQhCyABKAI8IQwgASgCGCENIAFBQGsiDigCACEPIAEoAhwhECABKAJEIREgASgCICESIAEoAkghEyABKAIkIRQgASgCTCEVIAAgASgCACABKAIoajYCACAAIBQgFWo2AiQgACASIBNqNgIgIAAgECARajYCHCAAIA0gD2o2AhggACALIAxqNgIUIAAgCSAKajYCECAAIAcgCGo2AgwgACAFIAZqNgIIIAAgAyAEajYCBCABKAIEIQMgASgCLCEFIAEoAgghBiABKAIwIQcgASgCDCEIIAEoAjQhCSABKAIQIQogASgCOCELIAEoAhQhDCABKAI8IQ0gASgCGCEPIA4oAgAhDiABKAIcIQQgASgCRCEQIAEoAiAhESABKAJIIRIgASgCACETIAEoAighFCAAIAEoAkwgASgCJGs2AkwgACASIBFrNgJIIAAgECAEazYCRCAAQUBrIgQgDiAPazYCACAAIA0gDGs2AjwgACALIAprNgI4IAAgCSAIazYCNCAAIAcgBms2AjAgACAFIANrNgIsIAAgFCATazYCKCAAQdAAaiAAIAJBKGoQBiAAQShqIgMgAyACEAYgAEH4AGogAkH4AGogAUH4AGoQBiAAIAFB0ABqIAJB0ABqEAYgACgCBCEUIAAoAgghFSAAKAIMIRYgACgCECEXIAAoAhQhGCAAKAIYIRkgACgCHCEaIAAoAiAhGyAAKAIkIRwgACgCLCEBIAAoAlQhAiAAKAIwIQMgACgCWCEFIAAoAjQhBiAAKAJcIQcgACgCOCEIIAAoAmAhCSAAKAI8IQogACgCZCELIAQoAgAhDCAAKAJoIQ0gACgCRCEOIAAoAmwhDyAAKAJIIRAgACgCcCERIAAoAgAhHSAAKAIoIRIgACgCUCETIAAgACgCTCIeIAAoAnQiH2o2AkwgACAQIBFqNgJIIAAgDiAPajYCRCAEIAwgDWo2AgAgACAKIAtqNgI8IAAgCCAJajYCOCAAIAYgB2o2AjQgACADIAVqNgIwIAAgASACajYCLCAAIBIgE2o2AiggACAfIB5rNgIkIAAgESAQazYCICAAIA8gDms2AhwgACANIAxrNgIYIAAgCyAKazYCFCAAIAkgCGs2AhAgACAHIAZrNgIMIAAgBSADazYCCCAAIAIgAWs2AgQgACATIBJrNgIAIAAgACgCnAEiASAcQQF0IgJqNgKcASAAIAAoApgBIgQgG0EBdCIDajYCmAEgACAAKAKUASIFIBpBAXQiBmo2ApQBIAAgACgCkAEiByAZQQF0IghqNgKQASAAIAAoAowBIgkgGEEBdCIKajYCjAEgACAAKAKIASILIBdBAXQiDGo2AogBIAAgACgChAEiDSAWQQF0Ig5qNgKEASAAIAAoAoABIg8gFUEBdCIQajYCgAEgACAAKAJ8IhEgFEEBdCISajYCfCAAIAAoAngiEyAdQQF0IhRqNgJ4IAAgAyAEazYCcCAAIAYgBWs2AmwgACAIIAdrNgJoIAAgCiAJazYCZCAAIAwgC2s2AmAgACAOIA1rNgJcIAAgECAPazYCWCAAIBIgEWs2AlQgACAUIBNrNgJQIAAgAiABazYCdAutDgEXfyMAQcACayIDJAAgAEEoaiIJIAEQYCAAQgA3AlQgAEEBNgJQIABCADcCXCAAQgA3AmQgAEIANwJsIABBADYCdCADQfABaiIIIAkQBSADQcABaiIGIAhBsAoQBkF/IQogAyADKALwAUEBayILNgLwASADIAMoAsABQQFqNgLAASADKAL0ASEMIAMoAvgBIQ0gAygC/AEhDiADKAKAAiEPIAMoAoQCIRAgAygCiAIhESADKAKMAiESIAMoApACIRMgAygClAIhFCADQZABaiIHIAYQBSAHIAcgBhAGIAAgBxAFIAAgACAGEAYgACAAIAgQBiMAQZABayIEJAAgBEHgAGoiBSAAEAUgBEEwaiICIAUQBSACIAIQBSACIAAgAhAGIAUgBSACEAYgBSAFEAUgBSACIAUQBiACIAUQBSACIAIQBSACIAIQBSACIAIQBSACIAIQBSAFIAIgBRAGIAIgBRAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAiAFEAYgBCACEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgBCAEEAUgAiAEIAIQBiACIAIQBSACIAIQBSACIAIQBSACIAIQBSACIAIQBSACIAIQBSACIAIQBSACIAIQBSACIAIQBSACIAIQBSAFIAIgBRAGIAIgBRAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAhAFIAIgAiAFEAYgBCACEAVBASECA0AgBCAEEAUgAkEBaiICQeQARw0ACyAEQTBqIgIgBCACEAYgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgAiACEAUgBEHgAGoiBSACIAUQBiAFIAUQBSAFIAUQBSAAIAUgABAGIARBkAFqJAAgACAAIAcQBiAAIAAgCBAGIANB4ABqIgIgABAFIAIgAiAGEAYgAyADKAKEASICIBRrNgJUIAMgAygCgAEiBCATazYCUCADIAMoAnwiBSASazYCTCADIAMoAngiBiARazYCSCADIAMoAnQi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BC0AbCACQQh2aiICOgBsIAQgBC0AbSACQQh2aiICOgBtIAQgBC0AbiACQQh2aiICOgBuIAQgBC0AbyACQQh2ajoAbyAAQUBrIQAgAUJAfCIBQj9WDQALIAFQDQELQQAhAiAEQSBqIARB4ABqIAQQLyABpyIGQQNxIQdBACEDIAFCBFoEQCAGQTxxIQhBACEGA0AgACADaiAEQSBqIgkgA2otAAA6AAAgACADQQFyIgVqIAUgCWotAAA6AAAgACADQQJyIgVqIARBIGogBWotAAA6AAAgACADQQNyIgVqIARBIGogBWotAAA6AAAgA0EEaiEDIAZBBGoiBiAIRw0ACwsgB0UNAANAIAAgA2ogBEEgaiADai0AADoAACADQQFqIQMgAkEBaiICIAdHDQALCyAEQSBqQcAAEAggBEEgEAgLIARB8ABqJABBAAuGBgEUfyMAQbACayICJAAgACABLQAAOgAAIAAgAS0AAToAASAAIAEtAAI6AAIgACABLQADOgADIAAgAS0ABDoABCAAIAEtAAU6AAUgACABLQAGOgAGIAAgAS0ABzoAByAAIAEtAAg6AAggACABLQAJOgAJIAAgAS0ACjoACiAAIAEtAAs6AAsgACABLQAMOgAMIAAgAS0ADToADSAAIAEtAA46AA4gACABLQAPOgAPIAAgAS0AEDoAECAAIAEtABE6ABEgACABLQASOgASIAAgAS0AEzoAEyAAIAEtABQ6ABQgACABLQAVOgAVIAAgAS0AFjoAFiAAIAEtABc6ABcgACABLQAYOgAYIAAgAS0AGToAGSAAIAEtABo6ABogACABLQAbOgAbIAAgAS0AHDoAHCAAIAEtAB06AB0gACABLQAeOgAeIAEtAB8hASAAIAAtAABB+AFxOgAAIAAgAUE/cUHAAHI6AB8gAkEwaiAAEDEgAigCgAEhASACKAJYIQMgAigChAEhBCACKAJcIQUgAigCiAEhBiACKAJgIQcgAigCjAEhCCACKAJkIQkgAigCkAEhCiACKAJoIQsgAigClAEhDCACKAJsIQ0gAigCmAEhDiACKAJwIQ8gAigCnAEhECACKAJ0IREgAigCoAEhEiACKAJ4IRMgAiACKAJ8IhQgAigCpAEiFWo2AqQCIAIgEiATajYCoAIgAiAQIBFqNgKcAiACIA4gD2o2ApgCIAIgDCANajYClAIgAiAKIAtqNgKQAiACIAggCWo2AowCIAIgBiAHajYCiAIgAiAEIAVqNgKEAiACIAEgA2o2AoACIAIgFSAUazYC9AEgAiASIBNrNgLwASACIBAgEWs2AuwBIAIgDiAPazYC6AEgAiAMIA1rNgLkASACIAogC2s2AuABIAIgCCAJazYC3AEgAiAGIAdrNgLYASACIAQgBWs2AtQBIAIgASADazYC0AEgAkHQAWoiASABEDMgAiACQYACaiABEAYgACACEBYgAkGwAmokAEEAC+scAj5/DH4jAEHwAmsiAyQAA0AgAiAGai0AACIEIAZBgIcCaiIJLQAAcyAHciEHIAQgCS0AwAFzIAVyIQUgBCAJLQCgAXMgDHIhDCAEIAktAIABcyAIciEIIAQgCS0AYHMgDXIhDSAEIAlBQGstAABzIAtyIQsgBCAJLQAgcyAKciEKIAZBAWoiBkEfRw0AC0F/IQkgAi0AH0H/AHEiBCAKckH/AXFBAWsgBCAHckH/AXFBAWtyIAQgC3JB/wFxQQFrciAEQdcAcyANckH/AXFBAWtyIARB/wBzIgQgCHJB/wFxQQFrciAEIAxyQf8BcUEBa3IgBCAFckH/AXFBAWtyQYACcUUEQCADIAEpABg3A+gCIAMgASkAEDcD4AIgAyABKQAAIkM3A9ACIAMgASkACDcD2AIgAyBDp0H4AXE6ANACIAMgAy0A7wJBP3FBwAByOgDvAiADQaACaiACEGAgA0IANwKEAiADQgA3AowCIANBADYClAIgA0IANwPQASADQgA3A9gBIANCADcD4AEgAyADKQOwAjcDoAEgAyADKQO4AjcDqAEgAyADKQPAAjcDsAEgA0IANwL0ASADQQE2AvABIANCADcC/AEgA0IANwPAASADQgA3A8gBIAMgAykDoAI3A5ABIAMgAykDqAI3A5gBIANCADcCdCADQgA3AnwgA0EANgKEASADQgA3AmQgA0EBNgJgIANCADcCbEH+ASECQQAhBANAIAMoApQCIQkgAygCtAEhBiADKAJgIQcgAygCwAEhCiADKAKQASELIAMoAvABIQ0gAygCZCEIIAMoAsQBIQwgAygClAEhBSADKAL0ASEQIAMoAmghDiADKALIASERIAMoApgBIRIgAygC+AEhEyADKAJsIQ8gAygCzAEhFCADKAKcASEVIAMoAvwB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GiABBEAgASALQhB8NwMAC0EADAELEAsACwsmACAAIAEgAiADIAStIAWtQiCGhCAGIAetIAitQiCGhCAKIAsQaQtZAQJ+IAetIAitQiCGhCELQX8hAQJAIAOtIAStQiCGhCIMQt////8PVg0AIAtC3////w9WDQAgACACIAynIAVBICAGIAunIAkgCkG8mwIoAgARCAAhAQsgAQuAAQEDfiAHrSAIrUIghoQhDEF/IQICQCAErSAFrUIghoQiC0IgVA0AIAtCIH0iDULf////D1YNACAMQt////8PVg0AIAAgAyANpyADIAunakEga0EgIAYgDKcgCSAKQbybAigCABEIACECCyABBEAgAUIAIAtCIH0gAhs3AwALIAILYAECfiAErSAFrUIghoQhDCAHrSAIrUIghoQhDSACBEAgAkIgNwMACyANQuD///8PVCAMQt////8PWHFFBEAQCwALIAAgAUEgIAMgDKcgBiANpyAKIAtBuJsCKAIAEQgAC3YBAn4CfyAGrSAHrUIghoQhCwJAIAOtIAStQiCGhCIMQt////8PVg0AIAtC4P///w9aDQAgACAAIAynIgNqQSAgAiADIAUgC6cgCSAKQbibAigCABEIACEAIAEEQCABQgAgDEIgfCAAGzcDAAsgAAwBCxALAAsLWQECfiAHrSAIrUIghoQhC0F/IQECQCADrSAErUIghoQiDELf////D1YNACALQt////8PVg0AIAAgAiAMpyAFQSAgBiALpyAJIApBtJsCKAIAEQgAIQELIAELgAEBA34gB60gCK1CIIaEIQxBfyECAkAgBK0gBa1CIIaEIgtCIFQNACALQiB9Ig1C3////w9WDQAgDELf////D1YNACAAIAMgDacgAyALp2pBIGtBICAGIAynIAkgCkG0mwIoAgARCAAhAgsgAQRAIAFCACALQiB9IAIbNwMACyACC2ABAn4gBK0gBa1CIIaEIQwgB60gCK1CIIaEIQ0gAgRAIAJCIDcDAAsgDULg////D1QgDELf////D1hxRQRAEAsACyAAIAFBICADIAynIAYgDacgCiALQbCbAigCABEIAAt2AQJ+An8gBq0gB61CIIaEIQsCQCADrSAErUIghoQiDELf////D1YNACALQuD///8PWg0AIAAgACAMpyIDakEgIAIgAyAFIAunIAkgCkGwmwIo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cDcDsAMgAiAEKQJQNwOQAyACQeADaiIFIAJBwAJqIgkQGCACQaABaiIEIAUgAkHYBGoiBhAGIAJByAFqIAJBiARqIgcgAkGwBGoiCBAGIAJB8AFqIAggBhAGIAJBmAJqIAUgBxAGIAUgBCABEA8gCSAFIAYQBiACQegCaiIKIAcgCBAGIAJBkANqIgsgCCAGEAYgAkG4A2oiDCAFIAcQBiACQaAGaiIBIAkQDiAFIAQgARAPIAkgBSAGEAYgCiAHIAgQBiALIAggBhAGIAwgBSAHEAYgAkHAB2oiASAJEA4gBSAEIAEQDyAJIAUgBhAGIAogByAIEAYgCyAIIAYQBiAMIAUgBxAGIAJB4AhqIgEgCRAOIAUgBCABEA8gCSAFIAYQBiAKIAcgCBAGIAsgCCAGEAYgDCAFIAcQBiACQYAKaiIBIAkQDiAFIAQgARAPIAkgBSAGEAYgCiAHIAgQBiALIAggBhAGIAwgBSAHEAYgAkGgC2oiASAJEA4gBSAEIAEQDyAJIAUgBhAGIAogByAIEAYgCyAIIAYQBiAMIAUgBxAGIAJBwAxqIgEgCRAOIAUgBCABEA8gCSAFIAYQBiAKIAcgCBAGIAsgCCAGEAYgDCAFIAcQBiACQeANaiAJEA4gAkIANwMgIAJCADcDGCACQgA3AxAgAkIANwMIIAJCADcCNCACQgA3AjwgAkIANwJEIAJCgICAgBA3AkwgAkIANwMAIAJCADcCLCACQQE2AiggAkHUAGpBAEHMABAJGiACQfgAaiEJIAJB2A9qIQ8gAkGwD2ohECACQdAAaiENIAJBKGohDkH8ASEEA0AgAkGoD2ogAikDIDcDACACQaAPaiACKQMYNwMAIAJBmA9qIAIpAxA3AwAgAkGQD2ogAikDCDcDACACIAIpAwA3A4gPIBAgDikCIDcCICAQIA4pAhg3AhggECAOKQIQNwIQIBAgDikCCDcCCCAQIA4pAgA3AgAgDyANKQIgNwIgIA8gDSkCGDcCGCAPIA0pAhA3AhAgDyANKQIINwIIIA8gDSkCADcCACAEIgFBgIUCaiwAACERIAJB4ANqIgUgAkGID2oQGAJAIBFBAEoEQCACQcACaiIEIAUgBhAGIAogByAIEAYgCyAIIAYQBiAMIAUgBxAGIAUgBCACQYAFaiARQf4BcUEBdkGgAWxqEA8MAQsgEUEA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GgDunNX/1cDRAUkuVAAUQSkBNs5PAMmDkv6qbxj/sSEy/qsmy/9O93QA0d2ZAIWAsgE6LBkAySc7Ab0T/AAx5dIBdbt1ALWzuAEActsAMF6TAPUpOAB9Dcz+9K13ACzdIP5U6hQA+aDGAex+6v8vY6j+quKZ/2az2ADijXr/ekKZ/rb1hgDj5BkB1jnr/9itOP+159IAd4Cd/4FfiP9ufjMAAqm3/weCYv5FsF7/dATjAdnykf/KrR8BaQEn/y6vRQDkLzr/1+BF/s84Rf8Q/ov/F8/U/8oUfv9f1WD/CbAhAMgFz//xKoD+IyHA//jlxAGBEXgA+2eX/wc0cP+MOEL/KOL1/9lGJf6s1gn/SEOGAZLA1v8sJnAARLhL/85a+wCV640Atao6AHT07wBcnQIAZq1iAOmJYAF/McsABZuUABeUCf/TegwAIoYa/9vMiACGCCn/4FMr/lUZ9wBtfwD+qYgwAO532//nrdUAzhL+/gi6B/9+CQcBbypIAG807P5gP40Ak79//s1OwP8Oau0Bu9tMAK/zu/5pWa0AVRlZAaLzlAACdtH+IZ4JAIujLv9dRigAbCqO/m/8jv+b35AAM+Wn/0n8m/9edAz/mKDa/5zuJf+z6s//xQCz/5qkjQDhxGgACiMZ/tHU8v9h/d7+uGXlAN4SfwGkiIf/Hs+M/pJh8wCBwBr+yVQh/28KTv+TUbL/BAQYAKHu1/8GjSEANdcO/ym10P/ni50As8vd//+5cQC94qz/cULW/8o+Lf9mQAj/Tq4Q/oV1RP8AQaATCwEBAEHAEwuwASbolY/CsiewRcP0ifLvmPDV36wF08YzObE4AohtU/wFxxdqcD1N2E+6PAt2DRBnDyogU/osOczGTsf9d5KsA3rs////////////////////////////////////////f+3///////////////////////////////////////9/7v///////////////////////////////////////3/t0/VcGmMSWNac96Le+d4UAEH/FAv88AEQhTuMAb3xJP/4JcMBYNw3ALdMPv/DQj0AMkykAeGkTP9MPaP/dT4fAFGRQP92QQ4AonPW/waKLgB85vT/CoqPADQawgC49EwAgY8pAb70E/97qnr/YoFEAHnVkwBWZR7/oWebAIxZQ//v5b4BQwu1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//kdGQFEvj8ADQAAAAD/AAAAAPUAAAAAAAD7AAAAAAAA/QAAAADzAAAAAAcAAAAAAAMAAAAA8wAAAAAFAAAAAAAAAAALAAAAAAALAAAAAPMAAAAAAAD9AAAAAAD/AAAAAAMAAAAA9QAAAAAAAAAPAAAAAAD/AAAAAP8AAAAABwAAAAAFAEH8hgILAQEAQaCHAgsBAQBBwIcCC/EG4Ot6fDtBuK4WVuP68Z/EatoJjeucMrH9hmIFFl9JuABfnJW8o1CMJLHQsVWcg+9bBERcxFgcjobYIk7d0J8RV+z///////////////////////////////////////9/7f///////////////////////////////////////3/u////////////////////////////////////////f0xpYnNvZGl1bURSRwAAAAAIybzzZ+YJajunyoSFrme7K/iU/nLzbjzxNh1fOvVPpdGC5q1/Ug5RH2w+K4xoBZtrvUH7q9mDH3khfhMZzeBbIq4o15gvikLNZe8jkUQ3cS87TezP+8C1vNuJgaXbtek4tUjzW8JWORnQBbbxEfFZm08Zr6SCP5IYgW3a1V4cq0ICA6OYqgfYvm9wRQFbgxKMsuROvoUxJOK0/9XDfQxVb4l78nRdvnKxlhY7/rHegDUSxyWnBtyblCZpz3Txm8HSSvGewWmb5OMlTziGR77vtdWMi8adwQ9lnKx3zKEMJHUCK1lvLOktg+SmbqqEdErU+0G93KmwXLVTEYPaiPl2q99m7lJRPpgQMrQtbcYxqD8h+5jIJwOw5A7vvsd/Wb/Cj6g98wvgxiWnCpNHkafVb4ID4FFjygZwbg4KZykpFPwv0kaFCrcnJskmXDghGy7tKsRa/G0sTd+zlZ0TDThT3mOvi1RzCmWosnc8uwpqduau7UcuycKBOzWCFIUscpJkA/FMoei/ogEwQrxLZhqokZf40HCLS8IwvlQGo1FsxxhS79YZ6JLREKllVSQGmdYqIHFXhTUO9LjRuzJwoGoQyNDSuBbBpBlTq0FRCGw3Hpnrjt9Md0gnqEib4bW8sDRjWsnFswwcOcuKQeNKqthOc+Njd0/KnFujuLLW828uaPyy713ugo90YC8XQ29jpXhyq/ChFHjIhOw5ZBoIAseMKB5jI/r/vpDpvYLe62xQpBV5xrL3o/m+K1Ny4/J4ccacYSbqzj4nygfCwCHHuIbRHuvgzdZ92up40W7uf0999bpvF3KqZ/AGppjIosV9YwquDfm+BJg/ERtHHBM1C3EbhH0EI/V32yiTJMdAe6vKMry+yRUKvp48TA0QnMRnHUO2Qj7LvtTFTCp+ZfycKX9Z7PrWOqtvy18XWEdKjBlEbIAAQcCPAguhAmfmCWqFrme7cvNuPDr1T6V/Ug5RjGgFm6vZgx8ZzeBbmC+KQpFEN3HP+8C1pdu16VvCVjnxEfFZpII/ktVeHKuYqgfYAVuDEr6FMSTDfQxVdF2+cv6x3oCnBtybdPGbwcFpm+SGR77vxp3BD8yhDCRvLOktqoR0StypsFzaiPl2UlE+mG3GMajIJwOwx39Zv/ML4MZHkafVUWPKBmcpKRSFCrcnOCEbLvxtLE0TDThTVHMKZbsKanYuycKBhSxykqHov6JLZhqocItLwqNRbMcZ6JLRJAaZ1oU1DvRwoGoQFsGkGQhsNx5Md0gntbywNLMMHDlKqthOT8qcW/NvLmjugo90b2OleBR4yIQIAseM+v++kOtsUKT3o/m+8nhxxoAAQbCSAgshU2lnRWQyNTUxOSBubyBFZDI1NTE5IGNvbGxpc2lvbnMBAEGAkwILJfCSAQABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAQbCTAgudCMZjY6X4fHyE7nd3mfZ7e43/8vIN1mtrvd5vb7GRxcVUYDAwUAIBAQPOZ2epVisrfef+/hm119diTaur5ux2dpqPyspFH4KCnYnJyUD6fX2H7/r6FbJZWeuOR0fJ+/DwC0Gtreyz1NRnX6Ki/UWvr+ojnJy/U6Sk9+RycpabwMBbdbe3wuH9/Rw9k5OuTCYmamw2Nlp+Pz9B9ff3AoPMzE9oNDRcUaWl9NHl5TT58fEI4nFxk6vY2HNiMTFTKhUVPwgEBAyVx8dSRiMjZZ3Dw14wGBgoN5aWoQoFBQ8vmpq1DgcHCSQSEjYbgICb3+LiPc3r6yZOJydpf7Kyzep1dZ8SCQkbHYODnlgsLHQ0GhouNhsbLdxubrK0WlruW6Cg+6RSUvZ2OztNt9bWYX2zs85SKSl73ePjPl4vL3EThISXplNT9bnR0WgAAAAAwe3tLEAgIGDj/PwfebGxyLZbW+3Uamq+jcvLRme+vtlyOTlLlEpK3phMTNSwWFjohc/PSrvQ0GvF7+8qT6qq5e37+xaGQ0PFmk1N12YzM1URhYWUikVFz+n5+RAEAgIG/n9/gaBQUPB4PDxEJZ+fukuoqOOiUVHzXaOj/oBAQMAFj4+KP5KSrSGdnbxwODhI8fX1BGO8vN93trbBr9radUIhIWMgEBAw5f//Gv3z8w6/0tJtgc3NTBgMDBQmExM1w+zsL75fX+E1l5eiiEREzC4XFzmTxMRXVaen8vx+foJ6PT1HyGRkrLpdXecyGRkr5nNzlcBgYKAZgYGYnk9P0aPc3H9EIiJmVCoqfjuQkKsLiIiDjEZGysfu7ilruLjTKBQUPKfe3nm8Xl7iFgsLHa3b23bb4OA7ZDIyVnQ6Ok4UCgoekklJ2wwGBgpIJCRsuFxc5J/Cwl2909NuQ6ys78RiYqY5kZGoMZWVpNPk5DfyeXmL1efnMovIyENuNzdZ2m1ttwGNjYyx1dVknE5O0kmpqeDYbGy0rFZW+vP09AfP6uolymVlr/R6eo5Hrq7pEAgIGG+6utXweHiISiUlb1wuLnI4HBwkV6am8XO0tMeXxsZRy+joI6Hd3XzodHScPh8fIZZLS91hvb3cDYuLhg+KioXgcHCQfD4+QnG1tcTMZmaqkEhI2AYDAwX39vYBHA4OEsJhYaNqNTVfrldX+Wm5udAXhoaRmcHBWDodHScnnp652eHhOOv4+BMrmJizIhERM9Jpabup2dlwB46OiTOUlKctm5u2PB4eIhWHh5LJ6ekgh87OSapVVf9QKCh4pd/fegOMjI9ZoaH4CYmJgBoNDRdlv7/a1+bmMYRCQsbQaGi4gkFBwymZmbBaLS13Hg8PEXuwsMuoVFT8bbu71iwWFjoKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQ==";return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["f"];updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var ASM_CONSTS={36304:()=>Module.getRandomValue(),36340:()=>{if(Module.getRandomValue===undefined){try{var window_="object"===typeof window?window:self;var crypto_=typeof window_.crypto!=="undefined"?window_.crypto:window_.msCrypto;var randomValuesStandard=function(){var buf=new Uint32Array(1);crypto_.getRandomValues(buf);return buf[0]>>>0};randomValuesStandard();Module.getRandomValue=randomValuesStandard}catch(e){try{var crypto=require("crypto");var randomValueNodeJS=function(){var buf=crypto["randomBytes"](4);return(buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3])>>>0};randomValueNodeJS();Module.getRandomValue=randomValueNodeJS}catch(e){throw"No secure random number generator found"}}}}};var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr];case"i8":return HEAP8[ptr];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":abort("to do getValue(i64) use WASM_BIGINT");case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=Module["noExitRuntime"]||true;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr]=value;break;case"i8":HEAP8[ptr]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":abort("to do setValue(i64) use WASM_BIGINT");case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var ___assert_fail=(condition,filename,line,func)=>{abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])};var __abort_js=()=>{abort("")};var __emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var wasmImports={b:___assert_fail,c:__abort_js,d:__emscripten_memcpy_js,a:_emscripten_asm_const_int,e:_emscripten_resize_heap};var wasmExports=createWasm();var _crypto_aead_aegis128l_keybytes=Module["_crypto_aead_aegis128l_keybytes"]=()=>(_crypto_aead_aegis128l_keybytes=Module["_crypto_aead_aegis128l_keybytes"]=wasmExports["g"])();var _crypto_aead_aegis128l_nsecbytes=Module["_crypto_aead_aegis128l_nsecbytes"]=()=>(_crypto_aead_aegis128l_nsecbytes=Module["_crypto_aead_aegis128l_nsecbytes"]=wasmExports["h"])();var _crypto_aead_aegis128l_npubbytes=Module["_crypto_aead_aegis128l_npubbytes"]=()=>(_crypto_aead_aegis128l_npubbytes=Module["_crypto_aead_aegis128l_npubbytes"]=wasmExports["i"])();var _crypto_aead_aegis128l_abytes=Module["_crypto_aead_aegis128l_abytes"]=()=>(_crypto_aead_aegis128l_abytes=Module["_crypto_aead_aegis128l_abytes"]=wasmExports["j"])();var _crypto_aead_aegis128l_messagebytes_max=Module["_crypto_aead_aegis128l_messagebytes_max"]=()=>(_crypto_aead_aegis128l_messagebytes_max=Module["_crypto_aead_aegis128l_messagebytes_max"]=wasmExports["k"])();var _crypto_aead_aegis128l_keygen=Module["_crypto_aead_aegis128l_keygen"]=a0=>(_crypto_aead_aegis128l_keygen=Module["_crypto_aead_aegis128l_keygen"]=wasmExports["l"])(a0);var _crypto_aead_aegis128l_encrypt=Module["_crypto_aead_aegis128l_encrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_aegis128l_encrypt=Module["_crypto_aead_aegis128l_encrypt"]=wasmExports["m"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_aegis128l_encrypt_detached=Module["_crypto_aead_aegis128l_encrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_crypto_aead_aegis128l_encrypt_detached=Module["_crypto_aead_aegis128l_encrypt_detached"]=wasmExports["n"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _crypto_aead_aegis128l_decrypt=Module["_crypto_aead_aegis128l_decrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_aegis128l_decrypt=Module["_crypto_aead_aegis128l_decrypt"]=wasmExports["o"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_aegis128l_decrypt_detached=Module["_crypto_aead_aegis128l_decrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_aegis128l_decrypt_detached=Module["_crypto_aead_aegis128l_decrypt_detached"]=wasmExports["p"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_aegis256_keybytes=Module["_crypto_aead_aegis256_keybytes"]=()=>(_crypto_aead_aegis256_keybytes=Module["_crypto_aead_aegis256_keybytes"]=wasmExports["q"])();var _crypto_aead_aegis256_nsecbytes=Module["_crypto_aead_aegis256_nsecbytes"]=()=>(_crypto_aead_aegis256_nsecbytes=Module["_crypto_aead_aegis256_nsecbytes"]=wasmExports["r"])();var _crypto_aead_aegis256_npubbytes=Module["_crypto_aead_aegis256_npubbytes"]=()=>(_crypto_aead_aegis256_npubbytes=Module["_crypto_aead_aegis256_npubbytes"]=wasmExports["s"])();var _crypto_aead_aegis256_abytes=Module["_crypto_aead_aegis256_abytes"]=()=>(_crypto_aead_aegis256_abytes=Module["_crypto_aead_aegis256_abytes"]=wasmExports["t"])();var _crypto_aead_aegis256_messagebytes_max=Module["_crypto_aead_aegis256_messagebytes_max"]=()=>(_crypto_aead_aegis256_messagebytes_max=Module["_crypto_aead_aegis256_messagebytes_max"]=wasmExports["u"])();var _crypto_aead_aegis256_keygen=Module["_crypto_aead_aegis256_keygen"]=a0=>(_crypto_aead_aegis256_keygen=Module["_crypto_aead_aegis256_keygen"]=wasmExports["v"])(a0);var _crypto_aead_aegis256_encrypt=Module["_crypto_aead_aegis256_encrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_aegis256_encrypt=Module["_crypto_aead_aegis256_encrypt"]=wasmExports["w"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_aegis256_encrypt_detached=Module["_crypto_aead_aegis256_encrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_crypto_aead_aegis256_encrypt_detached=Module["_crypto_aead_aegis256_encrypt_detached"]=wasmExports["x"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _crypto_aead_aegis256_decrypt=Module["_crypto_aead_aegis256_decrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_aegis256_decrypt=Module["_crypto_aead_aegis256_decrypt"]=wasmExports["y"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_aegis256_decrypt_detached=Module["_crypto_aead_aegis256_decrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_aegis256_decrypt_detached=Module["_crypto_aead_aegis256_decrypt_detached"]=wasmExports["z"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_chacha20poly1305_encrypt_detached=Module["_crypto_aead_chacha20poly1305_encrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_crypto_aead_chacha20poly1305_encrypt_detached=Module["_crypto_aead_chacha20poly1305_encrypt_detached"]=wasmExports["A"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _crypto_aead_chacha20poly1305_encrypt=Module["_crypto_aead_chacha20poly1305_encrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_chacha20poly1305_encrypt=Module["_crypto_aead_chacha20poly1305_encrypt"]=wasmExports["B"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_chacha20poly1305_ietf_encrypt_detached=Module["_crypto_aead_chacha20poly1305_ietf_encrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_crypto_aead_chacha20poly1305_ietf_encrypt_detached=Module["_crypto_aead_chacha20poly1305_ietf_encrypt_detached"]=wasmExports["C"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _crypto_aead_chacha20poly1305_ietf_encrypt=Module["_crypto_aead_chacha20poly1305_ietf_encrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_chacha20poly1305_ietf_encrypt=Module["_crypto_aead_chacha20poly1305_ietf_encrypt"]=wasmExports["D"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_chacha20poly1305_decrypt_detached=Module["_crypto_aead_chacha20poly1305_decrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_chacha20poly1305_decrypt_detached=Module["_crypto_aead_chacha20poly1305_decrypt_detached"]=wasmExports["E"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_chacha20poly1305_decrypt=Module["_crypto_aead_chacha20poly1305_decrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_chacha20poly1305_decrypt=Module["_crypto_aead_chacha20poly1305_decrypt"]=wasmExports["F"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_chacha20poly1305_ietf_decrypt_detached=Module["_crypto_aead_chacha20poly1305_ietf_decrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_chacha20poly1305_ietf_decrypt_detached=Module["_crypto_aead_chacha20poly1305_ietf_decrypt_detached"]=wasmExports["G"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_chacha20poly1305_ietf_decrypt=Module["_crypto_aead_chacha20poly1305_ietf_decrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_chacha20poly1305_ietf_decrypt=Module["_crypto_aead_chacha20poly1305_ietf_decrypt"]=wasmExports["H"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_chacha20poly1305_ietf_keybytes=Module["_crypto_aead_chacha20poly1305_ietf_keybytes"]=()=>(_crypto_aead_chacha20poly1305_ietf_keybytes=Module["_crypto_aead_chacha20poly1305_ietf_keybytes"]=wasmExports["I"])();var _crypto_aead_chacha20poly1305_ietf_npubbytes=Module["_crypto_aead_chacha20poly1305_ietf_npubbytes"]=()=>(_crypto_aead_chacha20poly1305_ietf_npubbytes=Module["_crypto_aead_chacha20poly1305_ietf_npubbytes"]=wasmExports["J"])();var _crypto_aead_chacha20poly1305_ietf_nsecbytes=Module["_crypto_aead_chacha20poly1305_ietf_nsecbytes"]=()=>(_crypto_aead_chacha20poly1305_ietf_nsecbytes=Module["_crypto_aead_chacha20poly1305_ietf_nsecbytes"]=wasmExports["K"])();var _crypto_aead_chacha20poly1305_ietf_abytes=Module["_crypto_aead_chacha20poly1305_ietf_abytes"]=()=>(_crypto_aead_chacha20poly1305_ietf_abytes=Module["_crypto_aead_chacha20poly1305_ietf_abytes"]=wasmExports["L"])();var _crypto_aead_chacha20poly1305_ietf_messagebytes_max=Module["_crypto_aead_chacha20poly1305_ietf_messagebytes_max"]=()=>(_crypto_aead_chacha20poly1305_ietf_messagebytes_max=Module["_crypto_aead_chacha20poly1305_ietf_messagebytes_max"]=wasmExports["M"])();var _crypto_aead_chacha20poly1305_ietf_keygen=Module["_crypto_aead_chacha20poly1305_ietf_keygen"]=a0=>(_crypto_aead_chacha20poly1305_ietf_keygen=Module["_crypto_aead_chacha20poly1305_ietf_keygen"]=wasmExports["N"])(a0);var _crypto_aead_chacha20poly1305_keybytes=Module["_crypto_aead_chacha20poly1305_keybytes"]=()=>(_crypto_aead_chacha20poly1305_keybytes=Module["_crypto_aead_chacha20poly1305_keybytes"]=wasmExports["O"])();var _crypto_aead_chacha20poly1305_npubbytes=Module["_crypto_aead_chacha20poly1305_npubbytes"]=()=>(_crypto_aead_chacha20poly1305_npubbytes=Module["_crypto_aead_chacha20poly1305_npubbytes"]=wasmExports["P"])();var _crypto_aead_chacha20poly1305_nsecbytes=Module["_crypto_aead_chacha20poly1305_nsecbytes"]=()=>(_crypto_aead_chacha20poly1305_nsecbytes=Module["_crypto_aead_chacha20poly1305_nsecbytes"]=wasmExports["Q"])();var _crypto_aead_chacha20poly1305_abytes=Module["_crypto_aead_chacha20poly1305_abytes"]=()=>(_crypto_aead_chacha20poly1305_abytes=Module["_crypto_aead_chacha20poly1305_abytes"]=wasmExports["R"])();var _crypto_aead_chacha20poly1305_messagebytes_max=Module["_crypto_aead_chacha20poly1305_messagebytes_max"]=()=>(_crypto_aead_chacha20poly1305_messagebytes_max=Module["_crypto_aead_chacha20poly1305_messagebytes_max"]=wasmExports["S"])();var _crypto_aead_chacha20poly1305_keygen=Module["_crypto_aead_chacha20poly1305_keygen"]=a0=>(_crypto_aead_chacha20poly1305_keygen=Module["_crypto_aead_chacha20poly1305_keygen"]=wasmExports["T"])(a0);var _crypto_aead_xchacha20poly1305_ietf_encrypt_detached=Module["_crypto_aead_xchacha20poly1305_ietf_encrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)=>(_crypto_aead_xchacha20poly1305_ietf_encrypt_detached=Module["_crypto_aead_xchacha20poly1305_ietf_encrypt_detached"]=wasmExports["U"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11);var _crypto_aead_xchacha20poly1305_ietf_encrypt=Module["_crypto_aead_xchacha20poly1305_ietf_encrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_xchacha20poly1305_ietf_encrypt=Module["_crypto_aead_xchacha20poly1305_ietf_encrypt"]=wasmExports["V"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_xchacha20poly1305_ietf_decrypt_detached=Module["_crypto_aead_xchacha20poly1305_ietf_decrypt_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_xchacha20poly1305_ietf_decrypt_detached=Module["_crypto_aead_xchacha20poly1305_ietf_decrypt_detached"]=wasmExports["W"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_xchacha20poly1305_ietf_decrypt=Module["_crypto_aead_xchacha20poly1305_ietf_decrypt"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)=>(_crypto_aead_xchacha20poly1305_ietf_decrypt=Module["_crypto_aead_xchacha20poly1305_ietf_decrypt"]=wasmExports["X"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);var _crypto_aead_xchacha20poly1305_ietf_keybytes=Module["_crypto_aead_xchacha20poly1305_ietf_keybytes"]=()=>(_crypto_aead_xchacha20poly1305_ietf_keybytes=Module["_crypto_aead_xchacha20poly1305_ietf_keybytes"]=wasmExports["Y"])();var _crypto_aead_xchacha20poly1305_ietf_npubbytes=Module["_crypto_aead_xchacha20poly1305_ietf_npubbytes"]=()=>(_crypto_aead_xchacha20poly1305_ietf_npubbytes=Module["_crypto_aead_xchacha20poly1305_ietf_npubbytes"]=wasmExports["Z"])();var _crypto_aead_xchacha20poly1305_ietf_nsecbytes=Module["_crypto_aead_xchacha20poly1305_ietf_nsecbytes"]=()=>(_crypto_aead_xchacha20poly1305_ietf_nsecbytes=Module["_crypto_aead_xchacha20poly1305_ietf_nsecbytes"]=wasmExports["_"])();var _crypto_aead_xchacha20poly1305_ietf_abytes=Module["_crypto_aead_xchacha20poly1305_ietf_abytes"]=()=>(_crypto_aead_xchacha20poly1305_ietf_abytes=Module["_crypto_aead_xchacha20poly1305_ietf_abytes"]=wasmExports["$"])();var _crypto_aead_xchacha20poly1305_ietf_messagebytes_max=Module["_crypto_aead_xchacha20poly1305_ietf_messagebytes_max"]=()=>(_crypto_aead_xchacha20poly1305_ietf_messagebytes_max=Module["_crypto_aead_xchacha20poly1305_ietf_messagebytes_max"]=wasmExports["aa"])();var _crypto_aead_xchacha20poly1305_ietf_keygen=Module["_crypto_aead_xchacha20poly1305_ietf_keygen"]=a0=>(_crypto_aead_xchacha20poly1305_ietf_keygen=Module["_crypto_aead_xchacha20poly1305_ietf_keygen"]=wasmExports["ba"])(a0);var _crypto_auth_bytes=Module["_crypto_auth_bytes"]=()=>(_crypto_auth_bytes=Module["_crypto_auth_bytes"]=wasmExports["ca"])();var _crypto_auth_keybytes=Module["_crypto_auth_keybytes"]=()=>(_crypto_auth_keybytes=Module["_crypto_auth_keybytes"]=wasmExports["da"])();var _crypto_auth=Module["_crypto_auth"]=(a0,a1,a2,a3,a4)=>(_crypto_auth=Module["_crypto_auth"]=wasmExports["ea"])(a0,a1,a2,a3,a4);var _crypto_auth_verify=Module["_crypto_auth_verify"]=(a0,a1,a2,a3,a4)=>(_crypto_auth_verify=Module["_crypto_auth_verify"]=wasmExports["fa"])(a0,a1,a2,a3,a4);var _crypto_auth_keygen=Module["_crypto_auth_keygen"]=a0=>(_crypto_auth_keygen=Module["_crypto_auth_keygen"]=wasmExports["ga"])(a0);var _crypto_box_seedbytes=Module["_crypto_box_seedbytes"]=()=>(_crypto_box_seedbytes=Module["_crypto_box_seedbytes"]=wasmExports["ha"])();var _crypto_box_publickeybytes=Module["_crypto_box_publickeybytes"]=()=>(_crypto_box_publickeybytes=Module["_crypto_box_publickeybytes"]=wasmExports["ia"])();var _crypto_box_secretkeybytes=Module["_crypto_box_secretkeybytes"]=()=>(_crypto_box_secretkeybytes=Module["_crypto_box_secretkeybytes"]=wasmExports["ja"])();var _crypto_box_beforenmbytes=Module["_crypto_box_beforenmbytes"]=()=>(_crypto_box_beforenmbytes=Module["_crypto_box_beforenmbytes"]=wasmExports["ka"])();var _crypto_box_noncebytes=Module["_crypto_box_noncebytes"]=()=>(_crypto_box_noncebytes=Module["_crypto_box_noncebytes"]=wasmExports["la"])();var _crypto_box_macbytes=Module["_crypto_box_macbytes"]=()=>(_crypto_box_macbytes=Module["_crypto_box_macbytes"]=wasmExports["ma"])();var _crypto_box_messagebytes_max=Module["_crypto_box_messagebytes_max"]=()=>(_crypto_box_messagebytes_max=Module["_crypto_box_messagebytes_max"]=wasmExports["na"])();var _crypto_box_seed_keypair=Module["_crypto_box_seed_keypair"]=(a0,a1,a2)=>(_crypto_box_seed_keypair=Module["_crypto_box_seed_keypair"]=wasmExports["oa"])(a0,a1,a2);var _crypto_box_keypair=Module["_crypto_box_keypair"]=(a0,a1)=>(_crypto_box_keypair=Module["_crypto_box_keypair"]=wasmExports["pa"])(a0,a1);var _crypto_box_beforenm=Module["_crypto_box_beforenm"]=(a0,a1,a2)=>(_crypto_box_beforenm=Module["_crypto_box_beforenm"]=wasmExports["qa"])(a0,a1,a2);var _crypto_box_detached_afternm=Module["_crypto_box_detached_afternm"]=(a0,a1,a2,a3,a4,a5,a6)=>(_crypto_box_detached_afternm=Module["_crypto_box_detached_afternm"]=wasmExports["ra"])(a0,a1,a2,a3,a4,a5,a6);var _crypto_box_detached=Module["_crypto_box_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_crypto_box_detached=Module["_crypto_box_detached"]=wasmExports["sa"])(a0,a1,a2,a3,a4,a5,a6,a7);var _crypto_box_easy_afternm=Module["_crypto_box_easy_afternm"]=(a0,a1,a2,a3,a4,a5)=>(_crypto_box_easy_afternm=Module["_crypto_box_easy_afternm"]=wasmExports["ta"])(a0,a1,a2,a3,a4,a5);var _crypto_box_easy=Module["_crypto_box_easy"]=(a0,a1,a2,a3,a4,a5,a6)=>(_crypto_box_easy=Module["_crypto_box_easy"]=wasmExports["ua"])(a0,a1,a2,a3,a4,a5,a6);var _crypto_box_open_detached_afternm=Module["_crypto_box_open_detached_afternm"]=(a0,a1,a2,a3,a4,a5,a6)=>(_crypto_box_open_detached_afternm=Module["_crypto_box_open_detached_afternm"]=wasmExports["va"])(a0,a1,a2,a3,a4,a5,a6);var _crypto_box_open_detached=Module["_crypto_box_open_detached"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_crypto_box_open_detached=Module["_crypto_box_open_detached"]=wasmExports["wa"])(a0,a1,a2,a3,a4,a5,a6,a7);var _crypto_box_open_easy_afternm=Module["_crypto_box_open_easy_afternm"]=(a0,a1,a2,a3,a4,a5)=>(_crypto_box_open_easy_afternm=Module["_crypto_box_open_easy_afternm"]=wasmExports["xa"])(a0,a1,a2,a3,a4,a5);var _crypto_box_open_easy=Module["_crypto_box_open_easy"]=(a0,a1,a2,a3,a4,a5,a6)=>(_crypto_box_open_easy=Module["_crypto_box_open_easy"]=wasmExports["ya"])(a0,a1,a2,a3,a4,a5,a6);var _crypto_box_seal=Module["_crypto_box_seal"]=(a0,a1,a2,a3,a4)=>(_crypto_box_seal=Module["_crypto_box_seal"]=wasmExports["za"])(a0,a1,a2,a3,a4);var _crypto_box_seal_open=Module["_crypto_box_seal_open"]=(a0,a1,a2,a3,a4,a5)=>(_crypto_box_seal_open=Module["_crypto_box_seal_open"]=wasmExports["Aa"])(a0,a1,a2,a3,a4,a5);var _crypto_box_sealbytes=Module["_crypto_box_sealbytes"]=()=>(_crypto_box_sealbytes=Module["_crypto_box_sealbytes"]=wasmExports["Ba"])();var _crypto_generichash_bytes_min=Module["_crypto_generichash_bytes_min"]=()=>(_crypto_generichash_bytes_min=Module["_crypto_generichash_bytes_min"]=wasmExports["Ca"])();var _crypto_generichash_bytes_max=Module["_crypto_generichash_bytes_max"]=()=>(_crypto_generichash_bytes_max=Module["_crypto_generichash_bytes_max"]=wasmExports["Da"])();var _crypto_generichash_bytes=Module["_crypto_generichash_bytes"]=()=>(_crypto_generichash_bytes=Module["_crypto_generichash_bytes"]=wasmExports["Ea"])();var _crypto_generichash_keybytes_min=Module["_crypto_generichash_keybytes_min"]=()=>(_crypto_generichash_keybytes_min=Module["_crypto_generichash_keybytes_min"]=wasmExports["Fa"])();var _crypto_generichash_keybytes_max=Module["_crypto_generichash_keybytes_max"]=()=>(_crypto_generichash_keybytes_max=Module["_crypto_generichash_keybytes_max"]=wasmExports["Ga"])();var _crypto_generichash_keybytes=Module["_crypto_generichash_keybytes"]=()=>(_crypto_generichash_keybytes=Module["_crypto_generichash_keybytes"]=wasmExports["Ha"])();var _crypto_generichash_statebytes=Module["_crypto_generichash_statebytes"]=()=>(_crypto_generichash_statebytes=Module["_crypto_generichash_statebytes"]=wasmExports["Ia"])();var _crypto_generichash=Module["_crypto_generichash"]=(a0,a1,a2,a3,a4,a5,a6)=>(_crypto_generichash=Module["_crypto_generichash"]=wasmExports["Ja"])(a0,a1,a2,a3,a4,a5,a6);var _crypto_generichash_init=Module["_crypto_generichash_init"]=(a0,a1,a2,a3)=>(_crypto_generichash_init=Module["_crypto_generichash_init"]=wasmExports["Ka"])(a0,a1,a2,a3);var _crypto_generichash_update=Module["_crypto_generichash_update"]=(a0,a1,a2,a3)=>(_crypto_generichash_update=Module["_crypto_generichash_update"]=wasmExports["La"])(a0,a1,a2,a3);var _crypto_generichash_final=Module["_crypto_generichash_final"]=(a0,a1,a2)=>(_crypto_generichash_final=Module["_crypto_generichash_final"]=wasmExports["Ma"])(a0,a1,a2);var _crypto_generichash_keygen=Module["_crypto_generichash_keygen"]=a0=>(_crypto_generichash_keygen=Module["_crypto_generichash_keygen"]=wasmExports["Na"])(a0);var _crypto_hash_bytes=Module["_crypto_hash_bytes"]=()=>(_crypto_hash_bytes=Module["_crypto_hash_bytes"]=wasmExports["Oa"])();var _crypto_hash=Module["_crypto_hash"]=(a0,a1,a2,a3)=>(_crypto_hash=Module["_crypto_hash"]=wasmExports["Pa"])(a0,a1,a2,a3);var _crypto_kdf_bytes_min=Module["_crypto_kdf_bytes_min"]=()=>(_crypto_kdf_bytes_min=Module["_crypto_kdf_bytes_min"]=wasmExports["Qa"])();var _crypto_kdf_bytes_max=Module["_crypto_kdf_bytes_max"]=()=>(_crypto_kdf_bytes_max=Module["_crypto_kdf_bytes_max"]=wasmExports["Ra"])();var _crypto_kdf_contextbytes=Module["_crypto_kdf_contextbytes"]=()=>(_crypto_kdf_contextbytes=Module["_crypto_kdf_contextbytes"]=wasmExports["Sa"])();var _crypto_kdf_keybytes=Module["_crypto_kdf_keybytes"]=()=>(_crypto_kdf_keybytes=Module["_crypto_kdf_keybytes"]=wasmExports["Ta"])();var _crypto_kdf_derive_from_key=Module["_crypto_kdf_derive_from_key"]=(a0,a1,a2,a3,a4,a5)=>(_crypto_kdf_derive_from_key=Module["_crypto_kdf_derive_from_key"]=wasmExports["Ua"])(a0,a1,a2,a3,a4,a5);var _crypto_kdf_keygen=Module["_crypto_kdf_keygen"]=a0=>(_crypto_kdf_keygen=Module["_crypto_kdf_keygen"]=wasmExports["Va"])(a0);var _crypto_kdf_hkdf_sha256_extract_init=Module["_crypto_kdf_hkdf_sha256_extract_init"]=(a0,a1,a2)=>(_crypto_kdf_hkdf_sha256_extract_init=Module["_crypto_kdf_hkdf_sha256_extract_init"]=wasmExports["Wa"])(a0,a1,a2);var _crypto_kdf_hkdf_sha256_extract_update=Module["_crypto_kdf_hkdf_sha256_extract_update"]=(a0,a1,a2)=>(_crypto_kdf_hkdf_sha256_extract_update=Module["_crypto_kdf_hkdf_sha256_extract_update"]=wasmExports["Xa"])(a0,a1,a2);var _crypto_kdf_hkdf_sha256_extract_final=Module["_crypto_kdf_hkdf_sha256_extract_final"]=(a0,a1)=>(_crypto_kdf_hkdf_sha256_extract_final=Module["_crypto_kdf_hkdf_sha256_extract_final"]=wasmExports["Ya"])(a0,a1);var _crypto_kdf_hkdf_sha256_extract=Module["_crypto_kdf_hkdf_sha256_extract"]=(a0,a1,a2,a3,a4)=>(_crypto_kdf_hkdf_sha256_extract=Module["_crypto_kdf_hkdf_sha256_extract"]=wasmExports["Za"])(a0,a1,a2,a3,a4);var _crypto_kdf_hkdf_sha256_keygen=Module["_crypto_kdf_hkdf_sha256_keygen"]=a0=>(_crypto_kdf_hkdf_sha256_keygen=Module["_crypto_kdf_hkdf_sha256_keygen"]=wasmExports["_a"])(a0);var _crypto_kdf_hkdf_sha256_expand=Module["_crypto_kdf_hkdf_sha256_expand"]=(a0,a1,a2,a3,a4)=>(_crypto_kdf_hkdf_sha256_expand=Module["_crypto_kdf_hkdf_sha256_expand"]=wasmExports["$a"])(a0,a1,a2,a3,a4);var _crypto_kdf_hkdf_sha256_keybytes=Module["_crypto_kdf_hkdf_sha256_keybytes"]=()=>(_crypto_kdf_hkdf_sha256_keybytes=Module["_crypto_kdf_hkdf_sha256_keybytes"]=wasmExports["ab"])();var _crypto_kdf_hkdf_sha256_bytes_min=Module["_crypto_kdf_hkdf_sha256_bytes_min"]=()=>(_crypto_kdf_hkdf_sha256_bytes_min=Module["_crypto_kdf_hkdf_sha256_bytes_min"]=wasmExports["bb"])();var _crypto_kdf_hkdf_sha256_bytes_max=Module["_crypto_kdf_hkdf_sha256_bytes_max"]=()=>(_crypto_kdf_hkdf_sha256_bytes_max=Module["_crypto_kdf_hkdf_sha256_bytes_max"]=wasmExports["cb"])();var _crypto_kdf_hkdf_sha256_statebytes=Module["_crypto_kdf_hkdf_sha256_statebytes"]=()=>(_crypto_kdf_hkdf_sha256_statebytes=Module["_crypto_kdf_hkdf_sha256_statebytes"]=wasmExports["db"])();var _crypto_kdf_hkdf_sha512_extract_init=Module["_crypto_kdf_hkdf_sha512_extract_init"]=(a0,a1,a2)=>(_crypto_kdf_hkdf_sha512_extract_init=Module["_crypto_kdf_hkdf_sha512_extract_init"]=wasmExports["eb"])(a0,a1,a2);var _crypto_kdf_hkdf_sha512_extract_update=Module["_crypto_kdf_hkdf_sha512_extract_update"]=(a0,a1,a2)=>(_crypto_kdf_hkdf_sha512_extract_update=Module["_crypto_kdf_hkdf_sha512_extract_update"]=wasmExports["fb"])(a0,a1,a2);var _crypto_kdf_hkdf_sha512_extract_final=Module["_crypto_kdf_hkdf_sha512_extract_final"]=(a0,a1)=>(_crypto_kdf_hkdf_sha512_extract_final=Module["_crypto_kdf_hkdf_sha512_extract_final"]=wasmExports["gb"])(a0,a1);var _crypto_kdf_hkdf_sha512_extract=Module["_crypto_kdf_hkdf_sha512_extract"]=(a0,a1,a2,a3,a4)=>(_crypto_kdf_hkdf_sha512_extract=Module["_crypto_kdf_hkdf_sha512_extract"]=wasmExports["hb"])(a0,a1,a2,a3,a4);var _crypto_kdf_hkdf_sha512_keygen=Module["_crypto_kdf_hkdf_sha512_keygen"]=a0=>(_crypto_kdf_hkdf_sha512_keygen=Module["_crypto_kdf_hkdf_sha512_keygen"]=wasmExports["ib"])(a0);var _crypto_kdf_hkdf_sha512_expand=Module["_crypto_kdf_hkdf_sha512_expand"]=(a0,a1,a2,a3,a4)=>(_crypto_kdf_hkdf_sha512_expand=Module["_crypto_kdf_hkdf_sha512_expand"]=wasmExports["jb"])(a0,a1,a2,a3,a4);var _crypto_kdf_hkdf_sha512_keybytes=Module["_crypto_kdf_hkdf_sha512_keybytes"]=()=>(_crypto_kdf_hkdf_sha512_keybytes=Module["_crypto_kdf_hkdf_sha512_keybytes"]=wasmExports["kb"])();var _crypto_kdf_hkdf_sha512_bytes_min=Module["_crypto_kdf_hkdf_sha512_bytes_min"]=()=>(_crypto_kdf_hkdf_sha512_bytes_min=Module["_crypto_kdf_hkdf_sha512_bytes_min"]=wasmExports["lb"])();var _crypto_kdf_hkdf_sha512_bytes_max=Module["_crypto_kdf_hkdf_sha512_bytes_max"]=()=>(_crypto_kdf_hkdf_sha512_bytes_max=Module["_crypto_kdf_hkdf_sha512_bytes_max"]=wasmExports["mb"])();var _crypto_kdf_hkdf_sha512_statebytes=Module["_crypto_kdf_hkdf_sha512_statebytes"]=()=>(_crypto_kdf_hkdf_sha512_statebytes=Module["_crypto_kdf_hkdf_sha512_statebytes"]=wasmExports["nb"])();var _crypto_kx_seed_keypair=Module["_crypto_kx_seed_keypair"]=(a0,a1,a2)=>(_crypto_kx_seed_keypair=Module["_crypto_kx_seed_keypair"]=wasmExports["ob"])(a0,a1,a2);var _crypto_kx_keypair=Module["_crypto_kx_keypair"]=(a0,a1)=>(_crypto_kx_keypair=Module["_crypto_kx_keypair"]=wasmExports["pb"])(a0,a1);var _crypto_kx_client_session_keys=Module["_crypto_kx_client_session_keys"]=(a0,a1,a2,a3,a4)=>(_crypto_kx_client_session_keys=Module["_crypto_kx_client_session_keys"]=wasmExports["qb"])(a0,a1,a2,a3,a4);var _crypto_kx_server_session_keys=Module["_crypto_kx_server_session_keys"]=(a0,a1,a2,a3,a4)=>(_crypto_kx_server_session_keys=Module["_crypto_kx_server_session_keys"]=wasmExports["rb"])(a0,a1,a2,a3,a4);var _crypto_kx_publickeybytes=Module["_crypto_kx_publickeybytes"]=()=>(_crypto_kx_publickeybytes=Module["_crypto_kx_publickeybytes"]=wasmExports["sb"])();var _crypto_kx_secretkeybytes=Module["_crypto_kx_secretkeybytes"]=()=>(_crypto_kx_secretkeybytes=Module["_crypto_kx_secretkeybytes"]=wasmExports["tb"])();var _crypto_kx_seedbytes=Module["_crypto_kx_seedbytes"]=()=>(_crypto_kx_seedbytes=Module["_crypto_kx_seedbytes"]=wasmExports["ub"])();var _crypto_kx_sessionkeybytes=Module["_crypto_kx_sessionkeybytes"]=()=>(_crypto_kx_sessionkeybytes=Module["_crypto_kx_sessionkeybytes"]=wasmExports["vb"])();var _crypto_scalarmult_base=Module["_crypto_scalarmult_base"]=(a0,a1)=>(_crypto_scalarmult_base=Module["_crypto_scalarmult_base"]=wasmExports["wb"])(a0,a1);var _crypto_scalarmult=Module["_crypto_scalarmult"]=(a0,a1,a2)=>(_crypto_scalarmult=Module["_crypto_scalarmult"]=wasmExports["xb"])(a0,a1,a2);var _crypto_scalarmult_bytes=Module["_crypto_scalarmult_bytes"]=()=>(_crypto_scalarmult_bytes=Module["_crypto_scalarmult_bytes"]=wasmExports["yb"])();var _crypto_scalarmult_scalarbytes=Module["_crypto_scalarmult_scalarbytes"]=()=>(_crypto_scalarmult_scalarbytes=Module["_crypto_scalarmult_scalarbytes"]=wasmExports["zb"])();var _crypto_secretbox_keybytes=Module["_crypto_secretbox_keybytes"]=()=>(_crypto_secretbox_keybytes=Module["_crypto_secretbox_keybytes"]=wasmExports["Ab"])();var _crypto_secretbox_noncebytes=Module["_crypto_secretbox_noncebytes"]=()=>(_crypto_secretbox_noncebytes=Module["_crypto_secretbox_noncebytes"]=wasmExports["Bb"])();var _crypto_secretbox_macbytes=Module["_crypto_secretbox_macbytes"]=()=>(_crypto_secretbox_macbytes=Module["_crypto_secretbox_macbytes"]=wasmExports["Cb"])();var _crypto_secretbox_messagebytes_max=Module["_crypto_secretbox_messagebytes_max"]=()=>(_crypto_secretbox_messagebytes_max=Module["_crypto_secretbox_messagebytes_max"]=wasmExports["Db"])();var _crypto_secretbox_keygen=Module["_crypto_secretbox_keygen"]=a0=>(_crypto_secretbox_keygen=Module["_crypto_secretbox_keygen"]=wasmExports["Eb"])(a0);var _crypto_secretbox_detached=Module["_crypto_secretbox_detached"]=(a0,a1,a2,a3,a4,a5,a6)=>(_crypto_secretbox_detached=Module["_crypto_secretbox_detached"]=wasmExports["Fb"])(a0,a1,a2,a3,a4,a5,a6);var _crypto_secretbox_easy=Module["_crypto_secretbox_easy"]=(a0,a1,a2,a3,a4,a5)=>(_crypto_secretbox_easy=Module["_crypto_secretbox_easy"]=wasmExports["Gb"])(a0,a1,a2,a3,a4,a5);var _crypto_secretbox_open_detached=Module["_crypto_secretbox_open_detached"]=(a0,a1,a2,a3,a4,a5,a6)=>(_crypto_secretbox_open_detached=Module["_crypto_secretbox_open_detached"]=wasmExports["Hb"])(a0,a1,a2,a3,a4,a5,a6);var _crypto_secretbox_open_easy=Module["_crypto_secretbox_open_easy"]=(a0,a1,a2,a3,a4,a5)=>(_crypto_secretbox_open_easy=Module["_crypto_secretbox_open_easy"]=wasmExports["Ib"])(a0,a1,a2,a3,a4,a5);var _crypto_secretstream_xchacha20poly1305_keygen=Module["_crypto_secretstream_xchacha20poly1305_keygen"]=a0=>(_crypto_secretstream_xchacha20poly1305_keygen=Module["_crypto_secretstream_xchacha20poly1305_keygen"]=wasmExports["Jb"])(a0);var _crypto_secretstream_xchacha20poly1305_init_push=Module["_crypto_secretstream_xchacha20poly1305_init_push"]=(a0,a1,a2)=>(_crypto_secretstream_xchacha20poly1305_init_push=Module["_crypto_secretstream_xchacha20poly1305_init_push"]=wasmExports["Kb"])(a0,a1,a2);var _crypto_secretstream_xchacha20poly1305_init_pull=Module["_crypto_secretstream_xchacha20poly1305_init_pull"]=(a0,a1,a2)=>(_crypto_secretstream_xchacha20poly1305_init_pull=Module["_crypto_secretstream_xchacha20poly1305_init_pull"]=wasmExports["Lb"])(a0,a1,a2);var _crypto_secretstream_xchacha20poly1305_rekey=Module["_crypto_secretstream_xchacha20poly1305_rekey"]=a0=>(_crypto_secretstream_xchacha20poly1305_rekey=Module["_crypto_secretstream_xchacha20poly1305_rekey"]=wasmExports["Mb"])(a0);var _crypto_secretstream_xchacha20poly1305_push=Module["_crypto_secretstream_xchacha20poly1305_push"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(_crypto_secretstream_xchacha20poly1305_push=Module["_crypto_secretstream_xchacha20poly1305_push"]=wasmExports["Nb"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var _crypto_secretstream_xchacha20poly1305_pull=Module["_crypto_secretstream_xchacha20poly1305_pull"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(_crypto_secretstream_xchacha20poly1305_pull=Module["_crypto_secretstream_xchacha20poly1305_pull"]=wasmExports["Ob"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var _crypto_secretstream_xchacha20poly1305_statebytes=Module["_crypto_secretstream_xchacha20poly1305_statebytes"]=()=>(_crypto_secretstream_xchacha20poly1305_statebytes=Module["_crypto_secretstream_xchacha20poly1305_statebytes"]=wasmExports["Pb"])();var _crypto_secretstream_xchacha20poly1305_abytes=Module["_crypto_secretstream_xchacha20poly1305_abytes"]=()=>(_crypto_secretstream_xchacha20poly1305_abytes=Module["_crypto_secretstream_xchacha20poly1305_abytes"]=wasmExports["Qb"])();var _crypto_secretstream_xchacha20poly1305_headerbytes=Module["_crypto_secretstream_xchacha20poly1305_headerbytes"]=()=>(_crypto_secretstream_xchacha20poly1305_headerbytes=Module["_crypto_secretstream_xchacha20poly1305_headerbytes"]=wasmExports["Rb"])();var _crypto_secretstream_xchacha20poly1305_keybytes=Module["_crypto_secretstream_xchacha20poly1305_keybytes"]=()=>(_crypto_secretstream_xchacha20poly1305_keybytes=Module["_crypto_secretstream_xchacha20poly1305_keybytes"]=wasmExports["Sb"])();var _crypto_secretstream_xchacha20poly1305_messagebytes_max=Module["_crypto_secretstream_xchacha20poly1305_messagebytes_max"]=()=>(_crypto_secretstream_xchacha20poly1305_messagebytes_max=Module["_crypto_secretstream_xchacha20poly1305_messagebytes_max"]=wasmExports["Tb"])();var _crypto_secretstream_xchacha20poly1305_tag_message=Module["_crypto_secretstream_xchacha20poly1305_tag_message"]=()=>(_crypto_secretstream_xchacha20poly1305_tag_message=Module["_crypto_secretstream_xchacha20poly1305_tag_message"]=wasmExports["Ub"])();var _crypto_secretstream_xchacha20poly1305_tag_push=Module["_crypto_secretstream_xchacha20poly1305_tag_push"]=()=>(_crypto_secretstream_xchacha20poly1305_tag_push=Module["_crypto_secretstream_xchacha20poly1305_tag_push"]=wasmExports["Vb"])();var _crypto_secretstream_xchacha20poly1305_tag_rekey=Module["_crypto_secretstream_xchacha20poly1305_tag_rekey"]=()=>(_crypto_secretstream_xchacha20poly1305_tag_rekey=Module["_crypto_secretstream_xchacha20poly1305_tag_rekey"]=wasmExports["Wb"])();var _crypto_secretstream_xchacha20poly1305_tag_final=Module["_crypto_secretstream_xchacha20poly1305_tag_final"]=()=>(_crypto_secretstream_xchacha20poly1305_tag_final=Module["_crypto_secretstream_xchacha20poly1305_tag_final"]=wasmExports["Xb"])();var _crypto_shorthash_bytes=Module["_crypto_shorthash_bytes"]=()=>(_crypto_shorthash_bytes=Module["_crypto_shorthash_bytes"]=wasmExports["Yb"])();var _crypto_shorthash_keybytes=Module["_crypto_shorthash_keybytes"]=()=>(_crypto_shorthash_keybytes=Module["_crypto_shorthash_keybytes"]=wasmExports["Zb"])();var _crypto_shorthash=Module["_crypto_shorthash"]=(a0,a1,a2,a3,a4)=>(_crypto_shorthash=Module["_crypto_shorthash"]=wasmExports["_b"])(a0,a1,a2,a3,a4);var _crypto_shorthash_keygen=Module["_crypto_shorthash_keygen"]=a0=>(_crypto_shorthash_keygen=Module["_crypto_shorthash_keygen"]=wasmExports["$b"])(a0);var _crypto_sign_statebytes=Module["_crypto_sign_statebytes"]=()=>(_crypto_sign_statebytes=Module["_crypto_sign_statebytes"]=wasmExports["ac"])();var _crypto_sign_bytes=Module["_crypto_sign_bytes"]=()=>(_crypto_sign_bytes=Module["_crypto_sign_bytes"]=wasmExports["bc"])();var _crypto_sign_seedbytes=Module["_crypto_sign_seedbytes"]=()=>(_crypto_sign_seedbytes=Module["_crypto_sign_seedbytes"]=wasmExports["cc"])();var _crypto_sign_publickeybytes=Module["_crypto_sign_publickeybytes"]=()=>(_crypto_sign_publickeybytes=Module["_crypto_sign_publickeybytes"]=wasmExports["dc"])();var _crypto_sign_secretkeybytes=Module["_crypto_sign_secretkeybytes"]=()=>(_crypto_sign_secretkeybytes=Module["_crypto_sign_secretkeybytes"]=wasmExports["ec"])();var _crypto_sign_messagebytes_max=Module["_crypto_sign_messagebytes_max"]=()=>(_crypto_sign_messagebytes_max=Module["_crypto_sign_messagebytes_max"]=wasmExports["fc"])();var _crypto_sign_seed_keypair=Module["_crypto_sign_seed_keypair"]=(a0,a1,a2)=>(_crypto_sign_seed_keypair=Module["_crypto_sign_seed_keypair"]=wasmExports["gc"])(a0,a1,a2);var _crypto_sign_keypair=Module["_crypto_sign_keypair"]=(a0,a1)=>(_crypto_sign_keypair=Module["_crypto_sign_keypair"]=wasmExports["hc"])(a0,a1);var _crypto_sign=Module["_crypto_sign"]=(a0,a1,a2,a3,a4,a5)=>(_crypto_sign=Module["_crypto_sign"]=wasmExports["ic"])(a0,a1,a2,a3,a4,a5);var _crypto_sign_open=Module["_crypto_sign_open"]=(a0,a1,a2,a3,a4,a5)=>(_crypto_sign_open=Module["_crypto_sign_open"]=wasmExports["jc"])(a0,a1,a2,a3,a4,a5);var _crypto_sign_detached=Module["_crypto_sign_detached"]=(a0,a1,a2,a3,a4,a5)=>(_crypto_sign_detached=Module["_crypto_sign_detached"]=wasmExports["kc"])(a0,a1,a2,a3,a4,a5);var _crypto_sign_verify_detached=Module["_crypto_sign_verify_detached"]=(a0,a1,a2,a3,a4)=>(_crypto_sign_verify_detached=Module["_crypto_sign_verify_detached"]=wasmExports["lc"])(a0,a1,a2,a3,a4);var _crypto_sign_init=Module["_crypto_sign_init"]=a0=>(_crypto_sign_init=Module["_crypto_sign_init"]=wasmExports["mc"])(a0);var _crypto_sign_update=Module["_crypto_sign_update"]=(a0,a1,a2,a3)=>(_crypto_sign_update=Module["_crypto_sign_update"]=wasmExports["nc"])(a0,a1,a2,a3);var _crypto_sign_final_create=Module["_crypto_sign_final_create"]=(a0,a1,a2,a3)=>(_crypto_sign_final_create=Module["_crypto_sign_final_create"]=wasmExports["oc"])(a0,a1,a2,a3);var _crypto_sign_final_verify=Module["_crypto_sign_final_verify"]=(a0,a1,a2)=>(_crypto_sign_final_verify=Module["_crypto_sign_final_verify"]=wasmExports["pc"])(a0,a1,a2);var _crypto_sign_ed25519_pk_to_curve25519=Module["_crypto_sign_ed25519_pk_to_curve25519"]=(a0,a1)=>(_crypto_sign_ed25519_pk_to_curve25519=Module["_crypto_sign_ed25519_pk_to_curve25519"]=wasmExports["qc"])(a0,a1);var _crypto_sign_ed25519_sk_to_curve25519=Module["_crypto_sign_ed25519_sk_to_curve25519"]=(a0,a1)=>(_crypto_sign_ed25519_sk_to_curve25519=Module["_crypto_sign_ed25519_sk_to_curve25519"]=wasmExports["rc"])(a0,a1);var _randombytes_random=Module["_randombytes_random"]=()=>(_randombytes_random=Module["_randombytes_random"]=wasmExports["sc"])();var _randombytes_stir=Module["_randombytes_stir"]=()=>(_randombytes_stir=Module["_randombytes_stir"]=wasmExports["tc"])();var _randombytes_uniform=Module["_randombytes_uniform"]=a0=>(_randombytes_uniform=Module["_randombytes_uniform"]=wasmExports["uc"])(a0);var _randombytes_buf=Module["_randombytes_buf"]=(a0,a1)=>(_randombytes_buf=Module["_randombytes_buf"]=wasmExports["vc"])(a0,a1);var _randombytes_buf_deterministic=Module["_randombytes_buf_deterministic"]=(a0,a1,a2)=>(_randombytes_buf_deterministic=Module["_randombytes_buf_deterministic"]=wasmExports["wc"])(a0,a1,a2);var _randombytes_seedbytes=Module["_randombytes_seedbytes"]=()=>(_randombytes_seedbytes=Module["_randombytes_seedbytes"]=wasmExports["xc"])();var _randombytes_close=Module["_randombytes_close"]=()=>(_randombytes_close=Module["_randombytes_close"]=wasmExports["yc"])();var _randombytes=Module["_randombytes"]=(a0,a1,a2)=>(_randombytes=Module["_randombytes"]=wasmExports["zc"])(a0,a1,a2);var _sodium_bin2hex=Module["_sodium_bin2hex"]=(a0,a1,a2,a3)=>(_sodium_bin2hex=Module["_sodium_bin2hex"]=wasmExports["Ac"])(a0,a1,a2,a3);var _sodium_hex2bin=Module["_sodium_hex2bin"]=(a0,a1,a2,a3,a4,a5,a6)=>(_sodium_hex2bin=Module["_sodium_hex2bin"]=wasmExports["Bc"])(a0,a1,a2,a3,a4,a5,a6);var _sodium_base64_encoded_len=Module["_sodium_base64_encoded_len"]=(a0,a1)=>(_sodium_base64_encoded_len=Module["_sodium_base64_encoded_len"]=wasmExports["Cc"])(a0,a1);var _sodium_bin2base64=Module["_sodium_bin2base64"]=(a0,a1,a2,a3,a4)=>(_sodium_bin2base64=Module["_sodium_bin2base64"]=wasmExports["Dc"])(a0,a1,a2,a3,a4);var _sodium_base642bin=Module["_sodium_base642bin"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sodium_base642bin=Module["_sodium_base642bin"]=wasmExports["Ec"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sodium_init=Module["_sodium_init"]=()=>(_sodium_init=Module["_sodium_init"]=wasmExports["Fc"])();var _sodium_pad=Module["_sodium_pad"]=(a0,a1,a2,a3,a4)=>(_sodium_pad=Module["_sodium_pad"]=wasmExports["Gc"])(a0,a1,a2,a3,a4);var _sodium_unpad=Module["_sodium_unpad"]=(a0,a1,a2,a3)=>(_sodium_unpad=Module["_sodium_unpad"]=wasmExports["Hc"])(a0,a1,a2,a3);var _sodium_version_string=Module["_sodium_version_string"]=()=>(_sodium_version_string=Module["_sodium_version_string"]=wasmExports["Ic"])();var _sodium_library_version_major=Module["_sodium_library_version_major"]=()=>(_sodium_library_version_major=Module["_sodium_library_version_major"]=wasmExports["Jc"])();var _sodium_library_version_minor=Module["_sodium_library_version_minor"]=()=>(_sodium_library_version_minor=Module["_sodium_library_version_minor"]=wasmExports["Kc"])();var _sodium_library_minimal=Module["_sodium_library_minimal"]=()=>(_sodium_library_minimal=Module["_sodium_library_minimal"]=wasmExports["Lc"])();var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["Mc"])(a0);var _free=Module["_free"]=a0=>(_free=Module["_free"]=wasmExports["Nc"])(a0);Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; + + + return moduleRtn; +} +); +})(); +export default Module; diff --git a/wrapper/build-wrappers.js b/wrapper/build-wrappers.js index 3c5bf67b..d724b6f1 100644 --- a/wrapper/build-wrappers.js +++ b/wrapper/build-wrappers.js @@ -4,15 +4,16 @@ var docBuilder = require("./build-doc"); //Parse arguments const argv = process.argv; -if (argv.length != 5) { +if (argv.length < 5) { console.error( - "Usage: build-wrappers.js " + "Usage: build-wrappers.js [--esm]" ); process.exit(1); } const libsodiumModuleName = argv[2], apiPath = argv[3], - wrappersPath = argv[4]; + wrappersPath = argv[4], + esm = argv[5] === '--esm'; //Loading preset macros var macros = {}; @@ -30,7 +31,14 @@ for (var i = 0; i < macrosFiles.length; i++) { macros[macroName] = macroCode; } -var templateCode = fs.readFileSync(path.join(__dirname, "wrap-template.js"), { +var utilsCode = fs.readFileSync(path.join(__dirname, "wrap-utils.js"), { + encoding: "utf8" +}); +if (esm) { + utilsCode = utilsCode.replace(/\nfunction/g, "\nexport function"); +} + +var templateCode = fs.readFileSync(path.join(__dirname, esm ? "wrap-esm-template.js" : "wrap-template.js"), { encoding: "utf8" }); @@ -62,8 +70,14 @@ for (var i = 0; i < symbolsFiles.length; i++) { for (var i = 0; i < symbols.length; i++) { buildSymbol(symbols[i]); } -exportFunctions(symbols); -exportConstants(loadConstants()); +if (!esm) { + exportFunctions(symbols); +} +if (esm) { + exportConstantsESM(loadConstants()); +} else { + exportConstants(loadConstants()); +} finalizeWrapper(); function exportFunctions(symbols) { @@ -82,6 +96,30 @@ function exportFunctions(symbols) { exportsCode += "}\n"; } +function exportConstantsESM(constSymbols) { + var keys = []; + for (var i = 0; i < constSymbols.length; i++) { + if (constSymbols[i].type === "uint") { + keys.push(constSymbols[i].name); + } + } + for (var i = 0; i < keys.length; i++) { + const key = keys[i]; + exportsCode += `export const ${key} = libsodium._${key.toLowerCase()}?.();\n`; + } + + keys = []; + for (i = 0; i < constSymbols.length; i++) { + if (constSymbols[i].type === "string") { + keys.push(constSymbols[i].name); + } + } + for (var i = 0; i < keys.length; i++) { + const key = keys[i]; + exportsCode += `export const ${key} = libsodium.UTF8ToString(libsodium._${key.toLowerCase()}?.());\n`; + } +} + function exportConstants(constSymbols) { var keys = []; for (var i = 0; i < constSymbols.length; i++) { @@ -114,6 +152,9 @@ function buildSymbol(symbolDescription) { if (symbolDescription.type == "function") { var targetName = "libsodium._" + symbolDescription.name; var funcCode = "function " + symbolDescription.name + "("; + if (esm) { + funcCode = "export " + funcCode; + } var funcBody = ""; //Adding parameters array in function's interface, their conversions in the function's body var paramsArray = []; @@ -242,8 +283,11 @@ function applyMacro(macroCode, symbols, substitutes) { } function finalizeWrapper() { + var subs = esm + ? [utilsCode, functionsCode, exportsCode, libsodiumModuleName] + : [injectTabs(utilsCode, 2), injectTabs(functionsCode, 2), injectTabs(exportsCode, 3), libsodiumModuleName]; scriptBuf = applyMacro( - scriptBuf, ["/*{{wraps_here}}*/", "/*{{exports_here}}*/", "/*{{libsodium}}*/"], [injectTabs(functionsCode, 2), injectTabs(exportsCode, 3), libsodiumModuleName] + scriptBuf, ["/*{{utils_here}}*/", "/*{{wraps_here}}*/", "/*{{exports_here}}*/", "/*{{libsodium}}*/"], subs ); fs.writeFileSync(wrappersPath, scriptBuf); fs.writeFileSync(apiPath, docBuilder.getResultDoc()); diff --git a/wrapper/wrap-esm-template.js b/wrapper/wrap-esm-template.js new file mode 100644 index 00000000..67eacff8 --- /dev/null +++ b/wrapper/wrap-esm-template.js @@ -0,0 +1,34 @@ +"use strict"; + +import initSodiumESM from "./libsodium.esm.js"; + +const output_format = "uint8array"; + +export const libsodium = await initSodiumESM(); + +/* Initialize. */ +if (libsodium._sodium_init() !== 0) { + throw new Error("libsodium was not correctly initialized."); +} + +/*{{exports_here}}*/ + +/*{{utils_here}}*/ + +/*{{wraps_here}}*/ + +/* Test to make sure everything works. */ +try { + var message = new Uint8Array([98, 97, 108, 108, 115]); + var nonce = randombytes_buf(crypto_secretbox_NONCEBYTES); + var key = randombytes_buf(crypto_secretbox_KEYBYTES); + var encrypted = crypto_secretbox_easy(message, nonce, key); + var decrypted = crypto_secretbox_open_easy(encrypted, nonce, key); + + if (!memcmp(message, decrypted)) { + throw new Error("Init test failed"); + } +} +catch (err) { + throw new Error("Failed to load" + err) +} diff --git a/wrapper/wrap-template.js b/wrapper/wrap-template.js index fa492058..d18eae91 100644 --- a/wrapper/wrap-template.js +++ b/wrapper/wrap-template.js @@ -40,541 +40,7 @@ libsodiumInit(); }); - // List of functions and constants defined in the wrapped libsodium - function symbols() { - return Object.keys(exports).sort(); - } - - function increment(bytes) { - if (!(bytes instanceof Uint8Array)) { - throw new TypeError("Only Uint8Array instances can be incremented"); - } - var c = 1 << 8; - for (var i = 0 | 0, j = bytes.length; i < j; i++) { - c >>= 8; - c += bytes[i]; - bytes[i] = c & 0xff; - } - } - - function add(a, b) { - if (!(a instanceof Uint8Array) || !(b instanceof Uint8Array)) { - throw new TypeError("Only Uint8Array instances can added"); - } - var j = a.length, - c = 0 | 0, - i = 0 | 0; - if (b.length != a.length) { - throw new TypeError("Arguments must have the same length"); - } - for (i = 0; i < j; i++) { - c >>= 8; - c += a[i] + b[i]; - a[i] = c & 0xff; - } - } - - function is_zero(bytes) { - if (!(bytes instanceof Uint8Array)) { - throw new TypeError("Only Uint8Array instances can be checked"); - } - var d = 0 | 0; - for (var i = 0 | 0, j = bytes.length; i < j; i++) { - d |= bytes[i]; - } - return d === 0; - } - - function memzero(bytes) { - if (!(bytes instanceof Uint8Array)) { - throw new TypeError("Only Uint8Array instances can be wiped"); - } - for (var i = 0 | 0, j = bytes.length; i < j; i++) { - bytes[i] = 0; - } - } - - function memcmp(b1, b2) { - if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { - throw new TypeError("Only Uint8Array instances can be compared"); - } - if (b1.length !== b2.length) { - throw new TypeError( - "Only instances of identical length can be compared" - ); - } - for (var d = 0 | 0, i = 0 | 0, j = b1.length; i < j; i++) { - d |= b1[i] ^ b2[i]; - } - return d === 0; - } - - function compare(b1, b2) { - if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { - throw new TypeError("Only Uint8Array instances can be compared"); - } - if (b1.length !== b2.length) { - throw new TypeError( - "Only instances of identical length can be compared" - ); - } - for (var gt = 0 | 0, eq = 1 | 1, i = b1.length; i-- > 0;) { - gt |= ((b2[i] - b1[i]) >> 8) & eq; - eq &= ((b2[i] ^ b1[i]) - 1) >> 8; - } - return gt + gt + eq - 1; - } - - function pad(buf, blocksize) { - if (!(buf instanceof Uint8Array)) { - throw new TypeError("buffer must be a Uint8Array"); - } - blocksize |= 0; - if (blocksize <= 0) { - throw new Error("block size must be > 0"); - } - var address_pool = [], - padded, - padded_buflen_p = _malloc(4), - st = 1 | 0, - i = 0 | 0, - k = buf.length | 0, - bufx = new AllocatedBuf(k + blocksize); - address_pool.push(padded_buflen_p); - address_pool.push(bufx.address); - for ( - var j = bufx.address, jmax = bufx.address + k + blocksize; j < jmax; j++ - ) { - libsodium.HEAPU8[j] = buf[i]; - k -= st; - st = ~(((((k >>> 48) | (k >>> 32) | (k >>> 16) | k) & 0xffff) - 1) >> 16) & - 1; - i += st; - } - if ( - libsodium._sodium_pad( - padded_buflen_p, - bufx.address, - buf.length, - blocksize, - bufx.length - ) !== 0 - ) { - _free_and_throw_error(address_pool, "internal error"); - } - bufx.length = libsodium.getValue(padded_buflen_p, "i32"); - padded = bufx.to_Uint8Array(); - _free_all(address_pool); - return padded; - } - - function unpad(buf, blocksize) { - if (!(buf instanceof Uint8Array)) { - throw new TypeError("buffer must be a Uint8Array"); - } - blocksize |= 0; - if (blocksize <= 0) { - throw new Error("block size must be > 0"); - } - var address_pool = [], - unpadded_address = _to_allocated_buf_address(buf), - unpadded_buflen_p = _malloc(4); - address_pool.push(unpadded_address); - address_pool.push(unpadded_buflen_p); - if ( - libsodium._sodium_unpad( - unpadded_buflen_p, - unpadded_address, - buf.length, - blocksize - ) !== 0 - ) { - _free_and_throw_error(address_pool, "unsupported/invalid padding"); - } - buf = new Uint8Array(buf); - buf = buf.subarray(0, libsodium.getValue(unpadded_buflen_p, "i32")); - _free_all(address_pool); - return buf; - } - - //--------------------------------------------------------------------------- - // Codecs - // - function from_string(str) { - if (typeof TextEncoder === "function") { - return new TextEncoder().encode(str); - } - str = unescape(encodeURIComponent(str)); - var bytes = new Uint8Array(str.length); - for (var i = 0, j = str.length; i < j; i++) { - bytes[i] = str.charCodeAt(i); - } - return bytes; - } - - function to_string(bytes) { - if (typeof TextDecoder === "function") { - return new TextDecoder("utf-8", { - fatal: true - }).decode(bytes); - } - - var toStringChunkSize = 8192, - numChunks = Math.ceil(bytes.length / toStringChunkSize); - if (numChunks <= 1) { - try { - return decodeURIComponent( - escape(String.fromCharCode.apply(null, bytes)) - ); - } catch (_) { - throw new TypeError("The encoded data was not valid."); - } - } - var totalString = ""; - var sequenceReadOffset = 0; - for (var i = 0; i < numChunks; i++) { - var currentChunk = Array.prototype.slice.call( - bytes, - i * toStringChunkSize + sequenceReadOffset, - (i + 1) * toStringChunkSize + sequenceReadOffset - ); - //Depending on how much we have shifted - if (currentChunk.length == 0) { - continue; - } - - //Checking that we didn't cut the buffer in the middle of a UTF8 sequence. - //If we did, remove the bytes of the "cut" sequence and - //decrement sequenceReadOffset for each removed byte - var sequenceDetectionComplete, - sequenceIndex = currentChunk.length, - sequenceLength = 0; - - //This loop will read the chunk from its end, looking for sequence start bytes - do { - sequenceIndex--; - var currentByte = currentChunk[sequenceIndex]; - - if (currentByte >= 240) { - //Beginning of a 4-byte UTF-8 sequence - sequenceLength = 4; - sequenceDetectionComplete = true; - } else if (currentByte >= 224) { - //Beginning of a 3-byte UTF-8 sequence - sequenceLength = 3; - sequenceDetectionComplete = true; - } else if (currentByte >= 192) { - //Beginning of a 2-byte UTF-8 sequence - sequenceLength = 2; - sequenceDetectionComplete = true; - } else if (currentByte < 128) { - //A one byte UTF-8 char - sequenceLength = 1; - sequenceDetectionComplete = true; - } - //The values between [128, 192[ are part of a UTF-8 sequence. - //The loop will not exit in that case, and will iterate one byte backwards instead - } while (!sequenceDetectionComplete); - - var extraBytes = sequenceLength - (currentChunk.length - sequenceIndex); - for (var j = 0; j < extraBytes; j++) { - sequenceReadOffset--; - currentChunk.pop(); - } - - totalString += to_string(currentChunk); - } - return totalString; - } - - function from_hex(input) { - var address_pool = [], - input = _any_to_Uint8Array(address_pool, input, "input"), - result = new AllocatedBuf(input.length / 2), - result_str, - input_address = _to_allocated_buf_address(input), - hex_end_p = _malloc(4), - hex_end; - address_pool.push(input_address); - address_pool.push(result.address); - address_pool.push(result.hex_end_p); - if ( - libsodium._sodium_hex2bin( - result.address, - result.length, - input_address, - input.length, - 0, - 0, - hex_end_p - ) !== 0 - ) { - _free_and_throw_error(address_pool, "invalid input"); - } - hex_end = libsodium.getValue(hex_end_p, "i32"); - if (hex_end - input_address !== input.length) { - _free_and_throw_error(address_pool, "incomplete input"); - } - result_str = result.to_Uint8Array(); - _free_all(address_pool); - return result_str; - } - - function to_hex(input) { - input = _any_to_Uint8Array(null, input, "input"); - var str = "", - b, - c, - x; - for (var i = 0; i < input.length; i++) { - c = input[i] & 0xf; - b = input[i] >>> 4; - x = - ((87 + c + (((c - 10) >> 8) & ~38)) << 8) | - (87 + b + (((b - 10) >> 8) & ~38)); - str += String.fromCharCode(x & 0xff) + String.fromCharCode(x >>> 8); - } - return str; - } - - var base64_variants = { - ORIGINAL: 1 | 0, - ORIGINAL_NO_PADDING: 3 | 0, - URLSAFE: 5 | 0, - URLSAFE_NO_PADDING: 7 | 0 - }; - - function check_base64_variant(variant) { - if (variant == undefined) { - return base64_variants.URLSAFE_NO_PADDING; - } - if ( - variant !== base64_variants.ORIGINAL && - variant !== base64_variants.ORIGINAL_NO_PADDING && - variant !== base64_variants.URLSAFE && - variant != base64_variants.URLSAFE_NO_PADDING - ) { - throw new Error("unsupported base64 variant"); - } - return variant; - } - - function from_base64(input, variant) { - variant = check_base64_variant(variant); - var address_pool = [], - input = _any_to_Uint8Array(address_pool, input, "input"), - result = new AllocatedBuf(input.length * 3 / 4), - result_bin, - input_address = _to_allocated_buf_address(input), - result_bin_len_p = _malloc(4), - b64_end_p = _malloc(4), - b64_end; - address_pool.push(input_address); - address_pool.push(result.address); - address_pool.push(result.result_bin_len_p); - address_pool.push(result.b64_end_p); - if ( - libsodium._sodium_base642bin( - result.address, - result.length, - input_address, - input.length, - 0, - result_bin_len_p, - b64_end_p, - variant - ) !== 0 - ) { - _free_and_throw_error(address_pool, "invalid input"); - } - b64_end = libsodium.getValue(b64_end_p, "i32"); - if (b64_end - input_address !== input.length) { - _free_and_throw_error(address_pool, "incomplete input"); - } - result.length = libsodium.getValue(result_bin_len_p, "i32"); - result_bin = result.to_Uint8Array(); - _free_all(address_pool); - return result_bin; - } - - function to_base64(input, variant) { - variant = check_base64_variant(variant); - input = _any_to_Uint8Array(address_pool, input, "input"); - var address_pool = [], - nibbles = Math.floor(input.length / 3) | 0, - remainder = input.length - 3 * nibbles, - b64_len = - nibbles * 4 + - (remainder !== 0 ? - (variant & 2) === 0 ? 4 : 2 + (remainder >>> 1) : - 0), - result = new AllocatedBuf(b64_len + 1), - result_b64, - input_address = _to_allocated_buf_address(input); - address_pool.push(input_address); - address_pool.push(result.address); - if ( - libsodium._sodium_bin2base64( - result.address, - result.length, - input_address, - input.length, - variant - ) === 0 - ) { - _free_and_throw_error(address_pool, "conversion failed"); - } - result.length = b64_len; - result_b64 = to_string(result.to_Uint8Array()); - _free_all(address_pool); - return result_b64; - } - - function output_formats() { - return ["uint8array", "text", "hex", "base64"]; - } - - function _format_output(output, optionalOutputFormat) { - var selectedOutputFormat = optionalOutputFormat || output_format; - if (!_is_output_format(selectedOutputFormat)) { - throw new Error( - selectedOutputFormat + " output format is not available" - ); - } - if (output instanceof AllocatedBuf) { - if (selectedOutputFormat === "uint8array") { - return output.to_Uint8Array(); - } else if (selectedOutputFormat === "text") { - return to_string(output.to_Uint8Array()); - } else if (selectedOutputFormat === "hex") { - return to_hex(output.to_Uint8Array()); - } else if (selectedOutputFormat === "base64") { - return to_base64( - output.to_Uint8Array(), - base64_variants.URLSAFE_NO_PADDING - ); - } else { - throw new Error( - 'What is output format "' + selectedOutputFormat + '"?' - ); - } - } else if (typeof output === "object") { - // Composed output. Example: key pairs - var props = Object.keys(output); - var formattedOutput = {}; - for (var i = 0; i < props.length; i++) { - formattedOutput[props[i]] = _format_output( - output[props[i]], - selectedOutputFormat - ); - } - return formattedOutput; - } else if (typeof output === "string") { - return output; - } else { - throw new TypeError("Cannot format output"); - } - } - - function _is_output_format(format) { - var formats = output_formats(); - for (var i = 0; i < formats.length; i++) { - if (formats[i] === format) { - return true; - } - } - return false; - } - - function _check_output_format(format) { - if (!format) { - return; - } else if (typeof format !== "string") { - throw new TypeError("When defined, the output format must be a string"); - } else if (!_is_output_format(format)) { - throw new Error(format + " is not a supported output format"); - } - } - - //--------------------------------------------------------------------------- - // Memory management - // - // AllocatedBuf: address allocated using _malloc() + length - function AllocatedBuf(length) { - this.length = length; - this.address = _malloc(length); - } - - // Copy the content of a AllocatedBuf (_malloc()'d memory) into a Uint8Array - AllocatedBuf.prototype.to_Uint8Array = function () { - var result = new Uint8Array(this.length); - result.set( - libsodium.HEAPU8.subarray(this.address, this.address + this.length) - ); - return result; - }; - - // _malloc() a region and initialize it with the content of a Uint8Array - function _to_allocated_buf_address(bytes) { - var address = _malloc(bytes.length); - libsodium.HEAPU8.set(bytes, address); - return address; - } - - function _malloc(length) { - var result = libsodium._malloc(length); - if (result === 0) { - throw { - message: "_malloc() failed", - length: length - }; - } - return result; - } - - function _free(address) { - libsodium._free(address); - } - - function _free_all(addresses) { - if (addresses) { - for (var i = 0; i < addresses.length; i++) { - _free(addresses[i]); - } - } - } - - function _free_and_throw_error(address_pool, err) { - _free_all(address_pool); - throw new Error(err); - } - - function _free_and_throw_type_error(address_pool, err) { - _free_all(address_pool); - throw new TypeError(err); - } - - function _require_defined(address_pool, varValue, varName) { - if (varValue == undefined) { - _free_and_throw_type_error( - address_pool, - varName + " cannot be null or undefined" - ); - } - } - - function _any_to_Uint8Array(address_pool, varValue, varName) { - _require_defined(address_pool, varValue, varName); - if (varValue instanceof Uint8Array) { - return varValue; - } else if (typeof varValue === "string") { - return from_string(varValue); - } - _free_and_throw_type_error( - address_pool, - "unsupported input type for " + varName - ); - } +/*{{utils_here}}*/ /*{{wraps_here}}*/ diff --git a/wrapper/wrap-utils.js b/wrapper/wrap-utils.js new file mode 100644 index 00000000..239f67a0 --- /dev/null +++ b/wrapper/wrap-utils.js @@ -0,0 +1,535 @@ +// List of functions and constants defined in the wrapped libsodium +function symbols() { + return Object.keys(exports).sort(); +} + +function increment(bytes) { + if (!(bytes instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be incremented"); + } + var c = 1 << 8; + for (var i = 0 | 0, j = bytes.length; i < j; i++) { + c >>= 8; + c += bytes[i]; + bytes[i] = c & 0xff; + } +} + +function add(a, b) { + if (!(a instanceof Uint8Array) || !(b instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can added"); + } + var j = a.length, + c = 0 | 0, + i = 0 | 0; + if (b.length != a.length) { + throw new TypeError("Arguments must have the same length"); + } + for (i = 0; i < j; i++) { + c >>= 8; + c += a[i] + b[i]; + a[i] = c & 0xff; + } +} + +function is_zero(bytes) { + if (!(bytes instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be checked"); + } + var d = 0 | 0; + for (var i = 0 | 0, j = bytes.length; i < j; i++) { + d |= bytes[i]; + } + return d === 0; +} + +function memzero(bytes) { + if (!(bytes instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be wiped"); + } + for (var i = 0 | 0, j = bytes.length; i < j; i++) { + bytes[i] = 0; + } +} + +function memcmp(b1, b2) { + if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be compared"); + } + if (b1.length !== b2.length) { + throw new TypeError( + "Only instances of identical length can be compared" + ); + } + for (var d = 0 | 0, i = 0 | 0, j = b1.length; i < j; i++) { + d |= b1[i] ^ b2[i]; + } + return d === 0; +} + +function compare(b1, b2) { + if (!(b1 instanceof Uint8Array && b2 instanceof Uint8Array)) { + throw new TypeError("Only Uint8Array instances can be compared"); + } + if (b1.length !== b2.length) { + throw new TypeError( + "Only instances of identical length can be compared" + ); + } + for (var gt = 0 | 0, eq = 1 | 1, i = b1.length; i-- > 0;) { + gt |= ((b2[i] - b1[i]) >> 8) & eq; + eq &= ((b2[i] ^ b1[i]) - 1) >> 8; + } + return gt + gt + eq - 1; +} + +function pad(buf, blocksize) { + if (!(buf instanceof Uint8Array)) { + throw new TypeError("buffer must be a Uint8Array"); + } + blocksize |= 0; + if (blocksize <= 0) { + throw new Error("block size must be > 0"); + } + var address_pool = [], + padded, + padded_buflen_p = _malloc(4), + st = 1 | 0, + i = 0 | 0, + k = buf.length | 0, + bufx = new AllocatedBuf(k + blocksize); + address_pool.push(padded_buflen_p); + address_pool.push(bufx.address); + for ( + var j = bufx.address, jmax = bufx.address + k + blocksize; j < jmax; j++ + ) { + libsodium.HEAPU8[j] = buf[i]; + k -= st; + st = ~(((((k >>> 48) | (k >>> 32) | (k >>> 16) | k) & 0xffff) - 1) >> 16) & + 1; + i += st; + } + if ( + libsodium._sodium_pad( + padded_buflen_p, + bufx.address, + buf.length, + blocksize, + bufx.length + ) !== 0 + ) { + _free_and_throw_error(address_pool, "internal error"); + } + bufx.length = libsodium.getValue(padded_buflen_p, "i32"); + padded = bufx.to_Uint8Array(); + _free_all(address_pool); + return padded; +} + +function unpad(buf, blocksize) { + if (!(buf instanceof Uint8Array)) { + throw new TypeError("buffer must be a Uint8Array"); + } + blocksize |= 0; + if (blocksize <= 0) { + throw new Error("block size must be > 0"); + } + var address_pool = [], + unpadded_address = _to_allocated_buf_address(buf), + unpadded_buflen_p = _malloc(4); + address_pool.push(unpadded_address); + address_pool.push(unpadded_buflen_p); + if ( + libsodium._sodium_unpad( + unpadded_buflen_p, + unpadded_address, + buf.length, + blocksize + ) !== 0 + ) { + _free_and_throw_error(address_pool, "unsupported/invalid padding"); + } + buf = new Uint8Array(buf); + buf = buf.subarray(0, libsodium.getValue(unpadded_buflen_p, "i32")); + _free_all(address_pool); + return buf; +} + +//--------------------------------------------------------------------------- +// Codecs +// +function from_string(str) { + if (typeof TextEncoder === "function") { + return new TextEncoder().encode(str); + } + str = unescape(encodeURIComponent(str)); + var bytes = new Uint8Array(str.length); + for (var i = 0, j = str.length; i < j; i++) { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} + +function to_string(bytes) { + if (typeof TextDecoder === "function") { + return new TextDecoder("utf-8", { + fatal: true + }).decode(bytes); + } + + var toStringChunkSize = 8192, + numChunks = Math.ceil(bytes.length / toStringChunkSize); + if (numChunks <= 1) { + try { + return decodeURIComponent( + escape(String.fromCharCode.apply(null, bytes)) + ); + } catch (_) { + throw new TypeError("The encoded data was not valid."); + } + } + var totalString = ""; + var sequenceReadOffset = 0; + for (var i = 0; i < numChunks; i++) { + var currentChunk = Array.prototype.slice.call( + bytes, + i * toStringChunkSize + sequenceReadOffset, + (i + 1) * toStringChunkSize + sequenceReadOffset + ); + //Depending on how much we have shifted + if (currentChunk.length == 0) { + continue; + } + + //Checking that we didn't cut the buffer in the middle of a UTF8 sequence. + //If we did, remove the bytes of the "cut" sequence and + //decrement sequenceReadOffset for each removed byte + var sequenceDetectionComplete, + sequenceIndex = currentChunk.length, + sequenceLength = 0; + + //This loop will read the chunk from its end, looking for sequence start bytes + do { + sequenceIndex--; + var currentByte = currentChunk[sequenceIndex]; + + if (currentByte >= 240) { + //Beginning of a 4-byte UTF-8 sequence + sequenceLength = 4; + sequenceDetectionComplete = true; + } else if (currentByte >= 224) { + //Beginning of a 3-byte UTF-8 sequence + sequenceLength = 3; + sequenceDetectionComplete = true; + } else if (currentByte >= 192) { + //Beginning of a 2-byte UTF-8 sequence + sequenceLength = 2; + sequenceDetectionComplete = true; + } else if (currentByte < 128) { + //A one byte UTF-8 char + sequenceLength = 1; + sequenceDetectionComplete = true; + } + //The values between [128, 192[ are part of a UTF-8 sequence. + //The loop will not exit in that case, and will iterate one byte backwards instead + } while (!sequenceDetectionComplete); + + var extraBytes = sequenceLength - (currentChunk.length - sequenceIndex); + for (var j = 0; j < extraBytes; j++) { + sequenceReadOffset--; + currentChunk.pop(); + } + + totalString += to_string(currentChunk); + } + return totalString; +} + +function from_hex(input) { + var address_pool = [], + input = _any_to_Uint8Array(address_pool, input, "input"), + result = new AllocatedBuf(input.length / 2), + result_str, + input_address = _to_allocated_buf_address(input), + hex_end_p = _malloc(4), + hex_end; + address_pool.push(input_address); + address_pool.push(result.address); + address_pool.push(result.hex_end_p); + if ( + libsodium._sodium_hex2bin( + result.address, + result.length, + input_address, + input.length, + 0, + 0, + hex_end_p + ) !== 0 + ) { + _free_and_throw_error(address_pool, "invalid input"); + } + hex_end = libsodium.getValue(hex_end_p, "i32"); + if (hex_end - input_address !== input.length) { + _free_and_throw_error(address_pool, "incomplete input"); + } + result_str = result.to_Uint8Array(); + _free_all(address_pool); + return result_str; +} + +function to_hex(input) { + input = _any_to_Uint8Array(null, input, "input"); + var str = "", + b, + c, + x; + for (var i = 0; i < input.length; i++) { + c = input[i] & 0xf; + b = input[i] >>> 4; + x = + ((87 + c + (((c - 10) >> 8) & ~38)) << 8) | + (87 + b + (((b - 10) >> 8) & ~38)); + str += String.fromCharCode(x & 0xff) + String.fromCharCode(x >>> 8); + } + return str; +} + +var base64_variants = { + ORIGINAL: 1 | 0, + ORIGINAL_NO_PADDING: 3 | 0, + URLSAFE: 5 | 0, + URLSAFE_NO_PADDING: 7 | 0 +}; + +function check_base64_variant(variant) { + if (variant == undefined) { + return base64_variants.URLSAFE_NO_PADDING; + } + if ( + variant !== base64_variants.ORIGINAL && + variant !== base64_variants.ORIGINAL_NO_PADDING && + variant !== base64_variants.URLSAFE && + variant != base64_variants.URLSAFE_NO_PADDING + ) { + throw new Error("unsupported base64 variant"); + } + return variant; +} + +function from_base64(input, variant) { + variant = check_base64_variant(variant); + var address_pool = [], + input = _any_to_Uint8Array(address_pool, input, "input"), + result = new AllocatedBuf(input.length * 3 / 4), + result_bin, + input_address = _to_allocated_buf_address(input), + result_bin_len_p = _malloc(4), + b64_end_p = _malloc(4), + b64_end; + address_pool.push(input_address); + address_pool.push(result.address); + address_pool.push(result.result_bin_len_p); + address_pool.push(result.b64_end_p); + if ( + libsodium._sodium_base642bin( + result.address, + result.length, + input_address, + input.length, + 0, + result_bin_len_p, + b64_end_p, + variant + ) !== 0 + ) { + _free_and_throw_error(address_pool, "invalid input"); + } + b64_end = libsodium.getValue(b64_end_p, "i32"); + if (b64_end - input_address !== input.length) { + _free_and_throw_error(address_pool, "incomplete input"); + } + result.length = libsodium.getValue(result_bin_len_p, "i32"); + result_bin = result.to_Uint8Array(); + _free_all(address_pool); + return result_bin; +} + +function to_base64(input, variant) { + variant = check_base64_variant(variant); + input = _any_to_Uint8Array(address_pool, input, "input"); + var address_pool = [], + nibbles = Math.floor(input.length / 3) | 0, + remainder = input.length - 3 * nibbles, + b64_len = + nibbles * 4 + + (remainder !== 0 ? + (variant & 2) === 0 ? 4 : 2 + (remainder >>> 1) : + 0), + result = new AllocatedBuf(b64_len + 1), + result_b64, + input_address = _to_allocated_buf_address(input); + address_pool.push(input_address); + address_pool.push(result.address); + if ( + libsodium._sodium_bin2base64( + result.address, + result.length, + input_address, + input.length, + variant + ) === 0 + ) { + _free_and_throw_error(address_pool, "conversion failed"); + } + result.length = b64_len; + result_b64 = to_string(result.to_Uint8Array()); + _free_all(address_pool); + return result_b64; +} + +function output_formats() { + return ["uint8array", "text", "hex", "base64"]; +} + +function _format_output(output, optionalOutputFormat) { + var selectedOutputFormat = optionalOutputFormat || output_format; + if (!_is_output_format(selectedOutputFormat)) { + throw new Error( + selectedOutputFormat + " output format is not available" + ); + } + if (output instanceof AllocatedBuf) { + if (selectedOutputFormat === "uint8array") { + return output.to_Uint8Array(); + } else if (selectedOutputFormat === "text") { + return to_string(output.to_Uint8Array()); + } else if (selectedOutputFormat === "hex") { + return to_hex(output.to_Uint8Array()); + } else if (selectedOutputFormat === "base64") { + return to_base64( + output.to_Uint8Array(), + base64_variants.URLSAFE_NO_PADDING + ); + } else { + throw new Error( + 'What is output format "' + selectedOutputFormat + '"?' + ); + } + } else if (typeof output === "object") { + // Composed output. Example: key pairs + var props = Object.keys(output); + var formattedOutput = {}; + for (var i = 0; i < props.length; i++) { + formattedOutput[props[i]] = _format_output( + output[props[i]], + selectedOutputFormat + ); + } + return formattedOutput; + } else if (typeof output === "string") { + return output; + } else { + throw new TypeError("Cannot format output"); + } +} + +function _is_output_format(format) { + var formats = output_formats(); + for (var i = 0; i < formats.length; i++) { + if (formats[i] === format) { + return true; + } + } + return false; +} + +function _check_output_format(format) { + if (!format) { + return; + } else if (typeof format !== "string") { + throw new TypeError("When defined, the output format must be a string"); + } else if (!_is_output_format(format)) { + throw new Error(format + " is not a supported output format"); + } +} + +//--------------------------------------------------------------------------- +// Memory management +// +// AllocatedBuf: address allocated using _malloc() + length +function AllocatedBuf(length) { + this.length = length; + this.address = _malloc(length); +} + +// Copy the content of a AllocatedBuf (_malloc()'d memory) into a Uint8Array +AllocatedBuf.prototype.to_Uint8Array = function() { + var result = new Uint8Array(this.length); + result.set( + libsodium.HEAPU8.subarray(this.address, this.address + this.length) + ); + return result; +}; + +// _malloc() a region and initialize it with the content of a Uint8Array +function _to_allocated_buf_address(bytes) { + var address = _malloc(bytes.length); + libsodium.HEAPU8.set(bytes, address); + return address; +} + +function _malloc(length) { + var result = libsodium._malloc(length); + if (result === 0) { + throw { + message: "_malloc() failed", + length: length + }; + } + return result; +} + +function _free(address) { + libsodium._free(address); +} + +function _free_all(addresses) { + if (addresses) { + for (var i = 0; i < addresses.length; i++) { + _free(addresses[i]); + } + } +} + +function _free_and_throw_error(address_pool, err) { + _free_all(address_pool); + throw new Error(err); +} + +function _free_and_throw_type_error(address_pool, err) { + _free_all(address_pool); + throw new TypeError(err); +} + +function _require_defined(address_pool, varValue, varName) { + if (varValue == undefined) { + _free_and_throw_type_error( + address_pool, + varName + " cannot be null or undefined" + ); + } +} + +function _any_to_Uint8Array(address_pool, varValue, varName) { + _require_defined(address_pool, varValue, varName); + if (varValue instanceof Uint8Array) { + return varValue; + } else if (typeof varValue === "string") { + return from_string(varValue); + } + _free_and_throw_type_error( + address_pool, + "unsupported input type for " + varName + ); +}