Contract 0x0470cfb29494d68166f2325c9e55d6c24dbc9a59 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x673c5c17b95342d55b4bca2548de3442cc6ecbf2391e0149bd3b545c130b009bAirdrop Native C...517093782022-12-01 9:42:1514 hrs 48 mins ago0x646c17ec19509a348192a1516334bc510fb19a2a IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590.225 FTM0.0030553
0xeed5f02d8f5de0adb0885744ffbc616930725f0100eda3f1371267f373843a5eAirdrop Native C...517090872022-12-01 9:36:3914 hrs 54 mins ago0x646c17ec19509a348192a1516334bc510fb19a2a IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590.225 FTM0.0032172309
0x32a49d3467d150235b8d56e0fa1faace70cf33e58b8014da200c8917e8087d63Airdrop Native C...517090392022-12-01 9:35:2314 hrs 55 mins ago0x646c17ec19509a348192a1516334bc510fb19a2a IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590.225 FTM0.03925068543
0xd3d96b02f795456d6540e711530fca4dbec8c000572ea71303f8a5dbae064a11Erc20Airdrop516399932022-11-30 2:22:251 day 22 hrs ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.298859156847
0xfdfcfbd3a50e002ed5d1444e3785f70ead9e2fe9cc08052f82131e8168633d9fErc20Airdrop516348392022-11-30 0:32:261 day 23 hrs ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.353663001063
0xb678f798bdbca5b9fddb744f2dc03346368a265baed503535d590cd6059ced63Erc20Airdrop516336122022-11-29 23:59:492 days 31 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.181633388567
0x888b9f67df6cd2b2bd497d675679947bbf0adefa4b2bca6b10b3a113e0a52d2aErc20Airdrop516335382022-11-29 23:58:272 days 32 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.191739136386
0x94f2be4114d95963ba8d04939f38c98e16a9b80a6509f839dc2713778a6c4f6fErc20Airdrop516334812022-11-29 23:57:062 days 34 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.181543850207
0x4c367f64b1312a46d701acf53f98f5571de457ed3d61221d3b2f2f857d9c2fd0Erc20Airdrop516333832022-11-29 23:55:182 days 35 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.21961711179
0x3756c3c208f7f1ad8de9d020a980797223b0b5fa1fed74bdcb6d1fa10079c7bcErc20Airdrop516333062022-11-29 23:53:372 days 37 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.256639995646
0xa0351704cbc6d23bf1c7df174f675cfe12d0f34287bb2c91537196cdf7ea90efErc20Airdrop516332272022-11-29 23:51:502 days 39 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.240251643331
0xc810c372f5c517df36c2b1f6bc0c23a1d03b23fe95415df9e4f0c14f0bc3fb77Erc20Airdrop516331602022-11-29 23:50:322 days 40 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.24203538
0x7260faed64a5362a4ba5eaf4f2068bcd9fab0bdf24def2bbcddcab11329955d8Erc20Airdrop516330382022-11-29 23:47:112 days 43 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.271445551163
0x926227c63de144a2c20d068174ba037ff46c2fa39a8428924eea971c5df8c604Erc20Airdrop516328222022-11-29 23:42:432 days 48 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.162662217023
0xbbc568f3ca88a50d4f040ceefc6018ba10fc73dcde04bd229cf68e830ae4ba24Erc20Airdrop516327172022-11-29 23:40:482 days 50 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.196051773069
0xb5ba5fbf4f65c84179c3238461022b5c05d5f30262e938214e6e24438c19c769Erc20Airdrop516326432022-11-29 23:39:182 days 51 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.216955726159
0xbb29e1f9385c8e3892606e200bf4a608775f847b52139cca6bfff9af7073249cErc20Airdrop516325522022-11-29 23:36:472 days 54 mins ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.322248041634
0x3884bd72ea613c6ff315ee5f1f2c32c97f33c099fdfcb8580c62ce1c082f1862Erc20Airdrop516322872022-11-29 23:29:242 days 1 hr ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.224963417944
0xbb6b7a697b62d1299611ffe257bb8f48098ec59d6c9ef8d86947e3c4b3b92c41Erc20Airdrop516321632022-11-29 23:26:532 days 1 hr ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.17882764328
0x1f8c21910dcae82ca92425c5e22f09f5101128fa176a21dac3c8bab274a176c9Erc20Airdrop516320572022-11-29 23:23:292 days 1 hr ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.208010192631
0x67eae2c76ed1ec957f12cd7c103ed37319ce78a01ea4e901462236e575c4ddaaErc20Airdrop516319072022-11-29 23:20:202 days 1 hr ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.185259970168
0x68c595523182ae1f9e6df869b8c34145d76ebb4ba19b060dc565c3b09008703fErc20Airdrop516317882022-11-29 23:17:172 days 1 hr ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.223839418492
0x7d10dc9c74ca2df54bcf75db38892b5423a681b9e749cabea8150a7aaab61312Erc20Airdrop516316832022-11-29 23:14:232 days 1 hr ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.202961924155
0x93f3af6d805d7627be3a5724385954fe607bbe423dfd5631fb10c7668e756d23Erc20Airdrop516316032022-11-29 23:12:482 days 1 hr ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.17857171917
0xec40a6bbd114259061497a10e4f543ba378d8640279ec7930844c6be7027f46dErc20Airdrop516314972022-11-29 23:10:072 days 1 hr ago0x4cbaf547e80ecb4c2a463cb99cea2b0468ec90a2 IN  0x0470cfb29494d68166f2325c9e55d6c24dbc9a590 FTM0.229884999371
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x673c5c17b95342d55b4bca2548de3442cc6ecbf2391e0149bd3b545c130b009b517093782022-12-01 9:42:1514 hrs 48 mins ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x10dc77f2f65889be8add7640bc76ae932f31607f0.2250000000000001 FTM
0xeed5f02d8f5de0adb0885744ffbc616930725f0100eda3f1371267f373843a5e517090872022-12-01 9:36:3914 hrs 54 mins ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x10dc77f2f65889be8add7640bc76ae932f31607f0.2250000000000001 FTM
0x32a49d3467d150235b8d56e0fa1faace70cf33e58b8014da200c8917e8087d63517090392022-12-01 9:35:2314 hrs 55 mins ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x10dc77f2f65889be8add7640bc76ae932f31607f0.2250000000000001 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x6deaf1cf4ee59a13cdb1fcbc13fb70f24cfe23910.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x5a89cc58bf3687d61d865d88d1c535a234350b140.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x8e9f338763c5194db035cafc43dc53354be45f3c0.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590xaf9e36000bd2fe33d773670a01ee2b55d8208abf0.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x418bd79aa8a8bf42fac9d094b148af912c9733120.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x775eb0d5913e5654203c191c087ac6adc82c1d070.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x0e2d3bf82c9ac9a11b63d92dc41b8e49d13673df0.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590xb490c4b541a6733f900b578d40eb360f35798f440.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590xe6825a2b17836abb077d344596fbd876802c89990.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x902715b08d2ecd60744b30923e8ee0a0b36b48210.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590xe8874360bfb0749a97ec014dc54e283d419a424f0.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x1af35811ddb7907243a53fe047428842d9f9b3420.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590xed94a76f3bea5dc1cbf8f675edc93c45535b946f0.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x0b24550f38f97929b10f24aa80cea5bf8a19cecf0.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590xb64d9b4018be33433369422bccfd109b4d5c68310.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590xe4591d38c45ea3cc2b66943c523474c001a29fc80.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590xe4c6cee4eeec3d5ca37e4e91d95086493169bb820.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x55a8581735308ad7b2fd8311e0dd241af270e35b0.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x15a7040be0996b07b9d6be989241a449fb8a57f80.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590xbb1863fbfd9efc4e3238f1ccb7dc9c4fdb6ac3af0.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x49726701d3f34a4e4ce1be304b5715394534a1130.15 FTM
0xa68d37ae3731e9f8ab1af1de8deb42975888ba04c34476543a1cf8e1fd638b79508226542022-11-13 15:23:5318 days 9 hrs ago 0x0470cfb29494d68166f2325c9e55d6c24dbc9a590x6fa4f41863d156a2a3cabb65d05d8711fdf4e9140.15 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoMultisender

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-05-18
*/

pragma solidity ^0.8.0;
 

contract Ownable {
    
    address public owner;
    
    event OwnershipTransferred(address indexed from, address indexed to);
    
    /**
     * Constructor assigns ownership to the address used to deploy the contract.
     * */
    constructor() {
        owner = msg.sender;
    }

    function getOwner() public view returns(address) {
        return owner;
    }

    /**
     * Any function with this modifier in its method signature can only be executed by
     * the owner of the contract. Any attempt made by any other account to invoke the 
     * functions with this modifier will result in a loss of gas and the contract's state
     * will remain untampered.
     * */
    modifier onlyOwner {
        require(msg.sender == owner, "Function restricted to owner of contract");
        _;
    }

    /**
     * Allows for the transfer of ownership to another address;
     * 
     * @param _newOwner The address to be assigned new ownership.
     * */
    function transferOwnership(address _newOwner) public onlyOwner {
        require(
            _newOwner != address(0)
            && _newOwner != owner 
        );
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }
}



abstract contract DeprecatedMultisenderSC {
    function isPremiumMember(address _who) external virtual view returns(bool);
}

/**
 * Contract acts as an interface between the Crypto Multisender contract and all ERC20 compliant
 * tokens. 
 * */
abstract contract ERC20Interface {
    function transferFrom(address _from, address _to, uint256 _value) public virtual;
    function balanceOf(address who)  public virtual returns (uint256);
    function allowance(address owner, address spender)  public view virtual returns (uint256);
    function transfer(address to, uint256 value) public virtual returns(bool);
    function gasOptimizedAirdrop(address[] calldata _addrs, uint256[] calldata _values) external virtual; 
}

/**
 * Contract acts as an interface between the NFT Crypto Multisender contract and all ERC721 compliant
 * tokens. 
 * */
abstract contract ERC721Interface {
    function transferFrom(address _from, address _to, uint256 _tokenId) public virtual;
    function balanceOf(address who)  public virtual returns (uint256);
    function isApprovedForAll(address _owner, address _operator) public view virtual returns(bool);
    function setApprovalForAll(address _operator, bool approved) public virtual;
    function gasOptimizedAirdrop(address _invoker, address[] calldata _addrs, uint256[] calldata _tokenIds) external virtual;
}


/**
 * Contract acts as an interface between the NFT Crypto Multisender contract and all ERC1155 compliant
 * tokens. 
 * */
abstract contract ERC1155Interface {
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory data) public virtual;
    function balanceOf(address _who, uint256 _id)  public virtual returns (uint256);
    function isApprovedForAll(address _owner, address _operator) public view virtual returns(bool);
    function setApprovalForAll(address _operator, bool approved) public virtual;
    function gasOptimizedAirdrop(address _invoker, address[] calldata _addrs, uint256[] calldata _tokenIds, uint256[] calldata _amounts) external virtual;
}



contract CryptoMultisender is Ownable {
 
    mapping (address => uint256) public tokenTrialDrops;
    mapping (address => uint256) public userTrialDrops;

    mapping (address => uint256) public premiumMembershipDiscount;
    mapping (address => uint256) public membershipExpiryTime;

    mapping (address => bool) public isGrantedPremiumMember;

    mapping (address => bool) public isListedToken;
    mapping (address => uint256) public tokenListingFeeDiscount;

    mapping (address => bool) public isGrantedListedToken;

    mapping (address => bool) public isAffiliate;
    mapping (string => address) public affiliateCodeToAddr;
    mapping (string => bool) public affiliateCodeExists;
    mapping (address => string) public affiliateCodeOfAddr;
    mapping (address => string) public isAffiliatedWith;
    mapping (string => uint256) public commissionPercentage;

    uint256 public oneDayMembershipFee;
    uint256 public sevenDayMembershipFee;
    uint256 public oneMonthMembershipFee;
    uint256 public lifetimeMembershipFee;
    uint256 public tokenListingFee;
    uint256 public rate;
    uint256 public dropUnitPrice;
    address public deprecatedMultisenderAddress;

    event TokenAirdrop(address indexed by, address indexed tokenAddress, uint256 totalTransfers);
    event EthAirdrop(address indexed by, uint256 totalTransfers, uint256 ethValue);
    event NftAirdrop(address indexed by, address indexed nftAddress, uint256 totalTransfers);
    event RateChanged(uint256 from, uint256 to);
    event RefundIssued(address indexed to, uint256 totalWei);
    event ERC20TokensWithdrawn(address token, address sentTo, uint256 value);
    event CommissionPaid(address indexed to, uint256 value);
    event NewPremiumMembership(address indexed premiumMember);
    event NewAffiliatePartnership(address indexed newAffiliate, string indexed affiliateCode);
    event AffiliatePartnershipRevoked(address indexed affiliate, string indexed affiliateCode);
    
    constructor() {
        rate = 3000;
        dropUnitPrice = 333333333333333; 
        oneDayMembershipFee = 9e17;
        sevenDayMembershipFee = 125e16;
        oneMonthMembershipFee = 2e18;
        lifetimeMembershipFee = 25e17;
        tokenListingFee = 5e18;
        deprecatedMultisenderAddress=address(0x29Cd4BD49b2c76f82A8BE41B3921339Fd7717ae8);
    }

    /**
     * Allows the owner of this contract to change the fees for users to become premium members.
     * 
     * @param _oneDayFee Fee for single day membership.
     * @param _sevenDayFee Fee for one week membership.
     * @param _oneMonthFee Fee for one month membership.
     * @param _lifetimeFee Fee for lifetime membership.
     * 
     * @return success True if the fee is changed successfully. False otherwise.
     * */
    function setMembershipFees(uint256 _oneDayFee, uint256 _sevenDayFee, uint256 _oneMonthFee, uint256 _lifetimeFee) public onlyOwner returns(bool success) {
        require(_oneDayFee>0 && _oneDayFee<_sevenDayFee && _sevenDayFee<_oneMonthFee && _oneMonthFee<_lifetimeFee);
        oneDayMembershipFee = _oneDayFee;
        sevenDayMembershipFee = _sevenDayFee;
        oneMonthMembershipFee = _oneMonthFee;
        lifetimeMembershipFee = _lifetimeFee;
        return true;
    }

    /**
     * Allows for the conversion of an unsigned integer to a string value. 
     * 
     * @param _i The value of the unsigned integer
     * 
     * @return _uintAsString The string value of the unsigned integer.
     * */
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    /**
    * Used to give change to users who accidentally send too much ETH to payable functions. 
    *
    * @param _price The service fee the user has to pay for function execution. 
    **/
    function giveChange(uint256 _price) internal {
        if(msg.value > _price) {
            uint256 change = msg.value - _price;
            payable(msg.sender).transfer(change);
        }
    }
    
    /**
    * Ensures that the correct affiliate code is used and also ensures that affiliate partners
    * are not able to 'jack' commissions from existing users who they are not affiliated with. 
    *
    * @param _afCode The affiliate code provided by the user.
    *
    * @return code The correct affiliate code or void.
    **/
    function processAffiliateCode(string memory _afCode) internal returns(string memory code) {
        if(stringsAreEqual(isAffiliatedWith[msg.sender], "void") || !isAffiliate[affiliateCodeToAddr[_afCode]]) {
            isAffiliatedWith[msg.sender] = "void";
            return "void";
        }
        if(!stringsAreEqual(_afCode, "") && stringsAreEqual(isAffiliatedWith[msg.sender],"") 
                                                                && affiliateCodeExists[_afCode]) {
            if(affiliateCodeToAddr[_afCode] == msg.sender) {
                return "void";
            }
            isAffiliatedWith[msg.sender] = _afCode;
        }
        if(stringsAreEqual(_afCode,"") && !stringsAreEqual(isAffiliatedWith[msg.sender],"")) {
            _afCode = isAffiliatedWith[msg.sender];
        } 
        if(stringsAreEqual(_afCode,"") || !affiliateCodeExists[_afCode]) {
            isAffiliatedWith[msg.sender] = "void";
            _afCode = "void";
        }
        return _afCode;
    }

    /**
     * Allows users to check if a user is a premium member or not. 
     * 
     * @param _addr The address of the user. 
     * 
     * @return isMember True if the user is a premium member, false otherwise.
     * */
    function checkIsPremiumMember(address _addr) public view returns(bool isMember) {
        return membershipExpiryTime[_addr] >= block.timestamp || isGrantedPremiumMember[_addr];
    }

    /**
    * Allows the owner of this contract to grant users with premium membership.
    *
    * @param _addr The address of the user who is being granted premium membership.
    *
    * @return success True if premium membership is granted successfully. False otherwise. 
    **/
    function grantPremiumMembership(address _addr) public onlyOwner returns(bool success) {
        require(checkIsPremiumMember(_addr) != true, "Is already premiumMember member");
        isGrantedPremiumMember[_addr] = true;
        emit NewPremiumMembership(_addr);
        return true; 
    }

    /**
    * Allows the owner of this contract to revoke a granted membership.
    *
    * @param _addr The address of the user whos membership is being revoked.
    *
    * @return success True if membership is revoked successfully. False otherwise. 
    **/
    function revokeGrantedPremiumMembership(address _addr) public onlyOwner returns(bool success) {
        require(isGrantedPremiumMember[_addr], "Not a granted membership");
        isGrantedPremiumMember[_addr] = false;
        return true;
    }

    /**
     * Allows the owner of the contract to grant a premium membership discount for a specified user.
     * 
     * @param _addr The address of the user.
     * @param _discount The discount being granted.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setPremiumMembershipDiscount(address _addr, uint256 _discount) public onlyOwner returns(bool success) {
        premiumMembershipDiscount[_addr] = _discount;
        return true;
    }

    /**
     * Allows users to check VIP membership fees for a specific address. This is useful for validating if a discount
     * has been granted for the specified user. 
     * 
     * @param _addr The address of the user.
     * @param _fee The default fee. 
     * 
     * @return fee The membership fee for the specified user. 
     * 
     * */
    function getPremiumMembershipFeeOfUser(address _addr, uint256 _fee) public view returns(uint256 fee) {
        if(premiumMembershipDiscount[_addr] > 0) {
            return _fee * premiumMembershipDiscount[_addr] / 100;
        }
        return _fee;
    }



    /**
     * Allows the owner of the contract to set the contract address of the old multisender SC.
     * 
     * @param _addr The updated address.
     * */
    function setDeprecatedMultisenderAddress(address _addr) public onlyOwner {
        deprecatedMultisenderAddress = _addr;
    }


    /**
     * This function checks if a user address has a membership on the old SC.
     * 
     * @param _who The address of the user.
     * 
     * @return True if the user is a member on the old SC, false otherwise.
     * */
    function isMemberOfOldMultisender(address _who) public view returns(bool) {
        DeprecatedMultisenderSC oldMultisender = DeprecatedMultisenderSC(deprecatedMultisenderAddress);
        return oldMultisender.isPremiumMember(_who);
    }


    /**
     * Allows users to transfer their membership from the old SC to this SC. 
     * 
     * @return True if there is a membership to be transferred, false otherwise. 
     * */
    function transferMembership() public returns(bool) {
        require(isMemberOfOldMultisender(msg.sender), "No membership to transfer");
        membershipExpiryTime[msg.sender] = block.timestamp + (36500 * 1 days);
        return true;
    }
    

    /**
     * This function is invoked internally the functions for purchasing memberships.
     * 
     * @param _days The number of days that the membership will be valid for. 
     * @param _fee The fee that is to be paid. 
     * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
     * an affiliate code so the partner gets commission.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function assignMembership(uint256 _days, uint256 _fee, string memory _afCode) internal returns(bool success) {
        require(checkIsPremiumMember(msg.sender) != true, "Is already premiumMember member");
        uint256 fee = getPremiumMembershipFeeOfUser(msg.sender, _fee);
        require(
            msg.value >= fee,
            string(abi.encodePacked(
                "premiumMember fee is: ", uint2str(fee), ". Not enough funds sent. ", uint2str(msg.value)
            ))
        );
        membershipExpiryTime[msg.sender] = block.timestamp + (_days * 1 days);
        _afCode = processAffiliateCode(_afCode);
        giveChange(fee);
        distributeCommission(fee, _afCode);
        emit NewPremiumMembership(msg.sender);
        return true; 
    }

    /**
    * Allows users to become lifetime members.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeLifetimeMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(36500, lifetimeMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 1 day.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneDayMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(1, oneDayMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 7 days.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneWeekMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(7, sevenDayMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 1 month
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneMonthMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(31, oneMonthMembershipFee, _afCode);
        return true;
    }


    /**
     * Allows users to check whether or not a token is listed.
     * 
     * @param _tokenAddr The address of the token to query.
     * 
     * @return isListed True if the token is listed, false otherwise. 
     * */
    function checkIsListedToken(address _tokenAddr) public view returns(bool isListed) {
        return isListedToken[_tokenAddr] || isGrantedListedToken[_tokenAddr];
    }


    /**
     * Allows the owner of the contract to set a listing discount for a specified token.
     * 
     * @param _tokenAddr The address of the token that will receive the discount. 
     * @param _discount The discount that will be applied. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setTokenListingFeeDiscount(address _tokenAddr, uint256 _discount) public onlyOwner returns(bool success) {
        tokenListingFeeDiscount[_tokenAddr] = _discount;
        return true;
    }

    /**
     * Allows users to query the listing fee for a token. This is useful to verify that a discount has been set. 
     * 
     * @param _tokenAddr The address of the token. 
     * 
     * @return fee The listing fee for the token. 
     * */
    function getListingFeeForToken(address _tokenAddr) public view returns(uint256 fee) {
        if(tokenListingFeeDiscount[_tokenAddr] > 0) {
            return tokenListingFee * tokenListingFeeDiscount[_tokenAddr] / 100;
        }
        return tokenListingFee;
    }

    /**
     * Allows users to list a token of their choosing. 
     * 
     * @param _tokenAddr The address of the token that will be listed. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function purchaseTokenListing(address _tokenAddr, string memory _afCode) public payable returns(bool success) {
        require(!checkIsListedToken(_tokenAddr), "Token is already listed");
        _afCode = processAffiliateCode(_afCode);
        uint256 fee = getListingFeeForToken(_tokenAddr);
        require(msg.value >= fee, "Not enough funds sent for listing");
        isListedToken[_tokenAddr] = true;
        giveChange(fee);
        distributeCommission(fee, _afCode);
        return true;
    }

    /**
     * Allows the owner of the contract to revoke a granted token listing. 
     * 
     * @param _tokenAddr The address of the token that is being delisted. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function revokeGrantedTokenListing(address _tokenAddr) public onlyOwner returns(bool success) {
        require(checkIsListedToken(_tokenAddr), "Is not listed token");
        isGrantedListedToken[_tokenAddr] = false;
        return  true;
    }


    /**
     * Allows the owner of the contract to grant a token a free listing. 
     * 
     * @param _tokenAddr The address of the token being listed.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function grantTokenListing(address _tokenAddr) public onlyOwner returns(bool success){
        require(!checkIsListedToken(_tokenAddr), "Token is already listed");
        isGrantedListedToken[_tokenAddr] = true;
        return true;
    }

    /**
     * Allows the owner of the contract to modify the token listing fee. 
     * 
     * @param _newFee The new fee for token listings. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setTokenListingFee(uint256 _newFee) public onlyOwner returns(bool success){
        tokenListingFee = _newFee;
        return true;
    }
    
    /**
    * Allows the owner of this contract to add an affiliate partner.
    *
    * @param _addr The address of the new affiliate partner.
    * @param _code The affiliate code.
    * 
    * @return success True if the affiliate has been added successfully. False otherwise. 
    **/
    function addAffiliate(address _addr, string memory _code, uint256 _percentage) public onlyOwner returns(bool success) {
        require(!isAffiliate[_addr], "Address is already an affiliate.");
        require(_addr != address(0), "0x00 address not allowed");
        require(!affiliateCodeExists[_code], "Affiliate code already exists!");
        require(_percentage <= 100 && _percentage > 0, "Percentage must be > 0 && <= 100");
        affiliateCodeExists[_code] = true;
        isAffiliate[_addr] = true;
        affiliateCodeToAddr[_code] = _addr;
        affiliateCodeOfAddr[_addr] = _code;
        commissionPercentage[_code] = _percentage;
        emit NewAffiliatePartnership(_addr,_code);
        return true;
    }


    /**
     * Allows the owner of the contract to set a customised commission percentage for a given affiliate partner.
     * 
     * @param _addressOfAffiliate The wallet address of the affiliate partner.
     * @param _percentage The commission percentage the affiliate will receive.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function changeAffiliatePercentage(address _addressOfAffiliate, uint256 _percentage) public onlyOwner returns(bool success) { 
        require(isAffiliate[_addressOfAffiliate]);
        string storage affCode = affiliateCodeOfAddr[_addressOfAffiliate];
        commissionPercentage[affCode] = _percentage;
        return true;
    }

    /**
    * Allows the owner of this contract to remove an affiliate partner. 
    *
    * @param _addr The address of the affiliate partner.
    *
    * @return success True if affiliate partner is removed successfully. False otherwise. 
    **/
    function removeAffiliate(address _addr) public onlyOwner returns(bool success) {
        require(isAffiliate[_addr]);
        isAffiliate[_addr] = false;
        affiliateCodeToAddr[affiliateCodeOfAddr[_addr]] = address(0);
        emit AffiliatePartnershipRevoked(_addr, affiliateCodeOfAddr[_addr]);
        affiliateCodeOfAddr[_addr] = "No longer an affiliate partner";
        return true;
    }
    
    /**
     * Checks whether or not an ERC20 token has used its free trial of 100 drops. This is a constant 
     * function which does not alter the state of the contract and therefore does not require any gas 
     * or a signature to be executed. 
     * 
     * @param _addressOfToken The address of the token being queried.
     * 
     * @return hasFreeTrial true if the token being queried has not used its 100 first free trial drops, false
     * otherwise.
     * */
    function tokenHasFreeTrial(address _addressOfToken) public view returns(bool hasFreeTrial) {
        return tokenTrialDrops[_addressOfToken] < 100;
    }


    /**
     * Checks whether or not a user has a free trial. 
     * 
     * @param _addressOfUser The address of the user being queried.
     * 
     * @return hasFreeTrial true if the user address being queried has not used the first 100 free trial drops, false
     * otherwise.
     * */
    function userHasFreeTrial(address _addressOfUser) public view returns(bool hasFreeTrial) {
        return userTrialDrops[_addressOfUser] < 100;
    }
    
    /**
     * Checks how many remaining free trial drops a token has.
     * 
     * @param _addressOfToken the address of the token being queried.
     * 
     * @return remainingTrialDrops the total remaining free trial drops of a token.
     * */
    function getRemainingTokenTrialDrops(address _addressOfToken) public view returns(uint256 remainingTrialDrops) {
        if(tokenHasFreeTrial(_addressOfToken)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops - tokenTrialDrops[_addressOfToken];
        } 
        return 0;
    }

    /**
     * Checks how many remaining free trial drops a user has.
     * 
     * @param _addressOfUser the address of the user being queried.
     * 
     * @return remainingTrialDrops the total remaining free trial drops of a user.
     * */
    function getRemainingUserTrialDrops(address _addressOfUser) public view returns(uint256 remainingTrialDrops) {
        if(userHasFreeTrial(_addressOfUser)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops - userTrialDrops[_addressOfUser];
        }
        return 0;
    }
    
    /**
     * Allows for the price of drops to be changed by the owner of the contract. Any attempt made by 
     * any other account to invoke the function will result in a loss of gas and the price will remain 
     * untampered.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */
    function setRate(uint256 _newRate) public onlyOwner returns(bool success) {
        require(
            _newRate != rate 
            && _newRate > 0
        );
        emit RateChanged(rate, _newRate);
        rate = _newRate;
        uint256 eth = 1 ether;
        dropUnitPrice = eth / rate;
        return true;
    }
    
    /**
     * Allows for the allowance of a token from its owner to this contract to be queried. 
     * 
     * As part of the ERC20 standard all tokens which fall under this category have an allowance 
     * function which enables owners of tokens to allow (or give permission) to another address 
     * to spend tokens on behalf of the owner. This contract uses this as part of its protocol.
     * Users must first give permission to the contract to transfer tokens on their behalf, however,
     * this does not mean that the tokens will ever be transferrable without the permission of the 
     * owner. This is a security feature which was implemented on this contract. It is not possible
     * for the owner of this contract or anyone else to transfer the tokens which belong to others. 
     * 
     * @param _addr The address of the token's owner.
     * @param _addressOfToken The contract address of the ERC20 token.
     * 
     * @return allowance The ERC20 token allowance from token owner to this contract. 
     * */
    function getTokenAllowance(address _addr, address _addressOfToken) public view returns(uint256 allowance) {
        ERC20Interface token = ERC20Interface(_addressOfToken);
        return token.allowance(_addr, address(this));
    }
    
    fallback() external payable {
        revert();
    }

    receive() external payable {
        revert();
    }
    
    /**
    * Checks if two strings are the same.
    *
    * @param _a String 1
    * @param _b String 2
    *
    * @return areEqual True if both strings are the same. False otherwise. 
    **/
    function stringsAreEqual(string memory _a, string memory _b) internal pure returns(bool areEqual) {
        bytes32 hashA = keccak256(abi.encodePacked(_a));
        bytes32 hashB = keccak256(abi.encodePacked(_b));
        return hashA == hashB;
    }
    
    /**
     * Allows for the distribution of Ether to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _values The corresponding amounts that the recipients will receive 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */
    function airdropNativeCurrency(address[] memory _recipients, uint256[] memory _values, uint256 _totalToSend, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");
        uint256 totalEthValue = _totalToSend;
        uint256 price = _recipients.length * dropUnitPrice;
        uint256 totalCost = totalEthValue + price;
        bool userHasTrial = userHasFreeTrial(msg.sender);
        bool isVIP = checkIsPremiumMember(msg.sender) == true;
        require(
            msg.value >= totalCost || isVIP || userHasTrial, 
            "Not enough funds sent with transaction!"
        );
        _afCode = processAffiliateCode(_afCode);
        if(!isVIP && !userHasTrial) {
            distributeCommission(price, _afCode);
        }
        if((isVIP || userHasTrial) && msg.value > _totalToSend) {
            payable(msg.sender).transfer((msg.value) - _totalToSend);
        } else {
            giveChange(totalCost);
        }
        for(uint i = 0; i < _recipients.length; i++) {
            payable(_recipients[i]).transfer(_values[i]);
        }
        if(userHasTrial) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        emit EthAirdrop(msg.sender, _recipients.length, totalEthValue);
        return true;
    }

    /**
     * Allows for the distribution of an ERC20 token to be transferred to multiple recipients at 
     * a time. This function facilitates batch transfers of differing values (i.e., all recipients
     * can receive different amounts of tokens).
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _values The corresponding values of tokens which each address will receive.
     * @param _optimized Should only be enabled for tokens with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */    
    function erc20Airdrop(address _addressOfToken,  address[] memory _recipients, uint256[] memory _values, uint256 _totalToSend, bool _isDeflationary, bool _optimized, string memory _afCode) public payable returns(bool success) {
        string memory afCode = processAffiliateCode(_afCode);
        ERC20Interface token = ERC20Interface(_addressOfToken);
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfToken);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfToken) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || tokenHasFreeTrial(_addressOfToken) || userHasFreeTrial(msg.sender) || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }

        if(_optimized) {
            token.transferFrom(msg.sender, address(this), _totalToSend);
            token.gasOptimizedAirdrop(_recipients,_values);
        } else {
            if(!_isDeflationary) {
                token.transferFrom(msg.sender, address(this), _totalToSend);
                for(uint i = 0; i < _recipients.length; i++) {
                    token.transfer(_recipients[i], _values[i]);
                }
                if(token.balanceOf(address(this)) > 0) {
                    token.transfer(msg.sender,token.balanceOf(address(this)));
                }
            } else {
                for(uint i=0; i < _recipients.length; i++) {
                    token.transferFrom(msg.sender, _recipients[i], _values[i]);
                }
            }
        }

        if(tokenHasFreeTrial(_addressOfToken)) {
            tokenTrialDrops[_addressOfToken] = tokenTrialDrops[_addressOfToken] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit TokenAirdrop(msg.sender, _addressOfToken, _recipients.length);
        return true;
    }


    /**
     * Allows for the distribution of ERC721 tokens to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _addressOfNFT The contract address of an ERC721 token collection.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _tokenIds The corresponding IDs of the NFT collection which each address will receive.
     * @param _optimized Should only be enabled for ERC721 token collections with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */ 
    function erc721Airdrop(address _addressOfNFT, address[] memory _recipients, uint256[] memory _tokenIds, bool _optimized, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _tokenIds.length, "Total number of recipients and total number of NFT IDs are not the same");
        string memory afCode = processAffiliateCode(_afCode);
        ERC721Interface erc721 = ERC721Interface(_addressOfNFT);
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfNFT);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfNFT) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || eligibleForFreeTrial || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }
        if(_optimized){
            erc721.gasOptimizedAirdrop(msg.sender,_recipients,_tokenIds);
        } else {
            for(uint i = 0; i < _recipients.length; i++) {
                erc721.transferFrom(msg.sender, _recipients[i], _tokenIds[i]);
            }
        }
        if(tokenHasFreeTrial(_addressOfNFT)) {
            tokenTrialDrops[_addressOfNFT] = tokenTrialDrops[_addressOfNFT] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit NftAirdrop(msg.sender, _addressOfNFT, _recipients.length);
        return true;
    }

    /**
     * Allows for the distribution of ERC1155 tokens to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _addressOfNFT The contract address of an ERC1155 token contract.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _ids The corresponding IDs of the token collection which each address will receive.
     * @param _amounts The amount of tokens to send from each token type.
     * @param _optimized Should only be enabled for ERC721 token collections with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */ 
    function erc1155Airdrop(address _addressOfNFT, address[] memory _recipients, uint256[] memory _ids, uint256[] memory _amounts, bool _optimized, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _ids.length, "Total number of recipients and total number of NFT IDs are not the same");
        require(_recipients.length == _amounts.length, "Total number of recipients and total number of amounts are not the same");
        string memory afCode = processAffiliateCode(_afCode);
        ERC1155Interface erc1155 = ERC1155Interface(_addressOfNFT);
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfNFT);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfNFT) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || eligibleForFreeTrial || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }
        if(_optimized){
            erc1155.gasOptimizedAirdrop(msg.sender,_recipients,_ids,_amounts);
        } else {
            for(uint i = 0; i < _recipients.length; i++) {
                erc1155.safeTransferFrom(msg.sender, _recipients[i], _ids[i], _amounts[i], "");
            }
        }
        if(tokenHasFreeTrial(_addressOfNFT)) {
            tokenTrialDrops[_addressOfNFT] = tokenTrialDrops[_addressOfNFT] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit NftAirdrop(msg.sender, _addressOfNFT, _recipients.length);
        return true;
    }


    /**
    * Send the owner and affiliates commissions.
    **/
    function distributeCommission(uint256 _profits, string memory _afCode) internal {
        if(!stringsAreEqual(_afCode,"void") && isAffiliate[affiliateCodeToAddr[_afCode]]) {
            uint256 commission = _profits * commissionPercentage[_afCode] / 100;
            payable(owner).transfer(_profits - commission);
            payable(affiliateCodeToAddr[_afCode]).transfer(commission);
            emit CommissionPaid(affiliateCodeToAddr[_afCode], commission);
        } else {
            payable(owner).transfer(_profits);
        }
    }


    /**
     * Allows the owner of the contract to withdraw any funds that may reside on the contract address.
     * */
    function withdrawFunds() public onlyOwner returns(bool success) {
        payable(owner).transfer(address(this).balance);
        return true;
    }

    /**
     * Allows for any ERC20 tokens which have been mistakenly  sent to this contract to be returned 
     * to the original sender by the owner of the contract. Any attempt made by any other account 
     * to invoke the function will result in a loss of gas and no tokens will be transferred out.
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipient The address which will receive tokens. 
     * @param _value The amount of tokens to refund.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */  
    function withdrawERC20Tokens(address _addressOfToken,  address _recipient, uint256 _value) public onlyOwner returns(bool success){
        ERC20Interface token = ERC20Interface(_addressOfToken);
        token.transfer(_recipient, _value);
        emit ERC20TokensWithdrawn(_addressOfToken, _recipient, _value);
        return true;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affiliate","type":"address"},{"indexed":true,"internalType":"string","name":"affiliateCode","type":"string"}],"name":"AffiliatePartnershipRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"CommissionPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"sentTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethValue","type":"uint256"}],"name":"EthAirdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAffiliate","type":"address"},{"indexed":true,"internalType":"string","name":"affiliateCode","type":"string"}],"name":"NewAffiliatePartnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"premiumMember","type":"address"}],"name":"NewPremiumMembership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"}],"name":"NftAirdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to","type":"uint256"}],"name":"RateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalWei","type":"uint256"}],"name":"RefundIssued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"}],"name":"TokenAirdrop","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_code","type":"string"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"addAffiliate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"affiliateCodeExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliateCodeOfAddr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"affiliateCodeToAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256","name":"_totalToSend","type":"uint256"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"airdropNativeCurrency","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeLifetimeMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneDayMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneMonthMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneWeekMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfAffiliate","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"changeAffiliatePercentage","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"checkIsListedToken","outputs":[{"internalType":"bool","name":"isListed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"checkIsPremiumMember","outputs":[{"internalType":"bool","name":"isMember","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"commissionPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deprecatedMultisenderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dropUnitPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfNFT","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc1155Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256","name":"_totalToSend","type":"uint256"},{"internalType":"bool","name":"_isDeflationary","type":"bool"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc20Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfNFT","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc721Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getListingFeeForToken","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"getPremiumMembershipFeeOfUser","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getRemainingTokenTrialDrops","outputs":[{"internalType":"uint256","name":"remainingTrialDrops","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfUser","type":"address"}],"name":"getRemainingUserTrialDrops","outputs":[{"internalType":"uint256","name":"remainingTrialDrops","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getTokenAllowance","outputs":[{"internalType":"uint256","name":"allowance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"grantPremiumMembership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"grantTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAffiliate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAffiliatedWith","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGrantedListedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGrantedPremiumMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isListedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"isMemberOfOldMultisender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lifetimeMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"membershipExpiryTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneDayMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneMonthMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"premiumMembershipDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"purchaseTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeAffiliate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"revokeGrantedPremiumMembership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"revokeGrantedTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setDeprecatedMultisenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneDayFee","type":"uint256"},{"internalType":"uint256","name":"_sevenDayFee","type":"uint256"},{"internalType":"uint256","name":"_oneMonthFee","type":"uint256"},{"internalType":"uint256","name":"_lifetimeFee","type":"uint256"}],"name":"setMembershipFees","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setPremiumMembershipDiscount","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"setRate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setTokenListingFee","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setTokenListingFeeDiscount","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sevenDayMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"tokenHasFreeTrial","outputs":[{"internalType":"bool","name":"hasFreeTrial","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenListingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenListingFeeDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfUser","type":"address"}],"name":"userHasFreeTrial","outputs":[{"internalType":"bool","name":"hasFreeTrial","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdrawERC20Tokens","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600080546001600160a01b03199081163317909155610bb860145566012f2a36ecd555601555670c7d713b49da0000600f55671158e460913d0000601055671bc16d674ec800006011556722b1c8c1227a0000601255674563918244f40000601355601680549091167329cd4bd49b2c76f82a8be41b3921339fd7717ae8179055614287806100a16000396000f3fe60806040526004361061039b5760003560e01c80636dd77649116101dc578063ac5b2bbc11610102578063df3b0ad1116100a0578063f2fde38b1161006f578063f2fde38b14610af6578063f519983514610b16578063f86af85114610b43578063fec5c0c614610b5657600080fd5b8063df3b0ad114610a8a578063e24f6a9714610aa0578063e5a8ec5b14610ac0578063ea7ee01014610ad657600080fd5b8063bcdd1e13116100dc578063bcdd1e13146109fa578063be6630c814610a1a578063ceb10f0b14610a4a578063d34937db14610a6a57600080fd5b8063ac5b2bbc146109a4578063b1867685146109c4578063bb12db5c146109e457600080fd5b80638ad95cf11161017a57806398adf5771161014957806398adf57714610939578063a39a2b761461095b578063a7296ee914610971578063a7ced8e21461098457600080fd5b80638ad95cf1146108b95780638da5cb5b146108d95780638faea9a7146108f95780638ffd58ad1461091957600080fd5b806386a9a599116101b657806386a9a5991461082e578063893d20e81461084e578063896bac231461086c5780638a53a1301461088c57600080fd5b80636dd77649146107e657806375f1a95a146107f957806385fc0de71461081957600080fd5b806339cb9ba8116102c15780634a4a2feb1161025f578063590925e21161022e578063590925e214610728578063593d98b114610769578063638c5da9146107895780636cca7d3c146107b957600080fd5b80634a4a2feb146106a55780634a4df559146106d25780634fa85186146106e5578063583a23901461071557600080fd5b80633d2375f91161029b5780633d2375f91461060a578063428b52f81461064557806343a92b41146106725780634930df8f1461069257600080fd5b806339cb9ba8146105c15780633aaff47f146105d45780633b9ff843146105ea57600080fd5b80631e93a9f2116103395780632c4e722e116103085780632c4e722e146105405780632f5f1a341461055657806334fcf4371461058e5780633671caa0146105ae57600080fd5b80631e93a9f2146104d557806323a0fb02146104eb57806324600fc31461050b5780632a769eb41461052057600080fd5b80630e160255116103755780630e1602551461042d57806317077fb71461046557806319acc3671461048557806319d30a40146104b557600080fd5b806306d7d80f146103aa578063088ea102146103d25780630ad92c311461040d57600080fd5b366103a557600080fd5b600080fd5b6103bd6103b83660046136f3565b610b76565b60405190151581526020015b60405180910390f35b3480156103de57600080fd5b506103ff6103ed36600461373f565b60076020526000908152604090205481565b6040519081526020016103c9565b34801561041957600080fd5b506103bd61042836600461373f565b610b8f565b34801561043957600080fd5b506103ff6104483660046136f3565b8051602081830181018051600e8252928201919093012091525481565b34801561047157600080fd5b506103ff61048036600461373f565b610c40565b34801561049157600080fd5b506103bd6104a036600461373f565b60056020526000908152604090205460ff1681565b3480156104c157600080fd5b506103bd6104d036600461373f565b610c9e565b3480156104e157600080fd5b506103ff60135481565b3480156104f757600080fd5b506103bd61050636600461373f565b610cdf565b34801561051757600080fd5b506103bd610cfd565b34801561052c57600080fd5b506103ff61053b36600461375a565b610d6a565b34801561054c57600080fd5b506103ff60145481565b34801561056257600080fd5b50601654610576906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561059a57600080fd5b506103bd6105a9366004613784565b610dc5565b6103bd6105bc3660046138a7565b610e6b565b6103bd6105cf366004613974565b611272565b3480156105e057600080fd5b506103ff60125481565b3480156105f657600080fd5b506103bd61060536600461373f565b6115a2565b34801561061657600080fd5b506103bd6106253660046136f3565b8051602081830181018051600b8252928201919093012091525460ff1681565b34801561065157600080fd5b506103ff61066036600461373f565b60036020526000908152604090205481565b34801561067e57600080fd5b506103bd61068d36600461373f565b611703565b6103bd6106a03660046136f3565b61179e565b3480156106b157600080fd5b506106c56106c036600461373f565b6117ae565b6040516103c99190613a52565b6103bd6106e0366004613a85565b611848565b3480156106f157600080fd5b506103bd61070036600461373f565b60096020526000908152604090205460ff1681565b6103bd610723366004613b51565b611e8a565b34801561073457600080fd5b506105766107433660046136f3565b8051602081830181018051600a825292820191909301209152546001600160a01b031681565b34801561077557600080fd5b506103bd61078436600461373f565b6120b1565b34801561079557600080fd5b506103bd6107a436600461373f565b60066020526000908152604090205460ff1681565b3480156107c557600080fd5b506103ff6107d436600461373f565b60016020526000908152604090205481565b6103bd6107f43660046136f3565b6120cf565b34801561080557600080fd5b506103bd61081436600461375a565b6120df565b34801561082557600080fd5b506103bd612176565b34801561083a57600080fd5b506103bd61084936600461373f565b6121f1565b34801561085a57600080fd5b506000546001600160a01b0316610576565b34801561087857600080fd5b506103bd610887366004613be3565b612269565b34801561089857600080fd5b506103ff6108a736600461373f565b60026020526000908152604090205481565b3480156108c557600080fd5b506103bd6108d4366004613784565b6122da565b3480156108e557600080fd5b50600054610576906001600160a01b031681565b34801561090557600080fd5b506103bd61091436600461373f565b61230e565b34801561092557600080fd5b506103ff61093436600461373f565b61234f565b34801561094557600080fd5b5061095961095436600461373f565b61238d565b005b34801561096757600080fd5b506103ff60155481565b6103bd61097f3660046136f3565b6123d9565b34801561099057600080fd5b506103bd61099f36600461375a565b6123ea565b3480156109b057600080fd5b506103ff6109bf36600461373f565b612436565b3480156109d057600080fd5b506106c56109df36600461373f565b61246c565b3480156109f057600080fd5b506103ff60105481565b348015610a0657600080fd5b506103bd610a15366004613c15565b612485565b348015610a2657600080fd5b506103bd610a3536600461373f565b60086020526000908152604090205460ff1681565b348015610a5657600080fd5b506103bd610a6536600461375a565b61256c565b348015610a7657600080fd5b506103bd610a8536600461373f565b6125b8565b348015610a9657600080fd5b506103ff60115481565b348015610aac57600080fd5b506103bd610abb366004613c51565b612670565b348015610acc57600080fd5b506103ff600f5481565b348015610ae257600080fd5b506103ff610af1366004613ca8565b612947565b348015610b0257600080fd5b50610959610b1136600461373f565b6129c4565b348015610b2257600080fd5b506103ff610b3136600461373f565b60046020526000908152604090205481565b6103bd610b51366004613cdb565b612a78565b348015610b6257600080fd5b506103bd610b7136600461373f565b612b7c565b6000610b86601f60115484612c52565b50600192915050565b600080546001600160a01b03163314610bc35760405162461bcd60e51b8152600401610bba90613d29565b60405180910390fd5b610bcc8261230e565b15610c135760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b506001600160a01b0381166000908152600860205260409020805460ff191660019081179091555b919050565b6001600160a01b03811660009081526007602052604081205415610c96576001600160a01b038216600090815260076020526040902054601354606491610c8691613d87565b610c909190613da6565b92915050565b505060135490565b6001600160a01b03811660009081526004602052604081205442111580610c905750506001600160a01b031660009081526005602052604090205460ff1690565b6001600160a01b031660009081526001602052604090205460641190565b600080546001600160a01b03163314610d285760405162461bcd60e51b8152600401610bba90613d29565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d62573d6000803e3d6000fd5b506001905090565b6001600160a01b03821660009081526003602052604081205415610dbf576001600160a01b038316600090815260036020526040902054606490610dae9084613d87565b610db89190613da6565b9050610c90565b50919050565b600080546001600160a01b03163314610df05760405162461bcd60e51b8152600401610bba90613d29565b6014548214158015610e025750600082115b610e0b57600080fd5b60145460408051918252602082018490527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f7186910160405180910390a16014829055670de0b6b3a7640000610e5f8382613da6565b60155550600192915050565b60008451865114610e8e5760405162461bcd60e51b8152600401610bba90613dc8565b8351865114610f155760405162461bcd60e51b815260206004820152604760248201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460448201527f6f74616c206e756d626572206f6620616d6f756e747320617265206e6f74207460648201526668652073616d6560c81b608482015260a401610bba565b6000610f2083612d8c565b60155488519192508991600091610f3691613d87565b90506000610f4333610c9e565b80610f525750610f528b61230e565b90506000610f5f8c610cdf565b8015610f6f5750610f6f336120b1565b90508234101580610f7d5750805b80610f855750815b610fa15760405162461bcd60e51b8152600401610bba90613e35565b8080610faa5750815b8015610fb65750600034115b15610fed5760405133903480156108fc02916000818181858888f19350505050158015610fe7573d6000803e3d6000fd5b50610ff6565b610ff6836131f8565b8715611065576040516322e31d0560e11b81526001600160a01b038516906345c63a0a9061102e9033908f908f908f90600401613ef0565b600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050611161565b60005b8b5181101561115f57846001600160a01b031663f242432a338e848151811061109357611093613f45565b60200260200101518e85815181106110ad576110ad613f45565b60200260200101518e86815181106110c7576110c7613f45565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b50505050808061115790613f5b565b915050611068565b505b61116a8c610cdf565b156111ae578a516001600160a01b038d166000908152600160205260409020546111949190613f74565b6001600160a01b038d166000908152600160205260409020555b6111b7336120b1565b156111e9578a51336000908152600260205260409020546111d89190613f74565b336000908152600260205260409020555b801580156111f5575081155b15611212576112126015548c5161120c9190613d87565b86613242565b8b6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768d5160405161125891815260200190565b60405180910390a35060019b9a5050505050505050505050565b600083518551146112955760405162461bcd60e51b8152600401610bba90613dc8565b60006112a083612d8c565b601554875191925088916000916112b691613d87565b905060006112c333610c9e565b806112d257506112d28a61230e565b905060006112df8b610cdf565b80156112ef57506112ef336120b1565b905082341015806112fd5750805b806113055750815b6113215760405162461bcd60e51b8152600401610bba90613e35565b808061132a5750815b80156113365750600034115b1561136d5760405133903480156108fc02916000818181858888f19350505050158015611367573d6000803e3d6000fd5b50611376565b611376836131f8565b87156113e3576040516304b1cddf60e31b81526001600160a01b0385169063258e6ef8906113ac9033908e908e90600401613f8c565b600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050611498565b60005b8a5181101561149657846001600160a01b03166323b872dd338d848151811061141157611411613f45565b60200260200101518d858151811061142b5761142b613f45565b60200260200101516040518463ffffffff1660e01b815260040161145193929190613fcc565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050808061148e90613f5b565b9150506113e6565b505b6114a18b610cdf565b156114e55789516001600160a01b038c166000908152600160205260409020546114cb9190613f74565b6001600160a01b038c166000908152600160205260409020555b6114ee336120b1565b156115205789513360009081526002602052604090205461150f9190613f74565b336000908152600260205260409020555b8015801561152c575081155b15611543576115436015548b5161120c9190613d87565b8a6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768c5160405161158991815260200190565b60405180910390a35060019a9950505050505050505050565b600080546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526009602052604090205460ff166115f257600080fd5b6001600160a01b0382166000908152600960209081526040808320805460ff19169055600c9091528082209051600a9161162b916140bc565b908152604080516020928190038301812080546001600160a01b0319166001600160a01b039586161790559285166000908152600c909252902061166e916140bc565b604051908190038120906001600160a01b038416907f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b0386166000908152600c909152929092209051610b8692906135ac565b600080546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bba90613d29565b6117378261230e565b6117795760405162461bcd60e51b815260206004820152601360248201527224b9903737ba103634b9ba32b2103a37b5b2b760691b6044820152606401610bba565b506001600160a01b03166000908152600860205260409020805460ff19169055600190565b6000610b86600760105484612c52565b600c60205260009081526040902080546117c790613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390613ff0565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b505050505081565b60008061185483612d8c565b875189519192508a911461187a5760405162461bcd60e51b8152600401610bba906140c8565b60006015548a5161188b9190613d87565b9050600061189833610c9e565b806118a757506118a78c61230e565b905060006118b48d610cdf565b80156118c457506118c4336120b1565b905082341015806118d957506118d98d610cdf565b806118e857506118e8336120b1565b806118f05750815b61190c5760405162461bcd60e51b8152600401610bba90613e35565b80806119155750815b80156119215750600034115b156119585760405133903480156108fc02916000818181858888f19350505050158015611952573d6000803e3d6000fd5b50611961565b611961836131f8565b8715611a2e576040516323b872dd60e01b81526001600160a01b038516906323b872dd9061199790339030908f90600401613fcc565b600060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b5050604051633ae4b60360e21b81526001600160a01b038716925063eb92d80c91506119f7908f908f9060040161411b565b600060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b50505050611d7e565b88611cc9576040516323b872dd60e01b81526001600160a01b038516906323b872dd90611a6390339030908f90600401613fcc565b600060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b5050505060005b8c51811015611b6b57846001600160a01b031663a9059cbb8e8381518110611ac257611ac2613f45565b60200260200101518e8481518110611adc57611adc613f45565b60200260200101516040518363ffffffff1660e01b8152600401611b159291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190614149565b5080611b6381613f5b565b915050611a98565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a08231906024016020604051808303816000875af1158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614166565b1115611cc4576040516370a0823160e01b81523060048201526001600160a01b0385169063a9059cbb90339083906370a08231906024016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614166565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614149565b505b611d7e565b60005b8c51811015611d7c57846001600160a01b03166323b872dd338f8481518110611cf757611cf7613f45565b60200260200101518f8581518110611d1157611d11613f45565b60200260200101516040518463ffffffff1660e01b8152600401611d3793929190613fcc565b600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050508080611d7490613f5b565b915050611ccc565b505b611d878d610cdf565b15611dcb578b516001600160a01b038e16600090815260016020526040902054611db19190613f74565b6001600160a01b038e166000908152600160205260409020555b611dd4336120b1565b15611e06578b5133600090815260026020526040902054611df59190613f74565b336000908152600260205260409020555b80158015611e12575081155b15611e2957611e296015548d5161120c9190613d87565b8c6001600160a01b0316336001600160a01b03167f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af8e51604051611e6f91815260200190565b60405180910390a35060019c9b505050505050505050505050565b60008351855114611ead5760405162461bcd60e51b8152600401610bba906140c8565b60155485518491600091611ec19190613d87565b90506000611ecf8284613f74565b90506000611edc336120b1565b90506000611ee933610c9e565b1515600115151490508234101580611efe5750805b80611f065750815b611f225760405162461bcd60e51b8152600401610bba90613e35565b611f2b87612d8c565b965080158015611f39575081155b15611f4857611f488488613242565b8080611f515750815b8015611f5c57508734115b15611f9d57336108fc611f6f8a3461417f565b6040518115909202916000818181858888f19350505050158015611f97573d6000803e3d6000fd5b50611fa6565b611fa6836131f8565b60005b8a51811015612030578a8181518110611fc457611fc4613f45565b60200260200101516001600160a01b03166108fc8b8381518110611fea57611fea613f45565b60200260200101519081150290604051600060405180830381858888f1935050505015801561201d573d6000803e3d6000fd5b508061202881613f5b565b915050611fa9565b508115612064578951336000908152600260205260409020546120539190613f74565b336000908152600260205260409020555b8951604080519182526020820187905233917f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a910160405180910390a25060019998505050505050505050565b6001600160a01b031660009081526002602052604090205460641190565b6000610b866001600f5484612c52565b600080546001600160a01b0316331461210a5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03831660009081526009602052604090205460ff1661212f57600080fd5b6001600160a01b0383166000908152600c60205260409081902090518390600e9061215b9084906140bc565b90815260405190819003602001902055506001905092915050565b6000612181336121f1565b6121cd5760405162461bcd60e51b815260206004820152601960248201527f4e6f206d656d6265727368697020746f207472616e73666572000000000000006044820152606401610bba565b6121db4263bbf81e00613f74565b3360009081526004602052604090205550600190565b601654604051633a28175360e21b81526001600160a01b0383811660048301526000921690819063e8a05d4c90602401602060405180830381865afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190614149565b9392505050565b600080546001600160a01b031633146122945760405162461bcd60e51b8152600401610bba90613d29565b6000851180156122a357508385105b80156122ae57508284105b80156122b957508183105b6122c257600080fd5b50600f93909355601091909155601155601255600190565b600080546001600160a01b031633146123055760405162461bcd60e51b8152600401610bba90613d29565b50601355600190565b6001600160a01b03811660009081526006602052604081205460ff1680610c905750506001600160a01b031660009081526008602052604090205460ff1690565b600061235a82610cdf565b15612385576001600160a01b038216600090815260016020526040902054606490612262908261417f565b506000919050565b6000546001600160a01b031633146123b75760405162461bcd60e51b8152600401610bba90613d29565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b86618e9460125484612c52565b600080546001600160a01b031633146124155760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260076020526040902055600190565b6000612441826120b1565b15612385576001600160a01b038216600090815260026020526040902054606490612262908261417f565b600d60205260009081526040902080546117c790613ff0565b600080546001600160a01b031633146124b05760405162461bcd60e51b8152600401610bba90613d29565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb906044016020604051808303816000875af1158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614149565b507ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d85858560405161255993929190613fcc565b60405180910390a1506001949350505050565b600080546001600160a01b031633146125975760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260036020526040902055600190565b600080546001600160a01b031633146125e35760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526005602052604090205460ff1661264b5760405162461bcd60e51b815260206004820152601860248201527f4e6f742061206772616e746564206d656d6265727368697000000000000000006044820152606401610bba565b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b600080546001600160a01b0316331461269b5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03841660009081526009602052604090205460ff16156127045760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e6044820152606401610bba565b6001600160a01b03841661275a5760405162461bcd60e51b815260206004820152601860248201527f307830302061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610bba565b600b8360405161276a9190614196565b9081526040519081900360200190205460ff16156127ca5760405162461bcd60e51b815260206004820152601e60248201527f416666696c6961746520636f646520616c7265616479206578697374732100006044820152606401610bba565b606482111580156127db5750600082115b6128275760405162461bcd60e51b815260206004820181905260248201527f50657263656e74616765206d757374206265203e2030202626203c3d203130306044820152606401610bba565b6001600b846040516128399190614196565b908152604080519182900360209081018320805494151560ff199586161790556001600160a01b038816600090815260099091522080549092166001179091558490600a90612889908690614196565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559186166000908152600c82529190912084516128d2928601906135ac565b5081600e846040516128e49190614196565b90815260405190819003602001812091909155612902908490614196565b604051908190038120906001600160a01b038616907ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060019392505050565b604051636eb1769f60e11b81526001600160a01b038381166004830152306024830152600091839182169063dd62ed3e90604401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190614166565b949350505050565b6000546001600160a01b031633146129ee5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03811615801590612a1457506000546001600160a01b03828116911614155b612a1d57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612a838361230e565b15612aca5760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b612ad382612d8c565b91506000612ae084610c40565b905080341015612b3c5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682066756e64732073656e7420666f72206c697374696e6044820152606760f81b6064820152608401610bba565b6001600160a01b0384166000908152600660205260409020805460ff19166001179055612b68816131f8565b612b728184613242565b5060019392505050565b600080546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610bba90613d29565b612bb082610c9e565b1515600103612c015760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6001600160a01b038216600081815260056020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b6000612c5d33610c9e565b1515600103612cae5760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6000612cba3385610d6a565b905080341015612cc98261341d565b612cd23461341d565b604051602001612ce39291906141b2565b60405160208183030381529060405290612d105760405162461bcd60e51b8152600401610bba9190613a52565b50612d1e8562015180613d87565b612d289042613f74565b33600090815260046020526040902055612d4183612d8c565b9250612d4c816131f8565b612d568184613242565b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001949350505050565b336000908152600d602052604090208054606091612e4d91612dad90613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd990613ff0565b8015612e265780601f10612dfb57610100808354040283529160200191612e26565b820191906000526020600020905b815481529060010190602001808311612e0957829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b815250613549565b80612e95575060096000600a84604051612e679190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff16155b15612ef45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d909152929092209051612ed292906135ac565b50506040805180820190915260048152631d9bda5960e21b6020820152919050565b612f0d8260405180602001604052806000815250613549565b158015612fc75750336000908152600d602052604090208054612fc79190612f3490613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6090613ff0565b8015612fad5780601f10612f8257610100808354040283529160200191612fad565b820191906000526020600020905b815481529060010190602001808311612f9057829003601f168201915b505050505060405180602001604052806000815250613549565b8015612ff25750600b82604051612fde9190614196565b9081526040519081900360200190205460ff165b1561307157336001600160a01b0316600a836040516130119190614196565b908152604051908190036020019020546001600160a01b03160361304f5750506040805180820190915260048152631d9bda5960e21b602082015290565b336000908152600d60209081526040909120835161306f928501906135ac565b505b61308a8260405180602001604052806000815250613549565b80156130b25750336000908152600d6020526040902080546130b09190612f3490613ff0565b155b1561315257336000908152600d6020526040902080546130d190613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546130fd90613ff0565b801561314a5780601f1061311f5761010080835404028352916020019161314a565b820191906000526020600020905b81548152906001019060200180831161312d57829003601f168201915b505050505091505b61316b8260405180602001604052806000815250613549565b806131965750600b826040516131819190614196565b9081526040519081900360200190205460ff16155b156131f45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d9091529290922090516131d392906135ac565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b8034111561323f57600061320c823461417f565b604051909150339082156108fc029083906000818181858888f1935050505015801561323c573d6000803e3d6000fd5b50505b50565b61326881604051806040016040528060048152602001631d9bda5960e21b815250613549565b1580156132b1575060096000600a836040516132849190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff165b156133e45760006064600e836040516132ca9190614196565b908152602001604051809103902054846132e49190613d87565b6132ee9190613da6565b6000549091506001600160a01b03166108fc61330a838661417f565b6040518115909202916000818181858888f19350505050158015613332573d6000803e3d6000fd5b50600a826040516133439190614196565b908152604051908190036020018120546001600160a01b03169082156108fc029083906000818181858888f19350505050158015613385573d6000803e3d6000fd5b50600a826040516133969190614196565b90815260405160209181900382018120548382526001600160a01b0316917f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a910160405180910390a2505050565b600080546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561323c573d6000803e3d6000fd5b6060816000036134445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561346e578061345881613f5b565b91506134679050600a83613da6565b9150613448565b60008167ffffffffffffffff8111156134895761348961363c565b6040519080825280601f01601f1916602001820160405280156134b3576020820181803683370190505b509050815b8515613540576134c960018261417f565b905060006134d8600a88613da6565b6134e390600a613d87565b6134ed908861417f565b6134f890603061422c565b905060008160f81b90508084848151811061351557613515613f45565b60200101906001600160f81b031916908160001a905350613537600a89613da6565b975050506134b8565b50949350505050565b6000808360405160200161355d9190614196565b6040516020818303038152906040528051906020012090506000836040516020016135889190614196565b60408051601f19818403018152919052805160209091012091909114949350505050565b8280546135b890613ff0565b90600052602060002090601f0160209004810192826135da5760008555613620565b82601f106135f357805160ff1916838001178555613620565b82800160010185558215613620579182015b82811115613620578251825591602001919060010190613605565b506131f49291505b808211156131f45760008155600101613628565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561367b5761367b61363c565b604052919050565b600082601f83011261369457600080fd5b813567ffffffffffffffff8111156136ae576136ae61363c565b6136c1601f8201601f1916602001613652565b8181528460208386010111156136d657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561370557600080fd5b813567ffffffffffffffff81111561371c57600080fd5b6129bc84828501613683565b80356001600160a01b0381168114610c3b57600080fd5b60006020828403121561375157600080fd5b61226282613728565b6000806040838503121561376d57600080fd5b61377683613728565b946020939093013593505050565b60006020828403121561379657600080fd5b5035919050565b600067ffffffffffffffff8211156137b7576137b761363c565b5060051b60200190565b600082601f8301126137d257600080fd5b813560206137e76137e28361379d565b613652565b82815260059290921b8401810191818101908684111561380657600080fd5b8286015b848110156138285761381b81613728565b835291830191830161380a565b509695505050505050565b600082601f83011261384457600080fd5b813560206138546137e28361379d565b82815260059290921b8401810191818101908684111561387357600080fd5b8286015b848110156138285780358352918301918301613877565b801515811461323f57600080fd5b8035610c3b8161388e565b60008060008060008060c087890312156138c057600080fd5b6138c987613728565b9550602087013567ffffffffffffffff808211156138e657600080fd5b6138f28a838b016137c1565b9650604089013591508082111561390857600080fd5b6139148a838b01613833565b9550606089013591508082111561392a57600080fd5b6139368a838b01613833565b945061394460808a0161389c565b935060a089013591508082111561395a57600080fd5b5061396789828a01613683565b9150509295509295509295565b600080600080600060a0868803121561398c57600080fd5b61399586613728565b9450602086013567ffffffffffffffff808211156139b257600080fd5b6139be89838a016137c1565b955060408801359150808211156139d457600080fd5b6139e089838a01613833565b9450606088013591506139f28261388e565b90925060808701359080821115613a0857600080fd5b50613a1588828901613683565b9150509295509295909350565b60005b83811015613a3d578181015183820152602001613a25565b83811115613a4c576000848401525b50505050565b6020815260008251806020840152613a71816040850160208701613a22565b601f01601f19169190910160400192915050565b600080600080600080600060e0888a031215613aa057600080fd5b613aa988613728565b9650602088013567ffffffffffffffff80821115613ac657600080fd5b613ad28b838c016137c1565b975060408a0135915080821115613ae857600080fd5b613af48b838c01613833565b965060608a0135955060808a01359150613b0d8261388e565b90935060a089013590613b1f8261388e565b90925060c08901359080821115613b3557600080fd5b50613b428a828b01613683565b91505092959891949750929550565b60008060008060808587031215613b6757600080fd5b843567ffffffffffffffff80821115613b7f57600080fd5b613b8b888389016137c1565b95506020870135915080821115613ba157600080fd5b613bad88838901613833565b9450604087013593506060870135915080821115613bca57600080fd5b50613bd787828801613683565b91505092959194509250565b60008060008060808587031215613bf957600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613c2a57600080fd5b613c3384613728565b9250613c4160208501613728565b9150604084013590509250925092565b600080600060608486031215613c6657600080fd5b613c6f84613728565b9250602084013567ffffffffffffffff811115613c8b57600080fd5b613c9786828701613683565b925050604084013590509250925092565b60008060408385031215613cbb57600080fd5b613cc483613728565b9150613cd260208401613728565b90509250929050565b60008060408385031215613cee57600080fd5b613cf783613728565b9150602083013567ffffffffffffffff811115613d1357600080fd5b613d1f85828601613683565b9150509250929050565b60208082526028908201527f46756e6374696f6e207265737472696374656420746f206f776e6572206f662060408201526718dbdb9d1c9858dd60c21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613da157613da1613d71565b500290565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526047908201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460408201527f6f74616c206e756d626572206f66204e46542049447320617265206e6f74207460608201526668652073616d6560c81b608082015260a00190565b60208082526027908201527f4e6f7420656e6f7567682066756e64732073656e742077697468207472616e73604082015266616374696f6e2160c81b606082015260800190565b600081518084526020808501945080840160005b83811015613eb55781516001600160a01b031687529582019590820190600101613e90565b509495945050505050565b600081518084526020808501945080840160005b83811015613eb557815187529582019590820190600101613ed4565b6001600160a01b0385168152608060208201819052600090613f1490830186613e7c565b8281036040840152613f268186613ec0565b90508281036060840152613f3a8185613ec0565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613f6d57613f6d613d71565b5060010190565b60008219821115613f8757613f87613d71565b500190565b6001600160a01b0384168152606060208201819052600090613fb090830185613e7c565b8281036040840152613fc28185613ec0565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600181811c9082168061400457607f821691505b602082108103610dbf57634e487b7160e01b600052602260045260246000fd5b8054600090600181811c908083168061403e57607f831692505b6020808410820361405f57634e487b7160e01b600052602260045260246000fd5b8180156140735760018114614084576140b0565b60ff198616895284890196506140b0565b876000528160002060005b868110156140a85781548b82015290850190830161408f565b505084890196505b50505050505092915050565b60006122628284614024565b60208082526033908201527f546f74616c206e756d626572206f6620726563697069656e747320616e642076604082015272185b1d595cc8185c99481b9bdd08195c5d585b606a1b606082015260800190565b60408152600061412e6040830185613e7c565b82810360208401526141408185613ec0565b95945050505050565b60006020828403121561415b57600080fd5b81516122628161388e565b60006020828403121561417857600080fd5b5051919050565b60008282101561419157614191613d71565b500390565b600082516141a8818460208701613a22565b9190910192915050565b750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b8152600083516141e3816016850160208801613a22565b7f2e204e6f7420656e6f7567682066756e64732073656e742e2000000000000000601691840191820152835161422081602f840160208801613a22565b01602f01949350505050565b600060ff821660ff84168060ff0382111561424957614249613d71565b01939250505056fea26469706673582212202ff4d9085bf5c12b56bbf76cbc7e8fd730c2c5978e2ae0f5b93e748506383ef964736f6c634300080d0033

Deployed ByteCode Sourcemap

3411:37217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;27326:8;;;3411:37217;27264:8;;;16446:183;;;;;;:::i;:::-;;:::i;:::-;;;1454:14:1;;1447:22;1429:41;;1417:2;1402:18;16446:183:0;;;;;;;;3826:59;;;;;;;;;;-1:-1:-1;3826:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1996:25:1;;;1984:2;1969:18;3826:59:0;1850:177:1;19857:243:0;;;;;;;;;;-1:-1:-1;19857:243:0;;;;;:::i;:::-;;:::i;4245:55::-;;;;;;;;;;-1:-1:-1;4245:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;17876:272;;;;;;;;;;-1:-1:-1;17876:272:0;;;;;:::i;:::-;;:::i;3709:55::-;;;;;;;;;;-1:-1:-1;3709:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9585:185;;;;;;;;;;-1:-1:-1;9585:185:0;;;;;:::i;:::-;;:::i;4479:30::-;;;;;;;;;;;;;;;;23463:155;;;;;;;;;;-1:-1:-1;23463:155:0;;;;;:::i;:::-;;:::i;39509:151::-;;;;;;;;;;;;;:::i;11786:261::-;;;;;;;;;;-1:-1:-1;11786:261:0;;;;;:::i;:::-;;:::i;4516:19::-;;;;;;;;;;;;;;;;4577:43;;;;;;;;;;-1:-1:-1;4577:43:0;;;;-1:-1:-1;;;;;4577:43:0;;;;;;-1:-1:-1;;;;;2455:32:1;;;2437:51;;2425:2;2410:18;4577:43:0;2291:203:1;25581:332:0;;;;;;;;;;-1:-1:-1;25581:332:0;;;;;:::i;:::-;;:::i;36666:2081::-;;;;;;:::i;:::-;;:::i;33922:1906::-;;;;;;:::i;:::-;;:::i;4436:36::-;;;;;;;;;;;;;;;;22559:405;;;;;;;;;;-1:-1:-1;22559:405:0;;;;;:::i;:::-;;:::i;4068:51::-;;;;;;;;;;-1:-1:-1;4068:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3576:61;;;;;;;;;;-1:-1:-1;3576:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;19339:249;;;;;;;;;;-1:-1:-1;19339:249:0;;;;;:::i;:::-;;:::i;15931:181::-;;;;;;:::i;:::-;;:::i;4126:54::-;;;;;;;;;;-1:-1:-1;4126:54:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30639:2515::-;;;;;;:::i;:::-;;:::i;3956:44::-;;;;;;;;;;-1:-1:-1;3956:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28351:1424;;;;;;:::i;:::-;;:::i;4007:54::-;;;;;;;;;;-1:-1:-1;4007:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4007:54:0;;;23929:151;;;;;;;;;;-1:-1:-1;23929:151:0;;;;;:::i;:::-;;:::i;3773:46::-;;;;;;;;;;-1:-1:-1;3773:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3459:51;;;;;;;;;;-1:-1:-1;3459:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;15419:178;;;;;;:::i;:::-;;:::i;21958:337::-;;;;;;;;;;-1:-1:-1;21958:337:0;;;;;:::i;:::-;;:::i;13045:246::-;;;;;;;;;;;;;:::i;12603:241::-;;;;;;;;;;-1:-1:-1;12603:241:0;;;;;:::i;:::-;;:::i;335:80::-;;;;;;;;;;-1:-1:-1;375:7:0;402:5;-1:-1:-1;;;;;402:5:0;335:80;;6248:483;;;;;;;;;;-1:-1:-1;6248:483:0;;;;;:::i;:::-;;:::i;3517:50::-;;;;;;;;;;-1:-1:-1;3517:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;20358:149;;;;;;;;;;-1:-1:-1;20358:149:0;;;;;:::i;:::-;;:::i;60:20::-;;;;;;;;;;-1:-1:-1;60:20:0;;;;-1:-1:-1;;;;;60:20:0;;;16874:170;;;;;;;;;;-1:-1:-1;16874:170:0;;;;;:::i;:::-;;:::i;24350:313::-;;;;;;;;;;-1:-1:-1;24350:313:0;;;;;:::i;:::-;;:::i;12226:128::-;;;;;;;;;;-1:-1:-1;12226:128:0;;;;;:::i;:::-;;:::i;:::-;;4542:28;;;;;;;;;;;;;;;;14900:186;;;;;;:::i;:::-;;:::i;17408:202::-;;;;;;;;;;-1:-1:-1;17408:202:0;;;;;:::i;:::-;;:::i;24925:306::-;;;;;;;;;;-1:-1:-1;24925:306:0;;;;;:::i;:::-;;:::i;4187:51::-;;;;;;;;;;-1:-1:-1;4187:51:0;;;;;:::i;:::-;;:::i;4350:36::-;;;;;;;;;;;;;;;;40281:342;;;;;;;;;;-1:-1:-1;40281:342:0;;;;;:::i;:::-;;:::i;3894:53::-;;;;;;;;;;-1:-1:-1;3894:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11219:196;;;;;;;;;;-1:-1:-1;11219:196:0;;;;;:::i;:::-;;:::i;10642:249::-;;;;;;;;;;-1:-1:-1;10642:249:0;;;;;:::i;:::-;;:::i;4393:36::-;;;;;;;;;;;;;;;;20816:738;;;;;;;;;;-1:-1:-1;20816:738:0;;;;;:::i;:::-;;:::i;4309:34::-;;;;;;;;;;;;;;;;26979:234;;;;;;;;;;-1:-1:-1;26979:234:0;;;;;:::i;:::-;;:::i;1033:256::-;;;;;;;;;;-1:-1:-1;1033:256:0;;;;;:::i;:::-;;:::i;3644:56::-;;;;;;;;;;-1:-1:-1;3644:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;18546:513;;;;;;:::i;:::-;;:::i;10069:297::-;;;;;;;;;;-1:-1:-1;10069:297:0;;;;;:::i;:::-;;:::i;16446:183::-;16522:12;16547:52;16564:2;16568:21;;16591:7;16547:16;:52::i;:::-;-1:-1:-1;16617:4:0;;16446:183;-1:-1:-1;;16446:183:0:o;19857:243::-;19929:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;;;;;;;;;19962:30:::1;19981:10;19962:18;:30::i;:::-;19961:31;19953:67;;;::::0;-1:-1:-1;;;19953:67:0;;11843:2:1;19953:67:0::1;::::0;::::1;11825:21:1::0;11882:2;11862:18;;;11855:30;-1:-1:-1;;;11901:18:1;;;11894:53;11964:18;;19953:67:0::1;11641:347:1::0;19953:67:0::1;-1:-1:-1::0;;;;;;20031:32:0;::::1;;::::0;;;:20:::1;:32;::::0;;;;:39;;-1:-1:-1;;20031:39:0::1;20066:4;20031:39:::0;;::::1;::::0;;;855:1:::1;19857:243:::0;;;:::o;17876:272::-;-1:-1:-1;;;;;17974:35:0;;17947:11;17974:35;;;:23;:35;;;;;;:39;17971:137;;-1:-1:-1;;;;;18055:35:0;;;;;;:23;:35;;;;;;18037:15;;18093:3;;18037:53;;;:::i;:::-;:59;;;;:::i;:::-;18030:66;17876:272;-1:-1:-1;;17876:272:0:o;17971:137::-;-1:-1:-1;;18125:15:0;;;17876:272::o;9585:185::-;-1:-1:-1;;;;;9683:27:0;;9650:13;9683:27;;;:20;:27;;;;;;9714:15;-1:-1:-1;9683:46:0;;:79;;-1:-1:-1;;;;;;;9733:29:0;;;;;:22;:29;;;;;;;;;9585:185::o;23463:155::-;-1:-1:-1;;;;;23572:32:0;23535:17;23572:32;;;:15;:32;;;;;;23607:3;-1:-1:-1;23572:38:0;23463:155::o;39509:151::-;39559:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;39592:5:::1;::::0;;39584:46:::1;::::0;-1:-1:-1;;;;;39592:5:0;;::::1;::::0;39608:21:::1;39584:46:::0;::::1;;;::::0;39608:21;;39584:46;39592:5;39584:46;39608:21;39592:5;39584:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;39648:4;39641:11;;39509:151:::0;:::o;11786:261::-;-1:-1:-1;;;;;11901:32:0;;11874:11;11901:32;;;:25;:32;;;;;;:36;11898:120;;-1:-1:-1;;;;;11968:32:0;;;;;;:25;:32;;;;;;12003:3;;11961:39;;:4;:39;:::i;:::-;:45;;;;:::i;:::-;11954:52;;;;11898:120;-1:-1:-1;12035:4:0;11786:261;-1:-1:-1;11786:261:0:o;25581:332::-;25641:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;25700:4:::1;;25688:8;:16;;:46;;;;;25733:1;25722:8;:12;25688:46;25666:79;;;::::0;::::1;;25773:4;::::0;25761:27:::1;::::0;;12694:25:1;;;12750:2;12735:18;;12728:34;;;25761:27:0::1;::::0;12667:18:1;25761:27:0::1;;;;;;;25799:4;:15:::0;;;25839:7:::1;25873:10;25806:8:::0;25839:7;25873:10:::1;:::i;:::-;25857:13;:26:::0;-1:-1:-1;25901:4:0::1;::::0;25581:332;-1:-1:-1;;25581:332:0:o;36666:2081::-;36856:12;36911:4;:11;36889;:18;:33;36881:117;;;;-1:-1:-1;;;36881:117:0;;;;;;;:::i;:::-;37039:8;:15;37017:11;:18;:37;37009:121;;;;-1:-1:-1;;;37009:121:0;;13455:2:1;37009:121:0;;;13437:21:1;13494:2;13474:18;;;13467:30;13533:34;13513:18;;;13506:62;13604:34;13584:18;;;13577:62;-1:-1:-1;;;13655:19:1;;;13648:38;13703:19;;37009:121:0;13253:475:1;37009:121:0;37141:20;37164:29;37185:7;37164:20;:29::i;:::-;37310:13;;37289:18;;37141:52;;-1:-1:-1;37248:13:0;;37204:24;;37289:34;;;:::i;:::-;37273:50;;37334:22;37359:32;37380:10;37359:20;:32::i;:::-;:69;;;;37395:33;37414:13;37395:18;:33::i;:::-;37334:94;;37439:25;37467:32;37485:13;37467:17;:32::i;:::-;:64;;;;;37503:28;37520:10;37503:16;:28::i;:::-;37439:92;;37577:5;37564:9;:18;;:42;;;;37586:20;37564:42;:63;;;;37610:17;37564:63;37542:152;;;;-1:-1:-1;;;37542:152:0;;;;;;;:::i;:::-;37709:20;:41;;;;37733:17;37709:41;37708:60;;;;;37767:1;37755:9;:13;37708:60;37705:181;;;37785:39;;37793:10;;37814:9;37785:39;;;;;;;;;37814:9;37793:10;37785:39;;;;;;;;;;;;;;;;;;;;;37705:181;;;37857:17;37868:5;37857:10;:17::i;:::-;37899:10;37896:296;;;37925:65;;-1:-1:-1;;;37925:65:0;;-1:-1:-1;;;;;37925:27:0;;;;;:65;;37953:10;;37964:11;;37976:4;;37981:8;;37925:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37896:296;;;38027:6;38023:158;38043:11;:18;38039:1;:22;38023:158;;;38087:7;-1:-1:-1;;;;;38087:24:0;;38112:10;38124:11;38136:1;38124:14;;;;;;;;:::i;:::-;;;;;;;38140:4;38145:1;38140:7;;;;;;;;:::i;:::-;;;;;;;38149:8;38158:1;38149:11;;;;;;;;:::i;:::-;;;;;;;;;;;38087:78;;-1:-1:-1;;;;;;38087:78:0;;;;;;;-1:-1:-1;;;;;16303:15:1;;;38087:78:0;;;16285:34:1;16355:15;;;;16335:18;;;16328:43;16387:18;;;16380:34;16430:18;;;16423:34;16265:3;16473:19;;;16466:32;-1:-1:-1;16514:19:1;;;16507:30;16554:19;;38087:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38063:3;;;;;:::i;:::-;;;;38023:158;;;;37896:296;38205:32;38223:13;38205:17;:32::i;:::-;38202:148;;;38320:18;;-1:-1:-1;;;;;38287:30:0;;;;;;:15;:30;;;;;;:51;;38320:18;38287:51;:::i;:::-;-1:-1:-1;;;;;38254:30:0;;;;;;:15;:30;;;;;:84;38202:148;38363:28;38380:10;38363:16;:28::i;:::-;38360:136;;;38466:18;;38452:10;38437:26;;;;:14;:26;;;;;;:47;;38466:18;38437:47;:::i;:::-;38423:10;38408:26;;;;:14;:26;;;;;:76;38360:136;38510:20;38509:21;:43;;;;;38535:17;38534:18;38509:43;38506:139;;;38569:64;38611:13;;38590:11;:18;:34;;;;:::i;:::-;38626:6;38569:20;:64::i;:::-;38683:13;-1:-1:-1;;;;;38660:57:0;38671:10;-1:-1:-1;;;;;38660:57:0;;38698:11;:18;38660:57;;;;1996:25:1;;1984:2;1969:18;;1850:177;38660:57:0;;;;;;;;-1:-1:-1;38735:4:0;;36666:2081;-1:-1:-1;;;;;;;;;;;36666:2081:0:o;33922:1906::-;34089:12;34144:9;:16;34122:11;:18;:38;34114:122;;;;-1:-1:-1;;;34114:122:0;;;;;;;:::i;:::-;34247:20;34270:29;34291:7;34270:20;:29::i;:::-;34413:13;;34392:18;;34247:52;;-1:-1:-1;34351:13:0;;34310:22;;34392:34;;;:::i;:::-;34376:50;;34437:22;34462:32;34483:10;34462:20;:32::i;:::-;:69;;;;34498:33;34517:13;34498:18;:33::i;:::-;34437:94;;34542:25;34570:32;34588:13;34570:17;:32::i;:::-;:64;;;;;34606:28;34623:10;34606:16;:28::i;:::-;34542:92;;34680:5;34667:9;:18;;:42;;;;34689:20;34667:42;:63;;;;34713:17;34667:63;34645:152;;;;-1:-1:-1;;;34645:152:0;;;;;;;:::i;:::-;34812:20;:41;;;;34836:17;34812:41;34811:60;;;;;34870:1;34858:9;:13;34811:60;34808:181;;;34888:39;;34896:10;;34917:9;34888:39;;;;;;;;;34917:9;34896:10;34888:39;;;;;;;;;;;;;;;;;;;;;34808:181;;;34960:17;34971:5;34960:10;:17::i;:::-;35002:10;34999:274;;;35028:60;;-1:-1:-1;;;35028:60:0;;-1:-1:-1;;;;;35028:26:0;;;;;:60;;35055:10;;35066:11;;35078:9;;35028:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34999:274;;;35125:6;35121:141;35141:11;:18;35137:1;:22;35121:141;;;35185:6;-1:-1:-1;;;;;35185:19:0;;35205:10;35217:11;35229:1;35217:14;;;;;;;;:::i;:::-;;;;;;;35233:9;35243:1;35233:12;;;;;;;;:::i;:::-;;;;;;;35185:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35161:3;;;;;:::i;:::-;;;;35121:141;;;;34999:274;35286:32;35304:13;35286:17;:32::i;:::-;35283:148;;;35401:18;;-1:-1:-1;;;;;35368:30:0;;;;;;:15;:30;;;;;;:51;;35401:18;35368:51;:::i;:::-;-1:-1:-1;;;;;35335:30:0;;;;;;:15;:30;;;;;:84;35283:148;35444:28;35461:10;35444:16;:28::i;:::-;35441:136;;;35547:18;;35533:10;35518:26;;;;:14;:26;;;;;;:47;;35547:18;35518:47;:::i;:::-;35504:10;35489:26;;;;:14;:26;;;;;:76;35441:136;35591:20;35590:21;:43;;;;;35616:17;35615:18;35590:43;35587:139;;;35650:64;35692:13;;35671:11;:18;:34;;;;:::i;35650:64::-;35764:13;-1:-1:-1;;;;;35741:57:0;35752:10;-1:-1:-1;;;;;35741:57:0;;35779:11;:18;35741:57;;;;1996:25:1;;1984:2;1969:18;;1850:177;35741:57:0;;;;;;;;-1:-1:-1;35816:4:0;;33922:1906;-1:-1:-1;;;;;;;;;;33922:1906:0:o;22559:405::-;22624:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22657:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;22649:27;;;::::0;::::1;;-1:-1:-1::0;;;;;22687:18:0;::::1;22708:5;22687:18:::0;;;:11:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;22687:26:0::1;::::0;;22744:19:::1;:26:::0;;;;;;22724:47;;:19:::1;::::0;:47:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:60;;-1:-1:-1;;;;;;22724:60:0::1;-1:-1:-1::0;;;;;22724:60:0;;::::1;;::::0;;22835:26;;::::1;-1:-1:-1::0;22835:26:0;;;:19:::1;:26:::0;;;;;22800:62:::1;::::0;::::1;:::i;:::-;;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;22800:62:0;::::1;::::0;::::1;::::0;;;::::1;22873:61;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;;;22873:26:0;::::1;-1:-1:-1::0;22873:26:0;;;:19:::1;:26:::0;;;;;;;:61;;::::1;::::0;;::::1;:::i;19339:249::-:0;19419:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;19452:30:::1;19471:10;19452:18;:30::i;:::-;19444:62;;;::::0;-1:-1:-1;;;19444:62:0;;19580:2:1;19444:62:0::1;::::0;::::1;19562:21:1::0;19619:2;19599:18;;;19592:30;-1:-1:-1;;;19638:18:1;;;19631:49;19697:18;;19444:62:0::1;19378:343:1::0;19444:62:0::1;-1:-1:-1::0;;;;;;19517:32:0::1;19552:5;19517:32:::0;;;:20:::1;:32;::::0;;;;:40;;-1:-1:-1;;19517:40:0::1;::::0;;-1:-1:-1;;19339:249:0:o;15931:181::-;16006:12;16031:51;16048:1;16051:21;;16074:7;16031:16;:51::i;4126:54::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30639:2515::-;30850:12;30875:20;30898:29;30919:7;30898:20;:29::i;:::-;31033:14;;31011:18;;30875:52;;-1:-1:-1;30976:15:0;;31011:36;31003:100;;;;-1:-1:-1;;;31003:100:0;;;;;;;:::i;:::-;31114:13;31151;;31130:11;:18;:34;;;;:::i;:::-;31114:50;;31175:22;31200:32;31221:10;31200:20;:32::i;:::-;:71;;;;31236:35;31255:15;31236:18;:35::i;:::-;31175:96;;31282:25;31310:34;31328:15;31310:17;:34::i;:::-;:66;;;;;31348:28;31365:10;31348:16;:28::i;:::-;31282:94;;31422:5;31409:9;:18;;:56;;;;31431:34;31449:15;31431:17;:34::i;:::-;31409:88;;;;31469:28;31486:10;31469:16;:28::i;:::-;31409:109;;;;31501:17;31409:109;31387:198;;;;-1:-1:-1;;;31387:198:0;;;;;;;:::i;:::-;31600:20;:41;;;;31624:17;31600:41;31599:60;;;;;31658:1;31646:9;:13;31599:60;31596:181;;;31676:39;;31684:10;;31705:9;31676:39;;;;;;;;;31705:9;31684:10;31676:39;;;;;;;;;;;;;;;;;;;;;31596:181;;;31748:17;31759:5;31748:10;:17::i;:::-;31792:10;31789:798;;;31819:59;;-1:-1:-1;;;31819:59:0;;-1:-1:-1;;;;;31819:18:0;;;;;:59;;31838:10;;31858:4;;31865:12;;31819:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31893:46:0;;-1:-1:-1;;;31893:46:0;;-1:-1:-1;;;;;31893:25:0;;;-1:-1:-1;31893:25:0;;-1:-1:-1;31893:46:0;;31919:11;;31931:7;;31893:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31789:798;;;31976:15;31972:604;;32012:59;;-1:-1:-1;;;32012:59:0;;-1:-1:-1;;;;;32012:18:0;;;;;:59;;32031:10;;32051:4;;32058:12;;32012:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32094:6;32090:130;32110:11;:18;32106:1;:22;32090:130;;;32158:5;-1:-1:-1;;;;;32158:14:0;;32173:11;32185:1;32173:14;;;;;;;;:::i;:::-;;;;;;;32189:7;32197:1;32189:10;;;;;;;;:::i;:::-;;;;;;;32158:42;;;;;;;;;;;;;;;-1:-1:-1;;;;;20808:32:1;;;;20790:51;;20872:2;20857:18;;20850:34;20778:2;20763:18;;20616:274;32158:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32130:3:0;;;;:::i;:::-;;;;32090:130;;;-1:-1:-1;32241:30:0;;-1:-1:-1;;;32241:30:0;;32265:4;32241:30;;;2437:51:1;32274:1:0;;-1:-1:-1;;;;;32241:15:0;;;;;2410:18:1;;32241:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;32238:139;;;32326:30;;-1:-1:-1;;;32326:30:0;;32350:4;32326:30;;;2437:51:1;-1:-1:-1;;;;;32300:14:0;;;;;32315:10;;32300:14;;32326:15;;2410:18:1;;32326:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32300:57;;-1:-1:-1;;;;;;32300:57:0;;;;;;;-1:-1:-1;;;;;20808:32:1;;;32300:57:0;;;20790:51:1;20857:18;;;20850:34;20763:18;;32300:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32238:139;31972:604;;;32421:6;32417:144;32435:11;:18;32431:1;:22;32417:144;;;32483:5;-1:-1:-1;;;;;32483:18:0;;32502:10;32514:11;32526:1;32514:14;;;;;;;;:::i;:::-;;;;;;;32530:7;32538:1;32530:10;;;;;;;;:::i;:::-;;;;;;;32483:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32455:3;;;;;:::i;:::-;;;;32417:144;;;;31972:604;32602:34;32620:15;32602:17;:34::i;:::-;32599:154;;;32723:18;;-1:-1:-1;;;;;32688:32:0;;;;;;:15;:32;;;;;;:53;;32723:18;32688:53;:::i;:::-;-1:-1:-1;;;;;32653:32:0;;;;;;:15;:32;;;;;:88;32599:154;32766:28;32783:10;32766:16;:28::i;:::-;32763:136;;;32869:18;;32855:10;32840:26;;;;:14;:26;;;;;;:47;;32869:18;32840:47;:::i;:::-;32826:10;32811:26;;;;:14;:26;;;;;:76;32763:136;32913:20;32912:21;:43;;;;;32938:17;32937:18;32912:43;32909:139;;;32972:64;33014:13;;32993:11;:18;:34;;;;:::i;32972:64::-;33088:15;-1:-1:-1;;;;;33063:61:0;33076:10;-1:-1:-1;;;;;33063:61:0;;33105:11;:18;33063:61;;;;1996:25:1;;1984:2;1969:18;;1850:177;33063:61:0;;;;;;;;-1:-1:-1;33142:4:0;;30639:2515;-1:-1:-1;;;;;;;;;;;;30639:2515:0:o;28351:1424::-;28506:12;28561:7;:14;28539:11;:18;:36;28531:100;;;;-1:-1:-1;;;28531:100:0;;;;;;;:::i;:::-;28726:13;;28705:18;;28666:12;;28642:21;;28705:34;;28726:13;28705:34;:::i;:::-;28689:50;-1:-1:-1;28750:17:0;28770:21;28689:50;28770:13;:21;:::i;:::-;28750:41;;28802:17;28822:28;28839:10;28822:16;:28::i;:::-;28802:48;;28861:10;28874:32;28895:10;28874:20;:32::i;:::-;:40;;28910:4;28874:40;;;28861:53;;28960:9;28947;:22;;:31;;;;28973:5;28947:31;:47;;;;28982:12;28947:47;28925:137;;;;-1:-1:-1;;;28925:137:0;;;;;;;:::i;:::-;29083:29;29104:7;29083:20;:29::i;:::-;29073:39;;29127:5;29126:6;:23;;;;;29137:12;29136:13;29126:23;29123:91;;;29166:36;29187:5;29194:7;29166:20;:36::i;:::-;29228:5;:21;;;;29237:12;29228:21;29227:51;;;;;29266:12;29254:9;:24;29227:51;29224:193;;;29303:10;29295:56;29324:26;29338:12;29325:9;29324:26;:::i;:::-;29295:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29224:193;;;29384:21;29395:9;29384:10;:21::i;:::-;29431:6;29427:116;29447:11;:18;29443:1;:22;29427:116;;;29495:11;29507:1;29495:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29487:32:0;:44;29520:7;29528:1;29520:10;;;;;;;;:::i;:::-;;;;;;;29487:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29467:3:0;;;;:::i;:::-;;;;29427:116;;;;29556:12;29553:120;;;29643:18;;29629:10;29614:26;;;;:14;:26;;;;;;:47;;29643:18;29614:47;:::i;:::-;29600:10;29585:26;;;;:14;:26;;;;;:76;29553:120;29711:18;;29688:57;;;12694:25:1;;;12750:2;12735:18;;12728:34;;;29699:10:0;;29688:57;;12667:18:1;29688:57:0;;;;;;;-1:-1:-1;29763:4:0;;28351:1424;-1:-1:-1;;;;;;;;;28351:1424:0:o;23929:151::-;-1:-1:-1;;;;;24036:30:0;23999:17;24036:30;;;:14;:30;;;;;;24069:3;-1:-1:-1;24036:36:0;23929:151::o;15419:178::-;15493:12;15518:49;15535:1;15538:19;;15559:7;15518:16;:49::i;21958:337::-;22068:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22102:32:0;::::1;;::::0;;;:11:::1;:32;::::0;;;;;::::1;;22094:41;;;::::0;::::1;;-1:-1:-1::0;;;;;22171:40:0;::::1;22146:22;22171:40:::0;;;:19:::1;:40;::::0;;;;;;22222:29;;22254:11;;22222:20:::1;::::0;:29:::1;::::0;22171:40;;22222:29:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:43;-1:-1:-1;22283:4:0::1;::::0;-1:-1:-1;21958:337:0;;;;:::o;13045:246::-;13090:4;13115:36;13140:10;13115:24;:36::i;:::-;13107:74;;;;-1:-1:-1;;;13107:74:0;;21872:2:1;13107:74:0;;;21854:21:1;21911:2;21891:18;;;21884:30;21950:27;21930:18;;;21923:55;21995:18;;13107:74:0;21670:349:1;13107:74:0;13227:34;:15;13246:14;13227:34;:::i;:::-;13213:10;13192:32;;;;:20;:32;;;;;:69;-1:-1:-1;13279:4:0;;13045:246::o;12603:241::-;12753:28;;12800:36;;-1:-1:-1;;;12800:36:0;;-1:-1:-1;;;;;2455:32:1;;;12800:36:0;;;2437:51:1;12671:4:0;;12753:28;;;;12800:30;;2410:18:1;;12800:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12793:43;12603:241;-1:-1:-1;;;12603:241:0:o;6248:483::-;6386:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;6430:1:::1;6419:10;:12;:39;;;;;6446:12;6435:10;:23;6419:39;:68;;;;;6475:12;6462;:25;6419:68;:97;;;;;6504:12;6491;:25;6419:97;6411:106;;;::::0;::::1;;-1:-1:-1::0;6528:19:0::1;:32:::0;;;;6571:21:::1;:36:::0;;;;6618:21:::1;:36:::0;6665:21:::1;:36:::0;6719:4:::1;::::0;6248:483::o;20358:149::-;20428:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;20452:15:0::1;:25:::0;20495:4:::1;::::0;20358:149::o;16874:170::-;-1:-1:-1;;;;;16975:25:0;;16942:13;16975:25;;;:13;:25;;;;;;;;;:61;;-1:-1:-1;;;;;;;17004:32:0;;;;;:20;:32;;;;;;;;;16874:170::o;24350:313::-;24432:27;24475:34;24493:15;24475:17;:34::i;:::-;24472:164;;;-1:-1:-1;;;;;24592:32:0;;24526:21;24592:32;;;:15;:32;;;;;;24551:3;;24576:48;;24551:3;24576:48;:::i;24472:164::-;-1:-1:-1;24654:1:0;;24350:313;-1:-1:-1;24350:313:0:o;12226:128::-;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;12310:28:::1;:36:::0;;-1:-1:-1;;;;;;12310:36:0::1;-1:-1:-1::0;;;;;12310:36:0;;;::::1;::::0;;;::::1;::::0;;12226:128::o;14900:186::-;14976:12;15001:55;15018:5;15025:21;;15048:7;15001:16;:55::i;17408:202::-;17508:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;17533:35:0;;;::::1;;::::0;;;:23:::1;:35;::::0;;;;:47;17598:4:::1;::::0;17408:202::o;24925:306::-;25005:27;25048:32;25065:14;25048:16;:32::i;:::-;25045:160;;;-1:-1:-1;;;;;25163:30:0;;25097:21;25163:30;;;:14;:30;;;;;;25122:3;;25147:46;;25122:3;25147:46;:::i;4187:51::-;;;;;;;;;;;;;;;;:::i;40281:342::-;40397:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;40486:34:::1;::::0;-1:-1:-1;;;40486:34:0;;-1:-1:-1;;;;;20808:32:1;;;40486:34:0::1;::::0;::::1;20790:51:1::0;20857:18;;;20850:34;;;40459:15:0;;40486:14;;::::1;::::0;::::1;::::0;20763:18:1;;40486:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40536:57;40557:15;40574:10;40586:6;40536:57;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;40611:4:0::1;::::0;40281:342;-1:-1:-1;;;;40281:342:0:o;11219:196::-;11316:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;11341:32:0;;;::::1;;::::0;;;:25:::1;:32;::::0;;;;:44;11403:4:::1;::::0;11219:196::o;10642:249::-;10722:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10755:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;;::::1;;10747:66;;;::::0;-1:-1:-1;;;10747:66:0;;22226:2:1;10747:66:0::1;::::0;::::1;22208:21:1::0;22265:2;22245:18;;;22238:30;22304:26;22284:18;;;22277:54;22348:18;;10747:66:0::1;22024:348:1::0;10747:66:0::1;-1:-1:-1::0;;;;;;10824:29:0::1;10856:5;10824:29:::0;;;:22:::1;:29;::::0;;;;:37;;-1:-1:-1;;10824:37:0::1;::::0;;-1:-1:-1;;10642:249:0:o;20816:738::-;20920:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20954:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;20953:19;20945:64;;;::::0;-1:-1:-1;;;20945:64:0;;22579:2:1;20945:64:0::1;::::0;::::1;22561:21:1::0;;;22598:18;;;22591:30;22657:34;22637:18;;;22630:62;22709:18;;20945:64:0::1;22377:356:1::0;20945:64:0::1;-1:-1:-1::0;;;;;21028:19:0;::::1;21020:56;;;::::0;-1:-1:-1;;;21020:56:0;;22940:2:1;21020:56:0::1;::::0;::::1;22922:21:1::0;22979:2;22959:18;;;22952:30;23018:26;22998:18;;;22991:54;23062:18;;21020:56:0::1;22738:348:1::0;21020:56:0::1;21096:19;21116:5;21096:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;21095:27;21087:70;;;::::0;-1:-1:-1;;;21087:70:0;;23574:2:1;21087:70:0::1;::::0;::::1;23556:21:1::0;23613:2;23593:18;;;23586:30;23652:32;23632:18;;;23625:60;23702:18;;21087:70:0::1;23372:354:1::0;21087:70:0::1;21191:3;21176:11;:18;;:37;;;;;21212:1;21198:11;:15;21176:37;21168:82;;;::::0;-1:-1:-1;;;21168:82:0;;23933:2:1;21168:82:0::1;::::0;::::1;23915:21:1::0;;;23952:18;;;23945:30;24011:34;23991:18;;;23984:62;24063:18;;21168:82:0::1;23731:356:1::0;21168:82:0::1;21290:4;21261:19;21281:5;21261:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;:33;;;::::1;;-1:-1:-1::0;;21261:33:0;;::::1;;::::0;;-1:-1:-1;;;;;21305:18:0;::::1;21261:26;21305:18:::0;;;:11:::1;:18:::0;;;;:25;;;;::::1;21261:33:::0;21305:25:::1;::::0;;;21317:5;;21341:19:::1;::::0;:26:::1;::::0;21361:5;;21341:26:::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:34;;-1:-1:-1;;;;;;21341:34:0::1;-1:-1:-1::0;;;;;21341:34:0;;::::1;;::::0;;21386:26;;::::1;-1:-1:-1::0;21386:26:0;;;:19:::1;:26:::0;;;;;;:34;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;21461:11;21431:20;21452:5;21431:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;;;;21488:36:::1;::::0;21518:5;;21488:36:::1;:::i;:::-;;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;21488:36:0;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;21542:4:0::1;20816:738:::0;;;;;:::o;26979:234::-;27168:37;;-1:-1:-1;;;27168:37:0;;-1:-1:-1;;;;;24322:15:1;;;27168:37:0;;;24304:34:1;27199:4:0;24354:18:1;;;24347:43;27066:17:0;;27134:15;;27168;;;;;24239:18:1;;27168:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27161:44;26979:234;-1:-1:-1;;;;26979:234:0:o;1033:256::-;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1129:23:0;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;1182:5:0::1;::::0;-1:-1:-1;;;;;1169:18:0;;::::1;1182:5:::0;::::1;1169:18;;1129:58;1107:92;;;::::0;::::1;;1236:5;::::0;;1215:38:::1;::::0;-1:-1:-1;;;;;1215:38:0;;::::1;::::0;1236:5;::::1;::::0;1215:38:::1;::::0;::::1;1264:5;:17:::0;;-1:-1:-1;;;;;;1264:17:0::1;-1:-1:-1::0;;;;;1264:17:0;;;::::1;::::0;;;::::1;::::0;;1033:256::o;18546:513::-;18642:12;18676:30;18695:10;18676:18;:30::i;:::-;18675:31;18667:67;;;;-1:-1:-1;;;18667:67:0;;11843:2:1;18667:67:0;;;11825:21:1;11882:2;11862:18;;;11855:30;-1:-1:-1;;;11901:18:1;;;11894:53;11964:18;;18667:67:0;11641:347:1;18667:67:0;18755:29;18776:7;18755:20;:29::i;:::-;18745:39;;18795:11;18809:33;18831:10;18809:21;:33::i;:::-;18795:47;;18874:3;18861:9;:16;;18853:62;;;;-1:-1:-1;;;18853:62:0;;24603:2:1;18853:62:0;;;24585:21:1;24642:2;24622:18;;;24615:30;24681:34;24661:18;;;24654:62;-1:-1:-1;;;24732:18:1;;;24725:31;24773:19;;18853:62:0;24401:397:1;18853:62:0;-1:-1:-1;;;;;18926:25:0;;;;;;:13;:25;;;;;:32;;-1:-1:-1;;18926:32:0;18954:4;18926:32;;;18969:15;18980:3;18969:10;:15::i;:::-;18995:34;19016:3;19021:7;18995:20;:34::i;:::-;-1:-1:-1;19047:4:0;;18546:513;-1:-1:-1;;;18546:513:0:o;10069:297::-;10141:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;10174:27:::1;10195:5;10174:20;:27::i;:::-;:35;;10205:4;10174:35:::0;10166:79:::1;;;::::0;-1:-1:-1;;;10166:79:0;;25005:2:1;10166:79:0::1;::::0;::::1;24987:21:1::0;25044:2;25024:18;;;25017:30;25083:33;25063:18;;;25056:61;25134:18;;10166:79:0::1;24803:355:1::0;10166:79:0::1;-1:-1:-1::0;;;;;10256:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;;:36;;-1:-1:-1;;10256:36:0::1;10288:4;10256:36;::::0;;10308:27;::::1;::::0;10256:29;10308:27:::1;-1:-1:-1::0;10353:4:0::1;10069:297:::0;;;:::o;13792:778::-;13887:12;13920:32;13941:10;13920:20;:32::i;:::-;:40;;13956:4;13920:40;13912:84;;;;-1:-1:-1;;;13912:84:0;;25005:2:1;13912:84:0;;;24987:21:1;25044:2;25024:18;;;25017:30;25083:33;25063:18;;;25056:61;25134:18;;13912:84:0;24803:355:1;13912:84:0;14007:11;14021:47;14051:10;14063:4;14021:29;:47::i;:::-;14007:61;;14114:3;14101:9;:16;;14200:13;14209:3;14200:8;:13::i;:::-;14244:19;14253:9;14244:8;:19::i;:::-;14139:139;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14079:211;;;;;-1:-1:-1;;;14079:211:0;;;;;;;;:::i;:::-;-1:-1:-1;14355:14:0;:5;14363:6;14355:14;:::i;:::-;14336:34;;:15;:34;:::i;:::-;14322:10;14301:32;;;;:20;:32;;;;;:69;14391:29;14412:7;14391:20;:29::i;:::-;14381:39;;14431:15;14442:3;14431:10;:15::i;:::-;14457:34;14478:3;14483:7;14457:20;:34::i;:::-;14507:32;;14528:10;;14507:32;;;;;-1:-1:-1;14557:4:0;;13792:778;-1:-1:-1;;;;13792:778:0:o;8315:1028::-;8452:10;8435:28;;;;:16;:28;;;;;8419:53;;8385:18;;8419:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8419:53:0;;;:15;:53::i;:::-;:99;;;;8477:11;:41;8489:19;8509:7;8489:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8489:28:0;8477:41;;;;;;;;;;-1:-1:-1;8477:41:0;;;;8476:42;8419:99;8416:196;;;8535:37;;;;;;;;;;;-1:-1:-1;;;8535:37:0;;;;;;;8552:10;-1:-1:-1;8535:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;-1:-1:-1;;8587:13:0;;;;;;;;;;;;-1:-1:-1;;;8587:13:0;;;;;8315:1028;-1:-1:-1;8315:1028:0:o;8416:196::-;8626:28;8642:7;8626:28;;;;;;;;;;;;:15;:28::i;:::-;8625:29;:81;;;;-1:-1:-1;8691:10:0;8674:28;;;;:16;:28;;;;;8658:48;;;;8674:28;8658:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:48::i;:::-;8625:179;;;;;8776:19;8796:7;8776:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8625:179;8622:358;;;8856:10;-1:-1:-1;;;;;8824:42:0;:19;8844:7;8824:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;8824:28:0;:42;8821:95;;-1:-1:-1;;8887:13:0;;;;;;;;;;;;-1:-1:-1;;;8887:13:0;;;;;8315:1028::o;8821:95::-;8947:10;8930:28;;;;:16;:28;;;;;;;;:38;;;;;;;;:::i;:::-;;8622:358;8993:27;9009:7;8993:27;;;;;;;;;;;;:15;:27::i;:::-;:80;;;;-1:-1:-1;9058:10:0;9041:28;;;;:16;:28;;;;;9025:48;;;;9041:28;9025:48;;;:::i;:::-;9024:49;8993:80;8990:150;;;9117:10;9100:28;;;;:16;:28;;;;;9090:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8990:150;9154:27;9170:7;9154:27;;;;;;;;;;;;:15;:27::i;:::-;:60;;;;9186:19;9206:7;9186:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9185:29;9154:60;9151:160;;;9231:37;;;;;;;;;;;-1:-1:-1;;;9231:37:0;;;;;;;9248:10;-1:-1:-1;9231:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;;9283:16;;;;;;;;;;;;;-1:-1:-1;;;9283:16:0;;;;;9151:160;-1:-1:-1;9328:7:0;8315:1028::o;7760:199::-;7831:6;7819:9;:18;7816:136;;;7854:14;7871:18;7883:6;7871:9;:18;:::i;:::-;7904:36;;7854:35;;-1:-1:-1;7912:10:0;;7904:36;;;;;7854:35;;7904:36;;;;7854:35;7912:10;7904:36;;;;;;;;;;;;;;;;;;;;;7839:113;7816:136;7760:199;:::o;38825:550::-;38920:31;38936:7;38920:31;;;;;;;;;;;;;-1:-1:-1;;;38920:31:0;;;:15;:31::i;:::-;38919:32;:77;;;;;38955:11;:41;38967:19;38987:7;38967:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38967:28:0;38955:41;;;;;;;;;;-1:-1:-1;38955:41:0;;;;38919:77;38916:452;;;39013:18;39077:3;39045:20;39066:7;39045:29;;;;;;:::i;:::-;;;;;;;;;;;;;;39034:8;:40;;;;:::i;:::-;:46;;;;:::i;:::-;39103:5;;39013:67;;-1:-1:-1;;;;;;39103:5:0;39095:46;39119:21;39013:67;39119:8;:21;:::i;:::-;39095:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39164:19;39184:7;39164:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;39164:28:0;;39156:58;;;;;39203:10;;39164:28;;;;39203:10;39164:28;39156:58;;;;;;;;;;;;;;;;;;;;;39249:19;39269:7;39249:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1996:25:1;;;-1:-1:-1;;;;;39249:28:0;;39234:56;;1969:18:1;39234:56:0;;;;;;;38998:304;38825:550;;:::o;38916:452::-;39331:5;;;39323:33;;-1:-1:-1;;;;;39331:5:0;;;;39323:33;;;;;39347:8;;39323:33;39331:5;39323:33;39347:8;39331:5;39323:33;;;;;;;;;;;;;;;;;;;6978:573;7028:27;7072:2;7078:1;7072:7;7068:50;;-1:-1:-1;;7096:10:0;;;;;;;;;;;;-1:-1:-1;;;7096:10:0;;;;;6978:573::o;7068:50::-;7137:2;7128:6;7169:69;7176:6;;7169:69;;7199:5;;;;:::i;:::-;;-1:-1:-1;7219:7:0;;-1:-1:-1;7224:2:0;7219:7;;:::i;:::-;;;7169:69;;;7248:17;7278:3;7268:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7268:14:0;-1:-1:-1;7248:34:0;-1:-1:-1;7302:3:0;7316:198;7323:7;;7316:198;;7351:3;7353:1;7351;:3;:::i;:::-;7347:7;-1:-1:-1;7369:10:0;7399:7;7404:2;7399;:7;:::i;:::-;:12;;7409:2;7399:12;:::i;:::-;7394:17;;:2;:17;:::i;:::-;7383:29;;:2;:29;:::i;:::-;7369:44;;7428:9;7447:4;7440:12;;7428:24;;7477:2;7467:4;7472:1;7467:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;7467:12:0;;;;;;;;-1:-1:-1;7494:8:0;7500:2;7494:8;;:::i;:::-;;;7332:182;;7316:198;;;-1:-1:-1;7538:4:0;6978:573;-1:-1:-1;;;;6978:573:0:o;27558:254::-;27641:13;27667;27710:2;27693:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;27683:31;;;;;;27667:47;;27725:13;27768:2;27751:20;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27751:20:0;;;;;;;;;27741:31;;27751:20;27741:31;;;;27790:14;;;;;27558:254;-1:-1:-1;;;;27558:254:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:275;217:2;211:9;282:2;263:13;;-1:-1:-1;;259:27:1;247:40;;317:18;302:34;;338:22;;;299:62;296:88;;;364:18;;:::i;:::-;400:2;393:22;146:275;;-1:-1:-1;146:275:1:o;426:531::-;469:5;522:3;515:4;507:6;503:17;499:27;489:55;;540:1;537;530:12;489:55;576:6;563:20;602:18;598:2;595:26;592:52;;;624:18;;:::i;:::-;668:55;711:2;692:13;;-1:-1:-1;;688:27:1;717:4;684:38;668:55;:::i;:::-;748:2;739:7;732:19;794:3;787:4;782:2;774:6;770:15;766:26;763:35;760:55;;;811:1;808;801:12;760:55;876:2;869:4;861:6;857:17;850:4;841:7;837:18;824:55;924:1;899:16;;;917:4;895:27;888:38;;;;903:7;426:531;-1:-1:-1;;;426:531:1:o;962:322::-;1031:6;1084:2;1072:9;1063:7;1059:23;1055:32;1052:52;;;1100:1;1097;1090:12;1052:52;1140:9;1127:23;1173:18;1165:6;1162:30;1159:50;;;1205:1;1202;1195:12;1159:50;1228;1270:7;1261:6;1250:9;1246:22;1228:50;:::i;1481:173::-;1549:20;;-1:-1:-1;;;;;1598:31:1;;1588:42;;1578:70;;1644:1;1641;1634:12;1659:186;1718:6;1771:2;1759:9;1750:7;1746:23;1742:32;1739:52;;;1787:1;1784;1777:12;1739:52;1810:29;1829:9;1810:29;:::i;2032:254::-;2100:6;2108;2161:2;2149:9;2140:7;2136:23;2132:32;2129:52;;;2177:1;2174;2167:12;2129:52;2200:29;2219:9;2200:29;:::i;:::-;2190:39;2276:2;2261:18;;;;2248:32;;-1:-1:-1;;;2032:254:1:o;2499:180::-;2558:6;2611:2;2599:9;2590:7;2586:23;2582:32;2579:52;;;2627:1;2624;2617:12;2579:52;-1:-1:-1;2650:23:1;;2499:180;-1:-1:-1;2499:180:1:o;2684:183::-;2744:4;2777:18;2769:6;2766:30;2763:56;;;2799:18;;:::i;:::-;-1:-1:-1;2844:1:1;2840:14;2856:4;2836:25;;2684:183::o;2872:668::-;2926:5;2979:3;2972:4;2964:6;2960:17;2956:27;2946:55;;2997:1;2994;2987:12;2946:55;3033:6;3020:20;3059:4;3083:60;3099:43;3139:2;3099:43;:::i;:::-;3083:60;:::i;:::-;3177:15;;;3263:1;3259:10;;;;3247:23;;3243:32;;;3208:12;;;;3287:15;;;3284:35;;;3315:1;3312;3305:12;3284:35;3351:2;3343:6;3339:15;3363:148;3379:6;3374:3;3371:15;3363:148;;;3445:23;3464:3;3445:23;:::i;:::-;3433:36;;3489:12;;;;3396;;3363:148;;;-1:-1:-1;3529:5:1;2872:668;-1:-1:-1;;;;;;2872:668:1:o;3545:662::-;3599:5;3652:3;3645:4;3637:6;3633:17;3629:27;3619:55;;3670:1;3667;3660:12;3619:55;3706:6;3693:20;3732:4;3756:60;3772:43;3812:2;3772:43;:::i;3756:60::-;3850:15;;;3936:1;3932:10;;;;3920:23;;3916:32;;;3881:12;;;;3960:15;;;3957:35;;;3988:1;3985;3978:12;3957:35;4024:2;4016:6;4012:15;4036:142;4052:6;4047:3;4044:15;4036:142;;;4118:17;;4106:30;;4156:12;;;;4069;;4036:142;;4212:118;4298:5;4291:13;4284:21;4277:5;4274:32;4264:60;;4320:1;4317;4310:12;4335:128;4400:20;;4429:28;4400:20;4429:28;:::i;4468:1166::-;4654:6;4662;4670;4678;4686;4694;4747:3;4735:9;4726:7;4722:23;4718:33;4715:53;;;4764:1;4761;4754:12;4715:53;4787:29;4806:9;4787:29;:::i;:::-;4777:39;;4867:2;4856:9;4852:18;4839:32;4890:18;4931:2;4923:6;4920:14;4917:34;;;4947:1;4944;4937:12;4917:34;4970:61;5023:7;5014:6;5003:9;4999:22;4970:61;:::i;:::-;4960:71;;5084:2;5073:9;5069:18;5056:32;5040:48;;5113:2;5103:8;5100:16;5097:36;;;5129:1;5126;5119:12;5097:36;5152:63;5207:7;5196:8;5185:9;5181:24;5152:63;:::i;:::-;5142:73;;5268:2;5257:9;5253:18;5240:32;5224:48;;5297:2;5287:8;5284:16;5281:36;;;5313:1;5310;5303:12;5281:36;5336:63;5391:7;5380:8;5369:9;5365:24;5336:63;:::i;:::-;5326:73;;5418:36;5449:3;5438:9;5434:19;5418:36;:::i;:::-;5408:46;;5507:3;5496:9;5492:19;5479:33;5463:49;;5537:2;5527:8;5524:16;5521:36;;;5553:1;5550;5543:12;5521:36;;5576:52;5620:7;5609:8;5598:9;5594:24;5576:52;:::i;:::-;5566:62;;;4468:1166;;;;;;;;:::o;5639:1000::-;5791:6;5799;5807;5815;5823;5876:3;5864:9;5855:7;5851:23;5847:33;5844:53;;;5893:1;5890;5883:12;5844:53;5916:29;5935:9;5916:29;:::i;:::-;5906:39;;5996:2;5985:9;5981:18;5968:32;6019:18;6060:2;6052:6;6049:14;6046:34;;;6076:1;6073;6066:12;6046:34;6099:61;6152:7;6143:6;6132:9;6128:22;6099:61;:::i;:::-;6089:71;;6213:2;6202:9;6198:18;6185:32;6169:48;;6242:2;6232:8;6229:16;6226:36;;;6258:1;6255;6248:12;6226:36;6281:63;6336:7;6325:8;6314:9;6310:24;6281:63;:::i;:::-;6271:73;;6394:2;6383:9;6379:18;6366:32;6353:45;;6407:28;6429:5;6407:28;:::i;:::-;6454:5;;-1:-1:-1;6512:3:1;6497:19;;6484:33;;6529:16;;;6526:36;;;6558:1;6555;6548:12;6526:36;;6581:52;6625:7;6614:8;6603:9;6599:24;6581:52;:::i;:::-;6571:62;;;5639:1000;;;;;;;;:::o;6644:258::-;6716:1;6726:113;6740:6;6737:1;6734:13;6726:113;;;6816:11;;;6810:18;6797:11;;;6790:39;6762:2;6755:10;6726:113;;;6857:6;6854:1;6851:13;6848:48;;;6892:1;6883:6;6878:3;6874:16;6867:27;6848:48;;6644:258;;;:::o;6907:383::-;7056:2;7045:9;7038:21;7019:4;7088:6;7082:13;7131:6;7126:2;7115:9;7111:18;7104:34;7147:66;7206:6;7201:2;7190:9;7186:18;7181:2;7173:6;7169:15;7147:66;:::i;:::-;7274:2;7253:15;-1:-1:-1;;7249:29:1;7234:45;;;;7281:2;7230:54;;6907:383;-1:-1:-1;;6907:383:1:o;7295:1205::-;7462:6;7470;7478;7486;7494;7502;7510;7563:3;7551:9;7542:7;7538:23;7534:33;7531:53;;;7580:1;7577;7570:12;7531:53;7603:29;7622:9;7603:29;:::i;:::-;7593:39;;7683:2;7672:9;7668:18;7655:32;7706:18;7747:2;7739:6;7736:14;7733:34;;;7763:1;7760;7753:12;7733:34;7786:61;7839:7;7830:6;7819:9;7815:22;7786:61;:::i;:::-;7776:71;;7900:2;7889:9;7885:18;7872:32;7856:48;;7929:2;7919:8;7916:16;7913:36;;;7945:1;7942;7935:12;7913:36;7968:63;8023:7;8012:8;8001:9;7997:24;7968:63;:::i;:::-;7958:73;;8078:2;8067:9;8063:18;8050:32;8040:42;;8132:3;8121:9;8117:19;8104:33;8091:46;;8146:28;8168:5;8146:28;:::i;:::-;8193:5;;-1:-1:-1;8250:3:1;8235:19;;8222:33;;8264:30;8222:33;8264:30;:::i;:::-;8313:7;;-1:-1:-1;8373:3:1;8358:19;;8345:33;;8390:16;;;8387:36;;;8419:1;8416;8409:12;8387:36;;8442:52;8486:7;8475:8;8464:9;8460:24;8442:52;:::i;:::-;8432:62;;;7295:1205;;;;;;;;;;:::o;8505:864::-;8651:6;8659;8667;8675;8728:3;8716:9;8707:7;8703:23;8699:33;8696:53;;;8745:1;8742;8735:12;8696:53;8785:9;8772:23;8814:18;8855:2;8847:6;8844:14;8841:34;;;8871:1;8868;8861:12;8841:34;8894:61;8947:7;8938:6;8927:9;8923:22;8894:61;:::i;:::-;8884:71;;9008:2;8997:9;8993:18;8980:32;8964:48;;9037:2;9027:8;9024:16;9021:36;;;9053:1;9050;9043:12;9021:36;9076:63;9131:7;9120:8;9109:9;9105:24;9076:63;:::i;:::-;9066:73;;9186:2;9175:9;9171:18;9158:32;9148:42;;9243:2;9232:9;9228:18;9215:32;9199:48;;9272:2;9262:8;9259:16;9256:36;;;9288:1;9285;9278:12;9256:36;;9311:52;9355:7;9344:8;9333:9;9329:24;9311:52;:::i;:::-;9301:62;;;8505:864;;;;;;;:::o;9374:385::-;9460:6;9468;9476;9484;9537:3;9525:9;9516:7;9512:23;9508:33;9505:53;;;9554:1;9551;9544:12;9505:53;-1:-1:-1;;9577:23:1;;;9647:2;9632:18;;9619:32;;-1:-1:-1;9698:2:1;9683:18;;9670:32;;9749:2;9734:18;9721:32;;-1:-1:-1;9374:385:1;-1:-1:-1;9374:385:1:o;9764:328::-;9841:6;9849;9857;9910:2;9898:9;9889:7;9885:23;9881:32;9878:52;;;9926:1;9923;9916:12;9878:52;9949:29;9968:9;9949:29;:::i;:::-;9939:39;;9997:38;10031:2;10020:9;10016:18;9997:38;:::i;:::-;9987:48;;10082:2;10071:9;10067:18;10054:32;10044:42;;9764:328;;;;;:::o;10097:464::-;10184:6;10192;10200;10253:2;10241:9;10232:7;10228:23;10224:32;10221:52;;;10269:1;10266;10259:12;10221:52;10292:29;10311:9;10292:29;:::i;:::-;10282:39;;10372:2;10361:9;10357:18;10344:32;10399:18;10391:6;10388:30;10385:50;;;10431:1;10428;10421:12;10385:50;10454;10496:7;10487:6;10476:9;10472:22;10454:50;:::i;:::-;10444:60;;;10551:2;10540:9;10536:18;10523:32;10513:42;;10097:464;;;;;:::o;10566:260::-;10634:6;10642;10695:2;10683:9;10674:7;10670:23;10666:32;10663:52;;;10711:1;10708;10701:12;10663:52;10734:29;10753:9;10734:29;:::i;:::-;10724:39;;10782:38;10816:2;10805:9;10801:18;10782:38;:::i;:::-;10772:48;;10566:260;;;;;:::o;10831:396::-;10909:6;10917;10970:2;10958:9;10949:7;10945:23;10941:32;10938:52;;;10986:1;10983;10976:12;10938:52;11009:29;11028:9;11009:29;:::i;:::-;10999:39;;11089:2;11078:9;11074:18;11061:32;11116:18;11108:6;11105:30;11102:50;;;11148:1;11145;11138:12;11102:50;11171;11213:7;11204:6;11193:9;11189:22;11171:50;:::i;:::-;11161:60;;;10831:396;;;;;:::o;11232:404::-;11434:2;11416:21;;;11473:2;11453:18;;;11446:30;11512:34;11507:2;11492:18;;11485:62;-1:-1:-1;;;11578:2:1;11563:18;;11556:38;11626:3;11611:19;;11232:404::o;11993:127::-;12054:10;12049:3;12045:20;12042:1;12035:31;12085:4;12082:1;12075:15;12109:4;12106:1;12099:15;12125:168;12165:7;12231:1;12227;12223:6;12219:14;12216:1;12213:21;12208:1;12201:9;12194:17;12190:45;12187:71;;;12238:18;;:::i;:::-;-1:-1:-1;12278:9:1;;12125:168::o;12298:217::-;12338:1;12364;12354:132;;12408:10;12403:3;12399:20;12396:1;12389:31;12443:4;12440:1;12433:15;12471:4;12468:1;12461:15;12354:132;-1:-1:-1;12500:9:1;;12298:217::o;12773:475::-;12975:2;12957:21;;;13014:2;12994:18;;;12987:30;13053:34;13048:2;13033:18;;13026:62;13124:34;13119:2;13104:18;;13097:62;-1:-1:-1;;;13190:3:1;13175:19;;13168:38;13238:3;13223:19;;12773:475::o;13733:403::-;13935:2;13917:21;;;13974:2;13954:18;;;13947:30;14013:34;14008:2;13993:18;;13986:62;-1:-1:-1;;;14079:2:1;14064:18;;14057:37;14126:3;14111:19;;13733:403::o;14141:461::-;14194:3;14232:5;14226:12;14259:6;14254:3;14247:19;14285:4;14314:2;14309:3;14305:12;14298:19;;14351:2;14344:5;14340:14;14372:1;14382:195;14396:6;14393:1;14390:13;14382:195;;;14461:13;;-1:-1:-1;;;;;14457:39:1;14445:52;;14517:12;;;;14552:15;;;;14493:1;14411:9;14382:195;;;-1:-1:-1;14593:3:1;;14141:461;-1:-1:-1;;;;;14141:461:1:o;14607:435::-;14660:3;14698:5;14692:12;14725:6;14720:3;14713:19;14751:4;14780:2;14775:3;14771:12;14764:19;;14817:2;14810:5;14806:14;14838:1;14848:169;14862:6;14859:1;14856:13;14848:169;;;14923:13;;14911:26;;14957:12;;;;14992:15;;;;14884:1;14877:9;14848:169;;15047:768;-1:-1:-1;;;;;15410:32:1;;15392:51;;15479:3;15474:2;15459:18;;15452:31;;;-1:-1:-1;;15506:57:1;;15543:19;;15535:6;15506:57;:::i;:::-;15611:9;15603:6;15599:22;15594:2;15583:9;15579:18;15572:50;15645:44;15682:6;15674;15645:44;:::i;:::-;15631:58;;15737:9;15729:6;15725:22;15720:2;15709:9;15705:18;15698:50;15765:44;15802:6;15794;15765:44;:::i;:::-;15757:52;15047:768;-1:-1:-1;;;;;;;15047:768:1:o;15820:127::-;15881:10;15876:3;15872:20;15869:1;15862:31;15912:4;15909:1;15902:15;15936:4;15933:1;15926:15;16584:135;16623:3;16644:17;;;16641:43;;16664:18;;:::i;:::-;-1:-1:-1;16711:1:1;16700:13;;16584:135::o;16724:128::-;16764:3;16795:1;16791:6;16788:1;16785:13;16782:39;;;16801:18;;:::i;:::-;-1:-1:-1;16837:9:1;;16724:128::o;16857:562::-;-1:-1:-1;;;;;17142:32:1;;17124:51;;17211:2;17206;17191:18;;17184:30;;;-1:-1:-1;;17237:56:1;;17274:18;;17266:6;17237:56;:::i;:::-;17341:9;17333:6;17329:22;17324:2;17313:9;17309:18;17302:50;17369:44;17406:6;17398;17369:44;:::i;:::-;17361:52;16857:562;-1:-1:-1;;;;;;16857:562:1:o;17424:375::-;-1:-1:-1;;;;;17682:15:1;;;17664:34;;17734:15;;;;17729:2;17714:18;;17707:43;17781:2;17766:18;;17759:34;;;;17614:2;17599:18;;17424:375::o;17804:380::-;17883:1;17879:12;;;;17926;;;17947:61;;18001:4;17993:6;17989:17;17979:27;;17947:61;18054:2;18046:6;18043:14;18023:18;18020:38;18017:161;;18100:10;18095:3;18091:20;18088:1;18081:31;18135:4;18132:1;18125:15;18163:4;18160:1;18153:15;18189:982;18274:12;;18239:3;;18329:1;18349:18;;;;18402;;;;18429:61;;18483:4;18475:6;18471:17;18461:27;;18429:61;18509:2;18557;18549:6;18546:14;18526:18;18523:38;18520:161;;18603:10;18598:3;18594:20;18591:1;18584:31;18638:4;18635:1;18628:15;18666:4;18663:1;18656:15;18520:161;18697:18;18724:104;;;;18842:1;18837:328;;;;18690:475;;18724:104;-1:-1:-1;;18757:24:1;;18745:37;;18802:16;;;;-1:-1:-1;18724:104:1;;18837:328;18868:5;18865:1;18858:16;18915:2;18912:1;18902:16;18940:1;18954:165;18968:6;18965:1;18962:13;18954:165;;;19046:14;;19033:11;;;19026:35;19089:16;;;;18983:10;;18954:165;;;18958:3;;19148:6;19143:3;19139:16;19132:23;;18690:475;;;;;;;18189:982;;;;:::o;19176:197::-;19304:3;19329:38;19363:3;19355:6;19329:38;:::i;19726:415::-;19928:2;19910:21;;;19967:2;19947:18;;;19940:30;20006:34;20001:2;19986:18;;19979:62;-1:-1:-1;;;20072:2:1;20057:18;;20050:49;20131:3;20116:19;;19726:415::o;20146:465::-;20403:2;20392:9;20385:21;20366:4;20429:56;20481:2;20470:9;20466:18;20458:6;20429:56;:::i;:::-;20533:9;20525:6;20521:22;20516:2;20505:9;20501:18;20494:50;20561:44;20598:6;20590;20561:44;:::i;:::-;20553:52;20146:465;-1:-1:-1;;;;;20146:465:1:o;20895:245::-;20962:6;21015:2;21003:9;20994:7;20990:23;20986:32;20983:52;;;21031:1;21028;21021:12;20983:52;21063:9;21057:16;21082:28;21104:5;21082:28;:::i;21145:184::-;21215:6;21268:2;21256:9;21247:7;21243:23;21239:32;21236:52;;;21284:1;21281;21274:12;21236:52;-1:-1:-1;21307:16:1;;21145:184;-1:-1:-1;21145:184:1:o;21334:125::-;21374:4;21402:1;21399;21396:8;21393:34;;;21407:18;;:::i;:::-;-1:-1:-1;21444:9:1;;21334:125::o;23091:276::-;23222:3;23260:6;23254:13;23276:53;23322:6;23317:3;23310:4;23302:6;23298:17;23276:53;:::i;:::-;23345:16;;;;;23091:276;-1:-1:-1;;23091:276:1:o;25163:793::-;-1:-1:-1;;;25569:3:1;25562:37;25544:3;25628:6;25622:13;25644:62;25699:6;25694:2;25689:3;25685:12;25678:4;25670:6;25666:17;25644:62;:::i;:::-;25770:27;25765:2;25725:16;;;25757:11;;;25750:48;25823:13;;25845:63;25823:13;25894:2;25886:11;;25879:4;25867:17;;25845:63;:::i;:::-;25928:17;25947:2;25924:26;;25163:793;-1:-1:-1;;;;25163:793:1:o;25961:204::-;25999:3;26035:4;26032:1;26028:12;26067:4;26064:1;26060:12;26102:3;26096:4;26092:14;26087:3;26084:23;26081:49;;;26110:18;;:::i;:::-;26146:13;;25961:204;-1:-1:-1;;;25961:204:1:o

Swarm Source

ipfs://2ff4d9085bf5c12b56bbf76cbc7e8fd730c2c5978e2ae0f5b93e748506383ef9
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.