ETH Price: $3,312.85 (-2.11%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim204293692024-07-31 21:58:47177 days ago1722463127IN
0x084FE7aa...E1aEaB183
0 ETH0.001122578.27746843
Transfer199903762024-05-31 14:22:23239 days ago1717165343IN
0x084FE7aa...E1aEaB183
0 ETH0.0034783334.66543989
Set Multiple Exl...199902072024-05-31 13:48:23239 days ago1717163303IN
0x084FE7aa...E1aEaB183
0 ETH0.0219885120.15331319
Set Multiple Exl...199901842024-05-31 13:43:47239 days ago1717163027IN
0x084FE7aa...E1aEaB183
0 ETH0.0270698514.62385109
Approve183902422023-10-20 8:07:11463 days ago1697789231IN
0x084FE7aa...E1aEaB183
0 ETH0.0002745811.25777119
Approve183902372023-10-20 8:06:11463 days ago1697789171IN
0x084FE7aa...E1aEaB183
0 ETH0.0002894911.86875291
Approve183902362023-10-20 8:05:59463 days ago1697789159IN
0x084FE7aa...E1aEaB183
0 ETH0.0002824211.57908005
Approve169203112023-03-27 17:49:47669 days ago1679939387IN
0x084FE7aa...E1aEaB183
0 ETH0.0009014136.95699521
Approve169203062023-03-27 17:48:47669 days ago1679939327IN
0x084FE7aa...E1aEaB183
0 ETH0.0009556139.17910899
Alow Claims162425352022-12-22 20:08:35764 days ago1671739715IN
0x084FE7aa...E1aEaB183
0 ETH0.0005306118.44983462
Transfer162424142022-12-22 19:44:11764 days ago1671738251IN
0x084FE7aa...E1aEaB183
0 ETH0.0048047319.3878405
Set Exclude From...162424122022-12-22 19:43:47764 days ago1671738227IN
0x084FE7aa...E1aEaB183
0 ETH0.0008007117.25012375
Approve161917492022-12-15 18:01:11771 days ago1671127271IN
0x084FE7aa...E1aEaB183
0 ETH0.0016608535.58331675
Approve159634702022-11-13 20:23:23803 days ago1668371003IN
0x084FE7aa...E1aEaB183
0 ETH0.0004814219.7380027
Approve159219062022-11-08 1:04:23809 days ago1667869463IN
0x084FE7aa...E1aEaB183
0 ETH0.001278727.39589253
Approve156618322022-10-02 17:02:47845 days ago1664730167IN
0x084FE7aa...E1aEaB183
0 ETH0.000140195.7476794
Claim154017142022-08-24 7:56:16885 days ago1661327776IN
0x084FE7aa...E1aEaB183
0 ETH0.0015679811.37739781
Claim154016972022-08-24 7:52:21885 days ago1661327541IN
0x084FE7aa...E1aEaB183
0 ETH0.0014750510.70303971
Set Blacklist153997982022-08-24 0:34:40885 days ago1661301280IN
0x084FE7aa...E1aEaB183
0 ETH0.000225559.2034034
Set Blacklist153990232022-08-23 21:29:32885 days ago1661290172IN
0x084FE7aa...E1aEaB183
0 ETH0.0005727721.60767723
Approve153876892022-08-22 2:33:19887 days ago1661135599IN
0x084FE7aa...E1aEaB183
0 ETH0.000289416.20059712
Approve153806992022-08-21 0:06:27888 days ago1661040387IN
0x084FE7aa...E1aEaB183
0 ETH0.000280056
Transfer153793002022-08-20 18:57:42888 days ago1661021862IN
0x084FE7aa...E1aEaB183
0 ETH0.0053694138.09227986
Approve153735352022-08-19 20:57:50889 days ago1660942670IN
0x084FE7aa...E1aEaB183
0 ETH0.001376429.48905289
Set Blacklist153712492022-08-19 12:19:21890 days ago1660911561IN
0x084FE7aa...E1aEaB183
0 ETH0.0002996812.23386875
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
154038122022-08-24 15:58:06884 days ago1661356686
0x084FE7aa...E1aEaB183
0.01768739 ETH
154038122022-08-24 15:58:06884 days ago1661356686
0x084FE7aa...E1aEaB183
0.01768739 ETH
153698192022-08-19 6:36:51890 days ago1660891011
0x084FE7aa...E1aEaB183
0.01692351 ETH
153698192022-08-19 6:36:51890 days ago1660891011
0x084FE7aa...E1aEaB183
0.01692351 ETH
153686812022-08-19 2:22:42890 days ago1660875762
0x084FE7aa...E1aEaB183
0.02855624 ETH
153686772022-08-19 2:22:01890 days ago1660875721
0x084FE7aa...E1aEaB183
0.00815474 ETH
153616902022-08-17 23:53:14891 days ago1660780394
0x084FE7aa...E1aEaB183
0.03015622 ETH
153616902022-08-17 23:53:14891 days ago1660780394
0x084FE7aa...E1aEaB183
0.03015622 ETH
153616902022-08-17 23:53:14891 days ago1660780394
0x084FE7aa...E1aEaB183
0.00128638 ETH
153616902022-08-17 23:53:14891 days ago1660780394
0x084FE7aa...E1aEaB183
0.00271369 ETH
153616902022-08-17 23:53:14891 days ago1660780394
0x084FE7aa...E1aEaB183
0.01628216 ETH
153616902022-08-17 23:53:14891 days ago1660780394
0x084FE7aa...E1aEaB183
0.00814108 ETH
153616902022-08-17 23:53:14891 days ago1660780394
0x084FE7aa...E1aEaB183
0.02713693 ETH
153606052022-08-17 19:39:43891 days ago1660765183
0x084FE7aa...E1aEaB183
0.03887083 ETH
153606052022-08-17 19:39:43891 days ago1660765183
0x084FE7aa...E1aEaB183
0.03887083 ETH
153598702022-08-17 16:48:34891 days ago1660754914
0x084FE7aa...E1aEaB183
0.00137524 ETH
153598702022-08-17 16:48:34891 days ago1660754914
0x084FE7aa...E1aEaB183
0.00290116 ETH
153598702022-08-17 16:48:34891 days ago1660754914
0x084FE7aa...E1aEaB183
0.01740697 ETH
153598702022-08-17 16:48:34891 days ago1660754914
0x084FE7aa...E1aEaB183
0.00870348 ETH
153598702022-08-17 16:48:34891 days ago1660754914
0x084FE7aa...E1aEaB183
0.02901162 ETH
153587882022-08-17 12:41:36892 days ago1660740096
0x084FE7aa...E1aEaB183
0.0016866 ETH
153587882022-08-17 12:41:36892 days ago1660740096
0x084FE7aa...E1aEaB183
0.00355604 ETH
153587882022-08-17 12:41:36892 days ago1660740096
0x084FE7aa...E1aEaB183
0.02133627 ETH
153587882022-08-17 12:41:36892 days ago1660740096
0x084FE7aa...E1aEaB183
0.01066813 ETH
153587882022-08-17 12:41:36892 days ago1660740096
0x084FE7aa...E1aEaB183
0.03556046 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BFF

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-21
*/

// File: contracts/BFF.sol

/**
 *Submitted for verification at Etherscan.io on 2022-06-21
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

library Counters {
    struct Counter {
        uint256 _value;
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

contract Ownable {
    address private _owner;
    address private _previousOwner;
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}

interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
     
    function createPair(address tokenA, address tokenB) external returns (address pair);
 }

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    function removeLiquidityETH(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountToken, uint amountETH); 
}

library Referrals {

    struct Data {
        uint256 tokensNeededForRefferalNumber;
        mapping(uint256 => address) registeredReferrersByCode;
        mapping(address => uint256) registeredReferrersByAddress;
        uint256 currentRefferralCode;
    }

    event RefferalCodeGenerated(address account, uint256 code, uint256 inc1, uint256 inc2);


    event UpdateTokensNeededForReferralNumber(uint256 value);


    function init(Data storage data) public {
        updateTokensNeededForReferralNumber(data, 10000 * (10**18)); //10000 tokens needed

        data.currentRefferralCode = 10000;
    }

    function updateTokensNeededForReferralNumber(Data storage data, uint256 value) public {
        data.tokensNeededForRefferalNumber = value;
        emit UpdateTokensNeededForReferralNumber(value);
    }

    function random(Data storage data, uint256 min, uint256 max) private view returns (uint256) {
        return min + uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp, data.currentRefferralCode))) % (max - min + 1);
    }

    function handleNewBalance(Data storage data, address account, uint256 balance) public {
        //already registered
        if(data.registeredReferrersByAddress[account] != 0) {
            return;
        }
        //not enough tokens
        if(balance < data.tokensNeededForRefferalNumber) {
            return;
        }
        //randomly increment referral code 
        //cannot be guessed easily
        uint256 inc1 = random(data, 1, 7);
        uint256 inc2 = random(data, 1, 9);
        data.currentRefferralCode += inc1;

        //don't allow referral code to end in 0,
        //so that ambiguous codes do not exist (ie, 420 and 4200)
        if(data.currentRefferralCode % 10 == 0) {
            data.currentRefferralCode += inc2;
        }

        if(data.currentRefferralCode < 10000) {
            uint256 inc3 = random(data, 51, 35156);
            data.currentRefferralCode = 10000;
            data.currentRefferralCode += inc3;

            if(data.currentRefferralCode % 10 == 0) {
            data.currentRefferralCode += inc2;
        }
        }
        
        if(data.currentRefferralCode > 99999) {
            uint256 inc4 = random(data, 111, 65644);
            data.currentRefferralCode = 10000;
            data.currentRefferralCode += inc4;

            if(data.currentRefferralCode % 10 == 0) {
            data.currentRefferralCode += inc2;
        }
        }

        if(data.registeredReferrersByCode[data.currentRefferralCode] != address(0)) {
            data.currentRefferralCode += inc2;
        }
        
        data.registeredReferrersByCode[data.currentRefferralCode] = account;
        data.registeredReferrersByAddress[account] = data.currentRefferralCode;

        emit RefferalCodeGenerated(account, data.currentRefferralCode, inc1, inc2);
    }

    function getReferralCode(Data storage referrals, address account) public view returns (uint256) {
        return referrals.registeredReferrersByAddress[account];
    }

    function getReferrer(Data storage referrals, uint256 referralCode) public view returns (address) {
        return referrals.registeredReferrersByCode[referralCode];
    }

    function getReferralCodeFromTokenAmount(uint256 tokenAmount) private pure returns (uint256) {

        return (tokenAmount % (10**18))/(10**(13));

    }

    function getReferrerFromTokenAmount(Data storage referrals, uint256 tokenAmount) public view returns (address) {
        uint256 referralCode = getReferralCodeFromTokenAmount(tokenAmount);

        return referrals.registeredReferrersByCode[referralCode];
    }

    function isValidReferrer(Data storage referrals, address referrer, uint256 referrerBalance, address transferTo) public view returns (bool) {
        if(referrer == address(0)) {
            return false;
        }

        uint256 tokensNeeded = referrals.tokensNeededForRefferalNumber;

        return referrerBalance >= tokensNeeded && referrer != transferTo;
    }
}

library SignedSafeMath {
    function mul(int256 a, int256 b) internal pure returns (int256) {
        return a * b;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        return a - b;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        return a + b;
    }
}

library UniswapV2PriceImpactCalculator {
    function calculateSellPriceImpact(address tokenAddress, address pairAddress, uint256 value) public view returns (uint256) {
        value = value * 998 / 1000;

        IUniswapV2Pair pair = IUniswapV2Pair(pairAddress);

        (uint256 r0, uint256 r1,) = pair.getReserves();

        IERC20Metadata token0 = IERC20Metadata(pair.token0());
        IERC20Metadata token1 = IERC20Metadata(pair.token1());

        if(address(token1) == tokenAddress) {
            IERC20Metadata tokenTemp = token0;
            token0 = token1;
            token1 = tokenTemp;

            uint256 rTemp = r0;
            r0 = r1;
            r1 = rTemp;
        }

        uint256 product = r0 * r1;

        uint256 r0After = r0 + value;
        uint256 r1After = product / r0After;

        return (10000 - (r1After * 10000 / r1)) * 998 / 1000;
    }
}

library SafeCast {
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(
            value <= type(uint224).max,
            "SafeCast: value doesn't fit in 224 bits"
        );
        return uint224(value);
    }

    function toUint128(uint256 value) internal pure returns (uint128) {
        require(
            value <= type(uint128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return uint128(value);
    }

    function toUint96(uint256 value) internal pure returns (uint96) {
        require(
            value <= type(uint96).max,
            "SafeCast: value doesn't fit in 96 bits"
        );
        return uint96(value);
    }

    function toUint64(uint256 value) internal pure returns (uint64) {
        require(
            value <= type(uint64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return uint64(value);
    }

    function toUint32(uint256 value) internal pure returns (uint32) {
        require(
            value <= type(uint32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return uint32(value);
    }

    function toUint16(uint256 value) internal pure returns (uint16) {
        require(
            value <= type(uint16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return uint16(value);
    }

    function toUint8(uint256 value) internal pure returns (uint8) {
        require(
            value <= type(uint8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return uint8(value);
    }

    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    function toInt128(int256 value) internal pure returns (int128) {
        require(
            value >= type(int128).min && value <= type(int128).max,
            "SafeCast: value doesn't fit in 128 bits"
        );
        return int128(value);
    }

    function toInt64(int256 value) internal pure returns (int64) {
        require(
            value >= type(int64).min && value <= type(int64).max,
            "SafeCast: value doesn't fit in 64 bits"
        );
        return int64(value);
    }

    function toInt32(int256 value) internal pure returns (int32) {
        require(
            value >= type(int32).min && value <= type(int32).max,
            "SafeCast: value doesn't fit in 32 bits"
        );
        return int32(value);
    }

    function toInt16(int256 value) internal pure returns (int16) {
        require(
            value >= type(int16).min && value <= type(int16).max,
            "SafeCast: value doesn't fit in 16 bits"
        );
        return int16(value);
    }

    function toInt8(int256 value) internal pure returns (int8) {
        require(
            value >= type(int8).min && value <= type(int8).max,
            "SafeCast: value doesn't fit in 8 bits"
        );
        return int8(value);
    }

    function toInt256(uint256 value) internal pure returns (int256) {
        require(
            value <= uint256(type(int256).max),
            "SafeCast: value doesn't fit in an int256"
        );
        return int256(value);
    }
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(
        address indexed to,
        uint256 weiAmount,
        address received
    );
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner)
        external
        view
        returns (uint256);

    function withdrawnDividendOf(address _owner)
        external
        view
        returns (uint256);

    function accumulativeDividendOf(address _owner)
        external
        view
        returns (uint256);
}

abstract contract DividendPayingToken is
    ERC20,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SignedSafeMath for int256;
    using SafeCast for uint256;
    using SafeCast for int256;
    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override {
        require(totalSupply() > 0);

        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);

            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender), payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user, address payable to)
        internal
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend, to);
            (bool success, ) = to.call{value: _withdrawableDividend}("");

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256() / magnitude;
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256());
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }

    function getAccount(address _account)
        public
        view
        returns (uint256 _withdrawableDividends, uint256 _withdrawnDividends)
    {
        _withdrawableDividends = withdrawableDividendOf(_account);
        _withdrawnDividends = withdrawnDividends[_account];
    }
}

contract BFFDividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private tokenHoldersCount;
    mapping(address => bool) private tokenHoldersMap;

    mapping(address => bool) public excludedFromDividends;

    uint256 public immutable minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);

    constructor()
        DividendPayingToken(
            "BFF_Dividend_Tracker",
            "BFF_Dividend_Tracker"
        )
    {
        minimumTokenBalanceForDividends = 10000 * 10**18;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function _approve(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "BFF_Dividend_Tracker: No approvals allowed");
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "BFF_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "BFF_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main BFF contract."
        );
    }

    function excludeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = true;

        _setBalance(account, 0);

        if (tokenHoldersMap[account] == true) {
            tokenHoldersMap[account] = false;
            tokenHoldersCount.decrement();
        }

        emit ExcludeFromDividends(account);
    }

    function includeFromDividends(address account, uint256 balance)
        external
        onlyOwner
    {
        excludedFromDividends[account] = false;

        if (balance >= minimumTokenBalanceForDividends) {
            _setBalance(account, balance);

            if (tokenHoldersMap[account] == false) {
                tokenHoldersMap[account] = true;
                tokenHoldersCount.increment();
            }
        }

        emit ExcludeFromDividends(account);
    }

    function isExcludeFromDividends(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return excludedFromDividends[account];
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersCount.current();
    }

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);

            if (tokenHoldersMap[account] == false) {
                tokenHoldersMap[account] = true;
                tokenHoldersCount.increment();
            }
        } else {
            _setBalance(account, 0);

            if (tokenHoldersMap[account] == true) {
                tokenHoldersMap[account] = false;
                tokenHoldersCount.decrement();
            }
        }
    }

    function processAccount(address account, address toAccount)
        public
        onlyOwner
        returns (uint256)
    {
        uint256 amount = _withdrawDividendOfUser(
            payable(account),
            payable(toAccount)
        );
        return amount;
    }
}

contract BFF is ERC20, Ownable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;
    using Referrals for Referrals.Data;

    string private constant _name = "By Frens For Frens";
    string private constant _symbol = "BFF";
    uint8 private constant _decimals = 18;
    uint256 private constant _tTotal = 1e12 * 10**18;

    IUniswapV2Router02 private uniswapV2Router =
        IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    bool private tradingOpen = false;
    bool private allowClaims = false;
    uint256 private launchBlock = 0;
    address private uniswapV2Pair;

    IERC20 private PreSaleTokenAddress;
    uint256 private minimumPreSaleTokens;
    uint256 private preSaleTimestamp;
    uint256 private minutesForPreSale;
    uint256 private publicSaleTimestamp;
    bool private preSaleActive = false;

    mapping(address => bool) private automatedMarketMakerPairs;
    mapping(address => bool) public isExcludeFromFee;
    mapping(address => bool) public isBlacklist;
    mapping(address => bool) public isAllowedToClaim;
    mapping(address => bool) public isBot;
    mapping(address => bool) public isExcludeFromMaxWalletAmount;

    uint256 public maxWalletAmount;

    uint256 public baseBuyTax = 10;
    uint256 public baseSellTax = 5;
    uint256 public referralBuyTax = 5;
    uint256 public referrerBonus = 25; // 2.5% division in tenths to support
    uint256 public referredBonus = 25; // 2.5% division in tenths to support

    uint256 private autoLP = 20;
    uint256 private devFee = 10;
    uint256 private marketingFee = 70;

    uint256 public minContractTokensToSwap = 2e9 * 10**18;

    struct PriceImpactRangeTax {
        uint256 from;
        uint256 to;
        uint256 tax;
    }

    mapping(address => uint256) public initialBuyTimestamp;
    mapping(uint256 => PriceImpactRangeTax) public priceImpactRangeTaxes;
    uint8 public maxIndexImpactRange;

    address private devWalletAddress;
    address private marketingWalletAddress;

    BFFDividendTracker public dividendTracker;
    uint256 minimumTokenBalanceForDividends = 1000 * 10**18;
    mapping(address => uint256) public lastTransfer;

    uint256 public pendingTokensForReward;
    uint256 public minRewardTokensToSwap = 10000 * 10**18;

    uint256 public pendingEthReward;

    struct ClaimedEth {
        uint256 ethAmount;
        uint256 tokenAmount;
        uint256 timestamp;
    }

    Counters.Counter private claimedHistoryIds;
    Referrals.Data private _storage;

    mapping(uint256 => ClaimedEth) private claimedEthMap;
    mapping(address => uint256[]) private userClaimedIds;

    event BuyFees(address from, address to, uint256 amountTokens);
    event SellFees(address from, address to, uint256 amountTokens);
    event AddLiquidity(uint256 amountTokens, uint256 amountEth);
    event SwapTokensForEth(uint256 sentTokens, uint256 receivedEth);
    event SwapEthForTokens(uint256 sentEth, uint256 receivedTokens);
    event DistributeFees(uint256 devEth, uint256 remarketingEth);
    event AddRewardPool(uint256 _ethAmount);

    event SendDividends(uint256 amount);

    event DividendClaimed(
        uint256 ethAmount,
        uint256 tokenAmount,
        address account
    );

    constructor(
        address _devWalletAddress,
        address _marketingWalletAddress
    ) ERC20(_name, _symbol) {
        devWalletAddress = _devWalletAddress;
        marketingWalletAddress = _marketingWalletAddress;

        maxWalletAmount = (_tTotal * 25) / 10000; // 0.25% maxWalletAmount (initial limit)

        dividendTracker = new BFFDividendTracker();
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(uniswapV2Router));

        isExcludeFromFee[owner()] = true;
        isExcludeFromFee[address(this)] = true;
        isExcludeFromFee[address(dividendTracker)] = true;
        isExcludeFromFee[devWalletAddress] = true;
        isExcludeFromFee[marketingWalletAddress] = true;
        isExcludeFromMaxWalletAmount[owner()] = true;
        isExcludeFromMaxWalletAmount[address(this)] = true;
        isExcludeFromMaxWalletAmount[address(uniswapV2Router)] = true;
        isExcludeFromMaxWalletAmount[devWalletAddress] = true;
        isExcludeFromMaxWalletAmount[marketingWalletAddress] = true;
        priceImpactRangeTaxes[1].from = 0;
        priceImpactRangeTaxes[1].to = 99;
        priceImpactRangeTaxes[1].tax = 5;
        priceImpactRangeTaxes[2].from = 100;
        priceImpactRangeTaxes[2].to = 149;
        priceImpactRangeTaxes[2].tax = 10;
        priceImpactRangeTaxes[3].from = 150;
        priceImpactRangeTaxes[3].to = 199;
        priceImpactRangeTaxes[3].tax = 15;
        priceImpactRangeTaxes[4].from = 200;
        priceImpactRangeTaxes[4].to = 249;
        priceImpactRangeTaxes[4].tax = 20;
        priceImpactRangeTaxes[5].from = 250;
        priceImpactRangeTaxes[5].to = 5000;
        priceImpactRangeTaxes[5].tax = 25;

        maxIndexImpactRange = 5;

        _mint(owner(), _tTotal);

        _storage.init();

    }

    // withdraw ETH if stuck before launch
    function withdrawStuckETH() external onlyOwner {
        require(!tradingOpen, "Can only withdraw if trading hasn't started");
        bool success;
        (success, ) = address(msg.sender).call{ value: address(this).balance }(
            ""
        );
    }

    function enablePreSale (uint256 _minutesForPreSale, address _preSaleTokenAddress, uint256 _minimumPreSaleTokens) external onlyOwner {
        require(!tradingOpen, "BFF: Can only enable PreSale before Trading has been opened.");
        minutesForPreSale = _minutesForPreSale;
        PreSaleTokenAddress = IERC20(_preSaleTokenAddress);
        minimumPreSaleTokens = _minimumPreSaleTokens * 10**18;
        preSaleActive = true;
    }

    function openTrading()
        external
        onlyOwner
    {
        require(!tradingOpen, "BFF: Trading is already open");
        
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );
        isExcludeFromMaxWalletAmount[address(uniswapV2Pair)] = true;

        automatedMarketMakerPairs[uniswapV2Pair] = true;
        dividendTracker.excludeFromDividends(uniswapV2Pair);

        addLiquidity(balanceOf(address(this)), address(this).balance);
        IERC20(uniswapV2Pair).approve(
            address(uniswapV2Router),
            type(uint256).max
        );

        tradingOpen = true;
        if (preSaleActive) {
            uint256 _launchTime;
            _launchTime = block.timestamp;

            preSaleTimestamp = _launchTime;
            publicSaleTimestamp = _launchTime.add(
                minutesForPreSale.mul(1 minutes)
            );
        }
        launchBlock = block.number;
    }

    function alowClaims(bool _alowClaims) external onlyOwner{
        allowClaims = _alowClaims;
    }

    function updateReferrals(uint256 _referralBuyTax, uint256 _referrerBonus, uint256 _referredBonus, uint256 tokensNeeded) public onlyOwner {
        referralBuyTax = _referralBuyTax;
        referrerBonus = _referrerBonus;
        referredBonus = _referredBonus;
        _storage.updateTokensNeededForReferralNumber(tokensNeeded);
    }
    
    function getReferralCode(address account) public view returns (uint256 referralCode) {
        referralCode = _storage.getReferralCode(account);
    }

    function getReferralCodeAddress(uint256 referralCode) public view returns (address referrerAddress) {
        referrerAddress = _storage.getReferrer(referralCode);
    }

    function getReferralAddressByTokenAmount(uint256 _amount) public view returns (address referrerAddress) {
        referrerAddress = _storage.getReferrerFromTokenAmount(_amount);
    }

    function isReferralValid(address referrer, address _to) public view returns (bool) {
        if(referrer == address(0)) {
            return false;
        }
        uint256 neededTokens = _storage.tokensNeededForRefferalNumber;

        return balanceOf(referrer) >= neededTokens && referrer != _to;
    }

    function handleNewBalanceForReferrals(address account) private {
        if(isExcludeFromFee[account] || isBlacklist[account]) {
            return;
        }

        if(account == address(uniswapV2Pair)) {
            return;
        }

        _storage.handleNewBalance(account, balanceOf(account));
    }

    function manualSwap() external onlyOwner {
        uint256 totalTokens = balanceOf(address(this)).sub(
            pendingTokensForReward
        );

        swapTokensForEth(totalTokens);
    }

    function manualSend() external onlyOwner {
        uint256 totalEth = address(this).balance.sub(pendingEthReward);

        uint256 devFeesToSend = totalEth.mul(devFee).div(
            uint256(100).sub(autoLP)
        );
        uint256 marketingFeesToSend = totalEth.mul(marketingFee).div(
            uint256(100).sub(autoLP)
        );
        uint256 remainingEthForFees = totalEth.sub(devFeesToSend).sub(
            marketingFeesToSend);
        devFeesToSend = devFeesToSend.add(remainingEthForFees);

        sendEthToWallets(devFeesToSend, marketingFeesToSend);
    }

    function getPriceImpactTax(address _ad, uint256 _amount) public view returns (uint256) {
        uint256 tax = baseSellTax;

        uint256 priceImpact = UniswapV2PriceImpactCalculator.calculateSellPriceImpact(address(_ad), uniswapV2Pair, _amount);

        for (uint8 x =1; x <= maxIndexImpactRange; x++) {
            if (
                (priceImpact >= priceImpactRangeTaxes[x].from &&
                    priceImpact <= priceImpactRangeTaxes[x].to)
            ) {
                tax = priceImpactRangeTaxes[x].tax;
                return tax;
            }
        }
        return tax;
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function withdrawableDividendOf(address _account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(_account);
    }

    function dividendTokenBalanceOf(address _account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.balanceOf(_account);
    }

    function claim() external {
        _claim(payable(msg.sender), false);
    }

    function reinvest() external {
        _claim(payable(msg.sender), true);
    }

    function _claim(address payable _account, bool _reinvest) private {
        uint256 withdrawableAmount = dividendTracker.withdrawableDividendOf(
            _account
        );
        require(
            withdrawableAmount > 0,
            "BFF: Claimer has no withdrawable dividends"
        );
        uint256 ethAmount;
        uint256 tokenAmount;

        if (!_reinvest) {
            require(
                allowClaims || isAllowedToClaim[_account],
                "BFF: Claimer not allowed to claim dividends, can only re-invest."
            );
            ethAmount = dividendTracker.processAccount(_account, _account);
        } else if (_reinvest) {
            ethAmount = dividendTracker.processAccount(_account, address(this));
            if (ethAmount > 0) {
                tokenAmount = swapEthForTokens(ethAmount, _account);
            }
        }
        if (ethAmount > 0) {
            claimedHistoryIds.increment();
            uint256 hId = claimedHistoryIds.current();
            claimedEthMap[hId].ethAmount = ethAmount;
            claimedEthMap[hId].tokenAmount = tokenAmount;
            claimedEthMap[hId].timestamp = block.timestamp;

            userClaimedIds[_account].push(hId);

            emit DividendClaimed(ethAmount, tokenAmount, _account);
        }
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function getAccount(address _account)
        public
        view
        returns (
            uint256 withdrawableDividends,
            uint256 withdrawnDividends,
            uint256 balance
        )
    {
        (withdrawableDividends, withdrawnDividends) = dividendTracker
            .getAccount(_account);
        return (withdrawableDividends, withdrawnDividends, balanceOf(_account));
    }

    function decimals() public view virtual override returns (uint8) {
        return _decimals;
    }

    function _transfer(
        address _from,
        address _to,
        uint256 _amount
    ) internal virtual override {
        require(!isBot[_from] && !isBot[_to]);
        require(!isBlacklist[_from] && !isBlacklist[_to]);

        uint256 transferAmount = _amount;
        if (
            tradingOpen &&
            (automatedMarketMakerPairs[_from] ||
                automatedMarketMakerPairs[_to]) &&
            !isExcludeFromFee[_from] &&
            !isExcludeFromFee[_to]
        ) {
            if (preSaleActive &&
                preSaleTimestamp <= block.timestamp &&
                publicSaleTimestamp > block.timestamp
            ) {
                require(
                    PreSaleTokenAddress.balanceOf(_to) >= minimumPreSaleTokens,
                    "PreSale: Not enough PreSale token balance."
                );
            }

            address _referrer; 
            _referrer = _storage.getReferrerFromTokenAmount(_amount);

            if(!_storage.isValidReferrer(_referrer, balanceOf(_referrer), _to)) {
                _referrer = address(0);
            }
            
            transferAmount = takeFees(_from, _to, _amount, _referrer);
            
        }
        if (initialBuyTimestamp[_to] == 0) {
            initialBuyTimestamp[_to] = block.timestamp;
        }
        if (!automatedMarketMakerPairs[_to] && !isExcludeFromMaxWalletAmount[_to]) {
            require(balanceOf(_to) + transferAmount <= maxWalletAmount,
                "BFF: Wallet balance limit reached"
            );
        }

        super._transfer(_from, _to, transferAmount);

        handleNewBalanceForReferrals(_to);

        if (!dividendTracker.isExcludeFromDividends(_from)) {
            try
                dividendTracker.setBalance(payable(_from), balanceOf(_from))
            {} catch {}
        }
        if (!dividendTracker.isExcludeFromDividends(_to)) {
            try
                dividendTracker.setBalance(payable(_to), balanceOf(_to))
            {} catch {}
        }
    }

    function _setAutomatedMarketMakerPair(address _pair, bool _value) private {
        require(
            automatedMarketMakerPairs[_pair] != _value,
            "BFF: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[_pair] = _value;

        if (_value) {
            dividendTracker.excludeFromDividends(_pair);
        }
    }

    function setBlacklist(address _address, bool _isBlaklist)
        external onlyOwner {
        isBlacklist[_address] = _isBlaklist;
    }

    function isAlowedToClaim(address _address, bool _isAlowedToClaim)
        external onlyOwner {
        isAllowedToClaim[_address] = _isAlowedToClaim;
    }

    function setExcludeFromFee(address _address, bool _isExludeFromFee)
        external onlyOwner {
        isExcludeFromFee[_address] = _isExludeFromFee;
    }

    function setExcludeFromMaxWalletAmount(address _address, bool _isExludeFromMaxWalletAmount)
        external onlyOwner {
        isExcludeFromMaxWalletAmount[_address] = _isExludeFromMaxWalletAmount;
    }

    function setExludeFromDividends(address _address, bool _isExludeFromDividends)
        external onlyOwner {
        if (_isExludeFromDividends) {
            dividendTracker.excludeFromDividends(_address);
        } else {
            dividendTracker.includeFromDividends(_address, balanceOf(_address));
        }
    }

    function setMultipleExludeFromDividends(address[] calldata _isMultipleExludeFromDividends) public onlyOwner {
        for (uint256 i = 0; i < _isMultipleExludeFromDividends.length; i++) {
                dividendTracker.excludeFromDividends(_isMultipleExludeFromDividends[i]);
            }
    }

    function setMaxWallet(uint256 newMaxWallet) external onlyOwner {
        require(newMaxWallet >= (totalSupply() * 1 / 1000)/1e18, "Cannot set maxWallet lower than 0.1%");
        maxWalletAmount = newMaxWallet * (10**18);
    }
    

    function setTaxes(
        uint256 _baseBuyTax,
        uint256 _baseSellTax,
        uint256 _autoLP,
        uint256 _devFee,
        uint256 _marketingFee
    ) external onlyOwner {
        require(_baseBuyTax <= 10 && baseSellTax <= 10);

        baseBuyTax = _baseBuyTax;
        baseSellTax = _baseSellTax;
        autoLP = _autoLP;
        devFee = _devFee;
        marketingFee = _marketingFee;
    }

    function setMinContractTokensToSwap(uint256 _numToken) public onlyOwner {
        minContractTokensToSwap = _numToken;
    }

    function setMinRewardTokensToSwap(uint256 _numToken) public onlyOwner {
        minRewardTokensToSwap = _numToken;
    }

    function setPriceImpactRangeTax(
        uint8 _index,
        uint256 _from,
        uint256 _to,
        uint256 _tax
    ) external onlyOwner {
        priceImpactRangeTaxes[_index].from = _from;
        priceImpactRangeTaxes[_index].to = _to;
        priceImpactRangeTaxes[_index].tax = _tax;
    }

    function setMaxIndexImpactRange(uint8 _maxIndex) external onlyOwner {
        maxIndexImpactRange = _maxIndex;
    }

    function setBots(address[] calldata _bots) public onlyOwner {
        for (uint256 i = 0; i < _bots.length; i++) {
            if (
                _bots[i] != uniswapV2Pair &&
                _bots[i] != address(uniswapV2Router)
            ) {
                isBot[_bots[i]] = true;
            }
        }
    }

    function setWalletAddress(address _devWallet, address _marketingWallet)
        external
        onlyOwner
    {
        devWalletAddress = _devWallet;
        marketingWalletAddress = _marketingWallet;
    }

    function takeFees(
        address _from,
        address _to,
        uint256 _amount,
        address _referrer
    ) private returns (uint256) {
        uint256 fees;
        uint256 remainingAmount;
        require(
            automatedMarketMakerPairs[_from] || automatedMarketMakerPairs[_to],
            "BFF: No market makers found"
        );

        if (automatedMarketMakerPairs[_from]) {
            uint256 totalBuyTax;
            uint256 referrerFees;
            uint256 referredFees;
            if (block.number == launchBlock && !preSaleActive) {
                totalBuyTax = 90;
            } else if (block.number == launchBlock + 1 && !preSaleActive) {
                totalBuyTax = 50;
            } else if (_referrer != address(0)) {
                totalBuyTax = referralBuyTax.add(referrerBonus.add(referredBonus).div(10));
            } else {
                totalBuyTax = baseBuyTax;
            }

            fees = _amount.mul(totalBuyTax).div(100);
            
            if(_referrer != address(0)) {
                fees = _amount.mul(referralBuyTax).div(100);

                referrerFees = _amount.mul(referrerBonus).div(1000);
                referredFees = _amount.mul(referredBonus).div(1000);

                uint256 totalReferralFees = referrerFees.add(referredFees);

                remainingAmount = _amount.sub(fees).sub(totalReferralFees).add(referredFees);

                super._transfer(_from, address(this), fees);

                super._transfer(_from, _referrer, referrerFees);

                emit BuyFees(_from, address(this), fees);

                emit BuyFees(_from, _referrer, referrerFees);

            } else {

            remainingAmount = _amount.sub(fees);

            super._transfer(_from, address(this), fees);

            emit BuyFees(_from, address(this), fees);
            }
        } else {
            uint256 totalSellTax;
            if (block.number == launchBlock) {
                totalSellTax = 90;
            } else if (block.number == launchBlock + 1) {
                totalSellTax = 50;
            } else {
                uint256 increaseSellFee = getPriceImpactTax(address(this), _amount);

                totalSellTax = baseSellTax + increaseSellFee;

                if(totalSellTax >= 30) {
                    totalSellTax = 30;
                }
            }

            fees = _amount.mul(totalSellTax).div(100);
            uint256 rewardTokens = _amount
                .mul(totalSellTax.sub(baseSellTax))
                .div(100);
            pendingTokensForReward = pendingTokensForReward.add(rewardTokens);

            remainingAmount = _amount.sub(fees);

            super._transfer(_from, address(this), fees);
            uint256 tokensToSwap = balanceOf(address(this)).sub(
                pendingTokensForReward);

            if (tokensToSwap > minContractTokensToSwap) {
                distributeTokensEth(tokensToSwap);
            }
            if (pendingTokensForReward > minRewardTokensToSwap) {
                swapAndSendDividends(pendingTokensForReward);
            }

            emit SellFees(_from, address(this), fees);
        }

        return remainingAmount;
    }

    function distributeTokensEth(uint256 _tokenAmount) private {
        uint256 tokensForLiquidity = _tokenAmount.mul(autoLP).div(100);

        uint256 halfLiquidity = tokensForLiquidity.div(2);
        uint256 tokensForSwap = _tokenAmount.sub(halfLiquidity);

        uint256 totalEth = swapTokensForEth(tokensForSwap);

        uint256 ethForAddLP = totalEth.mul(autoLP).div(100);
        uint256 devFeesToSend = totalEth.mul(devFee).div(100);
        uint256 marketingFeesToSend = totalEth.mul(marketingFee).div(100);
        uint256 remainingEthForFees = totalEth
            .sub(ethForAddLP)
            .sub(devFeesToSend)
            .sub(marketingFeesToSend);
        devFeesToSend = devFeesToSend.add(remainingEthForFees);

        sendEthToWallets(devFeesToSend, marketingFeesToSend);

        if (halfLiquidity > 0 && ethForAddLP > 0) {
            addLiquidity(halfLiquidity, ethForAddLP);
        }
    }

    function sendEthToWallets(uint256 _devFees, uint256 _marketingFees)
        private
    {
        if (_devFees > 0) {
            payable(devWalletAddress).transfer(_devFees);
        }
        if (_marketingFees > 0) {
            payable(marketingWalletAddress).transfer(_marketingFees);
        }
        emit DistributeFees(_devFees, _marketingFees);
    }

    function swapTokensForEth(uint256 _tokenAmount) private returns (uint256) {
        uint256 initialEthBalance = address(this).balance;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), _tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 receivedEth = address(this).balance.sub(initialEthBalance);

        emit SwapTokensForEth(_tokenAmount, receivedEth);
        return receivedEth;
    }

    function swapEthForTokens(uint256 _ethAmount, address _to)
        private
        returns (uint256)
    {
        uint256 initialTokenBalance = balanceOf(address(this));
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: _ethAmount
        }(0, path, _to, block.timestamp);

        uint256 receivedTokens = balanceOf(address(this)).sub(
            initialTokenBalance
        );

        emit SwapEthForTokens(_ethAmount, receivedTokens);
        return receivedTokens;
    }

    function addLiquidity(uint256 _tokenAmount, uint256 _ethAmount) private {
        _approve(address(this), address(uniswapV2Router), _tokenAmount);
        uniswapV2Router.addLiquidityETH{value: _ethAmount}(
            address(this),
            _tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
        emit AddLiquidity(_tokenAmount, _ethAmount);
    }

    function swapAndSendDividends(uint256 _tokenAmount) private {
        uint256 dividends = swapTokensForEth(_tokenAmount);

        pendingTokensForReward = pendingTokensForReward.sub(_tokenAmount);
        uint256 totalEthToSend = dividends.add(pendingEthReward);

        (bool success, ) = address(dividendTracker).call{value: totalEthToSend}(
            ""
        );

        if (success) {
            emit SendDividends(dividends);
        } else {
            pendingEthReward = pendingEthReward.add(dividends);
        }
    }

    function canHolderClaim(address _address) public view returns (uint256) {
        uint256 holderCanClaim;
        if(isAllowedToClaim[_address] || allowClaims) {
            holderCanClaim = 1000000;
        } else {
            holderCanClaim = 0;
        }

        return holderCanClaim;
    }

    function availableContractTokenBalance() public view returns (uint256) {
        return balanceOf(address(this)).sub(pendingTokensForReward);
    }

    function getHistory(
        address _account,
        uint256 _limit,
        uint256 _pageNumber
    ) external view returns (ClaimedEth[] memory) {
        require(_limit > 0 && _pageNumber > 0, "BFF: Invalid arguments");
        uint256 userClaimedCount = userClaimedIds[_account].length;
        uint256 end = _pageNumber * _limit;
        uint256 start = end - _limit;
        require(start < userClaimedCount, "BFF: Out of range");
        uint256 limit = _limit;
        if (end > userClaimedCount) {
            end = userClaimedCount;
            limit = userClaimedCount % _limit;
        }

        ClaimedEth[] memory myClaimedEth = new ClaimedEth[](limit);
        uint256 currentIndex = 0;
        for (uint256 i = start; i < end; i++) {
            uint256 hId = userClaimedIds[_account][i];
            myClaimedEth[currentIndex] = claimedEthMap[hId];
            currentIndex += 1;
        }
        return myClaimedEth;
    }

    function getHistoryCount(address _account) external view returns (uint256) {
        return userClaimedIds[_account].length;
    }

    receive() external payable {}
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_devWalletAddress","type":"address"},{"internalType":"address","name":"_marketingWalletAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountEth","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"AddRewardPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"BuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"devEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remarketingEth","type":"uint256"}],"name":"DistributeFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"DividendClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"SellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sentEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedTokens","type":"uint256"}],"name":"SwapEthForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sentTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedEth","type":"uint256"}],"name":"SwapTokensForEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_alowClaims","type":"bool"}],"name":"alowClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableContractTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"canHolderClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BFFDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minutesForPreSale","type":"uint256"},{"internalType":"address","name":"_preSaleTokenAddress","type":"address"},{"internalType":"uint256","name":"_minimumPreSaleTokens","type":"uint256"}],"name":"enablePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"withdrawnDividends","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_pageNumber","type":"uint256"}],"name":"getHistory","outputs":[{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct BFF.ClaimedEth[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getHistoryCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ad","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getPriceImpactTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getReferralAddressByTokenAmount","outputs":[{"internalType":"address","name":"referrerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralCode","outputs":[{"internalType":"uint256","name":"referralCode","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"referralCode","type":"uint256"}],"name":"getReferralCodeAddress","outputs":[{"internalType":"address","name":"referrerAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"initialBuyTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedToClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isAlowedToClaim","type":"bool"}],"name":"isAlowedToClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludeFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludeFromMaxWalletAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"isReferralValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxIndexImpactRange","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minContractTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minRewardTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingEthReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTokensForReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"priceImpactRangeTaxes","outputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"tax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referredBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referrerBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isBlaklist","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bots","type":"address[]"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExludeFromFee","type":"bool"}],"name":"setExcludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExludeFromMaxWalletAmount","type":"bool"}],"name":"setExcludeFromMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExludeFromDividends","type":"bool"}],"name":"setExludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxIndex","type":"uint8"}],"name":"setMaxIndexImpactRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numToken","type":"uint256"}],"name":"setMinContractTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numToken","type":"uint256"}],"name":"setMinRewardTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_isMultipleExludeFromDividends","type":"address[]"}],"name":"setMultipleExludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"},{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setPriceImpactRangeTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseBuyTax","type":"uint256"},{"internalType":"uint256","name":"_baseSellTax","type":"uint256"},{"internalType":"uint256","name":"_autoLP","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_marketingFee","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"},{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_referralBuyTax","type":"uint256"},{"internalType":"uint256","name":"_referrerBonus","type":"uint256"},{"internalType":"uint256","name":"_referredBonus","type":"uint256"},{"internalType":"uint256","name":"tokensNeeded","type":"uint256"}],"name":"updateReferrals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600780546001600160b01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790556000600855600f805460ff19169055600a6017819055600560188190556019908155601a819055601b556014601c55601d556046601e556b06765c793fa10079d0000000601f55683635c9adc5dea0000060255569021e19e0c9bab24000006028553480156200009957600080fd5b506040516200689e3803806200689e833981016040819052620000bc916200096d565b604051806040016040528060128152602001714279204672656e7320466f72204672656e7360701b8152506040518060400160405280600381526020016221232360e91b81525081600390805190602001906200011b9291906200089c565b508051620001319060049060208401906200089c565b5050600580546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360228054610100600160a81b0319166101006001600160a01b038581169190910291909117909155602380546001600160a01b031916918316919091179055612710620001d26c0c9f2c9cd04674edea400000006019620009bb565b620001de9190620009dd565b601655604051620001ef906200092b565b604051809103906000f0801580156200020c573d6000803e3d6000fd5b50602480546001600160a01b0319166001600160a01b0392909216918217815560405163031e79db60e41b8152600481018390526331e79db09101600060405180830381600087803b1580156200026257600080fd5b505af115801562000277573d6000803e3d6000fd5b50506024805460405163031e79db60e41b81523060048201526001600160a01b0390911693506331e79db0925001600060405180830381600087803b158015620002c057600080fd5b505af1158015620002d5573d6000803e3d6000fd5b50506024546001600160a01b031691506331e79db09050620002ff6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200034157600080fd5b505af115801562000356573d6000803e3d6000fd5b50506024805460075460405163031e79db60e41b81526001600160a01b039182166004820152911693506331e79db0925001600060405180830381600087803b158015620003a357600080fd5b505af1158015620003b8573d6000803e3d6000fd5b50505050600160116000620003d2620007a560201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152601190935281832080548516600190811790915560245482168452828420805486168217905560225461010090048216845282842080548616821790556023549091168352908220805490931681179092556015906200046b6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152601584528281208054861660019081179091556007548316825283822080548716821790556022805461010090048416835284832080548816831790556023548416835293822080548716909117905560219093527f2b59c9df127166d3570f589f0cb7377a6b175795e70ab275ebf42fa16c0a23f483905560637f2b59c9df127166d3570f589f0cb7377a6b175795e70ab275ebf42fa16c0a23f55560057f2b59c9df127166d3570f589f0cb7377a6b175795e70ab275ebf42fa16c0a23f681905560647f914a2534c436de5a3f77164e6b9b90d20144139ce899b6a8d30a442e7b9ef5335560957f914a2534c436de5a3f77164e6b9b90d20144139ce899b6a8d30a442e7b9ef53455600a7f914a2534c436de5a3f77164e6b9b90d20144139ce899b6a8d30a442e7b9ef5355560967fbae8fb7bb9008c9bfa6625328b7613a2bedfb2f936a7718f51173039a77c107c5560c77fbae8fb7bb9008c9bfa6625328b7613a2bedfb2f936a7718f51173039a77c107d55600f7fbae8fb7bb9008c9bfa6625328b7613a2bedfb2f936a7718f51173039a77c107e5560c87f1ae06646c6742a506302a1833f6c3f508643fd4c5dcb1e323706d5c3441af2985560f97f1ae06646c6742a506302a1833f6c3f508643fd4c5dcb1e323706d5c3441af2995560147f1ae06646c6742a506302a1833f6c3f508643fd4c5dcb1e323706d5c3441af29a559283905260fa7ffb8633a1617da4af6a760ee9a6f35275b7a2d26730de1bb585e883dd94ef868f556113887ffb8633a1617da4af6a760ee9a6f35275b7a2d26730de1bb585e883dd94ef86905560197ffb8633a1617da4af6a760ee9a6f35275b7a2d26730de1bb585e883dd94ef869155815490931682179055546200073891166c0c9f2c9cd04674edea40000000620007b4565b60405163020929fd60e41b8152602b600482015273a636249ba25ece6f11e5c1f5130da90a90c41789906320929fd09060240160006040518083038186803b1580156200078457600080fd5b505af415801562000799573d6000803e3d6000fd5b50505050505062000a58565b6005546001600160a01b031690565b6001600160a01b0382166200080f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b806002600082825462000823919062000a00565b90915550506001600160a01b038216600090815260208190526040812080548392906200085290849062000a00565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620008aa9062000a1b565b90600052602060002090601f016020900481019282620008ce576000855562000919565b82601f10620008e957805160ff191683800117855562000919565b8280016001018555821562000919579182015b8281111562000919578251825591602001919060010190620008fc565b506200092792915062000939565b5090565b6119aa8062004ef483390190565b5b808211156200092757600081556001016200093a565b80516001600160a01b03811681146200096857600080fd5b919050565b600080604083850312156200098157600080fd5b6200098c8362000950565b91506200099c6020840162000950565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620009d857620009d8620009a5565b500290565b600082620009fb57634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000a165762000a16620009a5565b500190565b600181811c9082168062000a3057607f821691505b6020821081141562000a5257634e487b7160e01b600052602260045260246000fd5b50919050565b61448c8062000a686000396000f3fe6080604052600436106104095760003560e01c80637c4b492e11610213578063b80425c211610123578063e4132fd8116100ab578063f42938901161007a578063f429389014610c96578063f5648a4f14610cab578063fb66d86d14610cc0578063fbcbc0f114610cd6578063fdb5a03e14610cf657600080fd5b8063e4132fd814610c09578063ea084eef14610c29578063eb50d71f14610c49578063ec29f4e914610c6957600080fd5b8063c9e8714c116100f2578063c9e8714c14610b47578063d2469ba614610b77578063d297105914610b97578063dd62ed3e14610bad578063e3402c6714610bf357600080fd5b8063b80425c214610ab0578063ba762ddd14610b07578063c2b1b19914610b1c578063c9567bf914610b3257600080fd5b806395d89b41116101a6578063aa4bde2811610175578063aa4bde2814610a0e578063adc7f53e14610a24578063af9549e014610a3a578063b1fdb11b14610a5a578063b515566a14610a9057600080fd5b806395d89b4114610999578063a457c2d7146109ae578063a8b9d240146109ce578063a9059cbb146109ee57600080fd5b80638da5cb5b116101e25780638da5cb5b146108ff5780638e5916b21461091d578063906778331461094d57806392c403441461097957600080fd5b80637c4b492e14610883578063884289e3146108995780638954fb4a146108c957806389a5c691146108e957600080fd5b80633bbac579116103195780635d0dc8e4116102a157806368bfe6231161027057806368bfe623146107f45780636973cd091461080e57806370a082311461082e578063715018a61461084e578063753d654e1461086357600080fd5b80635d0dc8e41461077f5780635fcefa421461079f57806364b0f653146107bf5780636843cd84146107d457600080fd5b80634f0f9010116102e85780634f0f9010146106e757806351bc3c85146107075780635b6612ad1461071c5780635b683e66146107495780635d0044ca1461075f57600080fd5b80633bbac5791461066c5780634bae2ef11461069c5780634c590d87146106b25780634e71d92d146106d257600080fd5b80631c08bc5d1161039c5780632c7401b31161036b5780632c7401b3146105c557806330bb4cff146105e5578063313ce567146105fa578063333e99db1461061c578063395093511461064c57600080fd5b80631c08bc5d1461054557806323b872dd1461056557806324848348146105855780632c1f5216146105a557600080fd5b806312dfbd33116103d857806312dfbd33146104c6578063153b0d1e146104e657806318160ddd1461050657806319a1cca01461052557600080fd5b806302d7acda1461041557806306fdde03146104525780630829b32d14610474578063095ea7b31461049657600080fd5b3661041057005b600080fd5b34801561042157600080fd5b50610435610430366004613dbc565b610d0b565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561045e57600080fd5b50610467610d90565b6040516104499190613dd5565b34801561048057600080fd5b5061049461048f366004613e42565b610e22565b005b3480156104a257600080fd5b506104b66104b1366004613e7a565b610f1c565b6040519015158152602001610449565b3480156104d257600080fd5b506104946104e1366004613dbc565b610f34565b3480156104f257600080fd5b50610494610501366004613eb4565b610f63565b34801561051257600080fd5b506002545b604051908152602001610449565b34801561053157600080fd5b50610435610540366004613dbc565b610fb8565b34801561055157600080fd5b50610494610560366004613dbc565b610ffa565b34801561057157600080fd5b506104b6610580366004613eed565b611029565b34801561059157600080fd5b506104b66105a0366004613f1d565b61104d565b3480156105b157600080fd5b50602454610435906001600160a01b031681565b3480156105d157600080fd5b506105176105e0366004613e7a565b61109a565b3480156105f157600080fd5b506105176111b8565b34801561060657600080fd5b5060125b60405160ff9091168152602001610449565b34801561062857600080fd5b506104b6610637366004613f4b565b60126020526000908152604090205460ff1681565b34801561065857600080fd5b506104b6610667366004613e7a565b61122b565b34801561067857600080fd5b506104b6610687366004613f4b565b60146020526000908152604090205460ff1681565b3480156106a857600080fd5b50610517601a5481565b3480156106be57600080fd5b506104946106cd366004613f68565b61126a565b3480156106de57600080fd5b50610494611313565b3480156106f357600080fd5b50610517610702366004613f4b565b611320565b34801561071357600080fd5b5061049461136a565b34801561072857600080fd5b50610517610737366004613f4b565b60266020526000908152604090205481565b34801561075557600080fd5b5061051760185481565b34801561076b57600080fd5b5061049461077a366004613dbc565b6113ba565b34801561078b57600080fd5b5061049461079a366004613fb0565b61148b565b3480156107ab57600080fd5b506104946107ba366004613fcb565b6114cb565b3480156107cb57600080fd5b50610517611529565b3480156107e057600080fd5b506105176107ef366004613f4b565b611573565b34801561080057600080fd5b5060225461060a9060ff1681565b34801561081a57600080fd5b50610494610829366004613f1d565b6115e3565b34801561083a57600080fd5b50610517610849366004613f4b565b611645565b34801561085a57600080fd5b50610494611660565b34801561086f57600080fd5b5061049461087e366004613eb4565b6116d4565b34801561088f57600080fd5b5061051760275481565b3480156108a557600080fd5b506104b66108b4366004613f4b565b60136020526000908152604090205460ff1681565b3480156108d557600080fd5b506104946108e4366004613eb4565b611729565b3480156108f557600080fd5b50610517601f5481565b34801561090b57600080fd5b506005546001600160a01b0316610435565b34801561092957600080fd5b506104b6610938366004613f4b565b60116020526000908152604090205460ff1681565b34801561095957600080fd5b50610517610968366004613f4b565b602080526000908152604090205481565b34801561098557600080fd5b50610517610994366004613f4b565b611808565b3480156109a557600080fd5b5061046761186a565b3480156109ba57600080fd5b506104b66109c9366004613e7a565b611879565b3480156109da57600080fd5b506105176109e9366004613f4b565b61190b565b3480156109fa57600080fd5b506104b6610a09366004613e7a565b61193e565b348015610a1a57600080fd5b5061051760165481565b348015610a3057600080fd5b50610517601b5481565b348015610a4657600080fd5b50610494610a55366004613eb4565b61194c565b348015610a6657600080fd5b50610517610a75366004613f4b565b6001600160a01b031660009081526030602052604090205490565b348015610a9c57600080fd5b50610494610aab366004614006565b6119a1565b348015610abc57600080fd5b50610aec610acb366004613dbc565b60216020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610449565b348015610b1357600080fd5b50610517611acc565b348015610b2857600080fd5b5061051760175481565b348015610b3e57600080fd5b50610494611add565b348015610b5357600080fd5b506104b6610b62366004613f4b565b60156020526000908152604090205460ff1681565b348015610b8357600080fd5b50610494610b92366004614006565b611e54565b348015610ba357600080fd5b5061051760295481565b348015610bb957600080fd5b50610517610bc8366004613f1d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bff57600080fd5b5061051760285481565b348015610c1557600080fd5b50610494610c2436600461407b565b611f2d565b348015610c3557600080fd5b50610494610c44366004613eb4565b611f75565b348015610c5557600080fd5b50610494610c64366004614098565b611fca565b348015610c7557600080fd5b50610c89610c843660046140d1565b612015565b6040516104499190614106565b348015610ca257600080fd5b5061049461223b565b348015610cb757600080fd5b50610494612308565b348015610ccc57600080fd5b5061051760195481565b348015610ce257600080fd5b50610aec610cf1366004613f4b565b6123e2565b348015610d0257600080fd5b50610494612471565b604051633b966bcd60e21b8152602b60048201526024810182905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063ee59af34906044015b602060405180830381865af4158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a919061415f565b92915050565b606060038054610d9f9061417c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcb9061417c565b8015610e185780601f10610ded57610100808354040283529160200191610e18565b820191906000526020600020905b815481529060010190602001808311610dfb57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e555760405162461bcd60e51b8152600401610e4c906141b7565b60405180910390fd5b600754600160a01b900460ff1615610ed55760405162461bcd60e51b815260206004820152603c60248201527f4246463a2043616e206f6e6c7920656e61626c652050726553616c652062656660448201527f6f72652054726164696e6720686173206265656e206f70656e65642e000000006064820152608401610e4c565b600d839055600a80546001600160a01b0319166001600160a01b038416179055610f0781670de0b6b3a7640000614202565b600b555050600f805460ff1916600117905550565b600033610f2a81858561247c565b5060019392505050565b6005546001600160a01b03163314610f5e5760405162461bcd60e51b8152600401610e4c906141b7565b601f55565b6005546001600160a01b03163314610f8d5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b604051633325c8f560e21b8152602b60048201526024810182905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063cc9723d490604401610d49565b6005546001600160a01b031633146110245760405162461bcd60e51b8152600401610e4c906141b7565b602855565b6000336110378582856125a0565b61104285858561262c565b506001949350505050565b60006001600160a01b03831661106557506000610d8a565b602b548061107285611645565b101580156110925750826001600160a01b0316846001600160a01b031614155b949350505050565b601854600954604051632f99934f60e01b81526000929183917389e3e1fee6b040e095965189094419d41184d9e991632f99934f916110eb9189916001600160a01b03909116908990600401614221565b602060405180830381865af4158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c9190614245565b905060015b60225460ff908116908216116111ae5760ff81166000908152602160205260409020548210801590611178575060ff81166000908152602160205260409020600101548211155b1561119c5760ff166000908152602160205260409020600201549250610d8a915050565b806111a68161425e565b915050611131565b5090949350505050565b602454604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190614245565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610f2a908290869061126590879061427e565b61247c565b6005546001600160a01b031633146112945760405162461bcd60e51b8152600401610e4c906141b7565b6019849055601a839055601b829055604051635fe4fbe160e11b8152602b60048201526024810182905273a636249ba25ece6f11e5c1f5130da90a90c417899063bfc9f7c29060440160006040518083038186803b1580156112f557600080fd5b505af4158015611309573d6000803e3d6000fd5b5050505050505050565b61131e336000612c6a565b565b6001600160a01b038116600090815260136020526040812054819060ff16806113525750600754600160a81b900460ff165b156113615750620f4240610d8a565b50600092915050565b6005546001600160a01b031633146113945760405162461bcd60e51b8152600401610e4c906141b7565b60006113ab6027546113a530611645565b90612fb1565b90506113b681612fc4565b5050565b6005546001600160a01b031633146113e45760405162461bcd60e51b8152600401610e4c906141b7565b670de0b6b3a76400006103e86113f960025490565b611404906001614202565b61140e91906142ac565b61141891906142ac565b8110156114735760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b6064820152608401610e4c565b61148581670de0b6b3a7640000614202565b60165550565b6005546001600160a01b031633146114b55760405162461bcd60e51b8152600401610e4c906141b7565b6022805460ff191660ff92909216919091179055565b6005546001600160a01b031633146114f55760405162461bcd60e51b8152600401610e4c906141b7565b600a85111580156115095750600a60185411155b61151257600080fd5b601794909455601892909255601c55601d55601e55565b602454604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b602480546040516370a0823160e01b81526001600160a01b0384811660048301526000939216916370a0823191015b602060405180830381865afa1580156115bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614245565b6005546001600160a01b0316331461160d5760405162461bcd60e51b8152600401610e4c906141b7565b60228054610100600160a81b0319166101006001600160a01b0394851602179055602380546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461168a5760405162461bcd60e51b8152600401610e4c906141b7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146116fe5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117535760405162461bcd60e51b8152600401610e4c906141b7565b80156117bc576024805460405163031e79db60e41b81526001600160a01b038581166004830152909116916331e79db091015b600060405180830381600087803b1580156117a057600080fd5b505af11580156117b4573d6000803e3d6000fd5b505050505050565b6024546001600160a01b03166318c18adb836117d781611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611786565b60405163057c207360e21b8152602b60048201526001600160a01b038216602482015260009073a636249ba25ece6f11e5c1f5130da90a90c41789906315f081cc90604401602060405180830381865af41580156115bf573d6000803e3d6000fd5b606060048054610d9f9061417c565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156118fe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e4c565b611042828686840361247c565b602480546040516302a2e74960e61b81526001600160a01b03848116600483015260009392169163a8b9d24091016115a2565b600033610f2a81858561262c565b6005546001600160a01b031633146119765760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146119cb5760405162461bcd60e51b8152600401610e4c906141b7565b60005b81811015611ac7576009546001600160a01b03168383838181106119f4576119f46142c0565b9050602002016020810190611a099190613f4b565b6001600160a01b031614158015611a5a57506007546001600160a01b0316838383818110611a3957611a396142c0565b9050602002016020810190611a4e9190613f4b565b6001600160a01b031614155b15611ab557600160146000858585818110611a7757611a776142c0565b9050602002016020810190611a8c9190613f4b565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611abf816142d6565b9150506119ce565b505050565b60006112266027546113a530611645565b6005546001600160a01b03163314611b075760405162461bcd60e51b8152600401610e4c906141b7565b600754600160a01b900460ff1615611b615760405162461bcd60e51b815260206004820152601c60248201527f4246463a2054726164696e6720697320616c7265616479206f70656e000000006044820152606401610e4c565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd8919061415f565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5e919061415f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccf919061415f565b600980546001600160a01b0319166001600160a01b0392831690811782556000908152601560209081526040808320805460ff19908116600190811790925585548716855260109093529281902080549092169092179055602480549254915163031e79db60e41b8152918416600483015291909216916331e79db09101600060405180830381600087803b158015611d6757600080fd5b505af1158015611d7b573d6000803e3d6000fd5b50505050611d91611d8b30611645565b47613179565b60095460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b91906142f1565b506007805460ff60a01b1916600160a01b179055600f5460ff1615611e4e5742600c819055600d54611e4990611e4290603c613288565b8290613294565b600e55505b43600855565b6005546001600160a01b03163314611e7e5760405162461bcd60e51b8152600401610e4c906141b7565b60005b81811015611ac7576024546001600160a01b03166331e79db0848484818110611eac57611eac6142c0565b9050602002016020810190611ec19190613f4b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611f0257600080fd5b505af1158015611f16573d6000803e3d6000fd5b505050508080611f25906142d6565b915050611e81565b6005546001600160a01b03163314611f575760405162461bcd60e51b8152600401610e4c906141b7565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6005546001600160a01b03163314611f9f5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611ff45760405162461bcd60e51b8152600401610e4c906141b7565b60ff9093166000908152602160205260409020918255600182015560020155565b60606000831180156120275750600082115b61206c5760405162461bcd60e51b81526020600482015260166024820152754246463a20496e76616c696420617267756d656e747360501b6044820152606401610e4c565b6001600160a01b038416600090815260306020526040812054906120908585614202565b9050600061209e868361430e565b90508281106120e35760405162461bcd60e51b81526020600482015260116024820152704246463a204f7574206f662072616e676560781b6044820152606401610e4c565b85838311156120fc578392506120f98784614325565b90505b60008167ffffffffffffffff81111561211757612117614339565b60405190808252806020026020018201604052801561216c57816020015b61215960405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816121355790505b5090506000835b8581101561222c576001600160a01b038b1660009081526030602052604081208054839081106121a5576121a56142c0565b90600052602060002001549050602f60008281526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050848481518110612200576122006142c0565b602090810291909101015261221660018461427e565b9250508080612224906142d6565b915050612173565b50909998505050505050505050565b6005546001600160a01b031633146122655760405162461bcd60e51b8152600401610e4c906141b7565b600061227c60295447612fb190919063ffffffff16565b905060006122ad612299601c546064612fb190919063ffffffff16565b601d546122a7908590613288565b906132a0565b905060006122d86122ca601c546064612fb190919063ffffffff16565b601e546122a7908690613288565b905060006122ea826113a58686612fb1565b90506122f68382613294565b925061230283836132ac565b50505050565b6005546001600160a01b031633146123325760405162461bcd60e51b8152600401610e4c906141b7565b600754600160a01b900460ff16156123a05760405162461bcd60e51b815260206004820152602b60248201527f43616e206f6e6c792077697468647261772069662074726164696e672068617360448201526a1b89dd081cdd185c9d195960aa1b6064820152608401610e4c565b604051600090339047908381818185875af1925050503d8060008114612302576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b6024805460405163fbcbc0f160e01b81526001600160a01b0384811660048301526000938493849392169163fbcbc0f191016040805180830381865afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612454919061434f565b9093509150828261246486611645565b9250925092509193909250565b61131e336001612c6a565b6001600160a01b0383166124de5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e4c565b6001600160a01b03821661253f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e4c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612302578181101561261f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e4c565b612302848484840361247c565b6001600160a01b03831660009081526014602052604090205460ff1615801561266e57506001600160a01b03821660009081526014602052604090205460ff16155b61267757600080fd5b6001600160a01b03831660009081526012602052604090205460ff161580156126b957506001600160a01b03821660009081526012602052604090205460ff16155b6126c257600080fd5b6007548190600160a01b900460ff16801561271757506001600160a01b03841660009081526010602052604090205460ff168061271757506001600160a01b03831660009081526010602052604090205460ff165b801561273c57506001600160a01b03841660009081526011602052604090205460ff16155b801561276157506001600160a01b03831660009081526011602052604090205460ff16155b1561299857600f5460ff16801561277a575042600c5411155b8015612787575042600e54115b1561285e57600b54600a546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156127d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fd9190614245565b101561285e5760405162461bcd60e51b815260206004820152602a60248201527f50726553616c653a204e6f7420656e6f7567682050726553616c6520746f6b6560448201526937103130b630b731b29760b11b6064820152608401610e4c565b604051633325c8f560e21b8152602b60048201526024810183905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063cc9723d490604401602060405180830381865af41580156128b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128dc919061415f565b905073a636249ba25ece6f11e5c1f5130da90a90c417896304ea10f2602b8361290481611645565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152604483015287166064820152608401602060405180830381865af415801561295c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298091906142f1565b612988575060005b6129948585858461336a565b9150505b6001600160a01b03831660009081526020805260409020546129cf576001600160a01b038316600090815260208052604090204290555b6001600160a01b03831660009081526010602052604090205460ff16158015612a1157506001600160a01b03831660009081526015602052604090205460ff16155b15612a855760165481612a2385611645565b612a2d919061427e565b1115612a855760405162461bcd60e51b815260206004820152602160248201527f4246463a2057616c6c65742062616c616e6365206c696d6974207265616368656044820152601960fa1b6064820152608401610e4c565b612a90848483613782565b612a9983613950565b60248054604051631b4a89ab60e11b81526001600160a01b0387811660048301529091169163369513569101602060405180830381865afa158015612ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0691906142f1565b612b7e576024546001600160a01b031663e30443bc85612b2581611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b6b57600080fd5b505af1925050508015612b7c575060015b505b60248054604051631b4a89ab60e11b81526001600160a01b0386811660048301529091169163369513569101602060405180830381865afa158015612bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612beb91906142f1565b612302576024546001600160a01b031663e30443bc84612c0a81611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612c5057600080fd5b505af1925050508015612c61575060015b61230257612302565b602480546040516302a2e74960e61b81526001600160a01b03858116600483015260009392169163a8b9d2409101602060405180830381865afa158015612cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd99190614245565b905060008111612d3e5760405162461bcd60e51b815260206004820152602a60248201527f4246463a20436c61696d657220686173206e6f20776974686472617761626c65604482015269206469766964656e647360b01b6064820152608401610e4c565b60008083612e6a57600754600160a81b900460ff1680612d7657506001600160a01b03851660009081526013602052604090205460ff165b612dea576040805162461bcd60e51b81526020600482015260248101919091527f4246463a20436c61696d6572206e6f7420616c6c6f77656420746f20636c616960448201527f6d206469766964656e64732c2063616e206f6e6c792072652d696e766573742e6064820152608401610e4c565b602480546040516352b5f81d60e01b81526001600160a01b0388811660048301819052938201939093529116906352b5f81d906044016020604051808303816000875af1158015612e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e639190614245565b9150612efd565b8315612efd57602480546040516352b5f81d60e01b81526001600160a01b03888116600483015230938201939093529116906352b5f81d906044016020604051808303816000875af1158015612ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee89190614245565b91508115612efd57612efa8286613a36565b90505b8115612faa57612f11602a80546001019055565b6000612f1c602a5490565b6000818152602f602090815260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260308452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505b5050505050565b6000612fbd828461430e565b9392505050565b6040805160028082526060820183526000924792849290916020830190803683370190505090503081600081518110612fff57612fff6142c0565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307c919061415f565b8160018151811061308f5761308f6142c0565b6001600160a01b0392831660209182029290920101526007546130b5913091168661247c565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906130ee9087906000908690309042906004016143b7565b600060405180830381600087803b15801561310857600080fd5b505af115801561311c573d6000803e3d6000fd5b5050505060006131358347612fb190919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b6007546131919030906001600160a01b03168461247c565b6007546001600160a01b031663f305d7198230856000806131ba6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613222573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061324791906143f3565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b6000612fbd8284614202565b6000612fbd828461427e565b6000612fbd82846142ac565b81156132f2576022546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f193505050501580156132f0573d6000803e3d6000fd5b505b8015613334576023546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613332573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd924968910161327c565b6001600160a01b0384166000908152601060205260408120548190819060ff16806133ad57506001600160a01b03861660009081526010602052604090205460ff165b6133f95760405162461bcd60e51b815260206004820152601b60248201527f4246463a204e6f206d61726b6574206d616b65727320666f756e6400000000006044820152606401610e4c565b6001600160a01b03871660009081526010602052604090205460ff161561363d576000806000600854431480156134335750600f5460ff16155b1561344157605a92506134b2565b60085461344f90600161427e565b431480156134605750600f5460ff16155b1561346e57603292506134b2565b6001600160a01b038716156134ac576134a561349c600a6122a7601b54601a5461329490919063ffffffff16565b60195490613294565b92506134b2565b60175492505b6134c160646122a78a86613288565b94506001600160a01b038716156135e2576134ec60646122a76019548b61328890919063ffffffff16565b94506135096103e86122a7601a548b61328890919063ffffffff16565b91506135266103e86122a7601b548b61328890919063ffffffff16565b905060006135348383613294565b905061354e82613548836113a58d8b612fb1565b90613294565b945061355b8b3088613782565b6135668b8985613782565b7f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8b308860405161359993929190614221565b60405180910390a17f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8b89856040516135d493929190614221565b60405180910390a150613635565b6135ec8886612fb1565b93506135f98a3087613782565b7f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8a308760405161362c93929190614221565b60405180910390a15b505050613778565b60006008544314156136515750605a61369b565b60085461365f90600161427e565b43141561366e5750603261369b565b600061367a308861109a565b90508060185461368a919061427e565b9150601e821061369957601e91505b505b6136aa60646122a78884613288565b925060006136d260646122a76136cb60185486612fb190919063ffffffff16565b8a90613288565b6027549091506136e29082613294565b6027556136ef8785612fb1565b92506136fc893086613782565b600061370d6027546113a530611645565b9050601f548111156137225761372281613be8565b602854602754111561373957613739602754613cde565b7f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a8a308760405161376c93929190614221565b60405180910390a15050505b9695505050505050565b6001600160a01b0383166137e65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e4c565b6001600160a01b0382166138485760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e4c565b6001600160a01b038316600090815260208190526040902054818110156138c05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e4c565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906138f790849061427e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161394391815260200190565b60405180910390a3612302565b6001600160a01b03811660009081526011602052604090205460ff168061398f57506001600160a01b03811660009081526012602052604090205460ff165b156139975750565b6009546001600160a01b03828116911614156139b05750565b73a636249ba25ece6f11e5c1f5130da90a90c4178963cdb09f68602b836139d681611645565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152604482015260640160006040518083038186803b158015613a2257600080fd5b505af4158015612faa573d6000803e3d6000fd5b600080613a4230611645565b60408051600280825260608201835292935060009290916020830190803683375050600754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad5919061415f565b81600081518110613ae857613ae86142c0565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110613b1c57613b1c6142c0565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790613b629060009086908a904290600401614421565b6000604051808303818588803b158015613b7b57600080fd5b505af1158015613b8f573d6000803e3d6000fd5b50505050506000613ba3836113a530611645565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000613c0460646122a7601c548561328890919063ffffffff16565b90506000613c138260026132a0565b90506000613c218483612fb1565b90506000613c2e82612fc4565b90506000613c4c60646122a7601c548561328890919063ffffffff16565b90506000613c6a60646122a7601d548661328890919063ffffffff16565b90506000613c8860646122a7601e548761328890919063ffffffff16565b90506000613c9c826113a585818989612fb1565b9050613ca88382613294565b9250613cb483836132ac565b600087118015613cc45750600084115b15613cd357613cd38785613179565b505050505050505050565b6000613ce982612fc4565b602754909150613cf99083612fb1565b602755602954600090613d0d908390613294565b6024546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613d5f576040519150601f19603f3d011682016040523d82523d6000602084013e613d64565b606091505b505090508015613da6576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1612302565b602954613db39084613294565b60295550505050565b600060208284031215613dce57600080fd5b5035919050565b600060208083528351808285015260005b81811015613e0257858101830151858201604001528201613de6565b81811115613e14576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114613e3f57600080fd5b50565b600080600060608486031215613e5757600080fd5b833592506020840135613e6981613e2a565b929592945050506040919091013590565b60008060408385031215613e8d57600080fd5b8235613e9881613e2a565b946020939093013593505050565b8015158114613e3f57600080fd5b60008060408385031215613ec757600080fd5b8235613ed281613e2a565b91506020830135613ee281613ea6565b809150509250929050565b600080600060608486031215613f0257600080fd5b8335613f0d81613e2a565b92506020840135613e6981613e2a565b60008060408385031215613f3057600080fd5b8235613f3b81613e2a565b91506020830135613ee281613e2a565b600060208284031215613f5d57600080fd5b8135612fbd81613e2a565b60008060008060808587031215613f7e57600080fd5b5050823594602084013594506040840135936060013592509050565b803560ff81168114613fab57600080fd5b919050565b600060208284031215613fc257600080fd5b612fbd82613f9a565b600080600080600060a08688031215613fe357600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806020838503121561401957600080fd5b823567ffffffffffffffff8082111561403157600080fd5b818501915085601f83011261404557600080fd5b81358181111561405457600080fd5b8660208260051b850101111561406957600080fd5b60209290920196919550909350505050565b60006020828403121561408d57600080fd5b8135612fbd81613ea6565b600080600080608085870312156140ae57600080fd5b6140b785613f9a565b966020860135965060408601359560600135945092505050565b6000806000606084860312156140e657600080fd5b83356140f181613e2a565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b828110156141525781518051855286810151878601528501518585015260609093019290850190600101614123565b5091979650505050505050565b60006020828403121561417157600080fd5b8151612fbd81613e2a565b600181811c9082168061419057607f821691505b602082108114156141b157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561421c5761421c6141ec565b500290565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561425757600080fd5b5051919050565b600060ff821660ff811415614275576142756141ec565b60010192915050565b60008219821115614291576142916141ec565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826142bb576142bb614296565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156142ea576142ea6141ec565b5060010190565b60006020828403121561430357600080fd5b8151612fbd81613ea6565b600082821015614320576143206141ec565b500390565b60008261433457614334614296565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561436257600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b838110156143ac5781516001600160a01b031687529582019590820190600101614387565b509495945050505050565b85815284602082015260a0604082015260006143d660a0830186614373565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561440857600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061443a6080830186614373565b6001600160a01b0394909416604083015250606001529291505056fea26469706673582212209a24f9b569365c3fe6c738299975d9f4b8a24d568443cc753184fe5b0022622264736f6c634300080b003360a06040523480156200001157600080fd5b5060408051808201825260148082527f4246465f4469766964656e645f547261636b6572000000000000000000000000602080840182815285518087019096529285528401528151919291839183916200006e91600391620000df565b50805162000084906004906020840190620000df565b5050600980546001600160a01b03191633908117909155604051909350600092507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091508290a369021e19e0c9bab2400000608052620001c2565b828054620000ed9062000185565b90600052602060002090601f0160209004810192826200011157600085556200015c565b82601f106200012c57805160ff19168380011785556200015c565b828001600101855582156200015c579182015b828111156200015c5782518255916020019190600101906200013f565b506200016a9291506200016e565b5090565b5b808211156200016a57600081556001016200016f565b600181811c908216806200019a57607f821691505b60208210811415620001bc57634e487b7160e01b600052602260045260246000fd5b50919050565b6080516117be620001ec6000396000818161051c0152818161077d0152610cab01526117be6000f3fe6080604052600436106101c65760003560e01c80636a474002116100f7578063a457c2d711610095578063be10b61411610064578063be10b6141461050a578063dd62ed3e1461053e578063e30443bc14610584578063fbcbc0f1146105a457600080fd5b8063a457c2d714610474578063a8b9d24014610494578063a9059cbb146104b4578063aafd847a146104d457600080fd5b806385a6b3ae116100d157806385a6b3ae146104015780638da5cb5b1461041757806391b89fba1461043f57806395d89b411461045f57600080fd5b80636a474002146103a157806370a08231146103b6578063715018a6146103ec57600080fd5b806327ce014711610164578063369513561161013e578063369513561461031157806339509351146103315780634e7b827f1461035157806352b5f81d1461038157600080fd5b806327ce0147146102b5578063313ce567146102d557806331e79db0146102f157600080fd5b806309bbedde116101a057806309bbedde1461023d57806318160ddd1461026057806318c18adb1461027557806323b872dd1461029557600080fd5b806303c83302146101da57806306fdde03146101e2578063095ea7b31461020d57600080fd5b366101d5576101d36105d9565b005b600080fd5b6101d36105d9565b3480156101ee57600080fd5b506101f761066c565b60405161020491906114e2565b60405180910390f35b34801561021957600080fd5b5061022d61022836600461154f565b6106fe565b6040519015158152602001610204565b34801561024957600080fd5b50610252610718565b604051908152602001610204565b34801561026c57600080fd5b50600254610252565b34801561028157600080fd5b506101d361029036600461154f565b610728565b3480156102a157600080fd5b5061022d6102b036600461157b565b610835565b3480156102c157600080fd5b506102526102d03660046115bc565b610859565b3480156102e157600080fd5b5060405160128152602001610204565b3480156102fd57600080fd5b506101d361030c3660046115bc565b6108b5565b34801561031d57600080fd5b5061022d61032c3660046115bc565b610994565b34801561033d57600080fd5b5061022d61034c36600461154f565b6109e0565b34801561035d57600080fd5b5061022d61036c3660046115bc565b600d6020526000908152604090205460ff1681565b34801561038d57600080fd5b5061025261039c3660046115d9565b610a1f565b3480156103ad57600080fd5b506101d3610a60565b3480156103c257600080fd5b506102526103d13660046115bc565b6001600160a01b031660009081526020819052604090205490565b3480156103f857600080fd5b506101d3610b00565b34801561040d57600080fd5b5061025260085481565b34801561042357600080fd5b506009546040516001600160a01b039091168152602001610204565b34801561044b57600080fd5b5061025261045a3660046115bc565b610b74565b34801561046b57600080fd5b506101f7610b7f565b34801561048057600080fd5b5061022d61048f36600461154f565b610b8e565b3480156104a057600080fd5b506102526104af3660046115bc565b610c20565b3480156104c057600080fd5b5061022d6104cf36600461154f565b610c4c565b3480156104e057600080fd5b506102526104ef3660046115bc565b6001600160a01b031660009081526007602052604090205490565b34801561051657600080fd5b506102527f000000000000000000000000000000000000000000000000000000000000000081565b34801561054a57600080fd5b506102526105593660046115d9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561059057600080fd5b506101d361059f36600461154f565b610c5a565b3480156105b057600080fd5b506105c46105bf3660046115bc565b610d8a565b60408051928352602083019190915201610204565b60006105e460025490565b116105ee57600080fd5b341561066a5761062161060060025490565b61060e34600160801b610db7565b6106189190611628565b60055490610dca565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26008546106669034610dca565b6008555b565b60606003805461067b9061164a565b80601f01602080910402602001604051908101604052809291908181526020018280546106a79061164a565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b60003361070c818585610dd6565b60019150505b92915050565b6000610723600b5490565b905090565b6009546001600160a01b0316331461075b5760405162461bcd60e51b815260040161075290611685565b60405180910390fd5b6001600160a01b0382166000908152600d60205260409020805460ff191690557f000000000000000000000000000000000000000000000000000000000000000081106107fd576107ac8282610e36565b6001600160a01b0382166000908152600c602052604090205460ff166107fd576001600160a01b0382166000908152600c60205260409020805460ff191660011790556107fd600b80546001019055565b6040516001600160a01b038316907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a25050565b600033610843858285610e95565b61084e858585610f21565b506001949350505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b926108ab926108a6926108a09161089b9190610db7565b610f7c565b90610fea565b610ff6565b6107129190611628565b6009546001600160a01b031633146108df5760405162461bcd60e51b815260040161075290611685565b6001600160a01b0381166000908152600d60205260408120805460ff1916600117905561090d908290610e36565b6001600160a01b0381166000908152600c602052604090205460ff1615156001141561095d576001600160a01b0381166000908152600c60205260409020805460ff1916905561095d600b611048565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546000906001600160a01b031633146109c15760405162461bcd60e51b815260040161075290611685565b506001600160a01b03166000908152600d602052604090205460ff1690565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061070c9082908690610a1a9087906116ba565b610dd6565b6009546000906001600160a01b03163314610a4c5760405162461bcd60e51b815260040161075290611685565b6000610a58848461109f565b949350505050565b60405162461bcd60e51b815260206004820152606360248201527f4246465f4469766964656e645f547261636b65723a207769746864726177446960448201527f766964656e642064697361626c65642e20557365207468652027636c61696d2760648201527f2066756e6374696f6e206f6e20746865206d61696e2042464620636f6e74726160848201526231ba1760e91b60a482015260c401610752565b6009546001600160a01b03163314610b2a5760405162461bcd60e51b815260040161075290611685565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b600061071282610c20565b60606004805461067b9061164a565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610c135760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610752565b61084e8286868403610dd6565b6001600160a01b03811660009081526007602052604081205461071290610c4684610859565b906111f5565b60003361070c818585610f21565b6009546001600160a01b03163314610c845760405162461bcd60e51b815260040161075290611685565b6001600160a01b0382166000908152600d602052604090205460ff1615610ca9575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610d2f57610cda8282610e36565b6001600160a01b0382166000908152600c602052604090205460ff16610d2b576001600160a01b0382166000908152600c60205260409020805460ff19166001179055610d2b600b80546001019055565b5050565b610d3a826000610e36565b6001600160a01b0382166000908152600c602052604090205460ff16151560011415610d2b576001600160a01b0382166000908152600c60205260409020805460ff19169055610d2b600b611048565b600080610d9683610c20565b6001600160a01b039093166000908152600760205260409020549293915050565b6000610dc382846116d2565b9392505050565b6000610dc382846116ba565b60405162461bcd60e51b815260206004820152602a60248201527f4246465f4469766964656e645f547261636b65723a204e6f20617070726f76616044820152691b1cc8185b1b1bddd95960b21b6064820152608401610752565b505050565b6001600160a01b03821660009081526020819052604090205480821115610e75576000610e6383836111f5565b9050610e6f8482611201565b50505050565b80821015610e31576000610e8982846111f5565b9050610e6f8482611265565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610e6f5781811015610f145760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610752565b610e6f8484848403610dd6565b60405162461bcd60e51b815260206004820152602a60248201527f4246465f4469766964656e645f547261636b65723a204e6f207472616e7366656044820152691c9cc8185b1b1bddd95960b21b6064820152608401610752565b60006001600160ff1b03821115610fe65760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401610752565b5090565b6000610dc382846116f1565b600080821215610fe65760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f7369746976656044820152606401610752565b8054806110975760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f7700000000006044820152606401610752565b600019019055565b6000806110ab84610c20565b905080156111eb576001600160a01b0384166000908152600760205260409020546110d69082610dca565b6001600160a01b038516600081815260076020526040908190209290925590517feb063efb53b3790d2bc15284b59af7544466c8787c2883321ee27095647911b69061113790849087909182526001600160a01b0316602082015260400190565b60405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461118c576040519150601f19603f3d011682016040523d82523d6000602084013e611191565b606091505b50509050806111e3576001600160a01b0385166000908152600760205260409020546111bd90836111f5565b6001600160a01b0386166000908152600760205260408120919091559250610712915050565b509050610712565b5060009392505050565b6000610dc38284611732565b61120b82826112a9565b61124561122661089b83600554610db790919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611388565b6001600160a01b0390921660009081526006602052604090209190915550565b61126f8282611394565b61124561128a61089b83600554610db790919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490610fea565b6001600160a01b0382166112ff5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610752565b806002600082825461131191906116ba565b90915550506001600160a01b0382166000908152602081905260408120805483929061133e9084906116ba565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000610dc38284611749565b6001600160a01b0382166113f45760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610752565b6001600160a01b038216600090815260208190526040902054818110156114685760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610752565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611497908490611732565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208083528351808285015260005b8181101561150f578581018301518582016040015282016114f3565b81811115611521576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461154c57600080fd5b50565b6000806040838503121561156257600080fd5b823561156d81611537565b946020939093013593505050565b60008060006060848603121561159057600080fd5b833561159b81611537565b925060208401356115ab81611537565b929592945050506040919091013590565b6000602082840312156115ce57600080fd5b8135610dc381611537565b600080604083850312156115ec57600080fd5b82356115f781611537565b9150602083013561160781611537565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008261164557634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061165e57607f821691505b6020821081141561167f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156116cd576116cd611612565b500190565b60008160001904831182151516156116ec576116ec611612565b500290565b600080821280156001600160ff1b038490038513161561171357611713611612565b600160ff1b839003841281161561172c5761172c611612565b50500190565b60008282101561174457611744611612565b500390565b60008083128015600160ff1b85018412161561176757611767611612565b6001600160ff1b038401831381161561178257611782611612565b5050039056fea264697066735822122080e5a226483e0df38603cebf1c96fe2aa9aff63f4de330b288983c933263bbbb64736f6c634300080b00330000000000000000000000005a377aecf9b9deaf61ab116fe14ed56a3f4b4a7e00000000000000000000000058782fc478221bfb381ce8d61560eb0f9f8402a8

Deployed Bytecode

0x6080604052600436106104095760003560e01c80637c4b492e11610213578063b80425c211610123578063e4132fd8116100ab578063f42938901161007a578063f429389014610c96578063f5648a4f14610cab578063fb66d86d14610cc0578063fbcbc0f114610cd6578063fdb5a03e14610cf657600080fd5b8063e4132fd814610c09578063ea084eef14610c29578063eb50d71f14610c49578063ec29f4e914610c6957600080fd5b8063c9e8714c116100f2578063c9e8714c14610b47578063d2469ba614610b77578063d297105914610b97578063dd62ed3e14610bad578063e3402c6714610bf357600080fd5b8063b80425c214610ab0578063ba762ddd14610b07578063c2b1b19914610b1c578063c9567bf914610b3257600080fd5b806395d89b41116101a6578063aa4bde2811610175578063aa4bde2814610a0e578063adc7f53e14610a24578063af9549e014610a3a578063b1fdb11b14610a5a578063b515566a14610a9057600080fd5b806395d89b4114610999578063a457c2d7146109ae578063a8b9d240146109ce578063a9059cbb146109ee57600080fd5b80638da5cb5b116101e25780638da5cb5b146108ff5780638e5916b21461091d578063906778331461094d57806392c403441461097957600080fd5b80637c4b492e14610883578063884289e3146108995780638954fb4a146108c957806389a5c691146108e957600080fd5b80633bbac579116103195780635d0dc8e4116102a157806368bfe6231161027057806368bfe623146107f45780636973cd091461080e57806370a082311461082e578063715018a61461084e578063753d654e1461086357600080fd5b80635d0dc8e41461077f5780635fcefa421461079f57806364b0f653146107bf5780636843cd84146107d457600080fd5b80634f0f9010116102e85780634f0f9010146106e757806351bc3c85146107075780635b6612ad1461071c5780635b683e66146107495780635d0044ca1461075f57600080fd5b80633bbac5791461066c5780634bae2ef11461069c5780634c590d87146106b25780634e71d92d146106d257600080fd5b80631c08bc5d1161039c5780632c7401b31161036b5780632c7401b3146105c557806330bb4cff146105e5578063313ce567146105fa578063333e99db1461061c578063395093511461064c57600080fd5b80631c08bc5d1461054557806323b872dd1461056557806324848348146105855780632c1f5216146105a557600080fd5b806312dfbd33116103d857806312dfbd33146104c6578063153b0d1e146104e657806318160ddd1461050657806319a1cca01461052557600080fd5b806302d7acda1461041557806306fdde03146104525780630829b32d14610474578063095ea7b31461049657600080fd5b3661041057005b600080fd5b34801561042157600080fd5b50610435610430366004613dbc565b610d0b565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561045e57600080fd5b50610467610d90565b6040516104499190613dd5565b34801561048057600080fd5b5061049461048f366004613e42565b610e22565b005b3480156104a257600080fd5b506104b66104b1366004613e7a565b610f1c565b6040519015158152602001610449565b3480156104d257600080fd5b506104946104e1366004613dbc565b610f34565b3480156104f257600080fd5b50610494610501366004613eb4565b610f63565b34801561051257600080fd5b506002545b604051908152602001610449565b34801561053157600080fd5b50610435610540366004613dbc565b610fb8565b34801561055157600080fd5b50610494610560366004613dbc565b610ffa565b34801561057157600080fd5b506104b6610580366004613eed565b611029565b34801561059157600080fd5b506104b66105a0366004613f1d565b61104d565b3480156105b157600080fd5b50602454610435906001600160a01b031681565b3480156105d157600080fd5b506105176105e0366004613e7a565b61109a565b3480156105f157600080fd5b506105176111b8565b34801561060657600080fd5b5060125b60405160ff9091168152602001610449565b34801561062857600080fd5b506104b6610637366004613f4b565b60126020526000908152604090205460ff1681565b34801561065857600080fd5b506104b6610667366004613e7a565b61122b565b34801561067857600080fd5b506104b6610687366004613f4b565b60146020526000908152604090205460ff1681565b3480156106a857600080fd5b50610517601a5481565b3480156106be57600080fd5b506104946106cd366004613f68565b61126a565b3480156106de57600080fd5b50610494611313565b3480156106f357600080fd5b50610517610702366004613f4b565b611320565b34801561071357600080fd5b5061049461136a565b34801561072857600080fd5b50610517610737366004613f4b565b60266020526000908152604090205481565b34801561075557600080fd5b5061051760185481565b34801561076b57600080fd5b5061049461077a366004613dbc565b6113ba565b34801561078b57600080fd5b5061049461079a366004613fb0565b61148b565b3480156107ab57600080fd5b506104946107ba366004613fcb565b6114cb565b3480156107cb57600080fd5b50610517611529565b3480156107e057600080fd5b506105176107ef366004613f4b565b611573565b34801561080057600080fd5b5060225461060a9060ff1681565b34801561081a57600080fd5b50610494610829366004613f1d565b6115e3565b34801561083a57600080fd5b50610517610849366004613f4b565b611645565b34801561085a57600080fd5b50610494611660565b34801561086f57600080fd5b5061049461087e366004613eb4565b6116d4565b34801561088f57600080fd5b5061051760275481565b3480156108a557600080fd5b506104b66108b4366004613f4b565b60136020526000908152604090205460ff1681565b3480156108d557600080fd5b506104946108e4366004613eb4565b611729565b3480156108f557600080fd5b50610517601f5481565b34801561090b57600080fd5b506005546001600160a01b0316610435565b34801561092957600080fd5b506104b6610938366004613f4b565b60116020526000908152604090205460ff1681565b34801561095957600080fd5b50610517610968366004613f4b565b602080526000908152604090205481565b34801561098557600080fd5b50610517610994366004613f4b565b611808565b3480156109a557600080fd5b5061046761186a565b3480156109ba57600080fd5b506104b66109c9366004613e7a565b611879565b3480156109da57600080fd5b506105176109e9366004613f4b565b61190b565b3480156109fa57600080fd5b506104b6610a09366004613e7a565b61193e565b348015610a1a57600080fd5b5061051760165481565b348015610a3057600080fd5b50610517601b5481565b348015610a4657600080fd5b50610494610a55366004613eb4565b61194c565b348015610a6657600080fd5b50610517610a75366004613f4b565b6001600160a01b031660009081526030602052604090205490565b348015610a9c57600080fd5b50610494610aab366004614006565b6119a1565b348015610abc57600080fd5b50610aec610acb366004613dbc565b60216020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610449565b348015610b1357600080fd5b50610517611acc565b348015610b2857600080fd5b5061051760175481565b348015610b3e57600080fd5b50610494611add565b348015610b5357600080fd5b506104b6610b62366004613f4b565b60156020526000908152604090205460ff1681565b348015610b8357600080fd5b50610494610b92366004614006565b611e54565b348015610ba357600080fd5b5061051760295481565b348015610bb957600080fd5b50610517610bc8366004613f1d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bff57600080fd5b5061051760285481565b348015610c1557600080fd5b50610494610c2436600461407b565b611f2d565b348015610c3557600080fd5b50610494610c44366004613eb4565b611f75565b348015610c5557600080fd5b50610494610c64366004614098565b611fca565b348015610c7557600080fd5b50610c89610c843660046140d1565b612015565b6040516104499190614106565b348015610ca257600080fd5b5061049461223b565b348015610cb757600080fd5b50610494612308565b348015610ccc57600080fd5b5061051760195481565b348015610ce257600080fd5b50610aec610cf1366004613f4b565b6123e2565b348015610d0257600080fd5b50610494612471565b604051633b966bcd60e21b8152602b60048201526024810182905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063ee59af34906044015b602060405180830381865af4158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a919061415f565b92915050565b606060038054610d9f9061417c565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcb9061417c565b8015610e185780601f10610ded57610100808354040283529160200191610e18565b820191906000526020600020905b815481529060010190602001808311610dfb57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e555760405162461bcd60e51b8152600401610e4c906141b7565b60405180910390fd5b600754600160a01b900460ff1615610ed55760405162461bcd60e51b815260206004820152603c60248201527f4246463a2043616e206f6e6c7920656e61626c652050726553616c652062656660448201527f6f72652054726164696e6720686173206265656e206f70656e65642e000000006064820152608401610e4c565b600d839055600a80546001600160a01b0319166001600160a01b038416179055610f0781670de0b6b3a7640000614202565b600b555050600f805460ff1916600117905550565b600033610f2a81858561247c565b5060019392505050565b6005546001600160a01b03163314610f5e5760405162461bcd60e51b8152600401610e4c906141b7565b601f55565b6005546001600160a01b03163314610f8d5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b604051633325c8f560e21b8152602b60048201526024810182905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063cc9723d490604401610d49565b6005546001600160a01b031633146110245760405162461bcd60e51b8152600401610e4c906141b7565b602855565b6000336110378582856125a0565b61104285858561262c565b506001949350505050565b60006001600160a01b03831661106557506000610d8a565b602b548061107285611645565b101580156110925750826001600160a01b0316846001600160a01b031614155b949350505050565b601854600954604051632f99934f60e01b81526000929183917389e3e1fee6b040e095965189094419d41184d9e991632f99934f916110eb9189916001600160a01b03909116908990600401614221565b602060405180830381865af4158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c9190614245565b905060015b60225460ff908116908216116111ae5760ff81166000908152602160205260409020548210801590611178575060ff81166000908152602160205260409020600101548211155b1561119c5760ff166000908152602160205260409020600201549250610d8a915050565b806111a68161425e565b915050611131565b5090949350505050565b602454604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190614245565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610f2a908290869061126590879061427e565b61247c565b6005546001600160a01b031633146112945760405162461bcd60e51b8152600401610e4c906141b7565b6019849055601a839055601b829055604051635fe4fbe160e11b8152602b60048201526024810182905273a636249ba25ece6f11e5c1f5130da90a90c417899063bfc9f7c29060440160006040518083038186803b1580156112f557600080fd5b505af4158015611309573d6000803e3d6000fd5b5050505050505050565b61131e336000612c6a565b565b6001600160a01b038116600090815260136020526040812054819060ff16806113525750600754600160a81b900460ff165b156113615750620f4240610d8a565b50600092915050565b6005546001600160a01b031633146113945760405162461bcd60e51b8152600401610e4c906141b7565b60006113ab6027546113a530611645565b90612fb1565b90506113b681612fc4565b5050565b6005546001600160a01b031633146113e45760405162461bcd60e51b8152600401610e4c906141b7565b670de0b6b3a76400006103e86113f960025490565b611404906001614202565b61140e91906142ac565b61141891906142ac565b8110156114735760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b6064820152608401610e4c565b61148581670de0b6b3a7640000614202565b60165550565b6005546001600160a01b031633146114b55760405162461bcd60e51b8152600401610e4c906141b7565b6022805460ff191660ff92909216919091179055565b6005546001600160a01b031633146114f55760405162461bcd60e51b8152600401610e4c906141b7565b600a85111580156115095750600a60185411155b61151257600080fd5b601794909455601892909255601c55601d55601e55565b602454604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b602480546040516370a0823160e01b81526001600160a01b0384811660048301526000939216916370a0823191015b602060405180830381865afa1580156115bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614245565b6005546001600160a01b0316331461160d5760405162461bcd60e51b8152600401610e4c906141b7565b60228054610100600160a81b0319166101006001600160a01b0394851602179055602380546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461168a5760405162461bcd60e51b8152600401610e4c906141b7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146116fe5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117535760405162461bcd60e51b8152600401610e4c906141b7565b80156117bc576024805460405163031e79db60e41b81526001600160a01b038581166004830152909116916331e79db091015b600060405180830381600087803b1580156117a057600080fd5b505af11580156117b4573d6000803e3d6000fd5b505050505050565b6024546001600160a01b03166318c18adb836117d781611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611786565b60405163057c207360e21b8152602b60048201526001600160a01b038216602482015260009073a636249ba25ece6f11e5c1f5130da90a90c41789906315f081cc90604401602060405180830381865af41580156115bf573d6000803e3d6000fd5b606060048054610d9f9061417c565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156118fe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e4c565b611042828686840361247c565b602480546040516302a2e74960e61b81526001600160a01b03848116600483015260009392169163a8b9d24091016115a2565b600033610f2a81858561262c565b6005546001600160a01b031633146119765760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146119cb5760405162461bcd60e51b8152600401610e4c906141b7565b60005b81811015611ac7576009546001600160a01b03168383838181106119f4576119f46142c0565b9050602002016020810190611a099190613f4b565b6001600160a01b031614158015611a5a57506007546001600160a01b0316838383818110611a3957611a396142c0565b9050602002016020810190611a4e9190613f4b565b6001600160a01b031614155b15611ab557600160146000858585818110611a7757611a776142c0565b9050602002016020810190611a8c9190613f4b565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611abf816142d6565b9150506119ce565b505050565b60006112266027546113a530611645565b6005546001600160a01b03163314611b075760405162461bcd60e51b8152600401610e4c906141b7565b600754600160a01b900460ff1615611b615760405162461bcd60e51b815260206004820152601c60248201527f4246463a2054726164696e6720697320616c7265616479206f70656e000000006044820152606401610e4c565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd8919061415f565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5e919061415f565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccf919061415f565b600980546001600160a01b0319166001600160a01b0392831690811782556000908152601560209081526040808320805460ff19908116600190811790925585548716855260109093529281902080549092169092179055602480549254915163031e79db60e41b8152918416600483015291909216916331e79db09101600060405180830381600087803b158015611d6757600080fd5b505af1158015611d7b573d6000803e3d6000fd5b50505050611d91611d8b30611645565b47613179565b60095460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b91906142f1565b506007805460ff60a01b1916600160a01b179055600f5460ff1615611e4e5742600c819055600d54611e4990611e4290603c613288565b8290613294565b600e55505b43600855565b6005546001600160a01b03163314611e7e5760405162461bcd60e51b8152600401610e4c906141b7565b60005b81811015611ac7576024546001600160a01b03166331e79db0848484818110611eac57611eac6142c0565b9050602002016020810190611ec19190613f4b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611f0257600080fd5b505af1158015611f16573d6000803e3d6000fd5b505050508080611f25906142d6565b915050611e81565b6005546001600160a01b03163314611f575760405162461bcd60e51b8152600401610e4c906141b7565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6005546001600160a01b03163314611f9f5760405162461bcd60e51b8152600401610e4c906141b7565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611ff45760405162461bcd60e51b8152600401610e4c906141b7565b60ff9093166000908152602160205260409020918255600182015560020155565b60606000831180156120275750600082115b61206c5760405162461bcd60e51b81526020600482015260166024820152754246463a20496e76616c696420617267756d656e747360501b6044820152606401610e4c565b6001600160a01b038416600090815260306020526040812054906120908585614202565b9050600061209e868361430e565b90508281106120e35760405162461bcd60e51b81526020600482015260116024820152704246463a204f7574206f662072616e676560781b6044820152606401610e4c565b85838311156120fc578392506120f98784614325565b90505b60008167ffffffffffffffff81111561211757612117614339565b60405190808252806020026020018201604052801561216c57816020015b61215960405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816121355790505b5090506000835b8581101561222c576001600160a01b038b1660009081526030602052604081208054839081106121a5576121a56142c0565b90600052602060002001549050602f60008281526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050848481518110612200576122006142c0565b602090810291909101015261221660018461427e565b9250508080612224906142d6565b915050612173565b50909998505050505050505050565b6005546001600160a01b031633146122655760405162461bcd60e51b8152600401610e4c906141b7565b600061227c60295447612fb190919063ffffffff16565b905060006122ad612299601c546064612fb190919063ffffffff16565b601d546122a7908590613288565b906132a0565b905060006122d86122ca601c546064612fb190919063ffffffff16565b601e546122a7908690613288565b905060006122ea826113a58686612fb1565b90506122f68382613294565b925061230283836132ac565b50505050565b6005546001600160a01b031633146123325760405162461bcd60e51b8152600401610e4c906141b7565b600754600160a01b900460ff16156123a05760405162461bcd60e51b815260206004820152602b60248201527f43616e206f6e6c792077697468647261772069662074726164696e672068617360448201526a1b89dd081cdd185c9d195960aa1b6064820152608401610e4c565b604051600090339047908381818185875af1925050503d8060008114612302576040519150601f19603f3d011682016040523d82523d6000602084013e612302565b6024805460405163fbcbc0f160e01b81526001600160a01b0384811660048301526000938493849392169163fbcbc0f191016040805180830381865afa158015612430573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612454919061434f565b9093509150828261246486611645565b9250925092509193909250565b61131e336001612c6a565b6001600160a01b0383166124de5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e4c565b6001600160a01b03821661253f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e4c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612302578181101561261f5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e4c565b612302848484840361247c565b6001600160a01b03831660009081526014602052604090205460ff1615801561266e57506001600160a01b03821660009081526014602052604090205460ff16155b61267757600080fd5b6001600160a01b03831660009081526012602052604090205460ff161580156126b957506001600160a01b03821660009081526012602052604090205460ff16155b6126c257600080fd5b6007548190600160a01b900460ff16801561271757506001600160a01b03841660009081526010602052604090205460ff168061271757506001600160a01b03831660009081526010602052604090205460ff165b801561273c57506001600160a01b03841660009081526011602052604090205460ff16155b801561276157506001600160a01b03831660009081526011602052604090205460ff16155b1561299857600f5460ff16801561277a575042600c5411155b8015612787575042600e54115b1561285e57600b54600a546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156127d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fd9190614245565b101561285e5760405162461bcd60e51b815260206004820152602a60248201527f50726553616c653a204e6f7420656e6f7567682050726553616c6520746f6b6560448201526937103130b630b731b29760b11b6064820152608401610e4c565b604051633325c8f560e21b8152602b60048201526024810183905260009073a636249ba25ece6f11e5c1f5130da90a90c417899063cc9723d490604401602060405180830381865af41580156128b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128dc919061415f565b905073a636249ba25ece6f11e5c1f5130da90a90c417896304ea10f2602b8361290481611645565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152604483015287166064820152608401602060405180830381865af415801561295c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298091906142f1565b612988575060005b6129948585858461336a565b9150505b6001600160a01b03831660009081526020805260409020546129cf576001600160a01b038316600090815260208052604090204290555b6001600160a01b03831660009081526010602052604090205460ff16158015612a1157506001600160a01b03831660009081526015602052604090205460ff16155b15612a855760165481612a2385611645565b612a2d919061427e565b1115612a855760405162461bcd60e51b815260206004820152602160248201527f4246463a2057616c6c65742062616c616e6365206c696d6974207265616368656044820152601960fa1b6064820152608401610e4c565b612a90848483613782565b612a9983613950565b60248054604051631b4a89ab60e11b81526001600160a01b0387811660048301529091169163369513569101602060405180830381865afa158015612ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0691906142f1565b612b7e576024546001600160a01b031663e30443bc85612b2581611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b6b57600080fd5b505af1925050508015612b7c575060015b505b60248054604051631b4a89ab60e11b81526001600160a01b0386811660048301529091169163369513569101602060405180830381865afa158015612bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612beb91906142f1565b612302576024546001600160a01b031663e30443bc84612c0a81611645565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612c5057600080fd5b505af1925050508015612c61575060015b61230257612302565b602480546040516302a2e74960e61b81526001600160a01b03858116600483015260009392169163a8b9d2409101602060405180830381865afa158015612cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd99190614245565b905060008111612d3e5760405162461bcd60e51b815260206004820152602a60248201527f4246463a20436c61696d657220686173206e6f20776974686472617761626c65604482015269206469766964656e647360b01b6064820152608401610e4c565b60008083612e6a57600754600160a81b900460ff1680612d7657506001600160a01b03851660009081526013602052604090205460ff165b612dea576040805162461bcd60e51b81526020600482015260248101919091527f4246463a20436c61696d6572206e6f7420616c6c6f77656420746f20636c616960448201527f6d206469766964656e64732c2063616e206f6e6c792072652d696e766573742e6064820152608401610e4c565b602480546040516352b5f81d60e01b81526001600160a01b0388811660048301819052938201939093529116906352b5f81d906044016020604051808303816000875af1158015612e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e639190614245565b9150612efd565b8315612efd57602480546040516352b5f81d60e01b81526001600160a01b03888116600483015230938201939093529116906352b5f81d906044016020604051808303816000875af1158015612ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee89190614245565b91508115612efd57612efa8286613a36565b90505b8115612faa57612f11602a80546001019055565b6000612f1c602a5490565b6000818152602f602090815260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260308452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505b5050505050565b6000612fbd828461430e565b9392505050565b6040805160028082526060820183526000924792849290916020830190803683370190505090503081600081518110612fff57612fff6142c0565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307c919061415f565b8160018151811061308f5761308f6142c0565b6001600160a01b0392831660209182029290920101526007546130b5913091168661247c565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906130ee9087906000908690309042906004016143b7565b600060405180830381600087803b15801561310857600080fd5b505af115801561311c573d6000803e3d6000fd5b5050505060006131358347612fb190919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b6007546131919030906001600160a01b03168461247c565b6007546001600160a01b031663f305d7198230856000806131ba6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613222573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061324791906143f3565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b6000612fbd8284614202565b6000612fbd828461427e565b6000612fbd82846142ac565b81156132f2576022546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f193505050501580156132f0573d6000803e3d6000fd5b505b8015613334576023546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015613332573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd924968910161327c565b6001600160a01b0384166000908152601060205260408120548190819060ff16806133ad57506001600160a01b03861660009081526010602052604090205460ff165b6133f95760405162461bcd60e51b815260206004820152601b60248201527f4246463a204e6f206d61726b6574206d616b65727320666f756e6400000000006044820152606401610e4c565b6001600160a01b03871660009081526010602052604090205460ff161561363d576000806000600854431480156134335750600f5460ff16155b1561344157605a92506134b2565b60085461344f90600161427e565b431480156134605750600f5460ff16155b1561346e57603292506134b2565b6001600160a01b038716156134ac576134a561349c600a6122a7601b54601a5461329490919063ffffffff16565b60195490613294565b92506134b2565b60175492505b6134c160646122a78a86613288565b94506001600160a01b038716156135e2576134ec60646122a76019548b61328890919063ffffffff16565b94506135096103e86122a7601a548b61328890919063ffffffff16565b91506135266103e86122a7601b548b61328890919063ffffffff16565b905060006135348383613294565b905061354e82613548836113a58d8b612fb1565b90613294565b945061355b8b3088613782565b6135668b8985613782565b7f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8b308860405161359993929190614221565b60405180910390a17f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8b89856040516135d493929190614221565b60405180910390a150613635565b6135ec8886612fb1565b93506135f98a3087613782565b7f6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401d8a308760405161362c93929190614221565b60405180910390a15b505050613778565b60006008544314156136515750605a61369b565b60085461365f90600161427e565b43141561366e5750603261369b565b600061367a308861109a565b90508060185461368a919061427e565b9150601e821061369957601e91505b505b6136aa60646122a78884613288565b925060006136d260646122a76136cb60185486612fb190919063ffffffff16565b8a90613288565b6027549091506136e29082613294565b6027556136ef8785612fb1565b92506136fc893086613782565b600061370d6027546113a530611645565b9050601f548111156137225761372281613be8565b602854602754111561373957613739602754613cde565b7f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a8a308760405161376c93929190614221565b60405180910390a15050505b9695505050505050565b6001600160a01b0383166137e65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e4c565b6001600160a01b0382166138485760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e4c565b6001600160a01b038316600090815260208190526040902054818110156138c05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e4c565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906138f790849061427e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161394391815260200190565b60405180910390a3612302565b6001600160a01b03811660009081526011602052604090205460ff168061398f57506001600160a01b03811660009081526012602052604090205460ff165b156139975750565b6009546001600160a01b03828116911614156139b05750565b73a636249ba25ece6f11e5c1f5130da90a90c4178963cdb09f68602b836139d681611645565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152604482015260640160006040518083038186803b158015613a2257600080fd5b505af4158015612faa573d6000803e3d6000fd5b600080613a4230611645565b60408051600280825260608201835292935060009290916020830190803683375050600754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad5919061415f565b81600081518110613ae857613ae86142c0565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110613b1c57613b1c6142c0565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790613b629060009086908a904290600401614421565b6000604051808303818588803b158015613b7b57600080fd5b505af1158015613b8f573d6000803e3d6000fd5b50505050506000613ba3836113a530611645565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000613c0460646122a7601c548561328890919063ffffffff16565b90506000613c138260026132a0565b90506000613c218483612fb1565b90506000613c2e82612fc4565b90506000613c4c60646122a7601c548561328890919063ffffffff16565b90506000613c6a60646122a7601d548661328890919063ffffffff16565b90506000613c8860646122a7601e548761328890919063ffffffff16565b90506000613c9c826113a585818989612fb1565b9050613ca88382613294565b9250613cb483836132ac565b600087118015613cc45750600084115b15613cd357613cd38785613179565b505050505050505050565b6000613ce982612fc4565b602754909150613cf99083612fb1565b602755602954600090613d0d908390613294565b6024546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613d5f576040519150601f19603f3d011682016040523d82523d6000602084013e613d64565b606091505b505090508015613da6576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1612302565b602954613db39084613294565b60295550505050565b600060208284031215613dce57600080fd5b5035919050565b600060208083528351808285015260005b81811015613e0257858101830151858201604001528201613de6565b81811115613e14576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114613e3f57600080fd5b50565b600080600060608486031215613e5757600080fd5b833592506020840135613e6981613e2a565b929592945050506040919091013590565b60008060408385031215613e8d57600080fd5b8235613e9881613e2a565b946020939093013593505050565b8015158114613e3f57600080fd5b60008060408385031215613ec757600080fd5b8235613ed281613e2a565b91506020830135613ee281613ea6565b809150509250929050565b600080600060608486031215613f0257600080fd5b8335613f0d81613e2a565b92506020840135613e6981613e2a565b60008060408385031215613f3057600080fd5b8235613f3b81613e2a565b91506020830135613ee281613e2a565b600060208284031215613f5d57600080fd5b8135612fbd81613e2a565b60008060008060808587031215613f7e57600080fd5b5050823594602084013594506040840135936060013592509050565b803560ff81168114613fab57600080fd5b919050565b600060208284031215613fc257600080fd5b612fbd82613f9a565b600080600080600060a08688031215613fe357600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806020838503121561401957600080fd5b823567ffffffffffffffff8082111561403157600080fd5b818501915085601f83011261404557600080fd5b81358181111561405457600080fd5b8660208260051b850101111561406957600080fd5b60209290920196919550909350505050565b60006020828403121561408d57600080fd5b8135612fbd81613ea6565b600080600080608085870312156140ae57600080fd5b6140b785613f9a565b966020860135965060408601359560600135945092505050565b6000806000606084860312156140e657600080fd5b83356140f181613e2a565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b828110156141525781518051855286810151878601528501518585015260609093019290850190600101614123565b5091979650505050505050565b60006020828403121561417157600080fd5b8151612fbd81613e2a565b600181811c9082168061419057607f821691505b602082108114156141b157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561421c5761421c6141ec565b500290565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561425757600080fd5b5051919050565b600060ff821660ff811415614275576142756141ec565b60010192915050565b60008219821115614291576142916141ec565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826142bb576142bb614296565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156142ea576142ea6141ec565b5060010190565b60006020828403121561430357600080fd5b8151612fbd81613ea6565b600082821015614320576143206141ec565b500390565b60008261433457614334614296565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561436257600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b838110156143ac5781516001600160a01b031687529582019590820190600101614387565b509495945050505050565b85815284602082015260a0604082015260006143d660a0830186614373565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561440857600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061443a6080830186614373565b6001600160a01b0394909416604083015250606001529291505056fea26469706673582212209a24f9b569365c3fe6c738299975d9f4b8a24d568443cc753184fe5b0022622264736f6c634300080b0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005a377aecf9b9deaf61ab116fe14ed56a3f4b4a7e00000000000000000000000058782fc478221bfb381ce8d61560eb0f9f8402a8

-----Decoded View---------------
Arg [0] : _devWalletAddress (address): 0x5a377AECF9b9DEAF61aB116FE14ED56A3F4b4A7e
Arg [1] : _marketingWalletAddress (address): 0x58782fC478221BfB381ce8d61560eB0f9f8402a8

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a377aecf9b9deaf61ab116fe14ed56a3f4b4a7e
Arg [1] : 00000000000000000000000058782fc478221bfb381ce8d61560eb0f9f8402a8


Libraries Used

UniswapV2PriceImpactCalculator : 0x89e3e1fee6b040e095965189094419d41184d9e9Unverified

Deployed Bytecode Sourcemap

32624:27402:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40428:171;;;;;;;;;;-1:-1:-1;40428:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;363:32:1;;;345:51;;333:2;318:18;40428:171:0;;;;;;;;1810:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38295:441::-;;;;;;;;;;-1:-1:-1;38295:441:0;;;;;:::i;:::-;;:::i;:::-;;2883:242;;;;;;;;;;-1:-1:-1;2883:242:0;;;;;:::i;:::-;;:::i;:::-;;;2018:14:1;;2011:22;1993:41;;1981:2;1966:18;2883:242:0;1853:187:1;50113:126:0;;;;;;;;;;-1:-1:-1;50113:126:0;;;;;:::i;:::-;;:::i;48099:140::-;;;;;;;;;;-1:-1:-1;48099:140:0;;;;;:::i;:::-;;:::i;2131:108::-;;;;;;;;;;-1:-1:-1;2219:12:0;;2131:108;;;2701:25:1;;;2689:2;2674:18;2131:108:0;2555:177:1;40607:185:0;;;;;;;;;;-1:-1:-1;40607:185:0;;;;;:::i;:::-;;:::i;50247:122::-;;;;;;;;;;-1:-1:-1;50247:122:0;;;;;:::i;:::-;;:::i;3133:295::-;;;;;;;;;;-1:-1:-1;3133:295:0;;;;;:::i;:::-;;:::i;40800:313::-;;;;;;;;;;-1:-1:-1;40800:313:0;;;;;:::i;:::-;;:::i;34704:41::-;;;;;;;;;;-1:-1:-1;34704:41:0;;;;-1:-1:-1;;;;;34704:41:0;;;42254:615;;;;;;;;;;-1:-1:-1;42254:615:0;;;;;:::i;:::-;;:::i;42877:141::-;;;;;;;;;;;;;:::i;45497:100::-;;;;;;;;;;-1:-1:-1;32920:2:0;45497:100;;;4006:4:1;3994:17;;;3976:36;;3964:2;3949:18;45497:100:0;3834:184:1;33631:43:0;;;;;;;;;;-1:-1:-1;33631:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3436:272;;;;;;;;;;-1:-1:-1;3436:272:0;;;;;:::i;:::-;;:::i;33736:37::-;;;;;;;;;;-1:-1:-1;33736:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34002:33;;;;;;;;;;;;;;;;39917:339;;;;;;;;;;-1:-1:-1;39917:339:0;;;;;:::i;:::-;;:::i;43401:79::-;;;;;;;;;;;;;:::i;58402:305::-;;;;;;;;;;-1:-1:-1;58402:305:0;;;;;:::i;:::-;;:::i;41447:200::-;;;;;;;;;;;;;:::i;34814:47::-;;;;;;;;;;-1:-1:-1;34814:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;33925:30;;;;;;;;;;;;;;;;49439:230;;;;;;;;;;-1:-1:-1;49439:230:0;;;;;:::i;:::-;;:::i;50696:118::-;;;;;;;;;;-1:-1:-1;50696:118:0;;;;;:::i;:::-;;:::i;49683:422::-;;;;;;;;;;-1:-1:-1;49683:422:0;;;;;:::i;:::-;;:::i;44925:142::-;;;;;;;;;;;;;:::i;43220:173::-;;;;;;;;;;-1:-1:-1;43220:173:0;;;;;:::i;:::-;;:::i;34577:32::-;;;;;;;;;;-1:-1:-1;34577:32:0;;;;;;;;51154:214;;;;;;;;;;-1:-1:-1;51154:214:0;;;;;:::i;:::-;;:::i;2247:177::-;;;;;;;;;;-1:-1:-1;2247:177:0;;;;;:::i;:::-;;:::i;10894:148::-;;;;;;;;;;;;;:::i;48247:158::-;;;;;;;;;;-1:-1:-1;48247:158:0;;;;;:::i;:::-;;:::i;34870:37::-;;;;;;;;;;;;;;;;33681:48;;;;;;;;;;-1:-1:-1;33681:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;48797:326;;;;;;;;;;-1:-1:-1;48797:326:0;;;;;:::i;:::-;;:::i;34270:53::-;;;;;;;;;;;;;;;;10682:79;;;;;;;;;;-1:-1:-1;10747:6:0;;-1:-1:-1;;;;;10747:6:0;10682:79;;33576:48;;;;;;;;;;-1:-1:-1;33576:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34441:54;;;;;;;;;;-1:-1:-1;34441:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;40268:152;;;;;;;;;;-1:-1:-1;40268:152:0;;;;;:::i;:::-;;:::i;1918:104::-;;;;;;;;;;;;;:::i;3716:507::-;;;;;;;;;;-1:-1:-1;3716:507:0;;;;;:::i;:::-;;:::i;43026:186::-;;;;;;;;;;-1:-1:-1;43026:186:0;;;;;:::i;:::-;;:::i;2432:234::-;;;;;;;;;;-1:-1:-1;2432:234:0;;;;;:::i;:::-;;:::i;33849:30::-;;;;;;;;;;;;;;;;34080:33;;;;;;;;;;;;;;;;48413:160;;;;;;;;;;-1:-1:-1;48413:160:0;;;;;:::i;:::-;;:::i;59848:132::-;;;;;;;;;;-1:-1:-1;59848:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;59941:24:0;59914:7;59941:24;;;:14;:24;;;;;:31;;59848:132;50822:324;;;;;;;;;;-1:-1:-1;50822:324:0;;;;;:::i;:::-;;:::i;34502:68::-;;;;;;;;;;-1:-1:-1;34502:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6294:25:1;;;6350:2;6335:18;;6328:34;;;;6378:18;;;6371:34;6282:2;6267:18;34502:68:0;6092:319:1;58715:149:0;;;;;;;;;;;;;:::i;33888:30::-;;;;;;;;;;;;;;;;38744:1057;;;;;;;;;;;;;:::i;33780:60::-;;;;;;;;;;-1:-1:-1;33780:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;49131:300;;;;;;;;;;-1:-1:-1;49131:300:0;;;;;:::i;:::-;;:::i;34976:31::-;;;;;;;;;;;;;;;;2674:201;;;;;;;;;;-1:-1:-1;2674:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;2840:18:0;;;2808:7;2840:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2674:201;34914:53;;;;;;;;;;;;;;;;39809:100;;;;;;;;;;-1:-1:-1;39809:100:0;;;;;:::i;:::-;;:::i;48581:208::-;;;;;;;;;;-1:-1:-1;48581:208:0;;;;;:::i;:::-;;:::i;50377:311::-;;;;;;;;;;-1:-1:-1;50377:311:0;;;;;:::i;:::-;;:::i;58872:968::-;;;;;;;;;;-1:-1:-1;58872:968:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41655:591::-;;;;;;;;;;;;;:::i;38021:266::-;;;;;;;;;;;;;:::i;33962:33::-;;;;;;;;;;;;;;;;45075:414;;;;;;;;;;-1:-1:-1;45075:414:0;;;;;:::i;:::-;;:::i;43488:81::-;;;;;;;;;;;;;:::i;40428:171::-;40557:34;;-1:-1:-1;;;40557:34:0;;:8;:34;;;8501:25:1;8542:18;;;8535:34;;;40503:23:0;;40557:20;;;;8474:18:1;;40557:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40539:52;40428:171;-1:-1:-1;;40428:171:0:o;1810:100::-;1864:13;1897:5;1890:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1810:100;:::o;38295:441::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;;;;;;;;;38447:11:::1;::::0;-1:-1:-1;;;38447:11:0;::::1;;;38446:12;38438:85;;;::::0;-1:-1:-1;;;38438:85:0;;9784:2:1;38438:85:0::1;::::0;::::1;9766:21:1::0;9823:2;9803:18;;;9796:30;9862:34;9842:18;;;9835:62;9933:30;9913:18;;;9906:58;9981:19;;38438:85:0::1;9582:424:1::0;38438:85:0::1;38534:17;:38:::0;;;38583:19:::1;:50:::0;;-1:-1:-1;;;;;;38583:50:0::1;-1:-1:-1::0;;;;;38583:50:0;::::1;;::::0;;38667:30:::1;:21:::0;38691:6:::1;38667:30;:::i;:::-;38644:20;:53:::0;-1:-1:-1;;38708:13:0::1;:20:::0;;-1:-1:-1;;38708:20:0::1;38724:4;38708:20;::::0;;-1:-1:-1;38295:441:0:o;2883:242::-;3002:4;1270:10;3063:32;1270:10;3079:7;3088:6;3063:8;:32::i;:::-;-1:-1:-1;3113:4:0;;2883:242;-1:-1:-1;;;2883:242:0:o;50113:126::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50196:23:::1;:35:::0;50113:126::o;48099:140::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48196:21:0;;;::::1;;::::0;;;:11:::1;:21;::::0;;;;:35;;-1:-1:-1;;48196:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48099:140::o;40607:185::-;40740:44;;-1:-1:-1;;;40740:44:0;;:8;:44;;;8501:25:1;8542:18;;;8535:34;;;40686:23:0;;40740:35;;;;8474:18:1;;40740:44:0;8296:279:1;50247:122:0;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50328:21:::1;:33:::0;50247:122::o;3133:295::-;3264:4;1270:10;3322:38;3338:4;1270:10;3353:6;3322:15;:38::i;:::-;3371:27;3381:4;3387:2;3391:6;3371:9;:27::i;:::-;-1:-1:-1;3416:4:0;;3133:295;-1:-1:-1;;;;3133:295:0:o;40800:313::-;40877:4;-1:-1:-1;;;;;40897:22:0;;40894:66;;-1:-1:-1;40943:5:0;40936:12;;40894:66;40993:8;:38;;41051:19;41061:8;41051:9;:19::i;:::-;:35;;:54;;;;;41102:3;-1:-1:-1;;;;;41090:15:0;:8;-1:-1:-1;;;;;41090:15:0;;;41051:54;41044:61;40800:313;-1:-1:-1;;;;40800:313:0:o;42254:615::-;42366:11;;42482:13;;42412:93;;-1:-1:-1;;;42412:93:0;;42332:7;;42366:11;42332:7;;42412:30;;:55;;:93;;42476:3;;-1:-1:-1;;;;;42482:13:0;;;;42497:7;;42412:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42390:115;-1:-1:-1;42532:1:0;42518:323;42540:19;;;;;;42535:24;;;;42518:323;;42619:24;;;;;;;:21;:24;;;;;:29;42604:44;;;;;:111;;-1:-1:-1;42688:24:0;;;;;;;:21;:24;;;;;:27;;;42673:42;;;42604:111;42581:249;;;42757:24;;;;;;:21;:24;;;;;:28;;;;-1:-1:-1;42804:10:0;;-1:-1:-1;;42804:10:0;42581:249;42561:3;;;;:::i;:::-;;;;42518:323;;;-1:-1:-1;42858:3:0;;42254:615;-1:-1:-1;;;;42254:615:0:o;42877:141::-;42967:15;;:43;;;-1:-1:-1;;;42967:43:0;;;;42940:7;;-1:-1:-1;;;;;42967:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42960:50;;42877:141;:::o;3436:272::-;1270:10;3551:4;3637:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3637:27:0;;;;;;;;;;3551:4;;1270:10;3612:66;;1270:10;;3637:27;;:40;;3667:10;;3637:40;:::i;:::-;3612:8;:66::i;39917:339::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;40065:14:::1;:32:::0;;;40108:13:::1;:30:::0;;;40149:13:::1;:30:::0;;;40190:58:::1;::::0;-1:-1:-1;;;40190:58:0;;:8:::1;:58;::::0;::::1;8501:25:1::0;8542:18;;;8535:34;;;40190:44:0::1;::::0;::::1;::::0;8474:18:1;;40190:58:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39917:339:::0;;;;:::o;43401:79::-;43438:34;43453:10;43466:5;43438:6;:34::i;:::-;43401:79::o;58402:305::-;-1:-1:-1;;;;;58521:26:0;;58465:7;58521:26;;;:16;:26;;;;;;58465:7;;58521:26;;;:41;;-1:-1:-1;58551:11:0;;-1:-1:-1;;;58551:11:0;;;;58521:41;58518:148;;;-1:-1:-1;58596:7:0;58518:148;;;-1:-1:-1;58653:1:0;58685:14;58402:305;-1:-1:-1;;58402:305:0:o;41447:200::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;41499:19:::1;41521:76;41564:22;;41521:24;41539:4;41521:9;:24::i;:::-;:28:::0;::::1;:76::i;:::-;41499:98;;41610:29;41627:11;41610:16;:29::i;:::-;;41488:159;41447:200::o:0;49439:230::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49564:4:::1;49558;49538:13;2219:12:::0;;;2131:108;49538:13:::1;:17;::::0;49554:1:::1;49538:17;:::i;:::-;:24;;;;:::i;:::-;49537:31;;;;:::i;:::-;49521:12;:47;;49513:96;;;::::0;-1:-1:-1;;;49513:96:0;;11665:2:1;49513:96:0::1;::::0;::::1;11647:21:1::0;11704:2;11684:18;;;11677:30;11743:34;11723:18;;;11716:62;-1:-1:-1;;;11794:18:1;;;11787:34;11838:19;;49513:96:0::1;11463:400:1::0;49513:96:0::1;49638:23;:12:::0;49654:6:::1;49638:23;:::i;:::-;49620:15;:41:::0;-1:-1:-1;49439:230:0:o;50696:118::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50775:19:::1;:31:::0;;-1:-1:-1;;50775:31:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;50696:118::o;49683:422::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49906:2:::1;49891:11;:17;;:38;;;;;49927:2;49912:11;;:17;;49891:38;49883:47;;;::::0;::::1;;49943:10;:24:::0;;;;49978:11:::1;:26:::0;;;;50015:6:::1;:16:::0;50042:6:::1;:16:::0;50069:12:::1;:28:::0;49683:422::o;44925:142::-;45018:15;;:41;;;-1:-1:-1;;;45018:41:0;;;;44991:7;;-1:-1:-1;;;;;45018:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;43220:173;43350:15;;;:35;;-1:-1:-1;;;43350:35:0;;-1:-1:-1;;;;;363:32:1;;;43350:35:0;;;345:51:1;43318:7:0;;43350:15;;;:25;;318:18:1;43350:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;51154:214::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;51279:16:::1;:29:::0;;-1:-1:-1;;;;;;51279:29:0::1;;-1:-1:-1::0;;;;;51279:29:0;;::::1;;;::::0;;51319:22:::1;:41:::0;;-1:-1:-1;;;;;;51319:41:0::1;::::0;;;::::1;;::::0;;51154:214::o;2247:177::-;-1:-1:-1;;;;;2398:18:0;2366:7;2398:18;;;;;;;;;;;;2247:177::o;10894:148::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;10985:6:::1;::::0;10964:40:::1;::::0;11001:1:::1;::::0;-1:-1:-1;;;;;10985:6:0::1;::::0;10964:40:::1;::::0;11001:1;;10964:40:::1;11015:6;:19:::0;;-1:-1:-1;;;;;;11015:19:0::1;::::0;;10894:148::o;48247:158::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48352:26:0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:45;;-1:-1:-1;;48352:45:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48247:158::o;48797:326::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;48919:22:::1;48915:201;;;48958:15;::::0;;:46:::1;::::0;-1:-1:-1;;;48958:46:0;;-1:-1:-1;;;;;363:32:1;;;48958:46:0::1;::::0;::::1;345:51:1::0;48958:15:0;;::::1;::::0;:36:::1;::::0;318:18:1;48958:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41610:29;41488:159;41447:200::o:0;48915:201::-:1;49037:15;::::0;-1:-1:-1;;;;;49037:15:0::1;:36;49074:8:::0;49084:19:::1;49074:8:::0;49084:9:::1;:19::i;:::-;49037:67;::::0;-1:-1:-1;;;;;;49037:67:0::1;::::0;;;;;;-1:-1:-1;;;;;12060:32:1;;;49037:67:0::1;::::0;::::1;12042:51:1::0;12109:18;;;12102:34;12015:18;;49037:67:0::1;11868:274:1::0;40268:152:0;40379:33;;-1:-1:-1;;;40379:33:0;;:8;:33;;;12352:25:1;-1:-1:-1;;;;;12413:32:1;;12393:18;;;12386:60;40331:20:0;;40379:24;;;;12325:18:1;;40379:33:0;;;;;;;;;;;;;;;;;;;;;;1918:104;1974:13;2007:7;2000:14;;;;;:::i;3716:507::-;1270:10;3836:4;3924:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;3924:27:0;;;;;;;;;;3836:4;;1270:10;3984:35;;;;3962:122;;;;-1:-1:-1;;;3962:122:0;;12659:2:1;3962:122:0;;;12641:21:1;12698:2;12678:18;;;12671:30;12737:34;12717:18;;;12710:62;-1:-1:-1;;;12788:18:1;;;12781:35;12833:19;;3962:122:0;12457:401:1;3962:122:0;4120:60;4129:5;4136:7;4164:15;4145:16;:34;4120:8;:60::i;43026:186::-;43156:15;;;:48;;-1:-1:-1;;;43156:48:0;;-1:-1:-1;;;;;363:32:1;;;43156:48:0;;;345:51:1;43124:7:0;;43156:15;;;:38;;318:18:1;43156:48:0;199:203:1;2432:234:0;2547:4;1270:10;2608:28;1270:10;2625:2;2629:6;2608:9;:28::i;48413:160::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48520:26:0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:45;;-1:-1:-1;;48520:45:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48413:160::o;50822:324::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50898:9:::1;50893:246;50913:16:::0;;::::1;50893:246;;;50985:13;::::0;-1:-1:-1;;;;;50985:13:0::1;50973:5:::0;;50979:1;50973:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50973:25:0::1;;;:82;;;;-1:-1:-1::0;51039:15:0::1;::::0;-1:-1:-1;;;;;51039:15:0::1;51019:5:::0;;51025:1;51019:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51019:36:0::1;;;50973:82;50951:177;;;51108:4;51090:5;:15;51096:5;;51102:1;51096:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51090:15:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;51090:15:0;:22;;-1:-1:-1;;51090:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50951:177:::1;50931:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50893:246;;;;50822:324:::0;;:::o;58715:149::-;58777:7;58804:52;58833:22;;58804:24;58822:4;58804:9;:24::i;38744:1057::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;38829:11:::1;::::0;-1:-1:-1;;;38829:11:0;::::1;;;38828:12;38820:53;;;::::0;-1:-1:-1;;;38820:53:0;;13337:2:1;38820:53:0::1;::::0;::::1;13319:21:1::0;13376:2;13356:18;;;13349:30;13415;13395:18;;;13388:58;13463:18;;38820:53:0::1;13135:352:1::0;38820:53:0::1;38928:15;;;;;;;;;-1:-1:-1::0;;;;;38928:15:0::1;-1:-1:-1::0;;;;;38928:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38910:55:0::1;;38992:4;39016:15;;;;;;;;;-1:-1:-1::0;;;;;39016:15:0::1;-1:-1:-1::0;;;;;39016:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38910:143;::::0;-1:-1:-1;;;;;;38910:143:0::1;::::0;;;;;;-1:-1:-1;;;;;13722:15:1;;;38910:143:0::1;::::0;::::1;13704:34:1::0;13774:15;;13754:18;;;13747:43;13639:18;;38910:143:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38894:13;:159:::0;;-1:-1:-1;;;;;;38894:159:0::1;-1:-1:-1::0;;;;;38894:159:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;39064:52:0;;;:28:::1;:52;::::0;;;;;;;:59;;-1:-1:-1;;39064:59:0;;::::1;-1:-1:-1::0;39064:59:0;;::::1;::::0;;;39162:13;;;::::1;39136:40:::0;;:25:::1;:40:::0;;;;;;;:47;;;;::::1;::::0;;::::1;::::0;;39194:15:::1;::::0;;39231:13;;39194:51;;-1:-1:-1;;;39194:51:0;;39231:13;;::::1;39194:51;::::0;::::1;345::1::0;39194:15:0;;;::::1;::::0;:36:::1;::::0;318:18:1;39194:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39258:61;39271:24;39289:4;39271:9;:24::i;:::-;39297:21;39258:12;:61::i;:::-;39337:13;::::0;39382:15:::1;::::0;39330:111:::1;::::0;-1:-1:-1;;;39330:111:0;;-1:-1:-1;;;;;39382:15:0;;::::1;39330:111;::::0;::::1;12042:51:1::0;-1:-1:-1;;12109:18:1;;;12102:34;39337:13:0;::::1;::::0;39330:29:::1;::::0;12015:18:1;;39330:111:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;39454:11:0::1;:18:::0;;-1:-1:-1;;;;39454:18:0::1;-1:-1:-1::0;;;39454:18:0::1;::::0;;39487:13:::1;::::0;39454:18:::1;39487:13;39483:274;;;39565:15;39597:16;:30:::0;;;39698:17:::1;::::0;39664:81:::1;::::0;39698:32:::1;::::0;39720:9:::1;39698:21;:32::i;:::-;39664:11:::0;;:15:::1;:81::i;:::-;39642:19;:103:::0;-1:-1:-1;39483:274:0::1;39781:12;39767:11;:26:::0;38744:1057::o;49131:300::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49255:9:::1;49250:174;49270:41:::0;;::::1;49250:174;;;49337:15;::::0;-1:-1:-1;;;;;49337:15:0::1;:36;49374:30:::0;;49405:1;49374:33;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;49337:71;::::0;-1:-1:-1;;;;;;49337:71:0::1;::::0;;;;;;-1:-1:-1;;;;;363:32:1;;;49337:71:0::1;::::0;::::1;345:51:1::0;318:18;;49337:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49313:3;;;;;:::i;:::-;;;;49250:174;;39809:100:::0;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;39876:11:::1;:25:::0;;;::::1;;-1:-1:-1::0;;;39876:25:0::1;-1:-1:-1::0;;;;39876:25:0;;::::1;::::0;;;::::1;::::0;;39809:100::o;48581:208::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48712:38:0;;;::::1;;::::0;;;:28:::1;:38;::::0;;;;:69;;-1:-1:-1;;48712:69:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48581:208::o;50377:311::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50538:29:::1;::::0;;::::1;;::::0;;;:21:::1;:29;::::0;;;;:42;;;50591:32:::1;::::0;::::1;:38:::0;50640:33:::1;;:40:::0;50377:311::o;58872:968::-;59004:19;59053:1;59044:6;:10;:29;;;;;59072:1;59058:11;:15;59044:29;59036:64;;;;-1:-1:-1;;;59036:64:0;;14253:2:1;59036:64:0;;;14235:21:1;14292:2;14272:18;;;14265:30;-1:-1:-1;;;14311:18:1;;;14304:52;14373:18;;59036:64:0;14051:346:1;59036:64:0;-1:-1:-1;;;;;59138:24:0;;59111;59138;;;:14;:24;;;;;:31;;59194:20;59208:6;59194:11;:20;:::i;:::-;59180:34;-1:-1:-1;59225:13:0;59241:12;59247:6;59180:34;59241:12;:::i;:::-;59225:28;;59280:16;59272:5;:24;59264:54;;;;-1:-1:-1;;;59264:54:0;;14734:2:1;59264:54:0;;;14716:21:1;14773:2;14753:18;;;14746:30;-1:-1:-1;;;14792:18:1;;;14785:47;14849:18;;59264:54:0;14532:341:1;59264:54:0;59345:6;59366:22;;;59362:125;;;59411:16;;-1:-1:-1;59450:25:0;59469:6;59411:16;59450:25;:::i;:::-;59442:33;;59362:125;59499:32;59551:5;59534:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;59534:23:0;;;;;;;;;;;;;;;;-1:-1:-1;59499:58:0;-1:-1:-1;59568:20:0;59620:5;59603:200;59631:3;59627:1;:7;59603:200;;;-1:-1:-1;;;;;59670:24:0;;59656:11;59670:24;;;:14;:24;;;;;:27;;59695:1;;59670:27;;;;;;:::i;:::-;;;;;;;;;59656:41;;59741:13;:18;59755:3;59741:18;;;;;;;;;;;59712:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;59725;59712:26;;;;;;;;:::i;:::-;;;;;;;;;;:47;59774:17;59790:1;59774:17;;:::i;:::-;;;59641:162;59636:3;;;;;:::i;:::-;;;;59603:200;;;-1:-1:-1;59820:12:0;;58872:968;-1:-1:-1;;;;;;;;;58872:968:0:o;41655:591::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;41707:16:::1;41726:43;41752:16;;41726:21;:25;;:43;;;;:::i;:::-;41707:62;;41782:21;41806:74;41845:24;41862:6;;41853:3;41845:16;;:24;;;;:::i;:::-;41819:6;::::0;41806:20:::1;::::0;:8;;:12:::1;:20::i;:::-;:24:::0;::::1;:74::i;:::-;41782:98;;41891:27;41921:80;41966:24;41983:6;;41974:3;41966:16;;:24;;;;:::i;:::-;41934:12;::::0;41921:26:::1;::::0;:8;;:12:::1;:26::i;:80::-;41891:110:::0;-1:-1:-1;42012:27:0::1;42042:66;41891:110:::0;42042:27:::1;:8:::0;42055:13;42042:12:::1;:27::i;:66::-;42012:96:::0;-1:-1:-1;42135:38:0::1;:13:::0;42012:96;42135:17:::1;:38::i;:::-;42119:54;;42186:52;42203:13;42218:19;42186:16;:52::i;:::-;41696:550;;;;41655:591::o:0;38021:266::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;38088:11:::1;::::0;-1:-1:-1;;;38088:11:0;::::1;;;38087:12;38079:68;;;::::0;-1:-1:-1;;;38079:68:0;;15329:2:1;38079:68:0::1;::::0;::::1;15311:21:1::0;15368:2;15348:18;;;15341:30;15407:34;15387:18;;;15380:62;-1:-1:-1;;;15458:18:1;;;15451:41;15509:19;;38079:68:0::1;15127:407:1::0;38079:68:0::1;38195:84;::::0;38158:12:::1;::::0;38203:10:::1;::::0;38228:21:::1;::::0;38158:12;38195:84;38158:12;38195:84;38228:21;38203:10;38195:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45075:414:::0;45349:15;;;:50;;-1:-1:-1;;;45349:50:0;;-1:-1:-1;;;;;363:32:1;;;45349:50:0;;;345:51:1;45175:29:0;;;;;;45349:15;;;:40;;318:18:1;45349:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45303:96;;-1:-1:-1;45303:96:0;-1:-1:-1;45303:96:0;;45461:19;45471:8;45461:9;:19::i;:::-;45410:71;;;;;;45075:414;;;;;:::o;43488:81::-;43528:33;43543:10;43556:4;43528:6;:33::i;5953:380::-;-1:-1:-1;;;;;6089:19:0;;6081:68;;;;-1:-1:-1;;;6081:68:0;;16201:2:1;6081:68:0;;;16183:21:1;16240:2;16220:18;;;16213:30;16279:34;16259:18;;;16252:62;-1:-1:-1;;;16330:18:1;;;16323:34;16374:19;;6081:68:0;15999:400:1;6081:68:0;-1:-1:-1;;;;;6168:21:0;;6160:68;;;;-1:-1:-1;;;6160:68:0;;16606:2:1;6160:68:0;;;16588:21:1;16645:2;16625:18;;;16618:30;16684:34;16664:18;;;16657:62;-1:-1:-1;;;16735:18:1;;;16728:32;16777:19;;6160:68:0;16404:398:1;6160:68:0;-1:-1:-1;;;;;6241:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;6293:32;;2701:25:1;;;6293:32:0;;2674:18:1;6293:32:0;;;;;;;5953:380;;;:::o;6341:502::-;-1:-1:-1;;;;;2840:18:0;;;6476:24;2840:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;6543:37:0;;6539:297;;6643:6;6623:16;:26;;6597:117;;;;-1:-1:-1;;;6597:117:0;;17009:2:1;6597:117:0;;;16991:21:1;17048:2;17028:18;;;17021:30;17087:31;17067:18;;;17060:59;17136:18;;6597:117:0;16807:353:1;6597:117:0;6758:51;6767:5;6774:7;6802:6;6783:16;:25;6758:8;:51::i;45605:2086::-;-1:-1:-1;;;;;45749:12:0;;;;;;:5;:12;;;;;;;;45748:13;:28;;;;-1:-1:-1;;;;;;45766:10:0;;;;;;:5;:10;;;;;;;;45765:11;45748:28;45740:37;;;;;;-1:-1:-1;;;;;45797:18:0;;;;;;:11;:18;;;;;;;;45796:19;:40;;;;-1:-1:-1;;;;;;45820:16:0;;;;;;:11;:16;;;;;;;;45819:17;45796:40;45788:49;;;;;;45911:11;;45875:7;;-1:-1:-1;;;45911:11:0;;;;:113;;;;-1:-1:-1;;;;;;45940:32:0;;;;;;:25;:32;;;;;;;;;:83;;-1:-1:-1;;;;;;45993:30:0;;;;;;:25;:30;;;;;;;;45940:83;45911:154;;;;-1:-1:-1;;;;;;46042:23:0;;;;;;:16;:23;;;;;;;;46041:24;45911:154;:193;;;;-1:-1:-1;;;;;;46083:21:0;;;;;;:16;:21;;;;;;;;46082:22;45911:193;45893:952;;;46135:13;;;;:69;;;;;46189:15;46169:16;;:35;;46135:69;:127;;;;;46247:15;46225:19;;:37;46135:127;46131:356;;;46365:20;;46327:19;;:34;;-1:-1:-1;;;46327:34:0;;-1:-1:-1;;;;;363:32:1;;;46327:34:0;;;345:51:1;46327:19:0;;;;:29;;318:18:1;;46327:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;46297:174;;;;-1:-1:-1;;;46297:174:0;;17367:2:1;46297:174:0;;;17349:21:1;17406:2;17386:18;;;17379:30;17445:34;17425:18;;;17418:62;-1:-1:-1;;;17496:18:1;;;17489:40;17546:19;;46297:174:0;17165:406:1;46297:174:0;46548:44;;-1:-1:-1;;;46548:44:0;;:8;:44;;;8501:25:1;8542:18;;;8535:34;;;46503:17:0;;46548:35;;;;8474:18:1;;46548:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46536:56;-1:-1:-1;46613:24:0;;:8;46536:56;46649:20;46536:56;46649:9;:20::i;:::-;46613:62;;-1:-1:-1;;;;;;46613:62:0;;;;;;;;;;17838:25:1;;;;-1:-1:-1;;;;;17937:15:1;;;17917:18;;;17910:43;17969:18;;;17962:34;18032:15;;18012:18;;;18005:43;17810:19;;46613:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46609:125;;-1:-1:-1;46716:1:0;46609:125;46779:40;46788:5;46795:3;46800:7;46809:9;46779:8;:40::i;:::-;46762:57;;46116:729;45893:952;-1:-1:-1;;;;;46859:24:0;;;;;;:19;:24;;;;;;46855:104;;-1:-1:-1;;;;;46905:24:0;;;;;;:19;:24;;;;;46932:15;46905:42;;46855:104;-1:-1:-1;;;;;46974:30:0;;;;;;:25;:30;;;;;;;;46973:31;:69;;;;-1:-1:-1;;;;;;47009:33:0;;;;;;:28;:33;;;;;;;;47008:34;46973:69;46969:229;;;47102:15;;47084:14;47067;47077:3;47067:9;:14::i;:::-;:31;;;;:::i;:::-;:50;;47059:127;;;;-1:-1:-1;;;47059:127:0;;18261:2:1;47059:127:0;;;18243:21:1;18300:2;18280:18;;;18273:30;18339:34;18319:18;;;18312:62;-1:-1:-1;;;18390:18:1;;;18383:31;18431:19;;47059:127:0;18059:397:1;47059:127:0;47210:43;47226:5;47233:3;47238:14;47210:15;:43::i;:::-;47266:33;47295:3;47266:28;:33::i;:::-;47317:15;;;:45;;-1:-1:-1;;;47317:45:0;;-1:-1:-1;;;;;363:32:1;;;47317:45:0;;;345:51:1;47317:15:0;;;;:38;;318:18:1;47317:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47312:184;;47400:15;;-1:-1:-1;;;;;47400:15:0;:26;47435:5;47443:16;47435:5;47443:9;:16::i;:::-;47400:60;;-1:-1:-1;;;;;;47400:60:0;;;;;;;-1:-1:-1;;;;;12060:32:1;;;47400:60:0;;;12042:51:1;12109:18;;;12102:34;12015:18;;47400:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47379:106;;47511:15;;;:43;;-1:-1:-1;;;47511:43:0;;-1:-1:-1;;;;;363:32:1;;;47511:43:0;;;345:51:1;47511:15:0;;;;:38;;318:18:1;47511:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47506:178;;47592:15;;-1:-1:-1;;;;;47592:15:0;:26;47627:3;47633:14;47627:3;47633:9;:14::i;:::-;47592:56;;-1:-1:-1;;;;;;47592:56:0;;;;;;;-1:-1:-1;;;;;12060:32:1;;;47592:56:0;;;12042:51:1;12109:18;;;12102:34;12015:18;;47592:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47571:102;;;;43577:1340;43683:15;;;:72;;-1:-1:-1;;;43683:72:0;;-1:-1:-1;;;;;363:32:1;;;43683:72:0;;;345:51:1;43654:26:0;;43683:15;;;:38;;318:18:1;43683:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43654:101;;43809:1;43788:18;:22;43766:114;;;;-1:-1:-1;;;43766:114:0;;19174:2:1;43766:114:0;;;19156:21:1;19213:2;19193:18;;;19186:30;19252:34;19232:18;;;19225:62;-1:-1:-1;;;19303:18:1;;;19296:40;19353:19;;43766:114:0;18972:406:1;43766:114:0;43891:17;43919:19;43956:9;43951:521;;44008:11;;-1:-1:-1;;;44008:11:0;;;;;:41;;-1:-1:-1;;;;;;44023:26:0;;;;;;:16;:26;;;;;;;;44008:41;43982:167;;;;;-1:-1:-1;;;43982:167:0;;19585:2:1;43982:167:0;;;19567:21:1;19604:18;;;19597:30;;;;19663:34;19643:18;;;19636:62;19734:34;19714:18;;;19707:62;19786:19;;43982:167:0;19383:428:1;43982:167:0;44176:15;;;:50;;-1:-1:-1;;;44176:50:0;;-1:-1:-1;;;;;13722:15:1;;;44176:50:0;;;13704:34:1;;;13754:18;;;13747:43;;;;44176:15:0;;;:30;;13639:18:1;;44176:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44164:62;;43951:521;;;44248:9;44244:228;;;44286:15;;;:55;;-1:-1:-1;;;44286:55:0;;-1:-1:-1;;;;;13722:15:1;;;44286:55:0;;;13704:34:1;44335:4:0;13754:18:1;;;13747:43;;;;44286:15:0;;;:30;;13639:18:1;;44286:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44274:67;-1:-1:-1;44360:13:0;;44356:105;;44408:37;44425:9;44436:8;44408:16;:37::i;:::-;44394:51;;44356:105;44486:13;;44482:428;;44516:29;:17;9977:19;;9995:1;9977:19;;;9888:127;44516:29;44560:11;44574:27;:17;9858:14;;9766:114;44574:27;44616:18;;;;:13;:18;;;;;;;;:40;;;44671:30;;;;:44;;;44761:15;44730:28;;;;:46;;;;-1:-1:-1;;;;;44793:24:0;;;;;:14;:24;;;;;:34;;;;;;;;;;;;;;;;;44849:49;;20668:25:1;;;20709:18;;;20702:34;;;20752:18;;20745:60;;;;44616:18:0;;-1:-1:-1;44849:49:0;;20656:2:1;20641:18;44849:49:0;;;;;;;44501:409;44482:428;43643:1274;;;43577:1340;;:::o;8521:98::-;8579:7;8606:5;8610:1;8606;:5;:::i;:::-;8599:12;8521:98;-1:-1:-1;;;8521:98:0:o;56013:721::-;56182:16;;;56196:1;56182:16;;;;;;;;56078:7;;56126:21;;56078:7;;56182:16;;;;;;;;;;;;-1:-1:-1;56182:16:0;56158:40;;56227:4;56209;56214:1;56209:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56209:23:0;;;:7;;;;;;;;;;:23;;;;56253:15;;:22;;;-1:-1:-1;;;56253:22:0;;;;:15;;;;;:20;;:22;;;;;56209:7;;56253:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56243:4;56248:1;56243:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56243:32:0;;;:7;;;;;;;;;:32;56318:15;;56286:63;;56303:4;;56318:15;56336:12;56286:8;:63::i;:::-;56360:15;;:197;;-1:-1:-1;;;56360:197:0;;-1:-1:-1;;;;;56360:15:0;;;;:66;;:197;;56441:12;;56360:15;;56484:4;;56511;;56531:15;;56360:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56570:19;56592:44;56618:17;56592:21;:25;;:44;;;;:::i;:::-;56654:43;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;56570:66:0;;-1:-1:-1;56654:43:0;;8474:18:1;56654:43:0;;;;;;;56715:11;56013:721;-1:-1:-1;;;;56013:721:0:o;57417:419::-;57532:15;;57500:63;;57517:4;;-1:-1:-1;;;;;57532:15:0;57550:12;57500:8;:63::i;:::-;57574:15;;-1:-1:-1;;;;;57574:15:0;:31;57613:10;57647:4;57667:12;57574:15;;57726:7;10747:6;;-1:-1:-1;;;;;10747:6:0;;10682:79;57726:7;57574:200;;;;;;-1:-1:-1;;;;;;57574:200:0;;;-1:-1:-1;;;;;22481:15:1;;;57574:200:0;;;22463:34:1;22513:18;;;22506:34;;;;22556:18;;;22549:34;;;;22599:18;;;22592:34;22663:15;;;22642:19;;;22635:44;57748:15:0;22695:19:1;;;22688:35;22397:19;;57574:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;57790:38:0;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;57790:38:0;;-1:-1:-1;8474:18:1;57790:38:0;;;;;;;;57417:419;;:::o;8627:98::-;8685:7;8712:5;8716:1;8712;:5;:::i;8415:98::-;8473:7;8500:5;8504:1;8500;:5;:::i;8733:98::-;8791:7;8818:5;8822:1;8818;:5;:::i;55635:370::-;55740:12;;55736:89;;55777:16;;55769:44;;55777:16;;;;-1:-1:-1;;;;;55777:16:0;;55769:44;;;;;;;;;;;;55777:16;55769:44;;;;;;;;;;;;;;;;;;;;;55736:89;55839:18;;55835:107;;55882:22;;55874:56;;-1:-1:-1;;;;;55882:22:0;;;;55874:56;;;;;55915:14;;55882:22;55874:56;55882:22;55874:56;55915:14;55882:22;55874:56;;;;;;;;;;;;;;;;;;;;;55835:107;55957:40;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;55957:40:0;;8474:18:1;55957:40:0;8296:279:1;51376:3305:0;-1:-1:-1;;;;;51617:32:0;;51518:7;51617:32;;;:25;:32;;;;;;51518:7;;;;51617:32;;;:66;;-1:-1:-1;;;;;;51653:30:0;;;;;;:25;:30;;;;;;;;51617:66;51595:143;;;;-1:-1:-1;;;51595:143:0;;23247:2:1;51595:143:0;;;23229:21:1;23286:2;23266:18;;;23259:30;23325:29;23305:18;;;23298:57;23372:18;;51595:143:0;23045:351:1;51595:143:0;-1:-1:-1;;;;;51755:32:0;;;;;;:25;:32;;;;;;;;51751:2888;;;51804:19;51838:20;51873;51928:11;;51912:12;:27;:45;;;;-1:-1:-1;51944:13:0;;;;51943:14;51912:45;51908:423;;;51992:2;51978:16;;51908:423;;;52036:11;;:15;;52050:1;52036:15;:::i;:::-;52020:12;:31;:49;;;;-1:-1:-1;52056:13:0;;;;52055:14;52020:49;52016:315;;;52104:2;52090:16;;52016:315;;;-1:-1:-1;;;;;52132:23:0;;;52128:203;;52190:60;52209:40;52246:2;52209:32;52227:13;;52209;;:17;;:32;;;;:::i;:40::-;52190:14;;;:18;:60::i;:::-;52176:74;;52128:203;;;52305:10;;52291:24;;52128:203;52354:33;52383:3;52354:24;:7;52366:11;52354;:24::i;:33::-;52347:40;-1:-1:-1;;;;;;52419:23:0;;;52416:875;;52470:36;52502:3;52470:27;52482:14;;52470:7;:11;;:27;;;;:::i;:36::-;52463:43;;52542:36;52573:4;52542:26;52554:13;;52542:7;:11;;:26;;;;:::i;:36::-;52527:51;;52612:36;52643:4;52612:26;52624:13;;52612:7;:11;;:26;;;;:::i;:36::-;52597:51;-1:-1:-1;52669:25:0;52697:30;:12;52597:51;52697:16;:30::i;:::-;52669:58;-1:-1:-1;52766:58:0;52811:12;52766:40;52669:58;52766:17;:7;52778:4;52766:11;:17::i;:40::-;:44;;:58::i;:::-;52748:76;;52845:43;52861:5;52876:4;52883;52845:15;:43::i;:::-;52909:47;52925:5;52932:9;52943:12;52909:15;:47::i;:::-;52982:35;52990:5;53005:4;53012;52982:35;;;;;;;;:::i;:::-;;;;;;;;53043:39;53051:5;53058:9;53069:12;53043:39;;;;;;;;:::i;:::-;;;;;;;;52444:656;52416:875;;;53141:17;:7;53153:4;53141:11;:17::i;:::-;53123:35;;53175:43;53191:5;53206:4;53213;53175:15;:43::i;:::-;53240:35;53248:5;53263:4;53270;53240:35;;;;;;;;:::i;:::-;;;;;;;;52416:875;51789:1513;;;51751:2888;;;53323:20;53378:11;;53362:12;:27;53358:456;;;-1:-1:-1;53425:2:0;53358:456;;;53469:11;;:15;;53483:1;53469:15;:::i;:::-;53453:12;:31;53449:365;;;-1:-1:-1;53520:2:0;53449:365;;;53563:23;53589:41;53615:4;53622:7;53589:17;:41::i;:::-;53563:67;;53680:15;53666:11;;:29;;;;:::i;:::-;53651:44;;53735:2;53719:12;:18;53716:83;;53777:2;53762:17;;53716:83;53544:270;53449:365;53837:34;53867:3;53837:25;:7;53849:12;53837:11;:25::i;:34::-;53830:41;;53886:20;53909:87;53992:3;53909:60;53939:29;53956:11;;53939:12;:16;;:29;;;;:::i;:::-;53909:7;;:29;:60::i;:87::-;54036:22;;53886:110;;-1:-1:-1;54036:40:0;;53886:110;54036:26;:40::i;:::-;54011:22;:65;54111:17;:7;54123:4;54111:11;:17::i;:::-;54093:35;;54145:43;54161:5;54176:4;54183;54145:15;:43::i;:::-;54203:20;54226:70;54273:22;;54226:24;54244:4;54226:9;:24::i;:70::-;54203:93;;54332:23;;54317:12;:38;54313:112;;;54376:33;54396:12;54376:19;:33::i;:::-;54468:21;;54443:22;;:46;54439:131;;;54510:44;54531:22;;54510:20;:44::i;:::-;54591:36;54600:5;54615:4;54622;54591:36;;;;;;;;:::i;:::-;;;;;;;;53308:1331;;;51751:2888;54658:15;51376:3305;-1:-1:-1;;;;;;51376:3305:0:o;4231:708::-;-1:-1:-1;;;;;4362:18:0;;4354:68;;;;-1:-1:-1;;;4354:68:0;;23983:2:1;4354:68:0;;;23965:21:1;24022:2;24002:18;;;23995:30;24061:34;24041:18;;;24034:62;-1:-1:-1;;;24112:18:1;;;24105:35;24157:19;;4354:68:0;23781:401:1;4354:68:0;-1:-1:-1;;;;;4441:16:0;;4433:64;;;;-1:-1:-1;;;4433:64:0;;24389:2:1;4433:64:0;;;24371:21:1;24428:2;24408:18;;;24401:30;24467:34;24447:18;;;24440:62;-1:-1:-1;;;24518:18:1;;;24511:33;24561:19;;4433:64:0;24187:399:1;4433:64:0;-1:-1:-1;;;;;4583:15:0;;4561:19;4583:15;;;;;;;;;;;4631:21;;;;4609:109;;;;-1:-1:-1;;;4609:109:0;;24793:2:1;4609:109:0;;;24775:21:1;24832:2;24812:18;;;24805:30;24871:34;24851:18;;;24844:62;-1:-1:-1;;;24922:18:1;;;24915:36;24968:19;;4609:109:0;24591:402:1;4609:109:0;-1:-1:-1;;;;;4754:15:0;;;:9;:15;;;;;;;;;;;4772:20;;;4754:38;;4814:13;;;;;;;;:23;;4786:6;;4754:9;4814:23;;4786:6;;4814:23;:::i;:::-;;;;;;;;4870:2;-1:-1:-1;;;;;4855:26:0;4864:4;-1:-1:-1;;;;;4855:26:0;;4874:6;4855:26;;;;2701:25:1;;2689:2;2674:18;;2555:177;4855:26:0;;;;;;;;4894:37;50822:324;41121:318;-1:-1:-1;;;;;41198:25:0;;;;;;:16;:25;;;;;;;;;:49;;-1:-1:-1;;;;;;41227:20:0;;;;;;:11;:20;;;;;;;;41198:49;41195:87;;;41121:318;:::o;41195:87::-;41316:13;;-1:-1:-1;;;;;41297:33:0;;;41316:13;;41297:33;41294:71;;;41121:318;:::o;41294:71::-;41377:25;;:8;41403:7;41412:18;41403:7;41412:9;:18::i;:::-;41377:54;;-1:-1:-1;;;;;;41377:54:0;;;;;;;;;;25231:25:1;;;;-1:-1:-1;;;;;25292:32:1;;;25272:18;;;25265:60;25341:18;;;25334:34;25204:18;;41377:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56742:667;56836:7;56861:27;56891:24;56909:4;56891:9;:24::i;:::-;56950:16;;;56964:1;56950:16;;;;;;;;56861:54;;-1:-1:-1;56926:21:0;;56950:16;;;;;;;;;;-1:-1:-1;;56987:15:0;;:22;;;-1:-1:-1;;;56987:22:0;;;;56926:40;;-1:-1:-1;;;;;;56987:15:0;;;;:20;;-1:-1:-1;56987:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56977:4;56982:1;56977:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;56977:32:0;;;-1:-1:-1;;;;;56977:32:0;;;;;57038:4;57020;57025:1;57020:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;57020:23:0;;;:7;;;;;;;;;:23;57056:15;;:140;;-1:-1:-1;;;57056:140:0;;:15;;;:66;;57144:10;;57056:140;;:15;;57169:4;;57175:3;;57180:15;;57056:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57209:22;57234:73;57277:19;57234:24;57252:4;57234:9;:24::i;:73::-;57325:44;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;57209:98:0;;-1:-1:-1;57325:44:0;;8474:18:1;57325:44:0;;;;;;;57387:14;56742:667;-1:-1:-1;;;;;56742:667:0:o;54689:938::-;54759:26;54788:33;54817:3;54788:24;54805:6;;54788:12;:16;;:24;;;;:::i;:33::-;54759:62;-1:-1:-1;54834:21:0;54858:25;54759:62;54881:1;54858:22;:25::i;:::-;54834:49;-1:-1:-1;54894:21:0;54918:31;:12;54834:49;54918:16;:31::i;:::-;54894:55;;54962:16;54981:31;54998:13;54981:16;:31::i;:::-;54962:50;;55025:19;55047:29;55072:3;55047:20;55060:6;;55047:8;:12;;:20;;;;:::i;:29::-;55025:51;;55087:21;55111:29;55136:3;55111:20;55124:6;;55111:8;:12;;:20;;;;:::i;:29::-;55087:53;;55151:27;55181:35;55212:3;55181:26;55194:12;;55181:8;:12;;:26;;;;:::i;:35::-;55151:65;-1:-1:-1;55227:27:0;55257:111;55151:65;55257:72;55315:13;55257:72;:8;55284:11;55257:26;:39::i;:111::-;55227:141;-1:-1:-1;55395:38:0;:13;55227:141;55395:17;:38::i;:::-;55379:54;;55446:52;55463:13;55478:19;55446:16;:52::i;:::-;55531:1;55515:13;:17;:36;;;;;55550:1;55536:11;:15;55515:36;55511:109;;;55568:40;55581:13;55596:11;55568:12;:40::i;:::-;54748:879;;;;;;;;54689:938;:::o;57844:550::-;57915:17;57935:30;57952:12;57935:16;:30::i;:::-;58003:22;;57915:50;;-1:-1:-1;58003:40:0;;58030:12;58003:26;:40::i;:::-;57978:22;:65;58093:16;;58054:22;;58079:31;;:9;;:13;:31::i;:::-;58150:15;;58142:80;;58054:56;;-1:-1:-1;58124:12:0;;-1:-1:-1;;;;;58150:15:0;;;;58054:56;;58124:12;58142:80;58124:12;58142:80;58054:56;58150:15;58142:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58123:99;;;58239:7;58235:152;;;58268:24;;2701:25:1;;;58268:24:0;;2689:2:1;2674:18;58268:24:0;;;;;;;58235:152;;;58344:16;;:31;;58365:9;58344:20;:31::i;:::-;58325:16;:50;57904:490;;;57844:550;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;407:597::-;519:4;548:2;577;566:9;559:21;609:6;603:13;652:6;647:2;636:9;632:18;625:34;677:1;687:140;701:6;698:1;695:13;687:140;;;796:14;;;792:23;;786:30;762:17;;;781:2;758:26;751:66;716:10;;687:140;;;845:6;842:1;839:13;836:91;;;915:1;910:2;901:6;890:9;886:22;882:31;875:42;836:91;-1:-1:-1;988:2:1;967:15;-1:-1:-1;;963:29:1;948:45;;;;995:2;944:54;;407:597;-1:-1:-1;;;407:597:1:o;1009:131::-;-1:-1:-1;;;;;1084:31:1;;1074:42;;1064:70;;1130:1;1127;1120:12;1064:70;1009:131;:::o;1145:383::-;1222:6;1230;1238;1291:2;1279:9;1270:7;1266:23;1262:32;1259:52;;;1307:1;1304;1297:12;1259:52;1343:9;1330:23;1320:33;;1403:2;1392:9;1388:18;1375:32;1416:31;1441:5;1416:31;:::i;:::-;1145:383;;1466:5;;-1:-1:-1;;;1518:2:1;1503:18;;;;1490:32;;1145:383::o;1533:315::-;1601:6;1609;1662:2;1650:9;1641:7;1637:23;1633:32;1630:52;;;1678:1;1675;1668:12;1630:52;1717:9;1704:23;1736:31;1761:5;1736:31;:::i;:::-;1786:5;1838:2;1823:18;;;;1810:32;;-1:-1:-1;;;1533:315:1:o;2045:118::-;2131:5;2124:13;2117:21;2110:5;2107:32;2097:60;;2153:1;2150;2143:12;2168:382;2233:6;2241;2294:2;2282:9;2273:7;2269:23;2265:32;2262:52;;;2310:1;2307;2300:12;2262:52;2349:9;2336:23;2368:31;2393:5;2368:31;:::i;:::-;2418:5;-1:-1:-1;2475:2:1;2460:18;;2447:32;2488:30;2447:32;2488:30;:::i;:::-;2537:7;2527:17;;;2168:382;;;;;:::o;2737:456::-;2814:6;2822;2830;2883:2;2871:9;2862:7;2858:23;2854:32;2851:52;;;2899:1;2896;2889:12;2851:52;2938:9;2925:23;2957:31;2982:5;2957:31;:::i;:::-;3007:5;-1:-1:-1;3064:2:1;3049:18;;3036:32;3077:33;3036:32;3077:33;:::i;3198:388::-;3266:6;3274;3327:2;3315:9;3306:7;3302:23;3298:32;3295:52;;;3343:1;3340;3333:12;3295:52;3382:9;3369:23;3401:31;3426:5;3401:31;:::i;:::-;3451:5;-1:-1:-1;3508:2:1;3493:18;;3480:32;3521:33;3480:32;3521:33;:::i;4023:247::-;4082:6;4135:2;4123:9;4114:7;4110:23;4106:32;4103:52;;;4151:1;4148;4141:12;4103:52;4190:9;4177:23;4209:31;4234:5;4209:31;:::i;4275:385::-;4361:6;4369;4377;4385;4438:3;4426:9;4417:7;4413:23;4409:33;4406:53;;;4455:1;4452;4445:12;4406:53;-1:-1:-1;;4478:23:1;;;4548:2;4533:18;;4520:32;;-1:-1:-1;4599:2:1;4584:18;;4571:32;;4650:2;4635:18;4622:32;;-1:-1:-1;4275:385:1;-1:-1:-1;4275:385:1:o;4665:156::-;4731:20;;4791:4;4780:16;;4770:27;;4760:55;;4811:1;4808;4801:12;4760:55;4665:156;;;:::o;4826:182::-;4883:6;4936:2;4924:9;4915:7;4911:23;4907:32;4904:52;;;4952:1;4949;4942:12;4904:52;4975:27;4992:9;4975:27;:::i;5013:454::-;5108:6;5116;5124;5132;5140;5193:3;5181:9;5172:7;5168:23;5164:33;5161:53;;;5210:1;5207;5200:12;5161:53;-1:-1:-1;;5233:23:1;;;5303:2;5288:18;;5275:32;;-1:-1:-1;5354:2:1;5339:18;;5326:32;;5405:2;5390:18;;5377:32;;-1:-1:-1;5456:3:1;5441:19;5428:33;;-1:-1:-1;5013:454:1;-1:-1:-1;5013:454:1:o;5472:615::-;5558:6;5566;5619:2;5607:9;5598:7;5594:23;5590:32;5587:52;;;5635:1;5632;5625:12;5587:52;5675:9;5662:23;5704:18;5745:2;5737:6;5734:14;5731:34;;;5761:1;5758;5751:12;5731:34;5799:6;5788:9;5784:22;5774:32;;5844:7;5837:4;5833:2;5829:13;5825:27;5815:55;;5866:1;5863;5856:12;5815:55;5906:2;5893:16;5932:2;5924:6;5921:14;5918:34;;;5948:1;5945;5938:12;5918:34;6001:7;5996:2;5986:6;5983:1;5979:14;5975:2;5971:23;5967:32;5964:45;5961:65;;;6022:1;6019;6012:12;5961:65;6053:2;6045:11;;;;;6075:6;;-1:-1:-1;5472:615:1;;-1:-1:-1;;;;5472:615:1:o;6416:241::-;6472:6;6525:2;6513:9;6504:7;6500:23;6496:32;6493:52;;;6541:1;6538;6531:12;6493:52;6580:9;6567:23;6599:28;6621:5;6599:28;:::i;6662:387::-;6746:6;6754;6762;6770;6823:3;6811:9;6802:7;6798:23;6794:33;6791:53;;;6840:1;6837;6830:12;6791:53;6863:27;6880:9;6863:27;:::i;:::-;6853:37;6937:2;6922:18;;6909:32;;-1:-1:-1;6988:2:1;6973:18;;6960:32;;7039:2;7024:18;7011:32;;-1:-1:-1;6662:387:1;-1:-1:-1;;;6662:387:1:o;7054:383::-;7131:6;7139;7147;7200:2;7188:9;7179:7;7175:23;7171:32;7168:52;;;7216:1;7213;7206:12;7168:52;7255:9;7242:23;7274:31;7299:5;7274:31;:::i;:::-;7324:5;7376:2;7361:18;;7348:32;;-1:-1:-1;7427:2:1;7412:18;;;7399:32;;7054:383;-1:-1:-1;;;7054:383:1:o;7442:849::-;7669:2;7721:21;;;7791:13;;7694:18;;;7813:22;;;7640:4;;7669:2;7854;;7872:18;;;;7913:15;;;7640:4;7956:309;7970:6;7967:1;7964:13;7956:309;;;8029:13;;8067:9;;8055:22;;8117:11;;;8111:18;8097:12;;;8090:40;8170:11;;8164:18;8150:12;;;8143:40;8212:4;8203:14;;;;8240:15;;;;7992:1;7985:9;7956:309;;;-1:-1:-1;8282:3:1;;7442:849;-1:-1:-1;;;;;;;7442:849:1:o;8580:251::-;8650:6;8703:2;8691:9;8682:7;8678:23;8674:32;8671:52;;;8719:1;8716;8709:12;8671:52;8751:9;8745:16;8770:31;8795:5;8770:31;:::i;8836:380::-;8915:1;8911:12;;;;8958;;;8979:61;;9033:4;9025:6;9021:17;9011:27;;8979:61;9086:2;9078:6;9075:14;9055:18;9052:38;9049:161;;;9132:10;9127:3;9123:20;9120:1;9113:31;9167:4;9164:1;9157:15;9195:4;9192:1;9185:15;9049:161;;8836:380;;;:::o;9221:356::-;9423:2;9405:21;;;9442:18;;;9435:30;9501:34;9496:2;9481:18;;9474:62;9568:2;9553:18;;9221:356::o;10011:127::-;10072:10;10067:3;10063:20;10060:1;10053:31;10103:4;10100:1;10093:15;10127:4;10124:1;10117:15;10143:168;10183:7;10249:1;10245;10241:6;10237:14;10234:1;10231:21;10226:1;10219:9;10212:17;10208:45;10205:71;;;10256:18;;:::i;:::-;-1:-1:-1;10296:9:1;;10143:168::o;10316:383::-;-1:-1:-1;;;;;10582:15:1;;;10564:34;;10634:15;;;;10629:2;10614:18;;10607:43;10681:2;10666:18;;10659:34;;;;10514:2;10499:18;;10316:383::o;10704:184::-;10774:6;10827:2;10815:9;10806:7;10802:23;10798:32;10795:52;;;10843:1;10840;10833:12;10795:52;-1:-1:-1;10866:16:1;;10704:184;-1:-1:-1;10704:184:1:o;10893:175::-;10930:3;10974:4;10967:5;10963:16;11003:4;10994:7;10991:17;10988:43;;;11011:18;;:::i;:::-;11060:1;11047:15;;10893:175;-1:-1:-1;;10893:175:1:o;11073:128::-;11113:3;11144:1;11140:6;11137:1;11134:13;11131:39;;;11150:18;;:::i;:::-;-1:-1:-1;11186:9:1;;11073:128::o;11206:127::-;11267:10;11262:3;11258:20;11255:1;11248:31;11298:4;11295:1;11288:15;11322:4;11319:1;11312:15;11338:120;11378:1;11404;11394:35;;11409:18;;:::i;:::-;-1:-1:-1;11443:9:1;;11338:120::o;12863:127::-;12924:10;12919:3;12915:20;12912:1;12905:31;12955:4;12952:1;12945:15;12979:4;12976:1;12969:15;12995:135;13034:3;-1:-1:-1;;13055:17:1;;13052:43;;;13075:18;;:::i;:::-;-1:-1:-1;13122:1:1;13111:13;;12995:135::o;13801:245::-;13868:6;13921:2;13909:9;13900:7;13896:23;13892:32;13889:52;;;13937:1;13934;13927:12;13889:52;13969:9;13963:16;13988:28;14010:5;13988:28;:::i;14402:125::-;14442:4;14470:1;14467;14464:8;14461:34;;;14475:18;;:::i;:::-;-1:-1:-1;14512:9:1;;14402:125::o;14878:112::-;14910:1;14936;14926:35;;14941:18;;:::i;:::-;-1:-1:-1;14975:9:1;;14878:112::o;14995:127::-;15056:10;15051:3;15047:20;15044:1;15037:31;15087:4;15084:1;15077:15;15111:4;15108:1;15101:15;15749:245;15828:6;15836;15889:2;15877:9;15868:7;15864:23;15860:32;15857:52;;;15905:1;15902;15895:12;15857:52;-1:-1:-1;;15928:16:1;;15984:2;15969:18;;;15963:25;15928:16;;15963:25;;-1:-1:-1;15749:245:1:o;20816:461::-;20869:3;20907:5;20901:12;20934:6;20929:3;20922:19;20960:4;20989:2;20984:3;20980:12;20973:19;;21026:2;21019:5;21015:14;21047:1;21057:195;21071:6;21068:1;21065:13;21057:195;;;21136:13;;-1:-1:-1;;;;;21132:39:1;21120:52;;21192:12;;;;21227:15;;;;21168:1;21086:9;21057:195;;;-1:-1:-1;21268:3:1;;20816:461;-1:-1:-1;;;;;20816:461:1:o;21282:582::-;21581:6;21570:9;21563:25;21624:6;21619:2;21608:9;21604:18;21597:34;21667:3;21662:2;21651:9;21647:18;21640:31;21544:4;21688:57;21740:3;21729:9;21725:19;21717:6;21688:57;:::i;:::-;-1:-1:-1;;;;;21781:32:1;;;;21776:2;21761:18;;21754:60;-1:-1:-1;21845:3:1;21830:19;21823:35;21680:65;21282:582;-1:-1:-1;;;21282:582:1:o;22734:306::-;22822:6;22830;22838;22891:2;22879:9;22870:7;22866:23;22862:32;22859:52;;;22907:1;22904;22897:12;22859:52;22936:9;22930:16;22920:26;;22986:2;22975:9;22971:18;22965:25;22955:35;;23030:2;23019:9;23015:18;23009:25;22999:35;;22734:306;;;;;:::o;25379:510::-;25650:6;25639:9;25632:25;25693:3;25688:2;25677:9;25673:18;25666:31;25613:4;25714:57;25766:3;25755:9;25751:19;25743:6;25714:57;:::i;:::-;-1:-1:-1;;;;;25807:32:1;;;;25802:2;25787:18;;25780:60;-1:-1:-1;25871:2:1;25856:18;25849:34;25706:65;25379:510;-1:-1:-1;;25379:510:1:o

Swarm Source

ipfs://80e5a226483e0df38603cebf1c96fe2aa9aff63f4de330b288983c933263bbbb

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.