UNPKG

@tatumio/tatum-v1

Version:

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

410 lines 44.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = require("fs"); const model_1 = require("../model"); const transaction_1 = require("../transaction"); const nft_1 = require("./nft"); describe('NFT tests', () => { jest.setTimeout(99999); describe('NFT CELO transactions', () => { it('should test valid deploy 721 transaction', async () => { const body = new model_1.CeloDeployErc721(); body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236'; body.name = 'Tatum'; body.symbol = 'TTM'; body.feeCurrency = model_1.Currency.CUSD; body.chain = model_1.Currency.CELO; const test = await nft_1.deployNFT(true, body, 'https://alfajores-forno.celo-testnet.org'); console.log(test); expect(test).toBeDefined(); }); it('should test celo 721 mint multiple transaction with cashback', async () => { const firstTokenId = new Date().getTime(); const secondTokenId = firstTokenId + 1; const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, { to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], chain: model_1.Currency.CELO, tokenId: [firstTokenId.toString(), secondTokenId.toString()], url: ['https://www.seznam.cz', 'https://www.seznam.cz'], fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb', contractAddress: '0x69aBb0b2d0fEd5f1Be31b007689181CeE0ed909B', authorAddresses: [['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9']], cashbackValues: [['0.25', '0.25'], ['0.25', '0.25']], fee: { gasLimit: '6000000', gasPrice: '100' }, feeCurrency: model_1.Currency.CUSD }); console.log(mintedTokens); expect(mintedTokens).not.toBeNull(); }); it('should test valid mint cashback 721 transaction', async () => { const body = new model_1.CeloMintErc721(); body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236'; body.to = '0x48d4bA7B2698A4b89635b9a2E391152350DB740f'; body.contractAddress = '0x28980D12Ce9E7Bf6C20f568Db998E9A4d8F13271'; body.authorAddresses = ['0x7100f8FF8AF3F5e527141039A1ceE9D244f39862']; body.cashbackValues = ['0.25']; body.tokenId = '1'; body.url = 'https://google.com'; body.feeCurrency = model_1.Currency.CUSD; body.chain = model_1.Currency.CELO; const test = await nft_1.mintNFTWithUri(true, body, 'https://alfajores-forno.celo-testnet.org'); console.log('test results', test); expect(test).toBeDefined(); }); it('should test valid mint 721 transaction', async () => { const body = new model_1.CeloMintErc721(); body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236'; body.to = '0x48d4bA7B2698A4b89635b9a2E391152350DB740f'; body.contractAddress = '0x1214BEada6b25bc98f7494C7BDBf22C095FDCaBD'; body.tokenId = '33334'; body.url = 'https://google.com'; body.feeCurrency = model_1.Currency.CUSD; body.chain = model_1.Currency.CELO; expect(await nft_1.mintNFTWithUri(true, body, 'https://alfajores-forno.celo-testnet.org')).toBeDefined(); }); it('should test valid mint 721 transaction on IPFS', async () => { const body = new model_1.CeloMintErc721(); body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236'; body.to = '0x48d4bA7B2698A4b89635b9a2E391152350DB740f'; body.contractAddress = '0x1214BEada6b25bc98f7494C7BDBf22C095FDCaBD'; body.tokenId = `${Date.now()}`; body.feeCurrency = model_1.Currency.CUSD; body.chain = model_1.Currency.CELO; console.log(await nft_1.createNFT(true, body, fs_1.readFileSync('/Users/ssramko/Downloads/logo_tatum.png'), 'Tatum LOGO', 'description', undefined, 'https://alfajores-forno.celo-testnet.org')); }); it('should test valid mint multiple 721 transaction', async () => { const body = new model_1.CeloMintMultipleErc721(); body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236'; body.to = ['0x8cb76aed9c5e336ef961265c6079c14e9cd3d2ea', '0x8cb76aed9c5e336ef961265c6079c14e9cd3d2ea']; body.contractAddress = '0x3e1a302DA9345ae6f8188607C017d342A4CCf22e'; body.tokenId = ['4', '5']; body.url = ['https://google.com', 'https://google.com']; body.feeCurrency = model_1.Currency.CUSD; body.chain = model_1.Currency.CELO; expect(await nft_1.mintMultipleNFTWithUri(true, body, 'https://alfajores-forno.celo-testnet.org')).toBeDefined(); }); it('should test valid burn 721 transaction', async () => { const body = new model_1.CeloBurnErc721(); body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236'; body.contractAddress = '0x3e1a302DA9345ae6f8188607C017d342A4CCf22e'; body.tokenId = '3'; body.feeCurrency = model_1.Currency.CUSD; body.chain = model_1.Currency.CELO; expect(await nft_1.burnNFT(true, body, 'https://alfajores-forno.celo-testnet.org')).toBeDefined(); }); it('should test valid transfer 721 transaction', async () => { const body = new model_1.CeloTransferErc721(); body.fromPrivateKey = '0xa488a82b8b57c3ece4307525741fd8256781906c5fad948b85f1d63000948236'; body.to = '0xd093bEd4BC06403bfEABB54667B42C48533D3Fd9'; body.contractAddress = '0x1214BEada6b25bc98f7494C7BDBf22C095FDCaBD'; body.tokenId = '33334'; body.feeCurrency = model_1.Currency.CUSD; body.chain = model_1.Currency.CELO; expect(await nft_1.transferNFT(true, body, 'https://alfajores-forno.celo-testnet.org')).toBeDefined(); }); }); describe('NFT ETH transactions', () => { it('should test eth 721 deploy transaction', async () => { const deployErc721Token = await nft_1.deployNFT(true, { symbol: 'TatumToken', chain: model_1.Currency.ETH, fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', name: 'TatumToken', fee: { gasLimit: '6000000', gasPrice: '100' } }); expect(deployErc721Token).not.toBeNull(); console.log('response::', deployErc721Token); }); it('should test eth 721 mint transaction', async () => { const tokenId = new Date().getTime().toString(); const mintedToken = await nft_1.mintNFTWithUri(true, { to: '0x687422eEA2cB73B5d3e242bA5456b782919AFc85', chain: model_1.Currency.ETH, tokenId, url: 'https://www.seznam.cz', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xE4966098662cF4c8e9BB63D643336b163cB9FFE1' }); console.log(tokenId); expect(mintedToken).not.toBeNull(); }); it('should test eth 721 mint transaction with cashback', async () => { const tokenId = new Date().getTime().toString(); const mintedToken = await nft_1.mintNFTWithUri(true, { to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f', chain: model_1.Currency.ETH, tokenId, url: 'test.com', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xE4966098662cF4c8e9BB63D643336b163cB9FFE1', authorAddresses: ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342'], cashbackValues: ['0.25'] }); console.log(mintedToken); expect(mintedToken).not.toBeNull(); }); it('should test eth 721 mint multiple transaction with cashback', async () => { const firstTokenId = new Date().getTime(); const secondTokenId = firstTokenId + 1; const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, { to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], chain: model_1.Currency.ETH, tokenId: [firstTokenId.toString(), secondTokenId.toString()], url: ['https://www.seznam.cz', 'https://www.seznam.cz'], fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0x17683adfe031d13caca13fc234f222fa3837d4aa', authorAddresses: [['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9']], cashbackValues: [['0.25', '0.25'], ['0.25', '0.25']] }); console.log(mintedTokens); expect(mintedTokens).not.toBeNull(); }); it('should test eth 721 mint multiple transaction', async () => { const firstTokenId = new Date().getTime(); const secondTokenId = firstTokenId + 1; const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, { to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], chain: model_1.Currency.ETH, tokenId: [firstTokenId.toString(), secondTokenId.toString()], url: ['https://www.seznam.cz', 'https://www.seznam.cz'], fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xab12c6c926cc3c9547aad71d6082fa724152a442', fee: { gasLimit: '500000', gasPrice: '100' } }); console.log(mintedTokens); expect(mintedTokens).not.toBeNull(); }); it('should test eth 721 burn transaction', async () => { const burnErc721Token = await nft_1.burnNFT(true, { tokenId: '1615884747446', chain: model_1.Currency.ETH, fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xab12c6c926cc3c9547aad71d6082fa724152a442', fee: { gasLimit: '5000000', gasPrice: '1100' }, }); expect(burnErc721Token).not.toBeNull(); }); it('should test eth 721 send transaction', async () => { const sendErc721Token = await nft_1.transferNFT(true, { to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f', chain: model_1.Currency.ETH, tokenId: '2', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xE4966098662cF4c8e9BB63D643336b163cB9FFE1', value: '1' }); expect(sendErc721Token).not.toBeNull(); }); it('should test eth 721 send transaction', async () => { const sendErc721Token = await nft_1.transferNFT(true, { to: '0x811dfbff13adfbc3cf653dcc373c03616d3471c9', chain: model_1.Currency.ETH, tokenId: '1615884907854', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xab12c6c926cc3c9547aad71d6082fa724152a442', fee: { gasLimit: '5000000', gasPrice: '100' }, value: '1' }); expect(sendErc721Token).not.toBeNull(); }); }); describe('NFT BSC transactions', () => { it('should test eth 721 deploy transaction', async () => { const deployErc721Token = await nft_1.deployNFT(true, { symbol: 'TatumToken', chain: model_1.Currency.BSC, fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', name: 'TatumToken', fee: { gasLimit: '6000000', gasPrice: '100' } }); expect(deployErc721Token).not.toBeNull(); console.log(deployErc721Token); }); it('should test bep 721 mint multiple transaction with cashback', async () => { const firstTokenId = new Date().getTime(); const secondTokenId = firstTokenId + 1; const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, { to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], chain: model_1.Currency.BSC, tokenId: [firstTokenId.toString(), secondTokenId.toString()], url: ['https://www.seznam.cz', 'https://www.seznam.cz'], fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xf59d331098f721fd4f6d4651c27e32daae5c1fdd', authorAddresses: [['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9']], cashbackValues: [['0.25', '0.25'], ['0.25', '0.25']], fee: { gasLimit: '6000000', gasPrice: '100' } }); console.log(mintedTokens); expect(mintedTokens).not.toBeNull(); }); it('should test bep 721 mint transaction', async () => { try { const mintedToken = await nft_1.mintNFTWithUri(true, { to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f', chain: model_1.Currency.BSC, tokenId: '1', url: 'test.com', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3', authorAddresses: ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342'], cashbackValues: ['0.25'] }); console.log('mintedToken', mintedToken); expect(mintedToken).not.toBeNull(); } catch (e) { console.log(e); } }); it('should test valid mint 721 transaction on IPFS', async () => { const body = { to: '0x811dfbff13adfbc3cf653dcc373c03616d3471c9', chain: model_1.Currency.BSC, tokenId: `${Date.now()}`, url: '', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xC25f71fEaD66A160758265321e4c2Fb93b83BabF', }; console.log(await nft_1.createNFT(true, body, fs_1.readFileSync('/Users/ssramko/Downloads/logo_tatum.png'), 'Tatum LOGO', 'description')); }); it('should test BSC send transaction', async () => { const sendErc721Token = await nft_1.transferNFT(true, { to: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', chain: model_1.Currency.BSC, tokenId: '1', fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb', contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3', value: '1' }); console.log('response: ', sendErc721Token); expect(sendErc721Token).not.toBeNull(); }); }); describe('NFT POLYGON transactions', () => { it('should test MATIC 721 deploy transaction', async () => { const deployErc721Token = await nft_1.deployNFT(true, { symbol: 'TatumToken', chain: model_1.Currency.MATIC, fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', name: 'TatumToken', fee: { gasLimit: '6000000', gasPrice: '5' } }, 'https://rpc-mumbai.matic.today'); expect(deployErc721Token).not.toBeNull(); console.log(deployErc721Token); }); it('should test MATIC 721 mint multiple transaction with cashback', async () => { const firstTokenId = new Date().getTime(); const secondTokenId = firstTokenId + 1; const mintedTokens = await nft_1.mintMultipleNFTWithUri(true, { to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], chain: model_1.Currency.MATIC, tokenId: [firstTokenId.toString(), secondTokenId.toString()], url: ['https://www.seznam.cz', 'https://www.seznam.cz'], fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xf59d331098f721fd4f6d4651c27e32daae5c1fdd', authorAddresses: [['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9']], cashbackValues: [['0.25', '0.25'], ['0.25', '0.25']], fee: { gasLimit: '6000000', gasPrice: '100' } }, 'https://rpc-mumbai.matic.today'); console.log(mintedTokens); expect(mintedTokens).not.toBeNull(); }); it('should test valid mint 721 transaction on IPFS', async () => { const body = { to: '0x811dfbff13adfbc3cf653dcc373c03616d3471c9', chain: model_1.Currency.MATIC, tokenId: `${Date.now()}`, url: '', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xdb778b39bd7a7c479b3bb1d70df6665fe73e7e1d', }; console.log(await nft_1.createNFT(true, body, fs_1.readFileSync('/Users/ssramko/Downloads/logo_tatum.png'), 'Tatum LOGO', 'description', undefined, 'https://rpc-mumbai.matic.today')); }); it('should obtain metadata from NFT on IPFS on MATIC', async () => { const data = await nft_1.getNFTImage(model_1.Currency.MATIC, '0x6d8eae641416b8b79e0fb3a92b17448cfff02b11', '1629193549967'); expect(data.publicUrl).toBe('https://gateway.pinata.cloud/ipfs/Qmaiu5NAXe2gwH734hWhvyharurBjoxi8Kv37sGp1ZhRpf'); expect(data.originalUrl).toBe('ipfs://Qmaiu5NAXe2gwH734hWhvyharurBjoxi8Kv37sGp1ZhRpf'); }); it('should obtain metadata from NFT on IPFS on FLOW', async () => { const data = await nft_1.getNFTImage(model_1.Currency.FLOW, '2d103773-50e2-4a37-ac3d-61bc6af8faee', '145', '0x10247089e55180c9'); expect(data.publicUrl).toBe('https://gateway.pinata.cloud/ipfs/Qmaiu5NAXe2gwH734hWhvyharurBjoxi8Kv37sGp1ZhRpf'); expect(data.originalUrl).toBe('ipfs://Qmaiu5NAXe2gwH734hWhvyharurBjoxi8Kv37sGp1ZhRpf'); }); it('should test MATIC 721 mint transaction', async () => { try { const mintedToken = await nft_1.mintNFTWithUri(true, { to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f', chain: model_1.Currency.MATIC, tokenId: '1', url: 'test.com', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3', authorAddresses: ['0x6c4A48886b77D1197eCFBDaA3D3f35d81d584342'], cashbackValues: ['0.25'] }, 'https://rpc-mumbai.matic.today'); console.log('mintedToken', mintedToken); expect(mintedToken).not.toBeNull(); } catch (e) { console.log(e); } }); it('should test MATIC send transaction', async () => { const sendErc721Token = await nft_1.transferNFT(true, { to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f', chain: model_1.Currency.MATIC, tokenId: '1', fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb', contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3', value: '1' }, 'https://rpc-mumbai.matic.today'); console.log('response: ', sendErc721Token); expect(sendErc721Token).not.toBeNull(); }); }); describe('NFT built in private key transactions', () => { it('should test CELO send mint transaction with built in key', async () => { const sendErc721Token = await transaction_1.sendCeloMintErc721Transaction(true, { to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f', chain: model_1.Currency.CELO, url: 'https://url' }); console.log('response: ', sendErc721Token); expect(sendErc721Token).not.toBeNull(); }); it('should test CELO send mint transaction with key', async () => { const sendErc721Token = await transaction_1.sendCeloMintErc721Transaction(true, { to: '0x4b812a77b109A150C2Fc89eD133EaBC78bC9EC8f', chain: model_1.Currency.CELO, url: 'https://url', fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb', tokenId: '1', contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3', feeCurrency: model_1.Currency.CELO, }); console.log('response: ', sendErc721Token); expect(sendErc721Token).not.toBeNull(); }); it('should test CELO send add minter transaction', async () => { const sendErc721Token = await nft_1.sendAddNFTMinter(true, { minter: '0x80d8bac9a6901698b3749fe336bbd1385c1f98f2', chain: model_1.Currency.CELO, fromPrivateKey: '0x4874827a55d87f2309c55b835af509e3427aa4d52321eeb49a2b93b5c0f8edfb', contractAddress: '0xdf82c2f74aa7b629bda65b1cfd258248c9c2b7d3', feeCurrency: model_1.Currency.CELO, }); console.log('response: ', sendErc721Token); expect(sendErc721Token).not.toBeNull(); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmZ0LnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmZ0L25mdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkJBQWdDO0FBQ2hDLG9DQUE2STtBQUM3SSxnREFBNkQ7QUFDN0QsK0JBQXdJO0FBRXhJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO0lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUNuQyxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBSSx3QkFBZ0IsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsb0VBQW9FLENBQUM7WUFDM0YsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7WUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBUSxDQUFDLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFRLENBQUMsSUFBSSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxHQUFHLE1BQU0sZUFBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUNyRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4REFBOEQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMxRSxNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFDLE1BQU0sYUFBYSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDdkMs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