Contract 0x29Cd4BD49b2c76f82A8BE41B3921339Fd7717ae8 1

Contract Overview

Balance:
0.0654 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2Multi Value Toke...160462562022-01-21 3:03:2820 hrs 49 mins ago0x2ac053cd40891a5fe9922801d926ceb60d032f47 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80.0099 BNB0.03600488
0x1f560eee3e1163f85d7eec8706816e74b2d8b87eac468031653d2aaa53e558d3Multi Value Toke...160462542022-01-21 3:03:2220 hrs 49 mins ago0x2ac053cd40891a5fe9922801d926ceb60d032f47 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80.06 BNB0.12572804
0xc4da4922410b72c751e17be45effc3309c9858d0b9b40ed893d6b03b7cee3697Multi Value Eth ...160461722022-01-21 2:59:1620 hrs 53 mins ago0x2ac053cd40891a5fe9922801d926ceb60d032f47 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80.019900000000001 BNB0.06198473
0xde13ef1c7d1f8044a34800e189da44f6d3ad83f1a7462f25c69d69a03a806f26Multi Value Eth ...160461702022-01-21 2:59:1020 hrs 53 mins ago0x2ac053cd40891a5fe9922801d926ceb60d032f47 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80.025000000000002 BNB0.07935657
0x2227107dc73c47a7aace62ae50f6f0e879ebb4ed604e2cc237f09ae4ce87efa8Multi Value Eth ...160461692022-01-21 2:59:0720 hrs 53 mins ago0x2ac053cd40891a5fe9922801d926ceb60d032f47 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80.025000000000002 BNB0.07910609
0x49a637541b0ff82f252e24b5171dd0939d50eca1cd7dea3bd325916f5846e871Multi Value Toke...159927632022-01-19 6:27:182 days 17 hrs ago0x6a50bd825676ee4f4c9ce5d1dbbcc75f3f3b8ea1 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.03027949
0x10e729c7698263499f58ee439d56380bc2fb06bb0617f5cae8a0968bdb42dd16Multi Value Toke...158646782022-01-14 19:30:057 days 4 hrs ago0x186ed9edb860dd99de411982ba53eff1a4679ec4 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.00084557
0x4042a5d3c18f9190252743aeedecd5ee1f9104c7ce557b03a846d2a44634c98eMulti Value Toke...158645992022-01-14 19:26:087 days 4 hrs ago0x186ed9edb860dd99de411982ba53eff1a4679ec4 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.00118997
0x7b229771cb36d703dd541a8371e6dcc5ae982ed2887cc931b977c5918c71da77Multi Value Toke...157717142022-01-11 13:51:2410 days 10 hrs ago0x4019f3333c3b2c3c975395e4d514e5b61c294be0 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.00158233
0xa06a66382ef80cd413f3a4b4d6800a83ddb850e79e68ce3eb7a4181f9d705ae6Multi Value Toke...157715962022-01-11 13:45:3010 days 10 hrs ago0x4019f3333c3b2c3c975395e4d514e5b61c294be0 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80.15 BNB0.00094128
0x6cea72829c401694c733ac9da26489c383bc19b2942caa7f0c9e6c63fb0e8741Multi Value Toke...157709802022-01-11 13:14:4210 days 10 hrs ago0x7afe1c96aa7d753b03fc58b92326a77817db2b52 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.00101868
0xebed89e333aa8dc4d8729aae07a856faf2f7efae457e4ff1932b5880fc394f1aMulti Value Toke...157707672022-01-11 13:04:0310 days 10 hrs ago0x2ac053cd40891a5fe9922801d926ceb60d032f47 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.17801432
0x073fc1ccd362118a797ced834db4bc0360a7e9c22877e763d2eb824ad34b578eMulti Value Toke...146411942021-12-03 4:12:0649 days 19 hrs ago0x38b14606cd478a60ffeff5205abf1dde357a0efe IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.00229107
0xbdc4e6a6fe2d19e5de467d732ff9bd11b34a40f2658982b143e768b7e624525aMulti Value Toke...145975482021-12-01 14:58:1551 days 8 hrs ago0x7253fb9531591c649571c4ab5a249eba0b626bcb IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.00197121
0x4fa6cb61e836502cb55f1cc3b3bc23caee9fe19890ca97e5e05ae9e841195385Multi Value Toke...143233742021-11-22 1:20:5060 days 22 hrs ago0xdc910f65db1dcb8204a123d80c6e0a15d1f107b9 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.002681118
0x4ce05a329ed506c5f5d39485205faa38b0df3b54777483125da490cb79a0d62fMulti Value Toke...143131092021-11-21 16:47:3361 days 7 hrs ago0xd08b8d68873414b847fcc912f15c7f5a1c4d8c7d IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.07015079
0x89c3a2476b14e0c03193f28fe2c7df4109f40374219c9a195ab265210636410aMulti Value Toke...143041542021-11-21 9:19:4861 days 14 hrs ago0xaf61ed464b8d82704effd45f3391b3bf94bc59b5 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.01369212
0xe63d935b20ada6b92d11e38be1d8c20500707c8c204021ab7802afe7ea6276eaMulti Value Toke...142800922021-11-20 13:16:2762 days 10 hrs ago0xd08b8d68873414b847fcc912f15c7f5a1c4d8c7d IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.08341839
0xc620d313c41a3636d107e634b1863a1a93eca2deb700162dc0a0ff9571ad1f6bMulti Value Toke...142518192021-11-19 13:41:5963 days 10 hrs ago0xd08b8d68873414b847fcc912f15c7f5a1c4d8c7d IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.03878221
0xf1dbcc07e9f8319b36ed06e722b457150d7136328908df004e761702eb670710Multi Value Toke...139637892021-11-09 13:14:0873 days 10 hrs ago0x6b8d9ec7c29b6274e4554bf8b36375c64c991ccc IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80.0599 BNB0.19652431
0x0e73dd2f61bb31a48faa9dd533ef93f4d7bc2a3840abcea409a168722a948570Multi Value Toke...139637062021-11-09 13:09:5973 days 10 hrs ago0x6b8d9ec7c29b6274e4554bf8b36375c64c991ccc IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80.0055 BNB0.01868422
0x71e533783f5a8aae5c723c2a5bc8a8cf51ca031f300a77e569612b708d48f15fGrant Premium Me...133441512021-10-18 22:05:0695 days 1 hr ago0x210efca155797119a5b0f1cfde64ca1fe55ec544 IN  0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80 BNB0.0004562
0x6af3e8838311791b98f5bd87880f2067839e7694ad93579f075451d22577ce2b0x60806040132545202021-10-15 19:16:0898 days 4 hrs ago0x210efca155797119a5b0f1cfde64ca1fe55ec544 IN  Create: CryptoMultisender0 BNB0.03000062
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae80x210efca155797119a5b0f1cfde64ca1fe55ec5440.0099 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
0xf3951ed9373ac76479ef55cff38bad9ff29e633f0d9b5d03627a78b41abaa5c2160462562022-01-21 3:03:2820 hrs 49 mins ago 0x29cd4bd49b2c76f82a8be41b3921339fd7717ae8 0xed24fc36d5ee211ea25a80239fb8c4cfd80f12ee0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoMultisender

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-10-15
*/

/***
 *   _____                  _          __  __       _ _   _                    _           
 *  / ____|                | |        |  \/  |     | | | (_)                  | |          
 * | |     _ __ _   _ _ __ | |_ ___   | \  / |_   _| | |_ _ ___  ___ _ __   __| | ___ _ __ 
 * | |    | '__| | | | '_ \| __/ _ \  | |\/| | | | | | __| / __|/ _ \ '_ \ / _` |/ _ \ '__|
 * | |____| |  | |_| | |_) | || (_) | | |  | | |_| | | |_| \__ \  __/ | | | (_| |  __/ |   
 *  \_____|_|   \__, | .__/ \__\___/  |_|  |_|\__,_|_|\__|_|___/\___|_| |_|\__,_|\___|_|   
 *               __/ | |                                                                   
 *             |___/|_|                                                                   
 *        
 * 
 * @author Zenos Pavlakou
 */
 
 
pragma solidity ^0.6.0;

library SafeMath {
    
    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }
        
        c = a * b;
        assert(c / a == b);
        return c;
    }
    

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }


    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }


    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}



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() public {
        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;
    }
}



/**
 * Contract acts as an interface between the DappleAirdrops contract and all ERC20 compliant
 * tokens. 
 * */
abstract contract ERCInterface {
    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);
}



contract CryptoMultisender is Ownable {
    
    using SafeMath for uint256;
 
    mapping (address => uint256) public tokenTrialDrops;

    mapping (address => bool) public isPremiumMember;
    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;
        
    uint256 public premiumMemberFee;
    uint256 public rate;
    uint256 public dropUnitPrice;


    event TokenAirdrop(address indexed by, address indexed tokenAddress, uint256 totalTransfers);
    event EthAirdrop(address indexed by, uint256 totalTransfers, uint256 ethValue);


   
    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);
    event PremiumMemberFeeUpdated(uint256 newFee);

    
    constructor() public {
        rate = 10000;
        dropUnitPrice = 1e14; 
        premiumMemberFee = 25e16;
    }
    

    /**
     * Allows the owner of this contract to change the fee for users to become premium members.
     * 
     * @param _fee The new fee.
     * 
     * @return True if the fee is changed successfully. False otherwise.
     * */
    function setPremiumMemberFee(uint256 _fee) public onlyOwner returns(bool) {
        require(_fee > 0 && _fee != premiumMemberFee);
        premiumMemberFee = _fee;
        emit PremiumMemberFeeUpdated(_fee);
        return true;
    }
    

    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.sub(_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 The correct affiliate code or void.
    **/
    function processAffiliateCode(string memory _afCode) internal returns(string memory) {
        
        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 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 True if premium membership is granted successfully. False otherwise. 
    **/
    function grantPremiumMembership(address _addr) public onlyOwner returns(bool) {
        require(!isPremiumMember[_addr], "Is already premiumMember member");
        isPremiumMember[_addr] = true;
        emit NewPremiumMembership(_addr);
        return true; 
    }


    /**
    * Allows users to become premium 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 True if user successfully becomes premium member. False otherwise. 
    **/
    function becomePremiumMember(string memory _afCode) public payable returns(bool) {
        require(!isPremiumMember[msg.sender], "Is already premiumMember member");
        require(
            msg.value >= premiumMemberFee,
            string(abi.encodePacked(
                "premiumMember fee is: ", uint2str(premiumMemberFee), ". Not enough ETH sent. ", uint2str(msg.value)
            ))
        );
        
        isPremiumMember[msg.sender] = true;
        
        _afCode = processAffiliateCode(_afCode);

        giveChange(premiumMemberFee);
        
        if(!stringsAreEqual(_afCode,"void") && isAffiliate[affiliateCodeToAddr[_afCode]]) {
            payable(owner).transfer(premiumMemberFee.mul(80).div(100));
            uint256 commission = premiumMemberFee.mul(20).div(100);
            payable(affiliateCodeToAddr[_afCode]).transfer(commission);
            emit CommissionPaid(affiliateCodeToAddr[_afCode], commission);
        } else {
            payable(owner).transfer(premiumMemberFee);
        }
        emit NewPremiumMembership(msg.sender);
        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 True if the affiliate has been added successfully. False otherwise. 
    **/
    function addAffiliate(address _addr, string memory _code) public onlyOwner returns(bool) {
        require(!isAffiliate[_addr], "Address is already an affiliate.");
        require(_addr != address(0));
        require(!affiliateCodeExists[_code]);
        affiliateCodeExists[_code] = true;
        isAffiliate[_addr] = true;
        affiliateCodeToAddr[_code] = _addr;
        affiliateCodeOfAddr[_addr] = _code;
        emit NewAffiliatePartnership(_addr,_code);
        return true;
    }
    

    /**
    * Allows the owner of this contract to remove an affiliate partner. 
    *
    * @param _addr The address of the affiliate partner.
    *
    * @return True if affiliate partner is removed successfully. False otherwise. 
    **/
    function removeAffiliate(address _addr) public onlyOwner returns(bool) {
        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 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) {
        return tokenTrialDrops[_addressOfToken] < 100;
    }
    
    
    /**
     * Checks how many remaining free trial drops a token has.
     * 
     * @param _addressOfToken the address of the token being queried.
     * 
     * @return the total remaining free trial drops of a token.
     * */
    function getRemainingTrialDrops(address _addressOfToken) public view returns(uint256) {
        if(tokenHasFreeTrial(_addressOfToken)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops.sub(tokenTrialDrops[_addressOfToken]);
        } 
        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 true if function executes successfully, false otherwise.
     * */
    function setRate(uint256 _newRate) public onlyOwner returns(bool) {
        require(
            _newRate != rate 
            && _newRate > 0
        );
        emit RateChanged(rate, _newRate);
        rate = _newRate;
        uint256 eth = 1 ether;
        dropUnitPrice = eth.div(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 The ERC20 token allowance from token owner to this contract. 
     * */
    function getTokenAllowance(address _addr, address _addressOfToken) public view returns(uint256) {
        ERCInterface token = ERCInterface(_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 True if both strings are the same. False otherwise. 
    **/
    function stringsAreEqual(string memory _a, string memory _b) internal pure returns(bool) {
        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. This function only facilitates batch transfers of constant values (i.e., all recipients
     * will receive the same amount of tokens).
     * 
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _value The amount of tokens all addresses 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 true if function executes successfully, false otherwise.
     * */
    function singleValueEthAirrop(address[] memory _recipients, uint256 _value, string memory _afCode) public payable returns(bool) {
        
        uint256 price = _recipients.length.mul(dropUnitPrice);
        uint256 totalCost = _value.mul(_recipients.length).add(price);

        require(
            msg.value >= totalCost|| isPremiumMember[msg.sender],
            "Not enough ETH sent with transaction!"
        );

        
        _afCode = processAffiliateCode(_afCode);
        
        
        if(!isPremiumMember[msg.sender]) {
            distributeCommission(_recipients.length, _afCode);
        }

        giveChange(totalCost);
        
        for(uint i=0; i<_recipients.length; i++) {
            if(_recipients[i] != address(0)) {
                payable(_recipients[i]).transfer(_value);
            }
        }

        emit EthAirdrop(msg.sender, _recipients.length, _value.mul(_recipients.length));
        
        return true;
    }
    

    
    function _getTotalEthValue(uint256[] memory _values) internal pure returns(uint256) {
        uint256 totalVal = 0;
        for(uint i = 0; i < _values.length; i++) {
            totalVal = totalVal.add(_values[i]);
        }
        return totalVal;
    }
    
    
    /**
     * 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 true if function executes successfully, false otherwise.
     * */
    function multiValueEthAirdrop(address[] memory _recipients, uint256[] memory _values, string memory _afCode) public payable returns(bool) {
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");

        uint256 totalEthValue = _getTotalEthValue(_values);
        uint256 price = _recipients.length.mul(dropUnitPrice);
        uint256 totalCost = totalEthValue.add(price);

        require(
            msg.value >= totalCost || isPremiumMember[msg.sender], 
            "Not enough ETH sent with transaction!"
        );
        
        
        _afCode = processAffiliateCode(_afCode);
        
        if(!isPremiumMember[msg.sender]) {
            distributeCommission(_recipients.length, _afCode);
        }

        giveChange(totalCost);
        
        for(uint i = 0; i < _recipients.length; i++) {
            if(_recipients[i] != address(0) && _values[i] > 0) {
                payable(_recipients[i]).transfer(_values[i]);
            }
        }
        
        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 only facilitates batch transfers of constant values (i.e., all recipients
     * will receive the same amount of tokens).
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _value The amount of tokens all addresses 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 true if function executes successfully, false otherwise.
     * */
    function singleValueTokenAirdrop(address _addressOfToken,  address[] memory _recipients, uint256 _value, string memory _afCode) public payable returns(bool) {
        ERCInterface token = ERCInterface(_addressOfToken);

        uint256 price = _recipients.length.mul(dropUnitPrice);

        require(
            msg.value >= price || tokenHasFreeTrial(_addressOfToken) || isPremiumMember[msg.sender],
            "Not enough ETH sent with transaction!"
        );

        giveChange(price);

        _afCode = processAffiliateCode(_afCode);
        
        for(uint i = 0; i < _recipients.length; i++) {
            if(_recipients[i] != address(0)) {
                token.transferFrom(msg.sender, _recipients[i], _value);
            }
        }
        if(tokenHasFreeTrial(_addressOfToken)) {
            tokenTrialDrops[_addressOfToken] = tokenTrialDrops[_addressOfToken].add(_recipients.length);
        } else {
            if(!isPremiumMember[msg.sender]) {
                distributeCommission(_recipients.length, _afCode);
            }
            
        }

        emit TokenAirdrop(msg.sender, _addressOfToken, _recipients.length);
        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 _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return true if function executes successfully, false otherwise.
     * */    
    function multiValueTokenAirdrop(address _addressOfToken,  address[] memory _recipients, uint256[] memory _values, string memory _afCode) public payable returns(bool) {
        ERCInterface token = ERCInterface(_addressOfToken);
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");

        uint256 price = _recipients.length.mul(dropUnitPrice);

        require(
            msg.value >= price || tokenHasFreeTrial(_addressOfToken) || isPremiumMember[msg.sender],
            "Not enough ETH sent with transaction!"
        );

        giveChange(price);
        
        _afCode = processAffiliateCode(_afCode);
        
        for(uint i = 0; i < _recipients.length; i++) {
            if(_recipients[i] != address(0) && _values[i] > 0) {
                token.transferFrom(msg.sender, _recipients[i], _values[i]);
            }
        }
        if(tokenHasFreeTrial(_addressOfToken)) {
            tokenTrialDrops[_addressOfToken] = tokenTrialDrops[_addressOfToken].add(_recipients.length);
        } else {
            if(!isPremiumMember[msg.sender]) {
                distributeCommission(_recipients.length, _afCode);
            }
        }
        emit TokenAirdrop(msg.sender, _addressOfToken, _recipients.length);
        return true;
    }
        

    /**
    * Send the owner and affiliates commissions.
    **/
    function distributeCommission(uint256 _drops, string memory _afCode) internal {
        if(!stringsAreEqual(_afCode,"void") && isAffiliate[affiliateCodeToAddr[_afCode]]) {
            uint256 profitSplit = _drops.mul(dropUnitPrice).div(2);
            payable(owner).transfer(profitSplit);
            payable(affiliateCodeToAddr[_afCode]).transfer(profitSplit);
            emit CommissionPaid(affiliateCodeToAddr[_afCode], profitSplit);
        } else {
            payable(owner).transfer(_drops.mul(dropUnitPrice));
        }
    }
    
    
    

    /**
     * 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 true if function executes successfully, false otherwise.
     * */  
    function withdrawERC20Tokens(address _addressOfToken,  address _recipient, uint256 _value) public onlyOwner returns(bool){
        require(
            _addressOfToken != address(0)
            && _recipient != address(0)
            && _value > 0
        );
        ERCInterface token = ERCInterface(_addressOfToken);
        token.transfer(_recipient, _value);
        emit ERC20TokensWithdrawn(_addressOfToken, _recipient, _value);
        return true;
    }
}

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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"PremiumMemberFeeUpdated","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"}],"name":"addAffiliate","outputs":[{"internalType":"bool","name":"","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":"string","name":"_afCode","type":"string"}],"name":"becomePremiumMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"dropUnitPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getRemainingTrialDrops","outputs":[{"internalType":"uint256","name":"","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":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"grantPremiumMembership","outputs":[{"internalType":"bool","name":"","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":"isPremiumMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"multiValueEthAirdrop","outputs":[{"internalType":"bool","name":"","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":"string","name":"_afCode","type":"string"}],"name":"multiValueTokenAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumMemberFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setPremiumMemberFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"setRate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"singleValueEthAirrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"singleValueTokenAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"tokenHasFreeTrial","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","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":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600080546001600160a01b03191633179055612710600955655af3107a4000600a556703782dace9d900006008556133d78061004e6000396000f3fe6080604052600436106101a05760003560e01c80638da5cb5b116100ec578063e8a05d4c1161008a578063f53289ca11610064578063f53289ca14610ae1578063f8fa4d1714610c1f578063f9727e1d14610dd7578063fec5c0c614610e01576101aa565b8063e8a05d4c14610a3e578063ea7ee01014610a71578063f2fde38b14610aac576101aa565b8063adc76126116100c6578063adc76126146108f1578063b186768514610924578063bcdd1e1314610957578063cfab2bb31461099a576101aa565b80638da5cb5b146108b257806390d419d1146108c7578063a39a2b76146108dc576101aa565b80634a4a2feb11610159578063590925e211610133578063590925e2146105f557806362920c85146106c25780636cca7d3c1461086a578063893d20e81461089d576101aa565b80634a4a2feb146104595780634fa8518614610501578063503ad00e14610534576101aa565b806318f20763146101af57806323a0fb02146102f15780632c4e722e1461032457806334fcf4371461034b5780633b9ff843146103755780633d2375f9146103a8576101aa565b366101aa57600080fd5b600080fd5b6102dd600480360360608110156101c557600080fd5b810190602081018135600160201b8111156101df57600080fd5b8201836020820111156101f157600080fd5b803590602001918460208302840111600160201b8311171561021257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092958435959094909350604081019250602001359050600160201b81111561026957600080fd5b82018360208201111561027b57600080fd5b803590602001918460018302840111600160201b8311171561029c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e34945050505050565b604080519115158252519081900360200190f35b3480156102fd57600080fd5b506102dd6004803603602081101561031457600080fd5b50356001600160a01b0316610fe5565b34801561033057600080fd5b50610339611007565b60408051918252519081900360200190f35b34801561035757600080fd5b506102dd6004803603602081101561036e57600080fd5b503561100d565b34801561038157600080fd5b506102dd6004803603602081101561039857600080fd5b50356001600160a01b03166110d3565b3480156103b457600080fd5b506102dd600480360360208110156103cb57600080fd5b810190602081018135600160201b8111156103e557600080fd5b8201836020820111156103f757600080fd5b803590602001918460018302840111600160201b8311171561041857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061130f945050505050565b34801561046557600080fd5b5061048c6004803603602081101561047c57600080fd5b50356001600160a01b031661132f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104c65781810151838201526020016104ae565b50505050905090810190601f1680156104f35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561050d57600080fd5b506102dd6004803603602081101561052457600080fd5b50356001600160a01b03166113ca565b34801561054057600080fd5b506102dd6004803603604081101561055757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561058157600080fd5b82018360208201111561059357600080fd5b803590602001918460018302840111600160201b831117156105b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113df945050505050565b34801561060157600080fd5b506106a66004803603602081101561061857600080fd5b810190602081018135600160201b81111561063257600080fd5b82018360208201111561064457600080fd5b803590602001918460018302840111600160201b8311171561066557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116e0945050505050565b604080516001600160a01b039092168252519081900360200190f35b6102dd600480360360608110156106d857600080fd5b810190602081018135600160201b8111156106f257600080fd5b82018360208201111561070457600080fd5b803590602001918460208302840111600160201b8311171561072557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561077457600080fd5b82018360208201111561078657600080fd5b803590602001918460208302840111600160201b831117156107a757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107f657600080fd5b82018360208201111561080857600080fd5b803590602001918460018302840111600160201b8311171561082957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611706945050505050565b34801561087657600080fd5b506103396004803603602081101561088d57600080fd5b50356001600160a01b031661191b565b3480156108a957600080fd5b506106a661192d565b3480156108be57600080fd5b506106a661193c565b3480156108d357600080fd5b5061033961194b565b3480156108e857600080fd5b50610339611951565b3480156108fd57600080fd5b506103396004803603602081101561091457600080fd5b50356001600160a01b0316611957565b34801561093057600080fd5b5061048c6004803603602081101561094757600080fd5b50356001600160a01b031661199e565b34801561096357600080fd5b506102dd6004803603606081101561097a57600080fd5b506001600160a01b03813581169160208101359091169060400135611a06565b6102dd600480360360208110156109b057600080fd5b810190602081018135600160201b8111156109ca57600080fd5b8201836020820111156109dc57600080fd5b803590602001918460018302840111600160201b831117156109fd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b58945050505050565b348015610a4a57600080fd5b506102dd60048036036020811015610a6157600080fd5b50356001600160a01b0316612058565b348015610a7d57600080fd5b5061033960048036036040811015610a9457600080fd5b506001600160a01b038135811691602001351661206d565b348015610ab857600080fd5b50610adf60048036036020811015610acf57600080fd5b50356001600160a01b03166120f6565b005b6102dd60048036036080811015610af757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610b2157600080fd5b820183602082011115610b3357600080fd5b803590602001918460208302840111600160201b83111715610b5457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092958435959094909350604081019250602001359050600160201b811115610bab57600080fd5b820183602082011115610bbd57600080fd5b803590602001918460018302840111600160201b83111715610bde57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506121c9945050505050565b6102dd60048036036080811015610c3557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610c5f57600080fd5b820183602082011115610c7157600080fd5b803590602001918460208302840111600160201b83111715610c9257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610ce157600080fd5b820183602082011115610cf357600080fd5b803590602001918460208302840111600160201b83111715610d1457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610d6357600080fd5b820183602082011115610d7557600080fd5b803590602001918460018302840111600160201b83111715610d9657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506123f3945050505050565b348015610de357600080fd5b506102dd60048036036020811015610dfa57600080fd5b50356125d7565b348015610e0d57600080fd5b506102dd60048036036020811015610e2457600080fd5b50356001600160a01b031661267c565b600080610e4d600a54865161278590919063ffffffff16565b90506000610e6f82610e6988518861278590919063ffffffff16565b906127aa565b90508034101580610e8f57503360009081526002602052604090205460ff165b610eca5760405162461bcd60e51b81526004018080602001828103825260258152602001806133226025913960400191505060405180910390fd5b610ed3846127c0565b3360009081526002602052604090205490945060ff16610ef857610ef8865185612d83565b610f0181613012565b60005b8651811015610f905760006001600160a01b0316878281518110610f2457fe5b60200260200101516001600160a01b031614610f8857868181518110610f4657fe5b60200260200101516001600160a01b03166108fc879081150290604051600060405180830381858888f19350505050158015610f86573d6000803e3d6000fd5b505b600101610f04565b50855133907f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a90610fc18882612785565b6040805192835260208301919091528051918290030190a250600195945050505050565b6001600160a01b0381166000908152600160205260409020546064115b919050565b60095481565b600080546001600160a01b031633146110575760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b60095482141580156110695750600082115b61107257600080fd5b600954604080519182526020820184905280517f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f71869281900390910190a16009829055670de0b6b3a76400006110c78184613059565b600a5550600192915050565b600080546001600160a01b0316331461111d5760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b03821660009081526003602052604090205460ff1661114257600080fd5b6001600160a01b0382166000908152600360209081526040808320805460ff191690556006909152808220905181546004929190819083906002600019600183161561010002019091160480156111d05780601f106111ae5761010080835404028352918201916111d0565b820191906000526020600020905b8154815290600101906020018083116111bc575b50509283525050604080516020928190038301812080546001600160a01b0319166001600160a01b0395861617905592851660009081526006909252902080549091908190839060026101006001831615026000190190911604801561126d5780601f1061124b57610100808354040283529182019161126d565b820191906000526020600020905b815481529060010190602001808311611259575b505060405190819003812092506001600160a01b03851691507f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b038616600090815260069091529290922090516113069290613297565b50600192915050565b805160208183018101805160058252928201919093012091525460ff1681565b60066020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156113c25780601f10611397576101008083540402835291602001916113c2565b820191906000526020600020905b8154815290600101906020018083116113a557829003601f168201915b505050505081565b60036020526000908152604090205460ff1681565b600080546001600160a01b031633146114295760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b03831660009081526003602052604090205460ff1615611497576040805162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e604482015290519081900360640190fd5b6001600160a01b0383166114aa57600080fd5b6005826040518082805190602001908083835b602083106114dc5780518252601f1990920191602091820191016114bd565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff16159150611519905057600080fd5b60016005836040518082805190602001908083835b6020831061154d5780518252601f19909201916020918201910161152e565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520805496151560ff199788161790556001600160a01b038916600090815260038352208054909516600117909455505083518592600492869290918291908401908083835b602083106115de5780518252601f1990920191602091820191016115bf565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820190942080546001600160a01b0319166001600160a01b03968716179055938716600090815260068552929092208551611648949193509086019150613297565b50816040518082805190602001908083835b602083106116795780518252601f19909201916020918201910161165a565b5181516020939093036101000a6000190180199091169216919091179052604051920182900382209350506001600160a01b03861691507ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060015b92915050565b80516020818301810180516004825292820191909301209152546001600160a01b031681565b600082518451146117485760405162461bcd60e51b81526004018080602001828103825260338152602001806133476033913960400191505060405180910390fd5b60006117538461306c565b9050600061176d600a54875161278590919063ffffffff16565b9050600061177b83836127aa565b9050803410158061179b57503360009081526002602052604090205460ff165b6117d65760405162461bcd60e51b81526004018080602001828103825260258152602001806133226025913960400191505060405180910390fd5b6117df856127c0565b3360009081526002602052604090205490955060ff1661180457611804875186612d83565b61180d81613012565b60005b87518110156118d05760006001600160a01b031688828151811061183057fe5b60200260200101516001600160a01b0316141580156118625750600087828151811061185857fe5b6020026020010151115b156118c85787818151811061187357fe5b60200260200101516001600160a01b03166108fc88838151811061189357fe5b60200260200101519081150290604051600060405180830381858888f193505050501580156118c6573d6000803e3d6000fd5b505b600101611810565b5086516040805191825260208201859052805133927f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a92908290030190a25060019695505050505050565b60016020526000908152604090205481565b6000546001600160a01b031690565b6000546001600160a01b031681565b60085481565b600a5481565b600061196282610fe5565b15611996576001600160a01b03821660009081526001602052604090205460649061198e9082906130b1565b915050611002565b506000919050565b60076020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156113c25780601f10611397576101008083540402835291602001916113c2565b600080546001600160a01b03163314611a505760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b03841615801590611a7057506001600160a01b03831615155b8015611a7c5750600082115b611a8557600080fd5b6040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b158015611ad857600080fd5b505af1158015611aec573d6000803e3d6000fd5b505050506040513d6020811015611b0257600080fd5b5050604080516001600160a01b0380881682528616602082015280820185905290517ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d9181900360600190a1506001949350505050565b3360009081526002602052604081205460ff1615611bbd576040805162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d62657200604482015290519081900360640190fd5b600854341015611bce6008546130c3565b611bd7346130c3565b6040516020018080750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b81525060160183805190602001908083835b60208310611c2a5780518252601f199092019160209182019101611c0b565b51815160209384036101000a60001901801990921691161790527f2e204e6f7420656e6f756768204554482073656e742e20000000000000000000919093019081528451601790910192850191508083835b60208310611c9b5780518252601f199092019160209182019101611c7c565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290611d595760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d1e578181015183820152602001611d06565b50505050905090810190601f168015611d4b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50336000908152600260205260409020805460ff19166001179055611d7d826127c0565b9150611d8a600854613012565b611db082604051806040016040528060048152602001631d9bda5960e21b8152506131a5565b158015611e395750600360006004846040518082805190602001908083835b60208310611dee5780518252601f199092019160209182019101611dcf565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420546001600160a01b0316855284019490945250016000205460ff1690505b15611fe8576000546008546001600160a01b03909116906108fc90611e6c90606490611e66906050612785565b90613059565b6040518115909202916000818181858888f19350505050158015611e94573d6000803e3d6000fd5b506000611eb26064611e66601460085461278590919063ffffffff16565b90506004836040518082805190602001908083835b60208310611ee65780518252601f199092019160209182019101611ec7565b51815160209384036101000a600019018019909216911617905292019485525060405193849003018320546001600160a01b0316926108fc85150292508491506000818181858888f19350505050158015611f45573d6000803e3d6000fd5b506004836040518082805190602001908083835b60208310611f785780518252601f199092019160209182019101611f59565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185205486865290516001600160a01b03909116947f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a94508190039091019150a250612025565b600080546008546040516001600160a01b039092169281156108fc029290818181858888f19350505050158015612023573d6000803e3d6000fd5b505b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001919050565b60026020526000908152604090205460ff1681565b60408051636eb1769f60e11b81526001600160a01b038481166004830152306024830152915160009284929083169163dd62ed3e91604480820192602092909190829003018186803b1580156120c257600080fd5b505afa1580156120d6573d6000803e3d6000fd5b505050506040513d60208110156120ec57600080fd5b5051949350505050565b6000546001600160a01b0316331461213f5760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b0381161580159061216557506000546001600160a01b03828116911614155b61216e57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600a548351600091869183916121df9190612785565b905080341015806121f457506121f487610fe5565b8061220e57503360009081526002602052604090205460ff165b6122495760405162461bcd60e51b81526004018080602001828103825260258152602001806133226025913960400191505060405180910390fd5b61225281613012565b61225b846127c0565b935060005b86518110156123325760006001600160a01b031687828151811061228057fe5b60200260200101516001600160a01b03161461232a57826001600160a01b03166323b872dd338984815181106122b257fe5b6020026020010151896040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561231157600080fd5b505af1158015612325573d6000803e3d6000fd5b505050505b600101612260565b5061233c87610fe5565b156123835785516001600160a01b038816600090815260016020526040902054612365916127aa565b6001600160a01b0388166000908152600160205260409020556123a5565b3360009081526002602052604090205460ff166123a5576123a5865185612d83565b855160408051918252516001600160a01b0389169133917f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af9181900360200190a35060019695505050505050565b815183516000918691146124385760405162461bcd60e51b81526004018080602001828103825260338152602001806133476033913960400191505060405180910390fd5b6000612450600a54875161278590919063ffffffff16565b90508034101580612465575061246587610fe5565b8061247f57503360009081526002602052604090205460ff165b6124ba5760405162461bcd60e51b81526004018080602001828103825260258152602001806133226025913960400191505060405180910390fd5b6124c381613012565b6124cc846127c0565b935060005b86518110156123325760006001600160a01b03168782815181106124f157fe5b60200260200101516001600160a01b0316141580156125235750600086828151811061251957fe5b6020026020010151115b156125cf57826001600160a01b03166323b872dd3389848151811061254457fe5b602002602001015189858151811061255857fe5b60200260200101516040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156125b657600080fd5b505af11580156125ca573d6000803e3d6000fd5b505050505b6001016124d1565b600080546001600160a01b031633146126215760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b60008211801561263357506008548214155b61263c57600080fd5b60088290556040805183815290517fa77eb4a199fa90085e9d7437273dd3bc924372a4bd0569aa21acc65a07b2c11c9181900360200190a1506001919050565b600080546001600160a01b031633146126c65760405162461bcd60e51b815260040180806020018281038252602881526020018061337a6028913960400191505060405180910390fd5b6001600160a01b03821660009081526002602052604090205460ff1615612734576040805162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d62657200604482015290519081900360640190fd5b6001600160a01b038216600081815260026020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b600082612794575060006116da565b50818102818382816127a257fe5b04146116da57fe5b6000828201838110156127b957fe5b9392505050565b336000908152600760209081526040918290208054835160026001831615610100026000190190921691909104601f81018490048402820184019094528381526060936128829391929183018282801561285b5780601f106128305761010080835404028352916020019161285b565b820191906000526020600020905b81548152906001019060200180831161283e57829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b8152506131a5565b8061290a5750600360006004846040518082805190602001908083835b602083106128be5780518252601f19909201916020918201910161289f565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420546001600160a01b0316855284019490945250016000205460ff161590505b156129695760408051808201825260048152631d9bda5960e21b602080830191825233600090815260079091529290922090516129479290613297565b50506040805180820190915260048152631d9bda5960e21b6020820152611002565b61298282604051806020016040528060008152506131a5565b158015612a3b57503360009081526007602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452612a3b9392830182828015612a215780601f106129f657610100808354040283529160200191612a21565b820191906000526020600020905b815481529060010190602001808311612a0457829003601f168201915b5050505050604051806020016040528060008152506131a5565b8015612aa757506005826040518082805190602001908083835b60208310612a745780518252601f199092019160209182019101612a55565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff169150505b15612b6d57336001600160a01b03166004836040518082805190602001908083835b60208310612ae85780518252601f199092019160209182019101612ac9565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220546001600160a01b031692909214159150612b4b905057506040805180820190915260048152631d9bda5960e21b6020820152611002565b3360009081526007602090815260409091208351612b6b92850190613297565b505b612b8682604051806020016040528060008152506131a5565b8015612bfb57503360009081526007602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452612bf99392830182828015612a215780601f106129f657610100808354040283529160200191612a21565b155b15612c9c573360009081526007602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015612c945780601f10612c6957610100808354040283529160200191612c94565b820191906000526020600020905b815481529060010190602001808311612c7757829003601f168201915b505050505091505b612cb582604051806020016040528060008152506131a5565b80612d2157506005826040518082805190602001908083835b60208310612ced5780518252601f199092019160209182019101612cce565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff16159150505b15612d7f5760408051808201825260048152631d9bda5960e21b60208083019182523360009081526007909152929092209051612d5e9290613297565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b612da981604051806040016040528060048152602001631d9bda5960e21b8152506131a5565b158015612e325750600360006004836040518082805190602001908083835b60208310612de75780518252601f199092019160209182019101612dc8565b51815160209384036101000a600019018019909216911617905292019485525060408051948590038201909420546001600160a01b0316855284019490945250016000205460ff1690505b15612fc3576000612e536002611e66600a548661278590919063ffffffff16565b600080546040519293506001600160a01b03169183156108fc0291849190818181858888f19350505050158015612e8e573d6000803e3d6000fd5b506004826040518082805190602001908083835b60208310612ec15780518252601f199092019160209182019101612ea2565b51815160209384036101000a600019018019909216911617905292019485525060405193849003018320546001600160a01b0316926108fc85150292508491506000818181858888f19350505050158015612f20573d6000803e3d6000fd5b506004826040518082805190602001908083835b60208310612f535780518252601f199092019160209182019101612f34565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185205486865290516001600160a01b03909116947f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a94508190039091019150a25061300e565b600054600a546001600160a01b03909116906108fc90612fe4908590612785565b6040518115909202916000818181858888f1935050505015801561300c573d6000803e3d6000fd5b505b5050565b8034111561305657600061302634836130b1565b604051909150339082156108fc029083906000818181858888f1935050505015801561300c573d6000803e3d6000fd5b50565b600081838161306457fe5b049392505050565b600080805b83518110156130aa576130a084828151811061308957fe5b6020026020010151836127aa90919063ffffffff16565b9150600101613071565b5092915050565b6000828211156130bd57fe5b50900390565b6060816130e857506040805180820190915260018152600360fc1b6020820152611002565b8160005b811561310057600101600a820491506130ec565b60608167ffffffffffffffff8111801561311957600080fd5b506040519080825280601f01601f191660200182016040528015613144576020820181803683370190505b509050815b851561319c57600019016000600a8704600a028703603001905060008160f81b90508084848151811061317857fe5b60200101906001600160f81b031916908160001a905350600a880497505050613149565b50949350505050565b600080836040516020018082805190602001908083835b602083106131db5780518252601f1990920191602091820191016131bc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012090506000836040516020018082805190602001908083835b6020831061324d5780518252601f19909201916020918201910161322e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012090508082149250505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106132d857805160ff1916838001178555613305565b82800160010185558215613305579182015b828111156133055782518255916020019190600101906132ea565b50612d7f9291505b80821115612d7f576000815560010161330d56fe4e6f7420656e6f756768204554482073656e742077697468207472616e73616374696f6e21546f74616c206e756d626572206f6620726563697069656e747320616e642076616c75657320617265206e6f7420657175616c46756e6374696f6e207265737472696374656420746f206f776e6572206f6620636f6e7472616374a26469706673582212207f7c3f03c312d641940ada8c37ebddb08dbb2d91434655ef18ee98c4af077cbf64736f6c634300060c0033

Deployed ByteCode Sourcemap

4031:21016:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15172:8;;;4031:21016;15108:8;;;16305:988;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16305:988:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16305:988:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16305:988:0;;;;;;;;;-1:-1:-1;16305:988:0;;;;-1:-1:-1;16305:988:0;;;;-1:-1:-1;;;;16305:988:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16305:988:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16305:988:0;;-1:-1:-1;16305:988:0;;-1:-1:-1;;;;;16305:988:0:i;:::-;;;;;;;;;;;;;;;;;;12403:142;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12403:142:0;-1:-1:-1;;;;;12403:142:0;;:::i;4570:19::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13440:327;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13440:327:0;;:::i;11512:397::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11512:397:0;-1:-1:-1;;;;;11512:397:0;;:::i;4345:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4345:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4345:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4345:51:0;;-1:-1:-1;4345:51:0;;-1:-1:-1;;;;;4345:51:0:i;4403:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4403:54:0;-1:-1:-1;;;;;4403:54:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4233:44;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4233:44:0;-1:-1:-1;;;;;4233:44:0;;:::i;10748:502::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10748:502:0;;;;;;;;;;;;;;;-1:-1:-1;;;10748:502:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10748:502:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10748:502:0;;-1:-1:-1;10748:502:0;;-1:-1:-1;;;;;10748:502:0:i;4284:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4284:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4284:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4284:54:0;;-1:-1:-1;4284:54:0;;-1:-1:-1;;;;;4284:54:0:i;:::-;;;;-1:-1:-1;;;;;4284:54:0;;;;;;;;;;;;;;18112:1152;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18112:1152:0;;;;;;;;-1:-1:-1;18112:1152:0;;-1:-1:-1;;;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18112:1152:0;;;;;;;;-1:-1:-1;18112:1152:0;;-1:-1:-1;;;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18112:1152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18112:1152:0;;-1:-1:-1;18112:1152:0;;-1:-1:-1;;;;;18112:1152:0:i;4118:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4118:51:0;-1:-1:-1;;;;;4118:51:0;;:::i;2567:80::-;;;;;;;;;;;;;:::i;2277:20::-;;;;;;;;;;;;;:::i;4532:31::-;;;;;;;;;;;;;:::i;4596:28::-;;;;;;;;;;;;;:::i;12801:291::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12801:291:0;-1:-1:-1;;;;;12801:291:0;;:::i;4464:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4464:51:0;-1:-1:-1;;;;;4464:51:0;;:::i;24573:471::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24573:471:0;;;;;;;;;;;;;;;;;:::i;9317:1124::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9317:1124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9317:1124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9317:1124:0;;-1:-1:-1;9317:1124:0;;-1:-1:-1;;;;;9317:1124:0:i;4178:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4178:48:0;-1:-1:-1;;;;;4178:48:0;;:::i;14831:220::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14831:220:0;;;;;;;;;;:::i;3267:256::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3267:256:0;-1:-1:-1;;;;;3267:256:0;;:::i;:::-;;20006:1205;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20006:1205:0;;;;;;;;;;;;;;;-1:-1:-1;;;20006:1205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20006:1205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20006:1205:0;;;;;;;;;-1:-1:-1;20006:1205:0;;;;-1:-1:-1;20006:1205:0;;;;-1:-1:-1;;;;20006:1205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20006:1205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20006:1205:0;;-1:-1:-1;20006:1205:0;;-1:-1:-1;;;;;20006:1205:0:i;21973:1339::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21973:1339:0;;;;;;;;;;;;;;;-1:-1:-1;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21973:1339:0;;;;;;;;-1:-1:-1;21973:1339:0;;-1:-1:-1;;;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21973:1339:0;;;;;;;;-1:-1:-1;21973:1339:0;;-1:-1:-1;;;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21973:1339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21973:1339:0;;-1:-1:-1;21973:1339:0;;-1:-1:-1;;;;;21973:1339:0:i;5774:239::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5774:239:0;;:::i;8724:270::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8724:270:0;-1:-1:-1;;;;;8724:270:0;;:::i;16305:988::-;16427:4;16454:13;16470:37;16493:13;;16470:11;:18;:22;;:37;;;;:::i;:::-;16454:53;;16518:17;16538:41;16573:5;16538:30;16549:11;:18;16538:6;:10;;:30;;;;:::i;:::-;:34;;:41::i;:::-;16518:61;;16627:9;16614;:22;;:52;;;-1:-1:-1;16655:10:0;16639:27;;;;:15;:27;;;;;;;;16614:52;16592:139;;;;-1:-1:-1;;;16592:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16764:29;16785:7;16764:20;:29::i;:::-;16844:10;16828:27;;;;:15;:27;;;;;;16754:39;;-1:-1:-1;16828:27:0;;16824:109;;16872:49;16893:11;:18;16913:7;16872:20;:49::i;:::-;16945:21;16956:9;16945:10;:21::i;:::-;16991:6;16987:175;17003:11;:18;17001:1;:20;16987:175;;;17072:1;-1:-1:-1;;;;;17046:28:0;:11;17058:1;17046:14;;;;;;;;;;;;;;-1:-1:-1;;;;;17046:28:0;;17043:108;;17103:11;17115:1;17103:14;;;;;;;;;;;;;;-1:-1:-1;;;;;17095:32:0;:40;17128:6;17095:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17043:108;17023:3;;16987:175;;;-1:-1:-1;17202:18:0;;17190:10;;17179:74;;17222:30;:6;17202:18;17222:10;:30::i;:::-;17179:74;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17281:4:0;;16305:988;-1:-1:-1;;;;;16305:988:0:o;12403:142::-;-1:-1:-1;;;;;12499:32:0;;12475:4;12499:32;;;:15;:32;;;;;;12534:3;-1:-1:-1;12403:142:0;;;;:::o;4570:19::-;;;;:::o;13440:327::-;13500:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13551:4:::1;;13539:8;:16;;:46;;;;;13584:1;13573:8;:12;13539:46;13517:79;;;::::0;::::1;;13624:4;::::0;13612:27:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;13650:4;:15:::0;;;13690:7:::1;13724:13;13690:7:::0;13657:8;13724:7:::1;:13::i;:::-;13708;:29:::0;-1:-1:-1;13755:4:0::1;::::0;13440:327;-1:-1:-1;;13440:327:0:o;11512:397::-;11577:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11602:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;11594:27;;;::::0;::::1;;-1:-1:-1::0;;;;;11632:18:0;::::1;11653:5;11632:18:::0;;;:11:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;11632:26:0::1;::::0;;11689:19:::1;:26:::0;;;;;;11669:47;;;;:19:::1;::::0;11689:26;11669:47;;;11689:26;;11669:47:::1;-1:-1:-1::0;;11632:26:0;11669:47;::::1;;11632:26;11669:47;::::0;;;::::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;11669:47:0;;;-1:-1:-1;;11669:47:0::1;::::0;;::::1;::::0;;;;;;;;:60;;-1:-1:-1;;;;;;11669:60:0::1;-1:-1:-1::0;;;;;11669:60:0;;::::1;;::::0;;11780:26;;::::1;-1:-1:-1::0;11780:26:0;;;:19:::1;:26:::0;;;;;11745:62;;11780:26;;11669:47;;;11780:26;;11745:62:::1;11669:60;-1:-1:-1::0;11745:62:0;::::1;;;-1:-1:-1::0;;11745:62:0;;;::::1;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;11745:62:0::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;;11745:62:0;::::1;::::0;-1:-1:-1;11745:62:0::1;::::0;;;::::1;11818:61;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;;;11818:26:0;::::1;-1:-1:-1::0;11818:26:0;;;:19:::1;:26:::0;;;;;;;:61;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;11897:4:0::1;::::0;11512:397;-1:-1:-1;;11512:397:0:o;4345:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4403:54::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4403:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4233:44::-;;;;;;;;;;;;;;;:::o;10748:502::-;10831:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10857:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;10856:19;10848:64;;;::::0;;-1:-1:-1;;;10848:64:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;10931:19:0;::::1;10923:28;;;::::0;::::1;;10971:19;10991:5;10971:26;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;10971:26:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;10971:26:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;10971:26:0::1;::::0;;;;;;;;;;::::1;;10970:27;::::0;-1:-1:-1;10962:36:0::1;::::0;-1:-1:-1;10962:36:0::1;;::::0;::::1;;11038:4;11009:19;11029:5;11009:26;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;11009:26:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;-1:-1:-1;;11009:26:0::1;::::0;;::::1;;;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;11009:26:0::1;::::0;;;;;;;;;;:33;;;::::1;;-1:-1:-1::0;;11009:33:0;;::::1;;::::0;;-1:-1:-1;;;;;11053:18:0;::::1;-1:-1:-1::0;11053:18:0;;;:11:::1;:18:::0;;;:25;;;;::::1;11009:26;11053:25;::::0;;;-1:-1:-1;;11089:26:0;;11065:5;;11089:19:::1;::::0;11109:5;;11009:26;;;;11089;;::::1;::::0;;11009;11089;::::1;;;;;;::::0;;;;-1:-1:-1;;11089:26:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;11089:26:0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;11089:26:0::1;::::0;;;;;;;;;;;:34;;-1:-1:-1;;;;;;11089:34:0::1;-1:-1:-1::0;;;;;11089:34:0;;::::1;;::::0;;11134:26;;::::1;-1:-1:-1::0;11134:26:0;;;:19:::1;:26:::0;;;;;;:34;;::::1;::::0;:26;;-1:-1:-1;11134:34:0;;::::1;::::0;-1:-1:-1;11134:34:0::1;:::i;:::-;;11214:5;11184:36;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;11184:36:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;::::0;;;::::1;::::0;;;::::1;;;-1:-1:-1::0;;11184:36:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;;;11184:36:0;::::1;::::0;-1:-1:-1;11184:36:0::1;::::0;-1:-1:-1;;11184:36:0::1;-1:-1:-1::0;11238:4:0::1;3089:1;10748:502:::0;;;;:::o;4284:54::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4284:54:0;;:::o;18112:1152::-;18244:4;18291:7;:14;18269:11;:18;:36;18261:100;;;;-1:-1:-1;;;18261:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18374:21;18398:26;18416:7;18398:17;:26::i;:::-;18374:50;;18435:13;18451:37;18474:13;;18451:11;:18;:22;;:37;;;;:::i;:::-;18435:53;-1:-1:-1;18499:17:0;18519:24;:13;18435:53;18519:17;:24::i;:::-;18499:44;;18591:9;18578;:22;;:53;;;-1:-1:-1;18620:10:0;18604:27;;;;:15;:27;;;;;;;;18578:53;18556:141;;;;-1:-1:-1;;;18556:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18738:29;18759:7;18738:20;:29::i;:::-;18808:10;18792:27;;;;:15;:27;;;;;;18728:39;;-1:-1:-1;18792:27:0;;18788:109;;18836:49;18857:11;:18;18877:7;18836:20;:49::i;:::-;18909:21;18920:9;18909:10;:21::i;:::-;18955:6;18951:201;18971:11;:18;18967:1;:22;18951:201;;;19040:1;-1:-1:-1;;;;;19014:28:0;:11;19026:1;19014:14;;;;;;;;;;;;;;-1:-1:-1;;;;;19014:28:0;;;:46;;;;;19059:1;19046:7;19054:1;19046:10;;;;;;;;;;;;;;:14;19014:46;19011:130;;;19089:11;19101:1;19089:14;;;;;;;;;;;;;;-1:-1:-1;;;;;19081:32:0;:44;19114:7;19122:1;19114:10;;;;;;;;;;;;;;19081:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19011:130;18991:3;;18951:201;;;-1:-1:-1;19200:18:0;;19177:57;;;;;;;;;;;;;;19188:10;;19177:57;;;;;;;;;-1:-1:-1;19252:4:0;;18112:1152;-1:-1:-1;;;;;;18112:1152:0:o;4118:51::-;;;;;;;;;;;;;:::o;2567:80::-;2607:7;2634:5;-1:-1:-1;;;;;2634:5:0;2567:80;:::o;2277:20::-;;;-1:-1:-1;;;;;2277:20:0;;:::o;4532:31::-;;;;:::o;4596:28::-;;;;:::o;12801:291::-;12878:7;12901:34;12919:15;12901:17;:34::i;:::-;12898:167;;;-1:-1:-1;;;;;13020:32:0;;12952:21;13020:32;;;:15;:32;;;;;;12977:3;;13002:51;;12977:3;;13002:17;:51::i;:::-;12995:58;;;;;12898:167;-1:-1:-1;13083:1:0;12801:291;;;:::o;4464:51::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4464:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24573:471;24689:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24727:29:0;::::1;::::0;;::::1;::::0;:70:::1;;-1:-1:-1::0;;;;;;24773:24:0;::::1;::::0;::::1;24727:70;:97;;;;;24823:1;24814:6;:10;24727:97;24705:130;;;::::0;::::1;;24907:34;::::0;;-1:-1:-1;;;24907:34:0;;-1:-1:-1;;;;;24907:34:0;;::::1;;::::0;::::1;::::0;;;;;;;;;24880:15;;24907:14;::::1;::::0;::::1;::::0;:34;;;;;::::1;::::0;;;;;;;;24846:18:::1;24907:14:::0;:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;24957:57:0::1;::::0;;-1:-1:-1;;;;;24957:57:0;;::::1;::::0;;;::::1;24907:34;24957:57:::0;::::1;::::0;;;;;;;;;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;25032:4:0::1;::::0;24573:471;-1:-1:-1;;;;24573:471:0:o;9317:1124::-;9434:10;9392:4;9418:27;;;:15;:27;;;;;;;;9417:28;9409:72;;;;;-1:-1:-1;;;9409:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9527:16;;9514:9;:29;;9626:26;9635:16;;9626:8;:26::i;:::-;9681:19;9690:9;9681:8;:19::i;:::-;9565:150;;;;;;-1:-1:-1;;;9565:150:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9565:150:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9565:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9565:150:0;;;;;;;;;;;;;-1:-1:-1;;9565:150:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9492:235;;;;;-1:-1:-1;;;9492:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9764:10:0;9748:27;;;;:15;:27;;;;;:34;;-1:-1:-1;;9748:34:0;9778:4;9748:34;;;9813:29;9834:7;9813:20;:29::i;:::-;9803:39;;9855:28;9866:16;;9855:10;:28::i;:::-;9908:31;9924:7;9908:31;;;;;;;;;;;;;-1:-1:-1;;;9908:31:0;;;:15;:31::i;:::-;9907:32;:77;;;;;9943:11;:41;9955:19;9975:7;9955:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9955:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9955:28:0;;;;;;;;;;;;;;;;-1:-1:-1;9955:28:0;;;;;;;;;;;;;-1:-1:-1;;;;;9955:28:0;9943:41;;;;;;;;-1:-1:-1;9943:41:0;-1:-1:-1;9943:41:0;;;;;-1:-1:-1;9907:77:0;9904:459;;;10009:5;;10025:16;;-1:-1:-1;;;;;10009:5:0;;;;10001:58;;10025:33;;10054:3;;10025:24;;10046:2;10025:20;:24::i;:::-;:28;;:33::i;:::-;10001:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10074:18;10095:33;10124:3;10095:24;10116:2;10095:16;;:20;;:24;;;;:::i;:33::-;10074:54;;10151:19;10171:7;10151:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10151:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10151:28:0;;;;;;;;;;;;;;;;-1:-1:-1;10151:28:0;;;;;;;;;;-1:-1:-1;;;;;10151:28:0;;10143:58;;;;;-1:-1:-1;10143:58:0;;-1:-1:-1;;10151:28:0;-1:-1:-1;10151:28:0;10143:58;10151:28;10143:58;;;;;;;;;;;;;;;;;;;;;10236:19;10256:7;10236:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10236:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10236:28:0;;;;;;;;;;;;;;;;-1:-1:-1;10236:28:0;;;;;;;;;;;;10221:56;;;;;-1:-1:-1;;;;;10236:28:0;;;;10221:56;;-1:-1:-1;10221:56:0;;;;;;;-1:-1:-1;10221:56:0;9904:459;;;;10318:5;;;10334:16;;10310:41;;-1:-1:-1;;;;;10318:5:0;;;;10310:41;;;;;;;10318:5;10310:41;10334:16;10318:5;10310:41;;;;;;;;;;;;;;;;;;;;;9904:459;10378:32;;10399:10;;10378:32;;;;;-1:-1:-1;10428:4:0;9317:1124;;;:::o;4178:48::-;;;;;;;;;;;;;;;:::o;14831:220::-;15006:37;;;-1:-1:-1;;;15006:37:0;;-1:-1:-1;;;;;15006:37:0;;;;;;;15037:4;15006:37;;;;;;14918:7;;14972:15;;15006;;;;;;:37;;;;;;;;;;;;;;;:15;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15006:37:0;;14831:220;-1:-1:-1;;;;14831:220:0:o;3267:256::-;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3363:23:0;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;3416:5:0::1;::::0;-1:-1:-1;;;;;3403:18:0;;::::1;3416:5:::0;::::1;3403:18;;3363:58;3341:92;;;::::0;::::1;;3470:5;::::0;;3449:38:::1;::::0;-1:-1:-1;;;;;3449:38:0;;::::1;::::0;3470:5;::::1;::::0;3449:38:::1;::::0;::::1;3498:5;:17:::0;;-1:-1:-1;;;;;;3498:17:0::1;-1:-1:-1::0;;;;;3498:17:0;;;::::1;::::0;;;::::1;::::0;;3267:256::o;20006:1205::-;20276:13;;20253:18;;20157:4;;20208:15;;20157:4;;20253:37;;:18;:22;:37::i;:::-;20237:53;;20338:5;20325:9;:18;;:56;;;;20347:34;20365:15;20347:17;:34::i;:::-;20325:87;;;-1:-1:-1;20401:10:0;20385:27;;;;:15;:27;;;;;;;;20325:87;20303:174;;;;-1:-1:-1;;;20303:174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20490:17;20501:5;20490:10;:17::i;:::-;20530:29;20551:7;20530:20;:29::i;:::-;20520:39;;20584:6;20580:193;20600:11;:18;20596:1;:22;20580:193;;;20669:1;-1:-1:-1;;;;;20643:28:0;:11;20655:1;20643:14;;;;;;;;;;;;;;-1:-1:-1;;;;;20643:28:0;;20640:122;;20692:5;-1:-1:-1;;;;;20692:18:0;;20711:10;20723:11;20735:1;20723:14;;;;;;;;;;;;;;20739:6;20692:54;;;;;;;;;;;;;-1:-1:-1;;;;;20692:54:0;;;;;;-1:-1:-1;;;;;20692:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20640:122;20620:3;;20580:193;;;;20786:34;20804:15;20786:17;:34::i;:::-;20783:320;;;20909:18;;-1:-1:-1;;;;;20872:32:0;;;;;;:15;:32;;;;;;:56;;:36;:56::i;:::-;-1:-1:-1;;;;;20837:32:0;;;;;;:15;:32;;;;;:91;20783:320;;;20981:10;20965:27;;;;:15;:27;;;;;;;;20961:117;;21013:49;21034:11;:18;21054:7;21013:20;:49::i;:::-;21162:18;;21120:61;;;;;;;-1:-1:-1;;;;;21120:61:0;;;21133:10;;21120:61;;;;;;;;;-1:-1:-1;21199:4:0;;20006:1205;-1:-1:-1;;;;;;20006:1205:0:o;21973:1339::-;22241:14;;22219:18;;22133:4;;22184:15;;22219:36;22211:100;;;;-1:-1:-1;;;22211:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22324:13;22340:37;22363:13;;22340:11;:18;:22;;:37;;;;:::i;:::-;22324:53;;22425:5;22412:9;:18;;:56;;;;22434:34;22452:15;22434:17;:34::i;:::-;22412:87;;;-1:-1:-1;22488:10:0;22472:27;;;;:15;:27;;;;;;;;22412:87;22390:174;;;;-1:-1:-1;;;22390:174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22577:17;22588:5;22577:10;:17::i;:::-;22625:29;22646:7;22625:20;:29::i;:::-;22615:39;;22679:6;22675:215;22695:11;:18;22691:1;:22;22675:215;;;22764:1;-1:-1:-1;;;;;22738:28:0;:11;22750:1;22738:14;;;;;;;;;;;;;;-1:-1:-1;;;;;22738:28:0;;;:46;;;;;22783:1;22770:7;22778:1;22770:10;;;;;;;;;;;;;;:14;22738:46;22735:144;;;22805:5;-1:-1:-1;;;;;22805:18:0;;22824:10;22836:11;22848:1;22836:14;;;;;;;;;;;;;;22852:7;22860:1;22852:10;;;;;;;;;;;;;;22805:58;;;;;;;;;;;;;-1:-1:-1;;;;;22805:58:0;;;;;;-1:-1:-1;;;;;22805:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22735:144;22715:3;;22675:215;;5774:239;5842:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5874:1:::1;5867:4;:8;:36;;;;;5887:16;;5879:4;:24;;5867:36;5859:45;;;::::0;::::1;;5915:16;:23:::0;;;5954:29:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;6001:4:0::1;5774:239:::0;;;:::o;8724:270::-;8796:4;3028:5;;-1:-1:-1;;;;;3028:5:0;3014:10;:19;3006:72;;;;-1:-1:-1;;;3006:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8822:22:0;::::1;;::::0;;;:15:::1;:22;::::0;;;;;::::1;;8821:23;8813:67;;;::::0;;-1:-1:-1;;;8813:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;8891:22:0;::::1;;::::0;;;:15:::1;:22;::::0;;;;;:29;;-1:-1:-1;;8891:29:0::1;8916:4;8891:29;::::0;;8936:27;::::1;::::0;8891:22;8936:27:::1;-1:-1:-1::0;8981:4:0::1;8724:270:::0;;;:::o;934:432::-;992:9;1238:6;1234:47;;-1:-1:-1;1268:1:0;1261:8;;1234:47;-1:-1:-1;1305:5:0;;;1309:1;1305;:5;:1;1328:5;;;;;:10;1321:18;;;2089:147;2147:7;2179:5;;;2202:6;;;;2195:14;;;;2227:1;2089:147;-1:-1:-1;;;2089:147:0:o;7366:1065::-;7508:10;7491:28;;;;:16;:28;;;;;;;;;7475:53;;;;;;;;;;;-1:-1:-1;;7475:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;7436:13;;7475:53;;;;7491:28;7475:53;;7491:28;7475:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7475:53:0;;;:15;:53::i;:::-;:99;;;;7533:11;:41;7545:19;7565:7;7545:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7545:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7545:28:0;;;;;;;;;;;;;;;;-1:-1:-1;7545:28:0;;;;;;;;;;;;;-1:-1:-1;;;;;7545:28:0;7533:41;;;;;;;;-1:-1:-1;7533:41:0;-1:-1:-1;7533:41:0;;;;7532:42;;-1:-1:-1;7475:99:0;7472:196;;;7591:37;;;;;;;;;;;-1:-1:-1;;;7591:37:0;;;;;;;7608:10;-1:-1:-1;7591:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;-1:-1:-1;;7643:13:0;;;;;;;;;;;;-1:-1:-1;;;7643:13:0;;;;;;7472:196;7692:28;7708:7;7692:28;;;;;;;;;;;;:15;:28::i;:::-;7691:29;:81;;;;-1:-1:-1;7757:10:0;7740:28;;;;:16;:28;;;;;;;;;7724:48;;;;;;-1:-1:-1;;7724:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7740:28;7724:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:48::i;:::-;7691:179;;;;;7842:19;7862:7;7842:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7842:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7842:28:0;;;;;;;;;;;;;;;;-1:-1:-1;7842:28:0;;;;;;;;;;;;;;-1:-1:-1;;7691:179:0;7688:358;;;7922:10;-1:-1:-1;;;;;7890:42:0;:19;7910:7;7890:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7890:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7890:28:0;;;;;;;;;;;;;;;;-1:-1:-1;7890:28:0;;;;;;;;;;;-1:-1:-1;;;;;7890:28:0;:42;;;;7887:95;;-1:-1:-1;7887:95:0;;-1:-1:-1;7887:95:0;-1:-1:-1;7953:13:0;;;;;;;;;;;;-1:-1:-1;;;7953:13:0;;;;;;7887:95;8013:10;7996:28;;;;:16;:28;;;;;;;;:38;;;;;;;;:::i;:::-;;7688:358;8061:27;8077:7;8061:27;;;;;;;;;;;;:15;:27::i;:::-;:80;;;;-1:-1:-1;8126:10:0;8109:28;;;;:16;:28;;;;;;;;;8093:48;;;;;;-1:-1:-1;;8093:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8109:28;8093:48;;;;;;;;;;;;;;;;;;;;;;;;;8092:49;8061:80;8058:150;;;8185:10;8168:28;;;;:16;:28;;;;;;;;;8158:38;;;;;;-1:-1:-1;;8158:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8168:28;;8158:38;;8168:28;8158:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8058:150;8232:27;8248:7;8232:27;;;;;;;;;;;;:15;:27::i;:::-;:60;;;;8264:19;8284:7;8264:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8264:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8264:28:0;;;;;;;;;;;;;;;;-1:-1:-1;8264:28:0;;;;;;;;;;;;;8263:29;;-1:-1:-1;;8232:60:0;8229:160;;;8309:37;;;;;;;;;;;-1:-1:-1;;;8309:37:0;;;;;;;8326:10;-1:-1:-1;8309:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;;8361:16;;;;;;;;;;;;;-1:-1:-1;;;8361:16:0;;;;;8229:160;-1:-1:-1;8416:7:0;7366:1065::o;23398:544::-;23491:31;23507:7;23491:31;;;;;;;;;;;;;-1:-1:-1;;;23491:31:0;;;:15;:31::i;:::-;23490:32;:77;;;;;23526:11;:41;23538:19;23558:7;23538:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23538:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23538:28:0;;;;;;;;;;;;;;;;-1:-1:-1;23538:28:0;;;;;;;;;;;;;-1:-1:-1;;;;;23538:28:0;23526:41;;;;;;;;-1:-1:-1;23526:41:0;-1:-1:-1;23526:41:0;;;;;-1:-1:-1;23490:77:0;23487:448;;;23584:19;23606:32;23636:1;23606:25;23617:13;;23606:6;:10;;:25;;;;:::i;:32::-;23661:5;;;23653:36;;23584:54;;-1:-1:-1;;;;;;23661:5:0;;23653:36;;;;;23584:54;;23653:36;;23661:5;23653:36;23584:54;23661:5;23653:36;;;;;;;;;;;;;;;;;;;;;23712:19;23732:7;23712:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23712:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23712:28:0;;;;;;;;;;;;;;;;-1:-1:-1;23712:28:0;;;;;;;;;;-1:-1:-1;;;;;23712:28:0;;23704:59;;;;;-1:-1:-1;23704:59:0;;-1:-1:-1;;23712:28:0;-1:-1:-1;23712:28:0;23704:59;23712:28;23704:59;;;;;;;;;;;;;;;;;;;;;23798:19;23818:7;23798:28;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23798:28:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23798:28:0;;;;;;;;;;;;;;;;-1:-1:-1;23798:28:0;;;;;;;;;;;;23783:57;;;;;-1:-1:-1;;;;;23798:28:0;;;;23783:57;;-1:-1:-1;23783:57:0;;;;;;;-1:-1:-1;23783:57:0;23487:448;;;;23881:5;;23908:13;;-1:-1:-1;;;;;23881:5:0;;;;23873:50;;23897:25;;:6;;:10;:25::i;:::-;23873:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23487:448;23398:544;;:::o;6811:202::-;6882:6;6870:9;:18;6867:139;;;6905:14;6922:21;:9;6936:6;6922:13;:21::i;:::-;6958:36;;6905:38;;-1:-1:-1;6966:10:0;;6958:36;;;;;6905:38;;6958:36;;;;6905:38;6966:10;6958:36;;;;;;;;;;;;;;;;;;;6867:139;6811:202;:::o;1467:295::-;1525:7;1753:1;1749;:5;;;;;;;1467:295;-1:-1:-1;;;1467:295:0:o;17313:262::-;17388:7;;;17439:103;17459:7;:14;17455:1;:18;17439:103;;;17506:24;17519:7;17527:1;17519:10;;;;;;;;;;;;;;17506:8;:12;;:24;;;;:::i;:::-;17495:35;-1:-1:-1;17475:3:0;;17439:103;;;-1:-1:-1;17559:8:0;17313:262;-1:-1:-1;;17313:262:0:o;1889:123::-;1947:7;1979:1;1974;:6;;1967:14;;;;-1:-1:-1;1999:5:0;;;1889:123::o;6027:573::-;6077:27;6121:7;6117:50;;-1:-1:-1;6145:10:0;;;;;;;;;;;;-1:-1:-1;;;6145:10:0;;;;;;6117:50;6186:2;6177:6;6218:69;6225:6;;6218:69;;6248:5;;6273:2;6268:7;;;;6218:69;;;6297:17;6327:3;6317:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6317:14:0;-1:-1:-1;6297:34:0;-1:-1:-1;6351:3:0;6365:198;6372:7;;6365:198;;-1:-1:-1;;6400:3:0;6418:10;6453:2;6448;:7;6458:2;6448:12;6443:2;:17;6432:2;:29;6418:44;;6477:9;6496:4;6489:12;;6477:24;;6526:2;6516:4;6521:1;6516:7;;;;;;;;;;;:12;-1:-1:-1;;;;;6516:12:0;;;;;;;;-1:-1:-1;6549:2:0;6543:8;;;;6365:198;;;;;-1:-1:-1;6587:4:0;6027:573;-1:-1:-1;;;;6027:573:0:o;15401:245::-;15484:4;15501:13;15544:2;15527:20;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15527:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15517:31;;;;;;15501:47;;15559:13;15602:2;15585:20;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15585:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15575:31;;;;;;15559:47;;15633:5;15624;:14;15617:21;;;;15401:245;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://7f7c3f03c312d641940ada8c37ebddb08dbb2d91434655ef18ee98c4af077cbf
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading