UNPKG

@tatumio/tatum-v1

Version:

Tatum API client allows browsers and Node.js clients to interact with Tatum API.

387 lines 29.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateWallet = exports.generateAlgoWallet = exports.generateAdaWallet = exports.generateXlmWallet = exports.generateXrpWallet = exports.generateLtcWallet = exports.generateTronWallet = exports.generateDogeWallet = exports.generateBtcWallet = exports.generateBchWallet = exports.generateCeloWallet = exports.generateXdcWallet = exports.generateBscWallet = exports.generateFlowWallet = exports.generateEgldWallet = exports.generateOneWallet = exports.generateKlaytnWallet = exports.generatePolygonWallet = exports.generateEthWallet = exports.generateVetWallet = exports.generateBnbWallet = void 0; const crypto_1 = require("@binance-chain/javascript-sdk/lib/crypto"); const bip39_1 = require("bip39"); const bitcoinjs_lib_1 = require("bitcoinjs-lib"); const ethereumjs_wallet_1 = require("ethereumjs-wallet"); // @ts-ignore const hdkey_1 = __importDefault(require("hdkey")); const ripple_lib_1 = require("ripple-lib"); const stellar_sdk_1 = require("stellar-sdk"); const constants_1 = require("../constants"); const model_1 = require("../model"); const cardano_crypto_1 = __importDefault(require("./cardano.crypto")); const algosdk = require('algosdk'); const base32 = require('base32.js'); /** * Generate BnB wallet * @param testnet testnet or mainnet version of address * @returns wallet */ const generateBnbWallet = async (testnet) => { const privateKey = crypto_1.generatePrivateKey(); const prefix = testnet ? 'tbnb' : 'bnb'; return { address: crypto_1.getAddressFromPrivateKey(privateKey, prefix), privateKey, }; }; exports.generateBnbWallet = generateBnbWallet; /** * Generate VeChain wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateVetWallet = async (testnet, mnem) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.VET_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem)); const derivePath = hdwallet.derivePath(path); return { xpub: derivePath.publicExtendedKey().toString(), mnemonic: mnem, }; }; exports.generateVetWallet = generateVetWallet; /** * Generate Ethereum or any other ERC20 wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateEthWallet = async (testnet, mnem) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.ETH_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem)); const derivePath = hdwallet.derivePath(path); return { xpub: derivePath.publicExtendedKey().toString(), mnemonic: mnem, }; }; exports.generateEthWallet = generateEthWallet; /** * Generate Polygon or any other ERC20 wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generatePolygonWallet = async (testnet, mnem) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.MATIC_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem)); const derivePath = hdwallet.derivePath(path); return { xpub: derivePath.publicExtendedKey().toString(), mnemonic: mnem, }; }; exports.generatePolygonWallet = generatePolygonWallet; /** * Generate Polygon or any other ERC20 wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateKlaytnWallet = async (testnet, mnem) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.KLAYTN_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem)); const derivePath = hdwallet.derivePath(path); return { xpub: derivePath.publicExtendedKey().toString(), mnemonic: mnem, }; }; exports.generateKlaytnWallet = generateKlaytnWallet; /** * Generate Harmony or any other ERC20 wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateOneWallet = async (testnet, mnem) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.ONE_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem)); const derivePath = hdwallet.derivePath(path); return { xpub: derivePath.publicExtendedKey().toString(), mnemonic: mnem, }; }; exports.generateOneWallet = generateOneWallet; /** * Generate EGLD wallet * @param testnet * @param mnem mnemonic seed to use * @returns wallet */ const generateEgldWallet = async (mnem) => { return { mnemonic: mnem, }; }; exports.generateEgldWallet = generateEgldWallet; /** * Generate Flow or FUSD wallet * @param mnem mnemonic seed to use * @returns wallet */ const generateFlowWallet = async (mnem) => { const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem)); return { mnemonic: mnem, xpub: hdwallet.derive(constants_1.FLOW_DERIVATION_PATH).toJSON().xpub, }; }; exports.generateFlowWallet = generateFlowWallet; /** * Generate BSC or any other BEP-20 or BEP-721 wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateBscWallet = async (testnet, mnem) => { return exports.generateEthWallet(testnet, mnem); }; exports.generateBscWallet = generateBscWallet; const generateXdcWallet = async (testnet, mnem) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.XDC_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem)); const derivePath = hdwallet.derivePath(path); return { xpub: derivePath.publicExtendedKey().toString(), mnemonic: mnem, }; }; exports.generateXdcWallet = generateXdcWallet; /** * Generate Celo or any other ERC20 wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateCeloWallet = async (testnet, mnem) => { const path = testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.CELO_DERIVATION_PATH; const hdwallet = ethereumjs_wallet_1.hdkey.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem)); const derivePath = hdwallet.derivePath(path); return { xpub: derivePath.publicExtendedKey().toString(), mnemonic: mnem, }; }; exports.generateCeloWallet = generateCeloWallet; /** * Generate Bitcoin Cash wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateBchWallet = async (testnet, mnem) => { const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem), testnet ? bitcoinjs_lib_1.networks.testnet.bip32 : bitcoinjs_lib_1.networks.bitcoin.bip32); return { mnemonic: mnem, xpub: hdwallet.derive(constants_1.BCH_DERIVATION_PATH).toJSON().xpub, }; }; exports.generateBchWallet = generateBchWallet; /** * Generate Bitcoin wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateBtcWallet = async (testnet, mnem) => { const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem), testnet ? bitcoinjs_lib_1.networks.testnet.bip32 : bitcoinjs_lib_1.networks.bitcoin.bip32); return { mnemonic: mnem, xpub: hdwallet.derive(testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.BTC_DERIVATION_PATH).toJSON().xpub, }; }; exports.generateBtcWallet = generateBtcWallet; /** * Generate Doge wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateDogeWallet = async (testnet, mnem) => { const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem), testnet ? constants_1.DOGE_TEST_NETWORK.bip32 : constants_1.DOGE_NETWORK.bip32); return { mnemonic: mnem, xpub: hdwallet.derive(testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.DOGE_DERIVATION_PATH).toJSON().xpub, }; }; exports.generateDogeWallet = generateDogeWallet; /** * Generate Tron wallet * @returns mnemonic for the wallet */ const generateTronWallet = async (mnem) => { const w = bitcoinjs_lib_1.bip32.fromSeed(await bip39_1.mnemonicToSeed(mnem)); const bip32Interface = w.derivePath(constants_1.TRON_DERIVATION_PATH).neutered(); return { mnemonic: mnem, xpub: bip32Interface.toBase58(), }; }; exports.generateTronWallet = generateTronWallet; /** * Generate Litecoin wallet * @param testnet testnet or mainnet version of address * @param mnem mnemonic seed to use * @returns wallet */ const generateLtcWallet = async (testnet, mnem) => { const hdwallet = hdkey_1.default.fromMasterSeed(await bip39_1.mnemonicToSeed(mnem), testnet ? constants_1.LTC_TEST_NETWORK.bip32 : constants_1.LTC_NETWORK.bip32); return { mnemonic: mnem, xpub: hdwallet.derive(testnet ? constants_1.TESTNET_DERIVATION_PATH : constants_1.LTC_DERIVATION_PATH).toJSON().xpub, }; }; exports.generateLtcWallet = generateLtcWallet; /** * Generate Xrp address and secret. */ const generateXrpWallet = () => { const { address, secret } = new ripple_lib_1.RippleAPI().generateAddress(); return { address, secret }; }; exports.generateXrpWallet = generateXrpWallet; /** * Generate Stellar address and secret. * @param secret secret of the account to generate address */ const generateXlmWallet = (secret) => { const keypair = secret ? stellar_sdk_1.Keypair.fromSecret(secret) : stellar_sdk_1.Keypair.random(); return { address: keypair.publicKey(), secret: keypair.secret() }; }; exports.generateXlmWallet = generateXlmWallet; /** * Generate ADA wallet * @param mnemonic mnemonic seed to use * @returns wallet */ const generateAdaWallet = async (mnemonic) => { return { mnemonic, xpub: await cardano_crypto_1.default.generateXPublicKey(mnemonic) }; }; exports.generateAdaWallet = generateAdaWallet; /** * Generate Algo wallet * @param mnem mnemonic seed to use * @returns address and secret */ const generateAlgoWallet = async (mnem) => { const account = mnem ? algosdk.mnemonicToSecretKey(mnem) : algosdk.generateAccount(); const encoder = new base32.Encoder({ type: 'rfc4648' }); const secret = encoder.write(account.sk).finalize(); return { address: account.addr, secret: secret, }; }; exports.generateAlgoWallet = generateAlgoWallet; /** * Generate wallet * @param currency blockchain to generate wallet for * @param testnet testnet or mainnet version of address * @param mnemonic mnemonic seed to use. If not present, new one will be generated * @returns wallet or a combination of address and private key */ const generateWallet = (currency, testnet, mnemonic) => { const mnem = mnemonic ? mnemonic : bip39_1.generateMnemonic(256); switch (currency) { case model_1.Currency.BTC: return exports.generateBtcWallet(testnet, mnem); case model_1.Currency.DOGE: return exports.generateDogeWallet(testnet, mnem); case model_1.Currency.LTC: return exports.generateLtcWallet(testnet, mnem); case model_1.Currency.BCH: return exports.generateBchWallet(testnet, mnem); case model_1.Currency.TRON: case model_1.Currency.USDT_TRON: case model_1.Currency.INRT_TRON: return exports.generateTronWallet(mnem); case model_1.Currency.FLOW: case model_1.Currency.FUSD: return exports.generateFlowWallet(mnem); case model_1.Currency.CELO: case model_1.Currency.CEUR: case model_1.Currency.CUSD: return exports.generateCeloWallet(testnet, mnem); case model_1.Currency.ONE: return exports.generateOneWallet(testnet, mnem); case model_1.Currency.KLAY: return exports.generateKlaytnWallet(testnet, mnem); case model_1.Currency.EGLD: return exports.generateEgldWallet(mnem); case model_1.Currency.USDT: case model_1.Currency.WBTC: case model_1.Currency.LEO: case model_1.Currency.REVV: case model_1.Currency.LATOKEN: case model_1.Currency.COIIN: case model_1.Currency.SAND: case model_1.Currency.LINK: case model_1.Currency.UNI: case model_1.Currency.FREE: case model_1.Currency.MKR: case model_1.Currency.USDC: case model_1.Currency.BAT: case model_1.Currency.TUSD: case model_1.Currency.BUSD: case model_1.Currency.USDC_BSC: case model_1.Currency.COIIN_BSC: case model_1.Currency.GMC: case model_1.Currency.GMC_BSC: case model_1.Currency.PAX: case model_1.Currency.PAXG: case model_1.Currency.PLTC: case model_1.Currency.XCON: case model_1.Currency.ETH: case model_1.Currency.BSC: case model_1.Currency.BETH: case model_1.Currency.GAMEE: case model_1.Currency.INTENT: case model_1.Currency.EURTENT: case model_1.Currency.GOLDAX: case model_1.Currency.CAKE: case model_1.Currency.MATIC_ETH: case model_1.Currency.HAG: case model_1.Currency.BUSD_BSC: case model_1.Currency.BBTC: case model_1.Currency.BADA: case model_1.Currency.WBNB: case model_1.Currency.BDOT: case model_1.Currency.BXRP: case model_1.Currency.BLTC: case model_1.Currency.BBCH: case model_1.Currency.MMY: return exports.generateEthWallet(testnet, mnem); case model_1.Currency.MATIC: case model_1.Currency.USDC_MATIC: case model_1.Currency.USDC_MATIC_NATIVE: case model_1.Currency.USDT_MATIC: return exports.generatePolygonWallet(testnet, mnem); case model_1.Currency.XDC: return exports.generateXdcWallet(testnet, mnem); case model_1.Currency.XRP: return exports.generateXrpWallet(); case model_1.Currency.XLM: return exports.generateXlmWallet(); case model_1.Currency.VET: return exports.generateVetWallet(testnet, mnem); case model_1.Currency.BNB: return exports.generateBnbWallet(testnet); case model_1.Currency.ADA: return exports.generateAdaWallet(mnem); case model_1.Currency.ALGO: return exports.generateAlgoWallet(mnemonic); default: throw new Error('Unsupported blockchain.'); } }; exports.generateWallet = generateWallet; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscUVBQXdHO0FBQ3hHLGlDQUF5RDtBQUN6RCxpREFBZ0Q7QUFDaEQseURBQXNEO0FBQ3RELGFBQWE7QUFDYixrREFBMEI7QUFDMUIsMkNBQXVDO0FBQ3ZDLDZDQUFzQztBQUN0Qyw0Q0FtQnNCO0FBQ3RCLG9DQUFvQztBQUNwQyxzRUFBdUM7QUFFdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQWVwQzs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO0lBQzFELE1BQU0sVUFBVSxHQUFHLDJCQUFrQixFQUFFLENBQUE7SUFDdkMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUN2QyxPQUFPO1FBQ0wsT0FBTyxFQUFFLGlDQUF3QixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUM7UUFDckQsVUFBVTtLQUNYLENBQUE7QUFDSCxDQUFDLENBQUE7QUFQWSxRQUFBLGlCQUFpQixxQkFPN0I7QUFFRDs7Ozs7R0FLRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFtQixFQUFFO0lBQ3pGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUNBQXVCLENBQUMsQ0FBQyxDQUFDLCtCQUFtQixDQUFBO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLHlCQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sc0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3BFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUMsT0FBTztRQUNMLElBQUksRUFBRSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDL0MsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBUlksUUFBQSxpQkFBaUIscUJBUTdCO0FBRUQ7Ozs7O0dBS0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLEtBQUssRUFBRSxPQUFnQixFQUFFLElBQVksRUFBbUIsRUFBRTtJQUN6RixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1DQUF1QixDQUFDLENBQUMsQ0FBQywrQkFBbUIsQ0FBQTtJQUNwRSxNQUFNLFFBQVEsR0FBRyx5QkFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLHNCQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNwRSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVDLE9BQU87UUFDTCxJQUFJLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxFQUFFO1FBQy9DLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQVJZLFFBQUEsaUJBQWlCLHFCQVE3QjtBQUVEOzs7OztHQUtHO0FBQ0ksTUFBTSxxQkFBcUIsR0FBRyxLQUFLLEVBQUUsT0FBZ0IsRUFBRSxJQUFZLEVBQW1CLEVBQUU7SUFDN0YsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxtQ0FBdUIsQ0FBQyxDQUFDLENBQUMsaUNBQXFCLENBQUE7SUFDdEUsTUFBTSxRQUFRLEdBQUcseUJBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxzQkFBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDcEUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QyxPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUMvQyxRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUE7QUFDSCxDQUFDLENBQUE7QUFSWSxRQUFBLHFCQUFxQix5QkFRakM7QUFFRDs7Ozs7R0FLRztBQUNJLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFtQixFQUFFO0lBQzVGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUNBQXVCLENBQUMsQ0FBQyxDQUFDLGtDQUFzQixDQUFBO0lBQ3ZFLE1BQU0sUUFBUSxHQUFHLHlCQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sc0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3BFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUMsT0FBTztRQUNMLElBQUksRUFBRSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDL0MsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBUlksUUFBQSxvQkFBb0Isd0JBUWhDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLEtBQUssRUFBRSxPQUFnQixFQUFFLElBQVksRUFBbUIsRUFBRTtJQUN6RixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1DQUF1QixDQUFDLENBQUMsQ0FBQywrQkFBbUIsQ0FBQTtJQUNwRSxNQUFNLFFBQVEsR0FBRyx5QkFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLHNCQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNwRSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVDLE9BQU87UUFDTCxJQUFJLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxFQUFFO1FBQy9DLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQVJZLFFBQUEsaUJBQWlCLHFCQVE3QjtBQUVEOzs7OztHQUtHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFpQyxFQUFFO0lBQ3RGLE9BQU87UUFDTCxRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUE7QUFDSCxDQUFDLENBQUE7QUFKWSxRQUFBLGtCQUFrQixzQkFJOUI7QUFFRDs7OztHQUlHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFtQixFQUFFO0lBQ3hFLE1BQU0sUUFBUSxHQUFHLGVBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxzQkFBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDakUsT0FBTztRQUNMLFFBQVEsRUFBRSxJQUFJO1FBQ2QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0NBQW9CLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJO0tBQzFELENBQUE7QUFDSCxDQUFDLENBQUE7QUFOWSxRQUFBLGtCQUFrQixzQkFNOUI7QUFFRDs7Ozs7R0FLRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFtQixFQUFFO0lBQ3pGLE9BQU8seUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQ3pDLENBQUMsQ0FBQTtBQUZZLFFBQUEsaUJBQWlCLHFCQUU3QjtBQUVNLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFtQixFQUFFO0lBQ3pGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUNBQXVCLENBQUMsQ0FBQyxDQUFDLCtCQUFtQixDQUFBO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLHlCQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sc0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ3BFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUMsT0FBTztRQUNMLElBQUksRUFBRSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDL0MsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBUlksUUFBQSxpQkFBaUIscUJBUTdCO0FBRUQ7Ozs7O0dBS0c7QUFDSSxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFBRSxPQUFnQixFQUFFLElBQVksRUFBbUIsRUFBRTtJQUMxRixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1DQUF1QixDQUFDLENBQUMsQ0FBQyxnQ0FBb0IsQ0FBQTtJQUNyRSxNQUFNLFFBQVEsR0FBRyx5QkFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLHNCQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNwRSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVDLE9BQU87UUFDTCxJQUFJLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxFQUFFO1FBQy9DLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQVJZLFFBQUEsa0JBQWtCLHNCQVE5QjtBQUVEOzs7OztHQUtHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEVBQUUsT0FBZ0IsRUFBRSxJQUFZLEVBQW1CLEVBQUU7SUFDekYsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLHNCQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyx3QkFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHdCQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzVILE9BQU87UUFDTCxRQUFRLEVBQUUsSUFBSTtRQUNkLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLCtCQUFtQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSTtLQUN6RCxDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBTlksUUFBQSxpQkFBaUIscUJBTTdCO0FBRUQ7Ozs7O0dBS0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLEtBQUssRUFBRSxPQUFnQixFQUFFLElBQVksRUFBbUIsRUFBRTtJQUN6RixNQUFNLFFBQVEsR0FBRyxlQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sc0JBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLHdCQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsd0JBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDNUgsT0FBTztRQUNMLFFBQVEsRUFBRSxJQUFJO1FBQ2QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxtQ0FBdUIsQ0FBQyxDQUFDLENBQUMsK0JBQW1CLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJO0tBQzdGLENBQUE7QUFDSCxDQUFDLENBQUE7QUFOWSxRQUFBLGlCQUFpQixxQkFNN0I7QUFFRDs7Ozs7R0FLRztBQUNJLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFtQixFQUFFO0lBQzFGLE1BQU0sUUFBUSxHQUFHLGVBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxzQkFBYyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsNkJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyx3QkFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3pILE9BQU87UUFDTCxRQUFRLEVBQUUsSUFBSTtRQUNkLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUNBQXVCLENBQUMsQ0FBQyxDQUFDLGdDQUFvQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSTtLQUM5RixDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBTlksUUFBQSxrQkFBa0Isc0JBTTlCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFFLEVBQUU7SUFDdkQsTUFBTSxDQUFDLEdBQUcscUJBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxzQkFBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDcEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxnQ0FBb0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBRXBFLE9BQU87UUFDTCxRQUFRLEVBQUUsSUFBSTtRQUNkLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFO0tBQ2hDLENBQUE7QUFDSCxDQUFDLENBQUE7QUFSWSxRQUFBLGtCQUFrQixzQkFROUI7QUFFRDs7Ozs7R0FLRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFtQixFQUFFO0lBQ3pGLE1BQU0sUUFBUSxHQUFHLGVBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxzQkFBYyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsNEJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyx1QkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3ZILE9BQU87UUFDTCxRQUFRLEVBQUUsSUFBSTtRQUNkLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUNBQXVCLENBQUMsQ0FBQyxDQUFDLCtCQUFtQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSTtLQUM3RixDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBTlksUUFBQSxpQkFBaUIscUJBTTdCO0FBRUQ7O0dBRUc7QUFDSSxNQUFNLGlCQUFpQixHQUFHLEdBQUcsRUFBRTtJQUNwQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksc0JBQVMsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDNUIsQ0FBQyxDQUFBO0FBSFksUUFBQSxpQkFBaUIscUJBRzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQWUsRUFBRSxFQUFFO0lBQ25ELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMscUJBQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFPLENBQUMsTUFBTSxFQUFFLENBQUE7SUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFBO0FBQ25FLENBQUMsQ0FBQTtBQUhZLFFBQUEsaUJBQWlCLHFCQUc3QjtBQUVEOzs7O0dBSUc7QUFDSSxNQUFNLGlCQUFpQixHQUFHLEtBQUssRUFBRSxRQUFnQixFQUFtQixFQUFFO0lBQzNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFBO0FBQ3ZFLENBQUMsQ0FBQTtBQUZZLFFBQUEsaUJBQWlCLHFCQUU3QjtBQUVEOzs7O0dBSUc7QUFDSSxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFBRSxJQUFhLEVBQUUsRUFBRTtJQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3JGLE1BQU0sT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BELE9BQU87UUFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDckIsTUFBTSxFQUFFLE1BQU07S0FDZixDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBUlksUUFBQSxrQkFBa0Isc0JBUTlCO0FBRUQ7Ozs7OztHQU1HO0FBQ0ksTUFBTSxjQUFjLEdBQUcsQ0FBQyxRQUFrQixFQUFFLE9BQWdCLEVBQUUsUUFBaUIsRUFBRSxFQUFFO0lBQ3hGLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyx3QkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4RCxRQUFRLFFBQVEsRUFBRTtRQUNoQixLQUFLLGdCQUFRLENBQUMsR0FBRztZQUNmLE9BQU8seUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3pDLEtBQUssZ0JBQVEsQ0FBQyxJQUFJO1lBQ2hCLE9BQU8sMEJBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzFDLEtBQUssZ0JBQVEsQ0FBQyxHQUFHO1lBQ2YsT0FBTyx5QkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsS0FBSyxnQkFBUSxDQUFDLEdBQUc7WUFDZixPQUFPLHlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN6QyxLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxTQUFTLENBQUM7UUFDeEIsS0FBSyxnQkFBUSxDQUFDLFNBQVM7WUFDckIsT0FBTywwQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqQyxLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxJQUFJO1lBQ2hCLE9BQU8sMEJBQWtCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakMsS0FBSyxnQkFBUSxDQUFDLElBQUksQ0FBQztRQUNuQixLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxJQUFJO1lBQ2hCLE9BQU8sMEJBQWtCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzFDLEtBQUssZ0JBQVEsQ0FBQyxHQUFHO1lBQ2YsT0FBTyx5QkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsS0FBSyxnQkFBUSxDQUFDLElBQUk7WUFDaEIsT0FBTyw0QkFBb0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDNUMsS0FBSyxnQkFBUSxDQUFDLElBQUk7WUFDaEIsT0FBTywwQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNqQyxLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkIsS0FBSyxnQkFBUSxDQUFDLEdBQUcsQ0FBQztRQUNsQixLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxPQUFPLENBQUM7UUFDdEIsS0FBSyxnQkFBUSxDQUFDLEtBQUssQ0FBQztRQUNwQixLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkIsS0FBSyxnQkFBUSxDQUFDLEdBQUcsQ0FBQztRQUNsQixLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxHQUFHLENBQUM7UUFDbEIsS0FBSyxnQkFBUSxDQUFDLElBQUksQ0FBQztRQUNuQixLQUFLLGdCQUFRLENBQUMsR0FBRyxDQUFDO1FBQ2xCLEtBQUssZ0JBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkIsS0FBSyxnQkFBUSxDQUFDLElBQUksQ0FBQztRQUNuQixLQUFLLGdCQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLEtBQUssZ0JBQVEsQ0FBQyxTQUFTLENBQUM7UUFDeEIsS0FBSyxnQkFBUSxDQUFDLEdBQUcsQ0FBQztRQUNsQixLQUFLLGdCQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3RCLEtBQUssZ0JBQVEsQ0FBQyxHQUFHLENBQUM7UUFDbEIsS0FBSyxnQkFBUSxDQUFDLElBQUksQ0FBQztRQUNuQixLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkIsS0FBSyxnQkFBUSxDQUFDLEdBQUcsQ0FBQztRQUNsQixLQUFLLGdCQUFRLENBQUMsR0FBRyxDQUFDO1FBQ2xCLEtBQUssZ0JBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkIsS0FBSyxnQkFBUSxDQUFDLEtBQUssQ0FBQztRQUNwQixLQUFLLGdCQUFRLENBQUMsTUFBTSxDQUFDO1FBQ3JCLEtBQUssZ0JBQVEsQ0FBQyxPQUFPLENBQUM7UUFDdEIsS0FBSyxnQkFBUSxDQUFDLE1BQU0sQ0FBQztRQUNyQixLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxTQUFTLENBQUM7UUFDeEIsS0FBSyxnQkFBUSxDQUFDLEdBQUcsQ0FBQztRQUNsQixLQUFLLGdCQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3ZCLEtBQUssZ0JBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkIsS0FBSyxnQkFBUSxDQUFDLElBQUksQ0FBQztRQUNuQixLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkIsS0FBSyxnQkFBUSxDQUFDLElBQUksQ0FBQztRQUNuQixLQUFLLGdCQUFRLENBQUMsSUFBSSxDQUFDO1FBQ25CLEtBQUssZ0JBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkIsS0FBSyxnQkFBUSxDQUFDLEdBQUc7WUFDZixPQUFPLHlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN6QyxLQUFLLGdCQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3BCLEtBQUssZ0JBQVEsQ0FBQyxVQUFVLENBQUM7UUFDekIsS0FBSyxnQkFBUSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hDLEtBQUssZ0JBQVEsQ0FBQyxVQUFVO1lBQ3RCLE9BQU8sNkJBQXFCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzdDLEtBQUssZ0JBQVEsQ0FBQyxHQUFHO1lBQ2YsT0FBTyx5QkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsS0FBSyxnQkFBUSxDQUFDLEdBQUc7WUFDZixPQUFPLHlCQUFpQixFQUFFLENBQUE7UUFDNUIsS0FBSyxnQkFBUSxDQUFDLEdBQUc7WUFDZixPQUFPLHlCQUFpQixFQUFFLENBQUE7UUFDNUIsS0FBSyxnQkFBUSxDQUFDLEdBQUc7WUFDZixPQUFPLHlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN6QyxLQUFLLGdCQUFRLENBQUMsR0FBRztZQUNmLE9BQU8seUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkMsS0FBSyxnQkFBUSxDQUFDLEdBQUc7WUFDZixPQUFPLHlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2hDLEtBQUssZ0JBQVEsQ0FBQyxJQUFJO1lBQ2hCLE9BQU8sMEJBQWtCLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDckM7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUE7S0FDN0M7QUFDSCxDQUFDLENBQUE7QUE3RlksUUFBQSxjQUFjLGtCQTZGMUIifQ==