ETH Price: $2,516.20 (-0.35%)

Token

By Frens For Frens (BFF)
 

Overview

Max Total Supply

1,000,000,000,000 BFF

Holders

29

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
5,000,000,000 BFF

Value
$0.00
0xa37a43b73b36f7cd56bc8003a8072d2dc3e5ac1c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

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-14
*/

// File: contracts/BFF.sol

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

// 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 by anywhere from 5-50 so they
        //cannot be guessed easily
        uint256 inc1 = random(data, 5, 89998);
        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;
        }

        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 dividend"
        );
        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);

                remainingAmount = _amount.sub(fees).sub(referrerFees).sub(referredFees);

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

                super._transfer(_from, _referrer, referrerFees);

                super._transfer(_from, _to, referredFees);

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

                emit BuyFees(_from, _referrer, referrerFees);

                emit BuyFees(_from, _to, referredFees);
            } 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 = 1;
        } 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"}]

6080604052600780546001600160b01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790556000600855600f805460ff19169055600a6017819055600560188190556019908155601a819055601b556014601c55601d556046601e556b06765c793fa10079d0000000601f55683635c9adc5dea0000060255569021e19e0c9bab24000006028553480156200009957600080fd5b50604051620068a2380380620068a2833981016040819052620000bc916200096d565b604051806040016040528060128152602001714279204672656e7320466f72204672656e7360701b8152506040518060400160405280600381526020016221232360e91b81525081600390805190602001906200011b9291906200089c565b508051620001319060049060208401906200089c565b5050600580546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a360228054610100600160a81b0319166101006001600160a01b038581169190910291909117909155602380546001600160a01b031916918316919091179055612710620001d26c0c9f2c9cd04674edea400000006019620009bb565b620001de9190620009dd565b601655604051620001ef906200092b565b604051809103906000f0801580156200020c573d6000803e3d6000fd5b50602480546001600160a01b0319166001600160a01b0392909216918217815560405163031e79db60e41b8152600481018390526331e79db09101600060405180830381600087803b1580156200026257600080fd5b505af115801562000277573d6000803e3d6000fd5b50506024805460405163031e79db60e41b81523060048201526001600160a01b0390911693506331e79db0925001600060405180830381600087803b158015620002c057600080fd5b505af1158015620002d5573d6000803e3d6000fd5b50506024546001600160a01b031691506331e79db09050620002ff6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200034157600080fd5b505af115801562000356573d6000803e3d6000fd5b50506024805460075460405163031e79db60e41b81526001600160a01b039182166004820152911693506331e79db0925001600060405180830381600087803b158015620003a357600080fd5b505af1158015620003b8573d6000803e3d6000fd5b50505050600160116000620003d2620007a560201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152601190935281832080548516600190811790915560245482168452828420805486168217905560225461010090048216845282842080548616821790556023549091168352908220805490931681179092556015906200046b6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152601584528281208054861660019081179091556007548316825283822080548716821790556022805461010090048416835284832080548816831790556023548416835293822080548716909117905560219093527f2b59c9df127166d3570f589f0cb7377a6b175795e70ab275ebf42fa16c0a23f483905560637f2b59c9df127166d3570f589f0cb7377a6b175795e70ab275ebf42fa16c0a23f55560057f2b59c9df127166d3570f589f0cb7377a6b175795e70ab275ebf42fa16c0a23f681905560647f914a2534c436de5a3f77164e6b9b90d20144139ce899b6a8d30a442e7b9ef5335560957f914a2534c436de5a3f77164e6b9b90d20144139ce899b6a8d30a442e7b9ef53455600a7f914a2534c436de5a3f77164e6b9b90d20144139ce899b6a8d30a442e7b9ef5355560967fbae8fb7bb9008c9bfa6625328b7613a2bedfb2f936a7718f51173039a77c107c5560c77fbae8fb7bb9008c9bfa6625328b7613a2bedfb2f936a7718f51173039a77c107d55600f7fbae8fb7bb9008c9bfa6625328b7613a2bedfb2f936a7718f51173039a77c107e5560c87f1ae06646c6742a506302a1833f6c3f508643fd4c5dcb1e323706d5c3441af2985560f97f1ae06646c6742a506302a1833f6c3f508643fd4c5dcb1e323706d5c3441af2995560147f1ae06646c6742a506302a1833f6c3f508643fd4c5dcb1e323706d5c3441af29a559283905260fa7ffb8633a1617da4af6a760ee9a6f35275b7a2d26730de1bb585e883dd94ef868f556113887ffb8633a1617da4af6a760ee9a6f35275b7a2d26730de1bb585e883dd94ef86905560197ffb8633a1617da4af6a760ee9a6f35275b7a2d26730de1bb585e883dd94ef869155815490931682179055546200073891166c0c9f2c9cd04674edea40000000620007b4565b60405163020929fd60e41b8152602b6004820152730f854ff4b84bf697592d2f7226d609b82de73dc9906320929fd09060240160006040518083038186803b1580156200078457600080fd5b505af415801562000799573d6000803e3d6000fd5b50505050505062000a58565b6005546001600160a01b031690565b6001600160a01b0382166200080f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b806002600082825462000823919062000a00565b90915550506001600160a01b038216600090815260208190526040812080548392906200085290849062000a00565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620008aa9062000a1b565b90600052602060002090601f016020900481019282620008ce576000855562000919565b82601f10620008e957805160ff191683800117855562000919565b8280016001018555821562000919579182015b8281111562000919578251825591602001919060010190620008fc565b506200092792915062000939565b5090565b6119aa8062004ef883390190565b5b808211156200092757600081556001016200093a565b80516001600160a01b03811681146200096857600080fd5b919050565b600080604083850312156200098157600080fd5b6200098c8362000950565b91506200099c6020840162000950565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620009d857620009d8620009a5565b500290565b600082620009fb57634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000a165762000a16620009a5565b500190565b600181811c9082168062000a3057607f821691505b6020821081141562000a5257634e487b7160e01b600052602260045260246000fd5b50919050565b6144908062000a686000396000f3fe6080604052600436106104095760003560e01c80637c4b492e11610213578063b80425c211610123578063e4132fd8116100ab578063f42938901161007a578063f429389014610c96578063f5648a4f14610cab578063fb66d86d14610cc0578063fbcbc0f114610cd6578063fdb5a03e14610cf657600080fd5b8063e4132fd814610c09578063ea084eef14610c29578063eb50d71f14610c49578063ec29f4e914610c6957600080fd5b8063c9e8714c116100f2578063c9e8714c14610b47578063d2469ba614610b77578063d297105914610b97578063dd62ed3e14610bad578063e3402c6714610bf357600080fd5b8063b80425c214610ab0578063ba762ddd14610b07578063c2b1b19914610b1c578063c9567bf914610b3257600080fd5b806395d89b41116101a6578063aa4bde2811610175578063aa4bde2814610a0e578063adc7f53e14610a24578063af9549e014610a3a578063b1fdb11b14610a5a578063b515566a14610a9057600080fd5b806395d89b4114610999578063a457c2d7146109ae578063a8b9d240146109ce578063a9059cbb146109ee57600080fd5b80638da5cb5b116101e25780638da5cb5b146108ff5780638e5916b21461091d578063906778331461094d57806392c403441461097957600080fd5b80637c4b492e14610883578063884289e3146108995780638954fb4a146108c957806389a5c691146108e957600080fd5b80633bbac579116103195780635d0dc8e4116102a157806368bfe6231161027057806368bfe623146107f45780636973cd091461080e57806370a082311461082e578063715018a61461084e578063753d654e1461086357600080fd5b80635d0dc8e41461077f5780635fcefa421461079f57806364b0f653146107bf5780636843cd84146107d457600080fd5b80634f0f9010116102e85780634f0f9010146106e757806351bc3c85146107075780635b6612ad1461071c5780635b683e66146107495780635d0044ca1461075f57600080fd5b80633bbac5791461066c5780634bae2ef11461069c5780634c590d87146106b25780634e71d92d146106d257600080fd5b80631c08bc5d1161039c5780632c7401b31161036b5780632c7401b3146105c557806330bb4cff146105e5578063313ce567146105fa578063333e99db1461061c578063395093511461064c57600080fd5b80631c08bc5d1461054557806323b872dd1461056557806324848348146105855780632c1f5216146105a557600080fd5b806312dfbd33116103d857806312dfbd33146104c6578063153b0d1e146104e657806318160ddd1461050657806319a1cca01461052557600080fd5b806302d7acda1461041557806306fdde03146104525780630829b32d14610474578063095ea7b31461049657600080fd5b3661041057005b600080fd5b34801561042157600080fd5b50610435610430366004613da0565b610d0b565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561045e57600080fd5b50610467610d90565b6040516104499190613db9565b34801561048057600080fd5b5061049461048f366004613e26565b610e22565b005b3480156104a257600080fd5b506104b66104b1366004613e5e565b610f1c565b6040519015158152602001610449565b3480156104d257600080fd5b506104946104e1366004613da0565b610f34565b3480156104f257600080fd5b50610494610501366004613e98565b610f63565b34801561051257600080fd5b506002545b604051908152602001610449565b34801561053157600080fd5b50610435610540366004613da0565b610fb8565b34801561055157600080fd5b50610494610560366004613da0565b610ffa565b34801561057157600080fd5b506104b6610580366004613ed1565b611029565b34801561059157600080fd5b506104b66105a0366004613f01565b61104d565b3480156105b157600080fd5b50602454610435906001600160a01b031681565b3480156105d157600080fd5b506105176105e0366004613e5e565b61109a565b3480156105f157600080fd5b506105176111b8565b34801561060657600080fd5b5060125b60405160ff9091168152602001610449565b34801561062857600080fd5b506104b6610637366004613f2f565b60126020526000908152604090205460ff1681565b34801561065857600080fd5b506104b6610667366004613e5e565b61122b565b34801561067857600080fd5b506104b6610687366004613f2f565b60146020526000908152604090205460ff1681565b3480156106a857600080fd5b50610517601a5481565b3480156106be57600080fd5b506104946106cd366004613f4c565b61126a565b3480156106de57600080fd5b50610494611313565b3480156106f357600080fd5b50610517610702366004613f2f565b611320565b34801561071357600080fd5b50610494611368565b34801561072857600080fd5b50610517610737366004613f2f565b60266020526000908152604090205481565b34801561075557600080fd5b5061051760185481565b34801561076b57600080fd5b5061049461077a366004613da0565b6113b8565b34801561078b57600080fd5b5061049461079a366004613f94565b611489565b3480156107ab57600080fd5b506104946107ba366004613faf565b6114c9565b3480156107cb57600080fd5b50610517611527565b3480156107e057600080fd5b506105176107ef366004613f2f565b611571565b34801561080057600080fd5b5060225461060a9060ff1681565b34801561081a57600080fd5b50610494610829366004613f01565b6115e1565b34801561083a57600080fd5b50610517610849366004613f2f565b611643565b34801561085a57600080fd5b5061049461165e565b34801561086f57600080fd5b5061049461087e366004613e98565b6116d2565b34801561088f57600080fd5b5061051760275481565b3480156108a557600080fd5b506104b66108b4366004613f2f565b60136020526000908152604090205460ff1681565b3480156108d557600080fd5b506104946108e4366004613e98565b611727565b3480156108f557600080fd5b50610517601f5481565b34801561090b57600080fd5b506005546001600160a01b0316610435565b34801561092957600080fd5b506104b6610938366004613f2f565b60116020526000908152604090205460ff1681565b34801561095957600080fd5b50610517610968366004613f2f565b602080526000908152604090205481565b34801561098557600080fd5b50610517610994366004613f2f565b611806565b3480156109a557600080fd5b50610467611868565b3480156109ba57600080fd5b506104b66109c9366004613e5e565b611877565b3480156109da57600080fd5b506105176109e9366004613f2f565b611909565b3480156109fa57600080fd5b506104b6610a09366004613e5e565b61193c565b348015610a1a57600080fd5b5061051760165481565b348015610a3057600080fd5b50610517601b5481565b348015610a4657600080fd5b50610494610a55366004613e98565b61194a565b348015610a6657600080fd5b50610517610a75366004613f2f565b6001600160a01b031660009081526030602052604090205490565b348015610a9c57600080fd5b50610494610aab366004613fea565b61199f565b348015610abc57600080fd5b50610aec610acb366004613da0565b60216020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610449565b348015610b1357600080fd5b50610517611aca565b348015610b2857600080fd5b5061051760175481565b348015610b3e57600080fd5b50610494611adb565b348015610b5357600080fd5b506104b6610b62366004613f2f565b60156020526000908152604090205460ff1681565b348015610b8357600080fd5b50610494610b92366004613fea565b611e52565b348015610ba357600080fd5b5061051760295481565b348015610bb957600080fd5b50610517610bc8366004613f01565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bff57600080fd5b5061051760285481565b348015610c1557600080fd5b50610494610c2436600461405f565b611f2b565b348015610c3557600080fd5b50610494610c44366004613e98565b611f73565b348015610c5557600080fd5b50610494610c6436600461407c565b611fc8565b348015610c7557600080fd5b50610c89610c843660046140b5565b612013565b60405161044991906140ea565b348015610ca257600080fd5b50610494612239565b348015610cb757600080fd5b50610494612306565b348015610ccc57600080fd5b5061051760195481565b348015610ce257600080fd5b50610aec610cf1366004613f2f565b6123e0565b348015610d0257600080fd5b5061049461246f565b604051633b966bcd60e21b8152602b600482015260248101829052600090730f854ff4b84bf697592d2f7226d609b82de73dc99063ee59af34906044015b602060405180830381865af4158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614143565b92915050565b606060038054610d9f90614160565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcb90614160565b8015610e185780601f10610ded57610100808354040283529160200191610e18565b820191906000526020600020905b815481529060010190602001808311610dfb57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e555760405162461bcd60e51b8152600401610e4c9061419b565b60405180910390fd5b600754600160a01b900460ff1615610ed55760405162461bcd60e51b815260206004820152603c60248201527f4246463a2043616e206f6e6c7920656e61626c652050726553616c652062656660448201527f6f72652054726164696e6720686173206265656e206f70656e65642e000000006064820152608401610e4c565b600d839055600a80546001600160a01b0319166001600160a01b038416179055610f0781670de0b6b3a76400006141e6565b600b555050600f805460ff1916600117905550565b600033610f2a81858561247a565b5060019392505050565b6005546001600160a01b03163314610f5e5760405162461bcd60e51b8152600401610e4c9061419b565b601f55565b6005546001600160a01b03163314610f8d5760405162461bcd60e51b8152600401610e4c9061419b565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b604051633325c8f560e21b8152602b600482015260248101829052600090730f854ff4b84bf697592d2f7226d609b82de73dc99063cc9723d490604401610d49565b6005546001600160a01b031633146110245760405162461bcd60e51b8152600401610e4c9061419b565b602855565b60003361103785828561259e565b61104285858561262a565b506001949350505050565b60006001600160a01b03831661106557506000610d8a565b602b548061107285611643565b101580156110925750826001600160a01b0316846001600160a01b031614155b949350505050565b601854600954604051632f99934f60e01b815260009291839173258805bf9beeb0d53ef9592b902ba3f513cc39ce91632f99934f916110eb9189916001600160a01b03909116908990600401614205565b602060405180830381865af4158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c9190614229565b905060015b60225460ff908116908216116111ae5760ff81166000908152602160205260409020548210801590611178575060ff81166000908152602160205260409020600101548211155b1561119c5760ff166000908152602160205260409020600201549250610d8a915050565b806111a681614242565b915050611131565b5090949350505050565b602454604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190614229565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610f2a9082908690611265908790614262565b61247a565b6005546001600160a01b031633146112945760405162461bcd60e51b8152600401610e4c9061419b565b6019849055601a839055601b829055604051635fe4fbe160e11b8152602b600482015260248101829052730f854ff4b84bf697592d2f7226d609b82de73dc99063bfc9f7c29060440160006040518083038186803b1580156112f557600080fd5b505af4158015611309573d6000803e3d6000fd5b5050505050505050565b61131e336000612c68565b565b6001600160a01b038116600090815260136020526040812054819060ff16806113525750600754600160a81b900460ff165b1561135f57506001610d8a565b50600092915050565b6005546001600160a01b031633146113925760405162461bcd60e51b8152600401610e4c9061419b565b60006113a96027546113a330611643565b90612fae565b90506113b481612fc1565b5050565b6005546001600160a01b031633146113e25760405162461bcd60e51b8152600401610e4c9061419b565b670de0b6b3a76400006103e86113f760025490565b6114029060016141e6565b61140c9190614290565b6114169190614290565b8110156114715760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b6064820152608401610e4c565b61148381670de0b6b3a76400006141e6565b60165550565b6005546001600160a01b031633146114b35760405162461bcd60e51b8152600401610e4c9061419b565b6022805460ff191660ff92909216919091179055565b6005546001600160a01b031633146114f35760405162461bcd60e51b8152600401610e4c9061419b565b600a85111580156115075750600a60185411155b61151057600080fd5b601794909455601892909255601c55601d55601e55565b602454604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b602480546040516370a0823160e01b81526001600160a01b0384811660048301526000939216916370a0823191015b602060405180830381865afa1580156115bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614229565b6005546001600160a01b0316331461160b5760405162461bcd60e51b8152600401610e4c9061419b565b60228054610100600160a81b0319166101006001600160a01b0394851602179055602380546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146116885760405162461bcd60e51b8152600401610e4c9061419b565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146116fc5760405162461bcd60e51b8152600401610e4c9061419b565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117515760405162461bcd60e51b8152600401610e4c9061419b565b80156117ba576024805460405163031e79db60e41b81526001600160a01b038581166004830152909116916331e79db091015b600060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050505050565b6024546001600160a01b03166318c18adb836117d581611643565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611784565b60405163057c207360e21b8152602b60048201526001600160a01b0382166024820152600090730f854ff4b84bf697592d2f7226d609b82de73dc9906315f081cc90604401602060405180830381865af41580156115bd573d6000803e3d6000fd5b606060048054610d9f90614160565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156118fc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e4c565b611042828686840361247a565b602480546040516302a2e74960e61b81526001600160a01b03848116600483015260009392169163a8b9d24091016115a0565b600033610f2a81858561262a565b6005546001600160a01b031633146119745760405162461bcd60e51b8152600401610e4c9061419b565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146119c95760405162461bcd60e51b8152600401610e4c9061419b565b60005b81811015611ac5576009546001600160a01b03168383838181106119f2576119f26142a4565b9050602002016020810190611a079190613f2f565b6001600160a01b031614158015611a5857506007546001600160a01b0316838383818110611a3757611a376142a4565b9050602002016020810190611a4c9190613f2f565b6001600160a01b031614155b15611ab357600160146000858585818110611a7557611a756142a4565b9050602002016020810190611a8a9190613f2f565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611abd816142ba565b9150506119cc565b505050565b60006112266027546113a330611643565b6005546001600160a01b03163314611b055760405162461bcd60e51b8152600401610e4c9061419b565b600754600160a01b900460ff1615611b5f5760405162461bcd60e51b815260206004820152601c60248201527f4246463a2054726164696e6720697320616c7265616479206f70656e000000006044820152606401610e4c565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd69190614143565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5c9190614143565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccd9190614143565b600980546001600160a01b0319166001600160a01b0392831690811782556000908152601560209081526040808320805460ff19908116600190811790925585548716855260109093529281902080549092169092179055602480549254915163031e79db60e41b8152918416600483015291909216916331e79db09101600060405180830381600087803b158015611d6557600080fd5b505af1158015611d79573d6000803e3d6000fd5b50505050611d8f611d8930611643565b47613176565b60095460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0991906142d5565b506007805460ff60a01b1916600160a01b179055600f5460ff1615611e4c5742600c819055600d54611e4790611e4090603c613285565b8290613291565b600e55505b43600855565b6005546001600160a01b03163314611e7c5760405162461bcd60e51b8152600401610e4c9061419b565b60005b81811015611ac5576024546001600160a01b03166331e79db0848484818110611eaa57611eaa6142a4565b9050602002016020810190611ebf9190613f2f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611f0057600080fd5b505af1158015611f14573d6000803e3d6000fd5b505050508080611f23906142ba565b915050611e7f565b6005546001600160a01b03163314611f555760405162461bcd60e51b8152600401610e4c9061419b565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6005546001600160a01b03163314611f9d5760405162461bcd60e51b8152600401610e4c9061419b565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611ff25760405162461bcd60e51b8152600401610e4c9061419b565b60ff9093166000908152602160205260409020918255600182015560020155565b60606000831180156120255750600082115b61206a5760405162461bcd60e51b81526020600482015260166024820152754246463a20496e76616c696420617267756d656e747360501b6044820152606401610e4c565b6001600160a01b0384166000908152603060205260408120549061208e85856141e6565b9050600061209c86836142f2565b90508281106120e15760405162461bcd60e51b81526020600482015260116024820152704246463a204f7574206f662072616e676560781b6044820152606401610e4c565b85838311156120fa578392506120f78784614309565b90505b60008167ffffffffffffffff8111156121155761211561431d565b60405190808252806020026020018201604052801561216a57816020015b61215760405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816121335790505b5090506000835b8581101561222a576001600160a01b038b1660009081526030602052604081208054839081106121a3576121a36142a4565b90600052602060002001549050602f600082815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250508484815181106121fe576121fe6142a4565b6020908102919091010152612214600184614262565b9250508080612222906142ba565b915050612171565b50909998505050505050505050565b6005546001600160a01b031633146122635760405162461bcd60e51b8152600401610e4c9061419b565b600061227a60295447612fae90919063ffffffff16565b905060006122ab612297601c546064612fae90919063ffffffff16565b601d546122a5908590613285565b9061329d565b905060006122d66122c8601c546064612fae90919063ffffffff16565b601e546122a5908690613285565b905060006122e8826113a38686612fae565b90506122f48382613291565b925061230083836132a9565b50505050565b6005546001600160a01b031633146123305760405162461bcd60e51b8152600401610e4c9061419b565b600754600160a01b900460ff161561239e5760405162461bcd60e51b815260206004820152602b60248201527f43616e206f6e6c792077697468647261772069662074726164696e672068617360448201526a1b89dd081cdd185c9d195960aa1b6064820152608401610e4c565b604051600090339047908381818185875af1925050503d8060008114612300576040519150601f19603f3d011682016040523d82523d6000602084013e612300565b6024805460405163fbcbc0f160e01b81526001600160a01b0384811660048301526000938493849392169163fbcbc0f191016040805180830381865afa15801561242e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124529190614333565b9093509150828261246286611643565b9250925092509193909250565b61131e336001612c68565b6001600160a01b0383166124dc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e4c565b6001600160a01b03821661253d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e4c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612300578181101561261d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e4c565b612300848484840361247a565b6001600160a01b03831660009081526014602052604090205460ff1615801561266c57506001600160a01b03821660009081526014602052604090205460ff16155b61267557600080fd5b6001600160a01b03831660009081526012602052604090205460ff161580156126b757506001600160a01b03821660009081526012602052604090205460ff16155b6126c057600080fd5b6007548190600160a01b900460ff16801561271557506001600160a01b03841660009081526010602052604090205460ff168061271557506001600160a01b03831660009081526010602052604090205460ff165b801561273a57506001600160a01b03841660009081526011602052604090205460ff16155b801561275f57506001600160a01b03831660009081526011602052604090205460ff16155b1561299657600f5460ff168015612778575042600c5411155b8015612785575042600e54115b1561285c57600b54600a546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156127d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fb9190614229565b101561285c5760405162461bcd60e51b815260206004820152602a60248201527f50726553616c653a204e6f7420656e6f7567682050726553616c6520746f6b6560448201526937103130b630b731b29760b11b6064820152608401610e4c565b604051633325c8f560e21b8152602b600482015260248101839052600090730f854ff4b84bf697592d2f7226d609b82de73dc99063cc9723d490604401602060405180830381865af41580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da9190614143565b9050730f854ff4b84bf697592d2f7226d609b82de73dc96304ea10f2602b8361290281611643565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152604483015287166064820152608401602060405180830381865af415801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e91906142d5565b612986575060005b61299285858584613367565b9150505b6001600160a01b03831660009081526020805260409020546129cd576001600160a01b038316600090815260208052604090204290555b6001600160a01b03831660009081526010602052604090205460ff16158015612a0f57506001600160a01b03831660009081526015602052604090205460ff16155b15612a835760165481612a2185611643565b612a2b9190614262565b1115612a835760405162461bcd60e51b815260206004820152602160248201527f4246463a2057616c6c65742062616c616e6365206c696d6974207265616368656044820152601960fa1b6064820152608401610e4c565b612a8e848483613766565b612a9783613934565b60248054604051631b4a89ab60e11b81526001600160a01b0387811660048301529091169163369513569101602060405180830381865afa158015612ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0491906142d5565b612b7c576024546001600160a01b031663e30443bc85612b2381611643565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b6957600080fd5b505af1925050508015612b7a575060015b505b60248054604051631b4a89ab60e11b81526001600160a01b0386811660048301529091169163369513569101602060405180830381865afa158015612bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be991906142d5565b612300576024546001600160a01b031663e30443bc84612c0881611643565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612c4e57600080fd5b505af1925050508015612c5f575060015b61230057612300565b602480546040516302a2e74960e61b81526001600160a01b03858116600483015260009392169163a8b9d2409101602060405180830381865afa158015612cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd79190614229565b905060008111612d3b5760405162461bcd60e51b815260206004820152602960248201527f4246463a20436c61696d657220686173206e6f20776974686472617761626c6560448201526808191a5d9a59195b9960ba1b6064820152608401610e4c565b60008083612e6757600754600160a81b900460ff1680612d7357506001600160a01b03851660009081526013602052604090205460ff165b612de7576040805162461bcd60e51b81526020600482015260248101919091527f4246463a20436c61696d6572206e6f7420616c6c6f77656420746f20636c616960448201527f6d206469766964656e64732c2063616e206f6e6c792072652d696e766573742e6064820152608401610e4c565b602480546040516352b5f81d60e01b81526001600160a01b0388811660048301819052938201939093529116906352b5f81d906044016020604051808303816000875af1158015612e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e609190614229565b9150612efa565b8315612efa57602480546040516352b5f81d60e01b81526001600160a01b03888116600483015230938201939093529116906352b5f81d906044016020604051808303816000875af1158015612ec1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee59190614229565b91508115612efa57612ef78286613a1a565b90505b8115612fa757612f0e602a80546001019055565b6000612f19602a5490565b6000818152602f602090815260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260308452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505b5050505050565b6000612fba82846142f2565b9392505050565b6040805160028082526060820183526000924792849290916020830190803683370190505090503081600081518110612ffc57612ffc6142a4565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613055573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130799190614143565b8160018151811061308c5761308c6142a4565b6001600160a01b0392831660209182029290920101526007546130b2913091168661247a565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906130eb90879060009086903090429060040161439b565b600060405180830381600087803b15801561310557600080fd5b505af1158015613119573d6000803e3d6000fd5b5050505060006131328347612fae90919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b60075461318e9030906001600160a01b03168461247a565b6007546001600160a01b031663f305d7198230856000806131b76005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561321f573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061324491906143d7565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b6000612fba82846141e6565b6000612fba8284614262565b6000612fba8284614290565b81156132ef576022546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f193505050501580156132ed573d6000803e3d6000fd5b505b8015613331576023546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561332f573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd9249689101613279565b6001600160a01b0384166000908152601060205260408120548190819060ff16806133aa57506001600160a01b03861660009081526010602052604090205460ff165b6133f65760405162461bcd60e51b815260206004820152601b60248201527f4246463a204e6f206d61726b6574206d616b65727320666f756e6400000000006044820152606401610e4c565b6001600160a01b03871660009081526010602052604090205460ff1615613621576000806000600854431480156134305750600f5460ff16155b1561343e57605a92506134af565b60085461344c906001614262565b4314801561345d5750600f5460ff16155b1561346b57603292506134af565b6001600160a01b038716156134a9576134a2613499600a6122a5601b54601a5461329190919063ffffffff16565b60195490613291565b92506134af565b60175492505b6134be60646122a58a86613285565b94506001600160a01b038716156135d8576134e960646122a56019548b61328590919063ffffffff16565b94506135066103e86122a5601a548b61328590919063ffffffff16565b91506135236103e86122a5601b548b61328590919063ffffffff16565b9050613535816113a384818c8a612fae565b93506135428a3087613766565b61354d8a8884613766565b6135588a8a83613766565b60008051602061443b8339815191528a308760405161357993929190614205565b60405180910390a160008051602061443b8339815191528a88846040516135a293929190614205565b60405180910390a160008051602061443b8339815191528a8a836040516135cb93929190614205565b60405180910390a1613619565b6135e28886612fae565b93506135ef8a3087613766565b60008051602061443b8339815191528a308760405161361093929190614205565b60405180910390a15b50505061375c565b60006008544314156136355750605a61367f565b600854613643906001614262565b4314156136525750603261367f565b600061365e308861109a565b90508060185461366e9190614262565b9150601e821061367d57601e91505b505b61368e60646122a58884613285565b925060006136b660646122a56136af60185486612fae90919063ffffffff16565b8a90613285565b6027549091506136c69082613291565b6027556136d38785612fae565b92506136e0893086613766565b60006136f16027546113a330611643565b9050601f548111156137065761370681613bcc565b602854602754111561371d5761371d602754613cc2565b7f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a8a308760405161375093929190614205565b60405180910390a15050505b9695505050505050565b6001600160a01b0383166137ca5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e4c565b6001600160a01b03821661382c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e4c565b6001600160a01b038316600090815260208190526040902054818110156138a45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e4c565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906138db908490614262565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161392791815260200190565b60405180910390a3612300565b6001600160a01b03811660009081526011602052604090205460ff168061397357506001600160a01b03811660009081526012602052604090205460ff165b1561397b5750565b6009546001600160a01b03828116911614156139945750565b730f854ff4b84bf697592d2f7226d609b82de73dc963cdb09f68602b836139ba81611643565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152604482015260640160006040518083038186803b158015613a0657600080fd5b505af4158015612fa7573d6000803e3d6000fd5b600080613a2630611643565b60408051600280825260608201835292935060009290916020830190803683375050600754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ab99190614143565b81600081518110613acc57613acc6142a4565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110613b0057613b006142a4565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790613b469060009086908a904290600401614405565b6000604051808303818588803b158015613b5f57600080fd5b505af1158015613b73573d6000803e3d6000fd5b50505050506000613b87836113a330611643565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000613be860646122a5601c548561328590919063ffffffff16565b90506000613bf782600261329d565b90506000613c058483612fae565b90506000613c1282612fc1565b90506000613c3060646122a5601c548561328590919063ffffffff16565b90506000613c4e60646122a5601d548661328590919063ffffffff16565b90506000613c6c60646122a5601e548761328590919063ffffffff16565b90506000613c80826113a385818989612fae565b9050613c8c8382613291565b9250613c9883836132a9565b600087118015613ca85750600084115b15613cb757613cb78785613176565b505050505050505050565b6000613ccd82612fc1565b602754909150613cdd9083612fae565b602755602954600090613cf1908390613291565b6024546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613d43576040519150601f19603f3d011682016040523d82523d6000602084013e613d48565b606091505b505090508015613d8a576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1612300565b602954613d979084613291565b60295550505050565b600060208284031215613db257600080fd5b5035919050565b600060208083528351808285015260005b81811015613de657858101830151858201604001528201613dca565b81811115613df8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114613e2357600080fd5b50565b600080600060608486031215613e3b57600080fd5b833592506020840135613e4d81613e0e565b929592945050506040919091013590565b60008060408385031215613e7157600080fd5b8235613e7c81613e0e565b946020939093013593505050565b8015158114613e2357600080fd5b60008060408385031215613eab57600080fd5b8235613eb681613e0e565b91506020830135613ec681613e8a565b809150509250929050565b600080600060608486031215613ee657600080fd5b8335613ef181613e0e565b92506020840135613e4d81613e0e565b60008060408385031215613f1457600080fd5b8235613f1f81613e0e565b91506020830135613ec681613e0e565b600060208284031215613f4157600080fd5b8135612fba81613e0e565b60008060008060808587031215613f6257600080fd5b5050823594602084013594506040840135936060013592509050565b803560ff81168114613f8f57600080fd5b919050565b600060208284031215613fa657600080fd5b612fba82613f7e565b600080600080600060a08688031215613fc757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060208385031215613ffd57600080fd5b823567ffffffffffffffff8082111561401557600080fd5b818501915085601f83011261402957600080fd5b81358181111561403857600080fd5b8660208260051b850101111561404d57600080fd5b60209290920196919550909350505050565b60006020828403121561407157600080fd5b8135612fba81613e8a565b6000806000806080858703121561409257600080fd5b61409b85613f7e565b966020860135965060408601359560600135945092505050565b6000806000606084860312156140ca57600080fd5b83356140d581613e0e565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b828110156141365781518051855286810151878601528501518585015260609093019290850190600101614107565b5091979650505050505050565b60006020828403121561415557600080fd5b8151612fba81613e0e565b600181811c9082168061417457607f821691505b6020821081141561419557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614200576142006141d0565b500290565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561423b57600080fd5b5051919050565b600060ff821660ff811415614259576142596141d0565b60010192915050565b60008219821115614275576142756141d0565b500190565b634e487b7160e01b600052601260045260246000fd5b60008261429f5761429f61427a565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156142ce576142ce6141d0565b5060010190565b6000602082840312156142e757600080fd5b8151612fba81613e8a565b600082821015614304576143046141d0565b500390565b6000826143185761431861427a565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561434657600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b838110156143905781516001600160a01b03168752958201959082019060010161436b565b509495945050505050565b85815284602082015260a0604082015260006143ba60a0830186614357565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156143ec57600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061441e6080830186614357565b6001600160a01b0394909416604083015250606001529291505056fe6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401da26469706673582212204c78987e7d1d548a3485800fe170c6c1c90157f5c106b8e1225265a81830f88e64736f6c634300080b003360a06040523480156200001157600080fd5b5060408051808201825260148082527f4246465f4469766964656e645f547261636b6572000000000000000000000000602080840182815285518087019096529285528401528151919291839183916200006e91600391620000df565b50805162000084906004906020840190620000df565b5050600980546001600160a01b03191633908117909155604051909350600092507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091508290a369021e19e0c9bab2400000608052620001c2565b828054620000ed9062000185565b90600052602060002090601f0160209004810192826200011157600085556200015c565b82601f106200012c57805160ff19168380011785556200015c565b828001600101855582156200015c579182015b828111156200015c5782518255916020019190600101906200013f565b506200016a9291506200016e565b5090565b5b808211156200016a57600081556001016200016f565b600181811c908216806200019a57607f821691505b60208210811415620001bc57634e487b7160e01b600052602260045260246000fd5b50919050565b6080516117be620001ec6000396000818161051c0152818161077d0152610cab01526117be6000f3fe6080604052600436106101c65760003560e01c80636a474002116100f7578063a457c2d711610095578063be10b61411610064578063be10b6141461050a578063dd62ed3e1461053e578063e30443bc14610584578063fbcbc0f1146105a457600080fd5b8063a457c2d714610474578063a8b9d24014610494578063a9059cbb146104b4578063aafd847a146104d457600080fd5b806385a6b3ae116100d157806385a6b3ae146104015780638da5cb5b1461041757806391b89fba1461043f57806395d89b411461045f57600080fd5b80636a474002146103a157806370a08231146103b6578063715018a6146103ec57600080fd5b806327ce014711610164578063369513561161013e578063369513561461031157806339509351146103315780634e7b827f1461035157806352b5f81d1461038157600080fd5b806327ce0147146102b5578063313ce567146102d557806331e79db0146102f157600080fd5b806309bbedde116101a057806309bbedde1461023d57806318160ddd1461026057806318c18adb1461027557806323b872dd1461029557600080fd5b806303c83302146101da57806306fdde03146101e2578063095ea7b31461020d57600080fd5b366101d5576101d36105d9565b005b600080fd5b6101d36105d9565b3480156101ee57600080fd5b506101f761066c565b60405161020491906114e2565b60405180910390f35b34801561021957600080fd5b5061022d61022836600461154f565b6106fe565b6040519015158152602001610204565b34801561024957600080fd5b50610252610718565b604051908152602001610204565b34801561026c57600080fd5b50600254610252565b34801561028157600080fd5b506101d361029036600461154f565b610728565b3480156102a157600080fd5b5061022d6102b036600461157b565b610835565b3480156102c157600080fd5b506102526102d03660046115bc565b610859565b3480156102e157600080fd5b5060405160128152602001610204565b3480156102fd57600080fd5b506101d361030c3660046115bc565b6108b5565b34801561031d57600080fd5b5061022d61032c3660046115bc565b610994565b34801561033d57600080fd5b5061022d61034c36600461154f565b6109e0565b34801561035d57600080fd5b5061022d61036c3660046115bc565b600d6020526000908152604090205460ff1681565b34801561038d57600080fd5b5061025261039c3660046115d9565b610a1f565b3480156103ad57600080fd5b506101d3610a60565b3480156103c257600080fd5b506102526103d13660046115bc565b6001600160a01b031660009081526020819052604090205490565b3480156103f857600080fd5b506101d3610b00565b34801561040d57600080fd5b5061025260085481565b34801561042357600080fd5b506009546040516001600160a01b039091168152602001610204565b34801561044b57600080fd5b5061025261045a3660046115bc565b610b74565b34801561046b57600080fd5b506101f7610b7f565b34801561048057600080fd5b5061022d61048f36600461154f565b610b8e565b3480156104a057600080fd5b506102526104af3660046115bc565b610c20565b3480156104c057600080fd5b5061022d6104cf36600461154f565b610c4c565b3480156104e057600080fd5b506102526104ef3660046115bc565b6001600160a01b031660009081526007602052604090205490565b34801561051657600080fd5b506102527f000000000000000000000000000000000000000000000000000000000000000081565b34801561054a57600080fd5b506102526105593660046115d9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561059057600080fd5b506101d361059f36600461154f565b610c5a565b3480156105b057600080fd5b506105c46105bf3660046115bc565b610d8a565b60408051928352602083019190915201610204565b60006105e460025490565b116105ee57600080fd5b341561066a5761062161060060025490565b61060e34600160801b610db7565b6106189190611628565b60055490610dca565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26008546106669034610dca565b6008555b565b60606003805461067b9061164a565b80601f01602080910402602001604051908101604052809291908181526020018280546106a79061164a565b80156106f45780601f106106c9576101008083540402835291602001916106f4565b820191906000526020600020905b8154815290600101906020018083116106d757829003601f168201915b5050505050905090565b60003361070c818585610dd6565b60019150505b92915050565b6000610723600b5490565b905090565b6009546001600160a01b0316331461075b5760405162461bcd60e51b815260040161075290611685565b60405180910390fd5b6001600160a01b0382166000908152600d60205260409020805460ff191690557f000000000000000000000000000000000000000000000000000000000000000081106107fd576107ac8282610e36565b6001600160a01b0382166000908152600c602052604090205460ff166107fd576001600160a01b0382166000908152600c60205260409020805460ff191660011790556107fd600b80546001019055565b6040516001600160a01b038316907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a25050565b600033610843858285610e95565b61084e858585610f21565b506001949350505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b926108ab926108a6926108a09161089b9190610db7565b610f7c565b90610fea565b610ff6565b6107129190611628565b6009546001600160a01b031633146108df5760405162461bcd60e51b815260040161075290611685565b6001600160a01b0381166000908152600d60205260408120805460ff1916600117905561090d908290610e36565b6001600160a01b0381166000908152600c602052604090205460ff1615156001141561095d576001600160a01b0381166000908152600c60205260409020805460ff1916905561095d600b611048565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546000906001600160a01b031633146109c15760405162461bcd60e51b815260040161075290611685565b506001600160a01b03166000908152600d602052604090205460ff1690565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061070c9082908690610a1a9087906116ba565b610dd6565b6009546000906001600160a01b03163314610a4c5760405162461bcd60e51b815260040161075290611685565b6000610a58848461109f565b949350505050565b60405162461bcd60e51b815260206004820152606360248201527f4246465f4469766964656e645f547261636b65723a207769746864726177446960448201527f766964656e642064697361626c65642e20557365207468652027636c61696d2760648201527f2066756e6374696f6e206f6e20746865206d61696e2042464620636f6e74726160848201526231ba1760e91b60a482015260c401610752565b6009546001600160a01b03163314610b2a5760405162461bcd60e51b815260040161075290611685565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b600061071282610c20565b60606004805461067b9061164a565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610c135760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610752565b61084e8286868403610dd6565b6001600160a01b03811660009081526007602052604081205461071290610c4684610859565b906111f5565b60003361070c818585610f21565b6009546001600160a01b03163314610c845760405162461bcd60e51b815260040161075290611685565b6001600160a01b0382166000908152600d602052604090205460ff1615610ca9575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610d2f57610cda8282610e36565b6001600160a01b0382166000908152600c602052604090205460ff16610d2b576001600160a01b0382166000908152600c60205260409020805460ff19166001179055610d2b600b80546001019055565b5050565b610d3a826000610e36565b6001600160a01b0382166000908152600c602052604090205460ff16151560011415610d2b576001600160a01b0382166000908152600c60205260409020805460ff19169055610d2b600b611048565b600080610d9683610c20565b6001600160a01b039093166000908152600760205260409020549293915050565b6000610dc382846116d2565b9392505050565b6000610dc382846116ba565b60405162461bcd60e51b815260206004820152602a60248201527f4246465f4469766964656e645f547261636b65723a204e6f20617070726f76616044820152691b1cc8185b1b1bddd95960b21b6064820152608401610752565b505050565b6001600160a01b03821660009081526020819052604090205480821115610e75576000610e6383836111f5565b9050610e6f8482611201565b50505050565b80821015610e31576000610e8982846111f5565b9050610e6f8482611265565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610e6f5781811015610f145760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610752565b610e6f8484848403610dd6565b60405162461bcd60e51b815260206004820152602a60248201527f4246465f4469766964656e645f547261636b65723a204e6f207472616e7366656044820152691c9cc8185b1b1bddd95960b21b6064820152608401610752565b60006001600160ff1b03821115610fe65760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401610752565b5090565b6000610dc382846116f1565b600080821215610fe65760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f7369746976656044820152606401610752565b8054806110975760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a2064656372656d656e74206f766572666c6f7700000000006044820152606401610752565b600019019055565b6000806110ab84610c20565b905080156111eb576001600160a01b0384166000908152600760205260409020546110d69082610dca565b6001600160a01b038516600081815260076020526040908190209290925590517feb063efb53b3790d2bc15284b59af7544466c8787c2883321ee27095647911b69061113790849087909182526001600160a01b0316602082015260400190565b60405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d806000811461118c576040519150601f19603f3d011682016040523d82523d6000602084013e611191565b606091505b50509050806111e3576001600160a01b0385166000908152600760205260409020546111bd90836111f5565b6001600160a01b0386166000908152600760205260408120919091559250610712915050565b509050610712565b5060009392505050565b6000610dc38284611732565b61120b82826112a9565b61124561122661089b83600554610db790919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611388565b6001600160a01b0390921660009081526006602052604090209190915550565b61126f8282611394565b61124561128a61089b83600554610db790919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490610fea565b6001600160a01b0382166112ff5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610752565b806002600082825461131191906116ba565b90915550506001600160a01b0382166000908152602081905260408120805483929061133e9084906116ba565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6000610dc38284611749565b6001600160a01b0382166113f45760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610752565b6001600160a01b038216600090815260208190526040902054818110156114685760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610752565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611497908490611732565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600060208083528351808285015260005b8181101561150f578581018301518582016040015282016114f3565b81811115611521576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461154c57600080fd5b50565b6000806040838503121561156257600080fd5b823561156d81611537565b946020939093013593505050565b60008060006060848603121561159057600080fd5b833561159b81611537565b925060208401356115ab81611537565b929592945050506040919091013590565b6000602082840312156115ce57600080fd5b8135610dc381611537565b600080604083850312156115ec57600080fd5b82356115f781611537565b9150602083013561160781611537565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008261164557634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061165e57607f821691505b6020821081141561167f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156116cd576116cd611612565b500190565b60008160001904831182151516156116ec576116ec611612565b500290565b600080821280156001600160ff1b038490038513161561171357611713611612565b600160ff1b839003841281161561172c5761172c611612565b50500190565b60008282101561174457611744611612565b500390565b60008083128015600160ff1b85018412161561176757611767611612565b6001600160ff1b038401831381161561178257611782611612565b5050039056fea2646970667358221220eb906fe02bcd5e6fda0c070a6d8b107cdb35d9f7d09a7216a96cc7b678a9679464736f6c634300080b00330000000000000000000000005a377aecf9b9deaf61ab116fe14ed56a3f4b4a7e00000000000000000000000058782fc478221bfb381ce8d61560eb0f9f8402a8

Deployed Bytecode

0x6080604052600436106104095760003560e01c80637c4b492e11610213578063b80425c211610123578063e4132fd8116100ab578063f42938901161007a578063f429389014610c96578063f5648a4f14610cab578063fb66d86d14610cc0578063fbcbc0f114610cd6578063fdb5a03e14610cf657600080fd5b8063e4132fd814610c09578063ea084eef14610c29578063eb50d71f14610c49578063ec29f4e914610c6957600080fd5b8063c9e8714c116100f2578063c9e8714c14610b47578063d2469ba614610b77578063d297105914610b97578063dd62ed3e14610bad578063e3402c6714610bf357600080fd5b8063b80425c214610ab0578063ba762ddd14610b07578063c2b1b19914610b1c578063c9567bf914610b3257600080fd5b806395d89b41116101a6578063aa4bde2811610175578063aa4bde2814610a0e578063adc7f53e14610a24578063af9549e014610a3a578063b1fdb11b14610a5a578063b515566a14610a9057600080fd5b806395d89b4114610999578063a457c2d7146109ae578063a8b9d240146109ce578063a9059cbb146109ee57600080fd5b80638da5cb5b116101e25780638da5cb5b146108ff5780638e5916b21461091d578063906778331461094d57806392c403441461097957600080fd5b80637c4b492e14610883578063884289e3146108995780638954fb4a146108c957806389a5c691146108e957600080fd5b80633bbac579116103195780635d0dc8e4116102a157806368bfe6231161027057806368bfe623146107f45780636973cd091461080e57806370a082311461082e578063715018a61461084e578063753d654e1461086357600080fd5b80635d0dc8e41461077f5780635fcefa421461079f57806364b0f653146107bf5780636843cd84146107d457600080fd5b80634f0f9010116102e85780634f0f9010146106e757806351bc3c85146107075780635b6612ad1461071c5780635b683e66146107495780635d0044ca1461075f57600080fd5b80633bbac5791461066c5780634bae2ef11461069c5780634c590d87146106b25780634e71d92d146106d257600080fd5b80631c08bc5d1161039c5780632c7401b31161036b5780632c7401b3146105c557806330bb4cff146105e5578063313ce567146105fa578063333e99db1461061c578063395093511461064c57600080fd5b80631c08bc5d1461054557806323b872dd1461056557806324848348146105855780632c1f5216146105a557600080fd5b806312dfbd33116103d857806312dfbd33146104c6578063153b0d1e146104e657806318160ddd1461050657806319a1cca01461052557600080fd5b806302d7acda1461041557806306fdde03146104525780630829b32d14610474578063095ea7b31461049657600080fd5b3661041057005b600080fd5b34801561042157600080fd5b50610435610430366004613da0565b610d0b565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561045e57600080fd5b50610467610d90565b6040516104499190613db9565b34801561048057600080fd5b5061049461048f366004613e26565b610e22565b005b3480156104a257600080fd5b506104b66104b1366004613e5e565b610f1c565b6040519015158152602001610449565b3480156104d257600080fd5b506104946104e1366004613da0565b610f34565b3480156104f257600080fd5b50610494610501366004613e98565b610f63565b34801561051257600080fd5b506002545b604051908152602001610449565b34801561053157600080fd5b50610435610540366004613da0565b610fb8565b34801561055157600080fd5b50610494610560366004613da0565b610ffa565b34801561057157600080fd5b506104b6610580366004613ed1565b611029565b34801561059157600080fd5b506104b66105a0366004613f01565b61104d565b3480156105b157600080fd5b50602454610435906001600160a01b031681565b3480156105d157600080fd5b506105176105e0366004613e5e565b61109a565b3480156105f157600080fd5b506105176111b8565b34801561060657600080fd5b5060125b60405160ff9091168152602001610449565b34801561062857600080fd5b506104b6610637366004613f2f565b60126020526000908152604090205460ff1681565b34801561065857600080fd5b506104b6610667366004613e5e565b61122b565b34801561067857600080fd5b506104b6610687366004613f2f565b60146020526000908152604090205460ff1681565b3480156106a857600080fd5b50610517601a5481565b3480156106be57600080fd5b506104946106cd366004613f4c565b61126a565b3480156106de57600080fd5b50610494611313565b3480156106f357600080fd5b50610517610702366004613f2f565b611320565b34801561071357600080fd5b50610494611368565b34801561072857600080fd5b50610517610737366004613f2f565b60266020526000908152604090205481565b34801561075557600080fd5b5061051760185481565b34801561076b57600080fd5b5061049461077a366004613da0565b6113b8565b34801561078b57600080fd5b5061049461079a366004613f94565b611489565b3480156107ab57600080fd5b506104946107ba366004613faf565b6114c9565b3480156107cb57600080fd5b50610517611527565b3480156107e057600080fd5b506105176107ef366004613f2f565b611571565b34801561080057600080fd5b5060225461060a9060ff1681565b34801561081a57600080fd5b50610494610829366004613f01565b6115e1565b34801561083a57600080fd5b50610517610849366004613f2f565b611643565b34801561085a57600080fd5b5061049461165e565b34801561086f57600080fd5b5061049461087e366004613e98565b6116d2565b34801561088f57600080fd5b5061051760275481565b3480156108a557600080fd5b506104b66108b4366004613f2f565b60136020526000908152604090205460ff1681565b3480156108d557600080fd5b506104946108e4366004613e98565b611727565b3480156108f557600080fd5b50610517601f5481565b34801561090b57600080fd5b506005546001600160a01b0316610435565b34801561092957600080fd5b506104b6610938366004613f2f565b60116020526000908152604090205460ff1681565b34801561095957600080fd5b50610517610968366004613f2f565b602080526000908152604090205481565b34801561098557600080fd5b50610517610994366004613f2f565b611806565b3480156109a557600080fd5b50610467611868565b3480156109ba57600080fd5b506104b66109c9366004613e5e565b611877565b3480156109da57600080fd5b506105176109e9366004613f2f565b611909565b3480156109fa57600080fd5b506104b6610a09366004613e5e565b61193c565b348015610a1a57600080fd5b5061051760165481565b348015610a3057600080fd5b50610517601b5481565b348015610a4657600080fd5b50610494610a55366004613e98565b61194a565b348015610a6657600080fd5b50610517610a75366004613f2f565b6001600160a01b031660009081526030602052604090205490565b348015610a9c57600080fd5b50610494610aab366004613fea565b61199f565b348015610abc57600080fd5b50610aec610acb366004613da0565b60216020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610449565b348015610b1357600080fd5b50610517611aca565b348015610b2857600080fd5b5061051760175481565b348015610b3e57600080fd5b50610494611adb565b348015610b5357600080fd5b506104b6610b62366004613f2f565b60156020526000908152604090205460ff1681565b348015610b8357600080fd5b50610494610b92366004613fea565b611e52565b348015610ba357600080fd5b5061051760295481565b348015610bb957600080fd5b50610517610bc8366004613f01565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610bff57600080fd5b5061051760285481565b348015610c1557600080fd5b50610494610c2436600461405f565b611f2b565b348015610c3557600080fd5b50610494610c44366004613e98565b611f73565b348015610c5557600080fd5b50610494610c6436600461407c565b611fc8565b348015610c7557600080fd5b50610c89610c843660046140b5565b612013565b60405161044991906140ea565b348015610ca257600080fd5b50610494612239565b348015610cb757600080fd5b50610494612306565b348015610ccc57600080fd5b5061051760195481565b348015610ce257600080fd5b50610aec610cf1366004613f2f565b6123e0565b348015610d0257600080fd5b5061049461246f565b604051633b966bcd60e21b8152602b600482015260248101829052600090730f854ff4b84bf697592d2f7226d609b82de73dc99063ee59af34906044015b602060405180830381865af4158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614143565b92915050565b606060038054610d9f90614160565b80601f0160208091040260200160405190810160405280929190818152602001828054610dcb90614160565b8015610e185780601f10610ded57610100808354040283529160200191610e18565b820191906000526020600020905b815481529060010190602001808311610dfb57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e555760405162461bcd60e51b8152600401610e4c9061419b565b60405180910390fd5b600754600160a01b900460ff1615610ed55760405162461bcd60e51b815260206004820152603c60248201527f4246463a2043616e206f6e6c7920656e61626c652050726553616c652062656660448201527f6f72652054726164696e6720686173206265656e206f70656e65642e000000006064820152608401610e4c565b600d839055600a80546001600160a01b0319166001600160a01b038416179055610f0781670de0b6b3a76400006141e6565b600b555050600f805460ff1916600117905550565b600033610f2a81858561247a565b5060019392505050565b6005546001600160a01b03163314610f5e5760405162461bcd60e51b8152600401610e4c9061419b565b601f55565b6005546001600160a01b03163314610f8d5760405162461bcd60e51b8152600401610e4c9061419b565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b604051633325c8f560e21b8152602b600482015260248101829052600090730f854ff4b84bf697592d2f7226d609b82de73dc99063cc9723d490604401610d49565b6005546001600160a01b031633146110245760405162461bcd60e51b8152600401610e4c9061419b565b602855565b60003361103785828561259e565b61104285858561262a565b506001949350505050565b60006001600160a01b03831661106557506000610d8a565b602b548061107285611643565b101580156110925750826001600160a01b0316846001600160a01b031614155b949350505050565b601854600954604051632f99934f60e01b815260009291839173258805bf9beeb0d53ef9592b902ba3f513cc39ce91632f99934f916110eb9189916001600160a01b03909116908990600401614205565b602060405180830381865af4158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c9190614229565b905060015b60225460ff908116908216116111ae5760ff81166000908152602160205260409020548210801590611178575060ff81166000908152602160205260409020600101548211155b1561119c5760ff166000908152602160205260409020600201549250610d8a915050565b806111a681614242565b915050611131565b5090949350505050565b602454604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190614229565b905090565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610f2a9082908690611265908790614262565b61247a565b6005546001600160a01b031633146112945760405162461bcd60e51b8152600401610e4c9061419b565b6019849055601a839055601b829055604051635fe4fbe160e11b8152602b600482015260248101829052730f854ff4b84bf697592d2f7226d609b82de73dc99063bfc9f7c29060440160006040518083038186803b1580156112f557600080fd5b505af4158015611309573d6000803e3d6000fd5b5050505050505050565b61131e336000612c68565b565b6001600160a01b038116600090815260136020526040812054819060ff16806113525750600754600160a81b900460ff165b1561135f57506001610d8a565b50600092915050565b6005546001600160a01b031633146113925760405162461bcd60e51b8152600401610e4c9061419b565b60006113a96027546113a330611643565b90612fae565b90506113b481612fc1565b5050565b6005546001600160a01b031633146113e25760405162461bcd60e51b8152600401610e4c9061419b565b670de0b6b3a76400006103e86113f760025490565b6114029060016141e6565b61140c9190614290565b6114169190614290565b8110156114715760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b6064820152608401610e4c565b61148381670de0b6b3a76400006141e6565b60165550565b6005546001600160a01b031633146114b35760405162461bcd60e51b8152600401610e4c9061419b565b6022805460ff191660ff92909216919091179055565b6005546001600160a01b031633146114f35760405162461bcd60e51b8152600401610e4c9061419b565b600a85111580156115075750600a60185411155b61151057600080fd5b601794909455601892909255601c55601d55601e55565b602454604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611202573d6000803e3d6000fd5b602480546040516370a0823160e01b81526001600160a01b0384811660048301526000939216916370a0823191015b602060405180830381865afa1580156115bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190614229565b6005546001600160a01b0316331461160b5760405162461bcd60e51b8152600401610e4c9061419b565b60228054610100600160a81b0319166101006001600160a01b0394851602179055602380546001600160a01b03191691909216179055565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146116885760405162461bcd60e51b8152600401610e4c9061419b565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146116fc5760405162461bcd60e51b8152600401610e4c9061419b565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146117515760405162461bcd60e51b8152600401610e4c9061419b565b80156117ba576024805460405163031e79db60e41b81526001600160a01b038581166004830152909116916331e79db091015b600060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050505050565b6024546001600160a01b03166318c18adb836117d581611643565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611784565b60405163057c207360e21b8152602b60048201526001600160a01b0382166024820152600090730f854ff4b84bf697592d2f7226d609b82de73dc9906315f081cc90604401602060405180830381865af41580156115bd573d6000803e3d6000fd5b606060048054610d9f90614160565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156118fc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e4c565b611042828686840361247a565b602480546040516302a2e74960e61b81526001600160a01b03848116600483015260009392169163a8b9d24091016115a0565b600033610f2a81858561262a565b6005546001600160a01b031633146119745760405162461bcd60e51b8152600401610e4c9061419b565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146119c95760405162461bcd60e51b8152600401610e4c9061419b565b60005b81811015611ac5576009546001600160a01b03168383838181106119f2576119f26142a4565b9050602002016020810190611a079190613f2f565b6001600160a01b031614158015611a5857506007546001600160a01b0316838383818110611a3757611a376142a4565b9050602002016020810190611a4c9190613f2f565b6001600160a01b031614155b15611ab357600160146000858585818110611a7557611a756142a4565b9050602002016020810190611a8a9190613f2f565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b80611abd816142ba565b9150506119cc565b505050565b60006112266027546113a330611643565b6005546001600160a01b03163314611b055760405162461bcd60e51b8152600401610e4c9061419b565b600754600160a01b900460ff1615611b5f5760405162461bcd60e51b815260206004820152601c60248201527f4246463a2054726164696e6720697320616c7265616479206f70656e000000006044820152606401610e4c565b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd69190614143565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5c9190614143565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ccd9190614143565b600980546001600160a01b0319166001600160a01b0392831690811782556000908152601560209081526040808320805460ff19908116600190811790925585548716855260109093529281902080549092169092179055602480549254915163031e79db60e41b8152918416600483015291909216916331e79db09101600060405180830381600087803b158015611d6557600080fd5b505af1158015611d79573d6000803e3d6000fd5b50505050611d8f611d8930611643565b47613176565b60095460075460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0991906142d5565b506007805460ff60a01b1916600160a01b179055600f5460ff1615611e4c5742600c819055600d54611e4790611e4090603c613285565b8290613291565b600e55505b43600855565b6005546001600160a01b03163314611e7c5760405162461bcd60e51b8152600401610e4c9061419b565b60005b81811015611ac5576024546001600160a01b03166331e79db0848484818110611eaa57611eaa6142a4565b9050602002016020810190611ebf9190613f2f565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611f0057600080fd5b505af1158015611f14573d6000803e3d6000fd5b505050508080611f23906142ba565b915050611e7f565b6005546001600160a01b03163314611f555760405162461bcd60e51b8152600401610e4c9061419b565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6005546001600160a01b03163314611f9d5760405162461bcd60e51b8152600401610e4c9061419b565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611ff25760405162461bcd60e51b8152600401610e4c9061419b565b60ff9093166000908152602160205260409020918255600182015560020155565b60606000831180156120255750600082115b61206a5760405162461bcd60e51b81526020600482015260166024820152754246463a20496e76616c696420617267756d656e747360501b6044820152606401610e4c565b6001600160a01b0384166000908152603060205260408120549061208e85856141e6565b9050600061209c86836142f2565b90508281106120e15760405162461bcd60e51b81526020600482015260116024820152704246463a204f7574206f662072616e676560781b6044820152606401610e4c565b85838311156120fa578392506120f78784614309565b90505b60008167ffffffffffffffff8111156121155761211561431d565b60405190808252806020026020018201604052801561216a57816020015b61215760405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816121335790505b5090506000835b8581101561222a576001600160a01b038b1660009081526030602052604081208054839081106121a3576121a36142a4565b90600052602060002001549050602f600082815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250508484815181106121fe576121fe6142a4565b6020908102919091010152612214600184614262565b9250508080612222906142ba565b915050612171565b50909998505050505050505050565b6005546001600160a01b031633146122635760405162461bcd60e51b8152600401610e4c9061419b565b600061227a60295447612fae90919063ffffffff16565b905060006122ab612297601c546064612fae90919063ffffffff16565b601d546122a5908590613285565b9061329d565b905060006122d66122c8601c546064612fae90919063ffffffff16565b601e546122a5908690613285565b905060006122e8826113a38686612fae565b90506122f48382613291565b925061230083836132a9565b50505050565b6005546001600160a01b031633146123305760405162461bcd60e51b8152600401610e4c9061419b565b600754600160a01b900460ff161561239e5760405162461bcd60e51b815260206004820152602b60248201527f43616e206f6e6c792077697468647261772069662074726164696e672068617360448201526a1b89dd081cdd185c9d195960aa1b6064820152608401610e4c565b604051600090339047908381818185875af1925050503d8060008114612300576040519150601f19603f3d011682016040523d82523d6000602084013e612300565b6024805460405163fbcbc0f160e01b81526001600160a01b0384811660048301526000938493849392169163fbcbc0f191016040805180830381865afa15801561242e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124529190614333565b9093509150828261246286611643565b9250925092509193909250565b61131e336001612c68565b6001600160a01b0383166124dc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e4c565b6001600160a01b03821661253d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e4c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114612300578181101561261d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e4c565b612300848484840361247a565b6001600160a01b03831660009081526014602052604090205460ff1615801561266c57506001600160a01b03821660009081526014602052604090205460ff16155b61267557600080fd5b6001600160a01b03831660009081526012602052604090205460ff161580156126b757506001600160a01b03821660009081526012602052604090205460ff16155b6126c057600080fd5b6007548190600160a01b900460ff16801561271557506001600160a01b03841660009081526010602052604090205460ff168061271557506001600160a01b03831660009081526010602052604090205460ff165b801561273a57506001600160a01b03841660009081526011602052604090205460ff16155b801561275f57506001600160a01b03831660009081526011602052604090205460ff16155b1561299657600f5460ff168015612778575042600c5411155b8015612785575042600e54115b1561285c57600b54600a546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156127d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127fb9190614229565b101561285c5760405162461bcd60e51b815260206004820152602a60248201527f50726553616c653a204e6f7420656e6f7567682050726553616c6520746f6b6560448201526937103130b630b731b29760b11b6064820152608401610e4c565b604051633325c8f560e21b8152602b600482015260248101839052600090730f854ff4b84bf697592d2f7226d609b82de73dc99063cc9723d490604401602060405180830381865af41580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da9190614143565b9050730f854ff4b84bf697592d2f7226d609b82de73dc96304ea10f2602b8361290281611643565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152604483015287166064820152608401602060405180830381865af415801561295a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297e91906142d5565b612986575060005b61299285858584613367565b9150505b6001600160a01b03831660009081526020805260409020546129cd576001600160a01b038316600090815260208052604090204290555b6001600160a01b03831660009081526010602052604090205460ff16158015612a0f57506001600160a01b03831660009081526015602052604090205460ff16155b15612a835760165481612a2185611643565b612a2b9190614262565b1115612a835760405162461bcd60e51b815260206004820152602160248201527f4246463a2057616c6c65742062616c616e6365206c696d6974207265616368656044820152601960fa1b6064820152608401610e4c565b612a8e848483613766565b612a9783613934565b60248054604051631b4a89ab60e11b81526001600160a01b0387811660048301529091169163369513569101602060405180830381865afa158015612ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0491906142d5565b612b7c576024546001600160a01b031663e30443bc85612b2381611643565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b6957600080fd5b505af1925050508015612b7a575060015b505b60248054604051631b4a89ab60e11b81526001600160a01b0386811660048301529091169163369513569101602060405180830381865afa158015612bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be991906142d5565b612300576024546001600160a01b031663e30443bc84612c0881611643565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612c4e57600080fd5b505af1925050508015612c5f575060015b61230057612300565b602480546040516302a2e74960e61b81526001600160a01b03858116600483015260009392169163a8b9d2409101602060405180830381865afa158015612cb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cd79190614229565b905060008111612d3b5760405162461bcd60e51b815260206004820152602960248201527f4246463a20436c61696d657220686173206e6f20776974686472617761626c6560448201526808191a5d9a59195b9960ba1b6064820152608401610e4c565b60008083612e6757600754600160a81b900460ff1680612d7357506001600160a01b03851660009081526013602052604090205460ff165b612de7576040805162461bcd60e51b81526020600482015260248101919091527f4246463a20436c61696d6572206e6f7420616c6c6f77656420746f20636c616960448201527f6d206469766964656e64732c2063616e206f6e6c792072652d696e766573742e6064820152608401610e4c565b602480546040516352b5f81d60e01b81526001600160a01b0388811660048301819052938201939093529116906352b5f81d906044016020604051808303816000875af1158015612e3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e609190614229565b9150612efa565b8315612efa57602480546040516352b5f81d60e01b81526001600160a01b03888116600483015230938201939093529116906352b5f81d906044016020604051808303816000875af1158015612ec1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee59190614229565b91508115612efa57612ef78286613a1a565b90505b8115612fa757612f0e602a80546001019055565b6000612f19602a5490565b6000818152602f602090815260408083208781556001808201889055426002909201919091556001600160a01b038b1680855260308452828520805492830181558552938390200184905580518781529182018690528101919091529091507f67dd3d116bf53e0ddda53bb148a5fdc129854e1c507c0eeda9190049a9bbc84f9060600160405180910390a1505b5050505050565b6000612fba82846142f2565b9392505050565b6040805160028082526060820183526000924792849290916020830190803683370190505090503081600081518110612ffc57612ffc6142a4565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613055573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130799190614143565b8160018151811061308c5761308c6142a4565b6001600160a01b0392831660209182029290920101526007546130b2913091168661247a565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906130eb90879060009086903090429060040161439b565b600060405180830381600087803b15801561310557600080fd5b505af1158015613119573d6000803e3d6000fd5b5050505060006131328347612fae90919063ffffffff16565b60408051878152602081018390529192507f4a6c12eb4e479a4ea28c8acad8efde466ef9bf69cf473501dd76865234496273910160405180910390a1949350505050565b60075461318e9030906001600160a01b03168461247a565b6007546001600160a01b031663f305d7198230856000806131b76005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561321f573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061324491906143d7565b505060408051848152602081018490527fcb1652de9aeec38545fc281847b3dbfc89aab56dfa907b1ab68466f602c36fb49250015b60405180910390a15050565b6000612fba82846141e6565b6000612fba8284614262565b6000612fba8284614290565b81156132ef576022546040516101009091046001600160a01b0316906108fc8415029084906000818181858888f193505050501580156132ed573d6000803e3d6000fd5b505b8015613331576023546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561332f573d6000803e3d6000fd5b505b60408051838152602081018390527f916ad8171ef8c567c7790377a142f0200f9565940680c06e30dd105cfd9249689101613279565b6001600160a01b0384166000908152601060205260408120548190819060ff16806133aa57506001600160a01b03861660009081526010602052604090205460ff165b6133f65760405162461bcd60e51b815260206004820152601b60248201527f4246463a204e6f206d61726b6574206d616b65727320666f756e6400000000006044820152606401610e4c565b6001600160a01b03871660009081526010602052604090205460ff1615613621576000806000600854431480156134305750600f5460ff16155b1561343e57605a92506134af565b60085461344c906001614262565b4314801561345d5750600f5460ff16155b1561346b57603292506134af565b6001600160a01b038716156134a9576134a2613499600a6122a5601b54601a5461329190919063ffffffff16565b60195490613291565b92506134af565b60175492505b6134be60646122a58a86613285565b94506001600160a01b038716156135d8576134e960646122a56019548b61328590919063ffffffff16565b94506135066103e86122a5601a548b61328590919063ffffffff16565b91506135236103e86122a5601b548b61328590919063ffffffff16565b9050613535816113a384818c8a612fae565b93506135428a3087613766565b61354d8a8884613766565b6135588a8a83613766565b60008051602061443b8339815191528a308760405161357993929190614205565b60405180910390a160008051602061443b8339815191528a88846040516135a293929190614205565b60405180910390a160008051602061443b8339815191528a8a836040516135cb93929190614205565b60405180910390a1613619565b6135e28886612fae565b93506135ef8a3087613766565b60008051602061443b8339815191528a308760405161361093929190614205565b60405180910390a15b50505061375c565b60006008544314156136355750605a61367f565b600854613643906001614262565b4314156136525750603261367f565b600061365e308861109a565b90508060185461366e9190614262565b9150601e821061367d57601e91505b505b61368e60646122a58884613285565b925060006136b660646122a56136af60185486612fae90919063ffffffff16565b8a90613285565b6027549091506136c69082613291565b6027556136d38785612fae565b92506136e0893086613766565b60006136f16027546113a330611643565b9050601f548111156137065761370681613bcc565b602854602754111561371d5761371d602754613cc2565b7f4ab5e0df8ff1605133dbdd1b8e3f52edb9539abe64595f6f70b30d2fea7f204a8a308760405161375093929190614205565b60405180910390a15050505b9695505050505050565b6001600160a01b0383166137ca5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e4c565b6001600160a01b03821661382c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e4c565b6001600160a01b038316600090815260208190526040902054818110156138a45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e4c565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906138db908490614262565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161392791815260200190565b60405180910390a3612300565b6001600160a01b03811660009081526011602052604090205460ff168061397357506001600160a01b03811660009081526012602052604090205460ff165b1561397b5750565b6009546001600160a01b03828116911614156139945750565b730f854ff4b84bf697592d2f7226d609b82de73dc963cdb09f68602b836139ba81611643565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152604482015260640160006040518083038186803b158015613a0657600080fd5b505af4158015612fa7573d6000803e3d6000fd5b600080613a2630611643565b60408051600280825260608201835292935060009290916020830190803683375050600754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ab99190614143565b81600081518110613acc57613acc6142a4565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110613b0057613b006142a4565b6001600160a01b03928316602091820292909201015260075460405163b6f9de9560e01b815291169063b6f9de95908790613b469060009086908a904290600401614405565b6000604051808303818588803b158015613b5f57600080fd5b505af1158015613b73573d6000803e3d6000fd5b50505050506000613b87836113a330611643565b60408051888152602081018390529192507f2d5c8efb676a77fc04b6b50a19f6ccbf08ee66df0202de33576485f1f77b4b69910160405180910390a195945050505050565b6000613be860646122a5601c548561328590919063ffffffff16565b90506000613bf782600261329d565b90506000613c058483612fae565b90506000613c1282612fc1565b90506000613c3060646122a5601c548561328590919063ffffffff16565b90506000613c4e60646122a5601d548661328590919063ffffffff16565b90506000613c6c60646122a5601e548761328590919063ffffffff16565b90506000613c80826113a385818989612fae565b9050613c8c8382613291565b9250613c9883836132a9565b600087118015613ca85750600084115b15613cb757613cb78785613176565b505050505050505050565b6000613ccd82612fc1565b602754909150613cdd9083612fae565b602755602954600090613cf1908390613291565b6024546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613d43576040519150601f19603f3d011682016040523d82523d6000602084013e613d48565b606091505b505090508015613d8a576040518381527fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b19060200160405180910390a1612300565b602954613d979084613291565b60295550505050565b600060208284031215613db257600080fd5b5035919050565b600060208083528351808285015260005b81811015613de657858101830151858201604001528201613dca565b81811115613df8576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114613e2357600080fd5b50565b600080600060608486031215613e3b57600080fd5b833592506020840135613e4d81613e0e565b929592945050506040919091013590565b60008060408385031215613e7157600080fd5b8235613e7c81613e0e565b946020939093013593505050565b8015158114613e2357600080fd5b60008060408385031215613eab57600080fd5b8235613eb681613e0e565b91506020830135613ec681613e8a565b809150509250929050565b600080600060608486031215613ee657600080fd5b8335613ef181613e0e565b92506020840135613e4d81613e0e565b60008060408385031215613f1457600080fd5b8235613f1f81613e0e565b91506020830135613ec681613e0e565b600060208284031215613f4157600080fd5b8135612fba81613e0e565b60008060008060808587031215613f6257600080fd5b5050823594602084013594506040840135936060013592509050565b803560ff81168114613f8f57600080fd5b919050565b600060208284031215613fa657600080fd5b612fba82613f7e565b600080600080600060a08688031215613fc757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060208385031215613ffd57600080fd5b823567ffffffffffffffff8082111561401557600080fd5b818501915085601f83011261402957600080fd5b81358181111561403857600080fd5b8660208260051b850101111561404d57600080fd5b60209290920196919550909350505050565b60006020828403121561407157600080fd5b8135612fba81613e8a565b6000806000806080858703121561409257600080fd5b61409b85613f7e565b966020860135965060408601359560600135945092505050565b6000806000606084860312156140ca57600080fd5b83356140d581613e0e565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b828110156141365781518051855286810151878601528501518585015260609093019290850190600101614107565b5091979650505050505050565b60006020828403121561415557600080fd5b8151612fba81613e0e565b600181811c9082168061417457607f821691505b6020821081141561419557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615614200576142006141d0565b500290565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60006020828403121561423b57600080fd5b5051919050565b600060ff821660ff811415614259576142596141d0565b60010192915050565b60008219821115614275576142756141d0565b500190565b634e487b7160e01b600052601260045260246000fd5b60008261429f5761429f61427a565b500490565b634e487b7160e01b600052603260045260246000fd5b60006000198214156142ce576142ce6141d0565b5060010190565b6000602082840312156142e757600080fd5b8151612fba81613e8a565b600082821015614304576143046141d0565b500390565b6000826143185761431861427a565b500690565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561434657600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b838110156143905781516001600160a01b03168752958201959082019060010161436b565b509495945050505050565b85815284602082015260a0604082015260006143ba60a0830186614357565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156143ec57600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061441e6080830186614357565b6001600160a01b0394909416604083015250606001529291505056fe6b0b46d0273ce53f1de696d2100b35dd3a405dcecbcbeede66215d858d5c401da26469706673582212204c78987e7d1d548a3485800fe170c6c1c90157f5c106b8e1225265a81830f88e64736f6c634300080b0033

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 : 0x258805bf9beeb0d53ef9592b902ba3f513cc39ceUnverified

Deployed Bytecode Sourcemap

31838:27430:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39642:171;;;;;;;;;;-1:-1:-1;39642:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;363:32:1;;;345:51;;333:2;318:18;39642:171:0;;;;;;;;1810:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37509:441::-;;;;;;;;;;-1:-1:-1;37509: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;49326:126:0;;;;;;;;;;-1:-1:-1;49326:126:0;;;;;:::i;:::-;;:::i;47312:140::-;;;;;;;;;;-1:-1:-1;47312: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;39821:185:0;;;;;;;;;;-1:-1:-1;39821:185:0;;;;;:::i;:::-;;:::i;49460:122::-;;;;;;;;;;-1:-1:-1;49460:122:0;;;;;:::i;:::-;;:::i;3133:295::-;;;;;;;;;;-1:-1:-1;3133:295:0;;;;;:::i;:::-;;:::i;40014:313::-;;;;;;;;;;-1:-1:-1;40014:313:0;;;;;:::i;:::-;;:::i;33918:41::-;;;;;;;;;;-1:-1:-1;33918:41:0;;;;-1:-1:-1;;;;;33918:41:0;;;41468:615;;;;;;;;;;-1:-1:-1;41468:615:0;;;;;:::i;:::-;;:::i;42091:141::-;;;;;;;;;;;;;:::i;44710:100::-;;;;;;;;;;-1:-1:-1;32134:2:0;44710:100;;;4006:4:1;3994:17;;;3976:36;;3964:2;3949:18;44710:100:0;3834:184:1;32845:43:0;;;;;;;;;;-1:-1:-1;32845:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3436:272;;;;;;;;;;-1:-1:-1;3436:272:0;;;;;:::i;:::-;;:::i;32950:37::-;;;;;;;;;;-1:-1:-1;32950:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33216:33;;;;;;;;;;;;;;;;39131:339;;;;;;;;;;-1:-1:-1;39131:339:0;;;;;:::i;:::-;;:::i;42615:79::-;;;;;;;;;;;;;:::i;57650:299::-;;;;;;;;;;-1:-1:-1;57650:299:0;;;;;:::i;:::-;;:::i;40661:200::-;;;;;;;;;;;;;:::i;34028:47::-;;;;;;;;;;-1:-1:-1;34028:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;33139:30;;;;;;;;;;;;;;;;48652:230;;;;;;;;;;-1:-1:-1;48652:230:0;;;;;:::i;:::-;;:::i;49909:118::-;;;;;;;;;;-1:-1:-1;49909:118:0;;;;;:::i;:::-;;:::i;48896:422::-;;;;;;;;;;-1:-1:-1;48896:422:0;;;;;:::i;:::-;;:::i;44138:142::-;;;;;;;;;;;;;:::i;42434:173::-;;;;;;;;;;-1:-1:-1;42434:173:0;;;;;:::i;:::-;;:::i;33791:32::-;;;;;;;;;;-1:-1:-1;33791:32:0;;;;;;;;50367:214;;;;;;;;;;-1:-1:-1;50367:214:0;;;;;:::i;:::-;;:::i;2247:177::-;;;;;;;;;;-1:-1:-1;2247:177:0;;;;;:::i;:::-;;:::i;10894:148::-;;;;;;;;;;;;;:::i;47460:158::-;;;;;;;;;;-1:-1:-1;47460:158:0;;;;;:::i;:::-;;:::i;34084:37::-;;;;;;;;;;;;;;;;32895:48;;;;;;;;;;-1:-1:-1;32895:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;48010:326;;;;;;;;;;-1:-1:-1;48010:326:0;;;;;:::i;:::-;;:::i;33484:53::-;;;;;;;;;;;;;;;;10682:79;;;;;;;;;;-1:-1:-1;10747:6:0;;-1:-1:-1;;;;;10747:6:0;10682:79;;32790:48;;;;;;;;;;-1:-1:-1;32790:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33655:54;;;;;;;;;;-1:-1:-1;33655:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;39482:152;;;;;;;;;;-1:-1:-1;39482:152:0;;;;;:::i;:::-;;:::i;1918:104::-;;;;;;;;;;;;;:::i;3716:507::-;;;;;;;;;;-1:-1:-1;3716:507:0;;;;;:::i;:::-;;:::i;42240:186::-;;;;;;;;;;-1:-1:-1;42240:186:0;;;;;:::i;:::-;;:::i;2432:234::-;;;;;;;;;;-1:-1:-1;2432:234:0;;;;;:::i;:::-;;:::i;33063:30::-;;;;;;;;;;;;;;;;33294:33;;;;;;;;;;;;;;;;47626:160;;;;;;;;;;-1:-1:-1;47626:160:0;;;;;:::i;:::-;;:::i;59090:132::-;;;;;;;;;;-1:-1:-1;59090:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;59183:24:0;59156:7;59183:24;;;:14;:24;;;;;:31;;59090:132;50035:324;;;;;;;;;;-1:-1:-1;50035:324:0;;;;;:::i;:::-;;:::i;33716:68::-;;;;;;;;;;-1:-1:-1;33716:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6294:25:1;;;6350:2;6335:18;;6328:34;;;;6378:18;;;6371:34;6282:2;6267:18;33716:68:0;6092:319:1;57957:149:0;;;;;;;;;;;;;:::i;33102:30::-;;;;;;;;;;;;;;;;37958:1057;;;;;;;;;;;;;:::i;32994:60::-;;;;;;;;;;-1:-1:-1;32994:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;48344:300;;;;;;;;;;-1:-1:-1;48344:300:0;;;;;:::i;:::-;;:::i;34190: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;34128:53;;;;;;;;;;;;;;;;39023:100;;;;;;;;;;-1:-1:-1;39023:100:0;;;;;:::i;:::-;;:::i;47794:208::-;;;;;;;;;;-1:-1:-1;47794:208:0;;;;;:::i;:::-;;:::i;49590:311::-;;;;;;;;;;-1:-1:-1;49590:311:0;;;;;:::i;:::-;;:::i;58114:968::-;;;;;;;;;;-1:-1:-1;58114:968:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40869:591::-;;;;;;;;;;;;;:::i;37235:266::-;;;;;;;;;;;;;:::i;33176:33::-;;;;;;;;;;;;;;;;44288:414;;;;;;;;;;-1:-1:-1;44288:414:0;;;;;:::i;:::-;;:::i;42702:81::-;;;;;;;;;;;;;:::i;39642:171::-;39771:34;;-1:-1:-1;;;39771:34:0;;:8;:34;;;8501:25:1;8542:18;;;8535:34;;;39717:23:0;;39771:20;;;;8474:18:1;;39771:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39753:52;39642:171;-1:-1:-1;;39642:171:0:o;1810:100::-;1864:13;1897:5;1890:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1810:100;:::o;37509:441::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;;;;;;;;;37661:11:::1;::::0;-1:-1:-1;;;37661:11:0;::::1;;;37660:12;37652:85;;;::::0;-1:-1:-1;;;37652:85:0;;9784:2:1;37652: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;;37652:85:0::1;9582:424:1::0;37652:85:0::1;37748:17;:38:::0;;;37797:19:::1;:50:::0;;-1:-1:-1;;;;;;37797:50:0::1;-1:-1:-1::0;;;;;37797:50:0;::::1;;::::0;;37881:30:::1;:21:::0;37905:6:::1;37881:30;:::i;:::-;37858:20;:53:::0;-1:-1:-1;;37922:13:0::1;:20:::0;;-1:-1:-1;;37922:20:0::1;37938:4;37922:20;::::0;;-1:-1:-1;37509: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;49326:126::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49409:23:::1;:35:::0;49326:126::o;47312: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;;;;;47409:21:0;;;::::1;;::::0;;;:11:::1;:21;::::0;;;;:35;;-1:-1:-1;;47409:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47312:140::o;39821:185::-;39954:44;;-1:-1:-1;;;39954:44:0;;:8;:44;;;8501:25:1;8542:18;;;8535:34;;;39900:23:0;;39954:35;;;;8474:18:1;;39954:44:0;8296:279:1;49460:122:0;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49541:21:::1;:33:::0;49460: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;40014:313::-;40091:4;-1:-1:-1;;;;;40111:22:0;;40108:66;;-1:-1:-1;40157:5:0;40150:12;;40108:66;40207:8;:38;;40265:19;40275:8;40265:9;:19::i;:::-;:35;;:54;;;;;40316:3;-1:-1:-1;;;;;40304:15:0;:8;-1:-1:-1;;;;;40304:15:0;;;40265:54;40258:61;40014:313;-1:-1:-1;;;;40014:313:0:o;41468:615::-;41580:11;;41696:13;;41626:93;;-1:-1:-1;;;41626:93:0;;41546:7;;41580:11;41546:7;;41626:30;;:55;;:93;;41690:3;;-1:-1:-1;;;;;41696:13:0;;;;41711:7;;41626:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41604:115;-1:-1:-1;41746:1:0;41732:323;41754:19;;;;;;41749:24;;;;41732:323;;41833:24;;;;;;;:21;:24;;;;;:29;41818:44;;;;;:111;;-1:-1:-1;41902:24:0;;;;;;;:21;:24;;;;;:27;;;41887:42;;;41818:111;41795:249;;;41971:24;;;;;;:21;:24;;;;;:28;;;;-1:-1:-1;42018:10:0;;-1:-1:-1;;42018:10:0;41795:249;41775:3;;;;:::i;:::-;;;;41732:323;;;-1:-1:-1;42072:3:0;;41468:615;-1:-1:-1;;;;41468:615:0:o;42091:141::-;42181:15;;:43;;;-1:-1:-1;;;42181:43:0;;;;42154:7;;-1:-1:-1;;;;;42181:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42174:50;;42091: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;39131:339::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;39279:14:::1;:32:::0;;;39322:13:::1;:30:::0;;;39363:13:::1;:30:::0;;;39404:58:::1;::::0;-1:-1:-1;;;39404:58:0;;:8:::1;:58;::::0;::::1;8501:25:1::0;8542:18;;;8535:34;;;39404:44:0::1;::::0;::::1;::::0;8474:18:1;;39404:58:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39131:339:::0;;;;:::o;42615:79::-;42652:34;42667:10;42680:5;42652:6;:34::i;:::-;42615:79::o;57650:299::-;-1:-1:-1;;;;;57769:26:0;;57713:7;57769:26;;;:16;:26;;;;;;57713:7;;57769:26;;;:41;;-1:-1:-1;57799:11:0;;-1:-1:-1;;;57799:11:0;;;;57769:41;57766:142;;;-1:-1:-1;57844:1:0;57766:142;;;-1:-1:-1;57895:1:0;57927:14;57650:299;-1:-1:-1;;57650:299:0:o;40661:200::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;40713:19:::1;40735:76;40778:22;;40735:24;40753:4;40735:9;:24::i;:::-;:28:::0;::::1;:76::i;:::-;40713:98;;40824:29;40841:11;40824:16;:29::i;:::-;;40702:159;40661:200::o:0;48652:230::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;48777:4:::1;48771;48751:13;2219:12:::0;;;2131:108;48751:13:::1;:17;::::0;48767:1:::1;48751:17;:::i;:::-;:24;;;;:::i;:::-;48750:31;;;;:::i;:::-;48734:12;:47;;48726:96;;;::::0;-1:-1:-1;;;48726:96:0;;11665:2:1;48726: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;;48726:96:0::1;11463:400:1::0;48726:96:0::1;48851:23;:12:::0;48867:6:::1;48851:23;:::i;:::-;48833:15;:41:::0;-1:-1:-1;48652:230:0:o;49909:118::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49988:19:::1;:31:::0;;-1:-1:-1;;49988:31:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;49909:118::o;48896:422::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49119:2:::1;49104:11;:17;;:38;;;;;49140:2;49125:11;;:17;;49104:38;49096:47;;;::::0;::::1;;49156:10;:24:::0;;;;49191:11:::1;:26:::0;;;;49228:6:::1;:16:::0;49255:6:::1;:16:::0;49282:12:::1;:28:::0;48896:422::o;44138:142::-;44231:15;;:41;;;-1:-1:-1;;;44231:41:0;;;;44204:7;;-1:-1:-1;;;;;44231:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;42434:173;42564:15;;;:35;;-1:-1:-1;;;42564:35:0;;-1:-1:-1;;;;;363:32:1;;;42564:35:0;;;345:51:1;42532:7:0;;42564:15;;;:25;;318:18:1;42564:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50367:214::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50492:16:::1;:29:::0;;-1:-1:-1;;;;;;50492:29:0::1;;-1:-1:-1::0;;;;;50492:29:0;;::::1;;;::::0;;50532:22:::1;:41:::0;;-1:-1:-1;;;;;;50532:41:0::1;::::0;;;::::1;;::::0;;50367: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;47460: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;;;;;47565:26:0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:45;;-1:-1:-1;;47565:45:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47460:158::o;48010:326::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;48132:22:::1;48128:201;;;48171:15;::::0;;:46:::1;::::0;-1:-1:-1;;;48171:46:0;;-1:-1:-1;;;;;363:32:1;;;48171:46:0::1;::::0;::::1;345:51:1::0;48171:15:0;;::::1;::::0;:36:::1;::::0;318:18:1;48171:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40824:29;40702:159;40661:200::o:0;48128:201::-:1;48250:15;::::0;-1:-1:-1;;;;;48250:15:0::1;:36;48287:8:::0;48297:19:::1;48287:8:::0;48297:9:::1;:19::i;:::-;48250:67;::::0;-1:-1:-1;;;;;;48250:67:0::1;::::0;;;;;;-1:-1:-1;;;;;12060:32:1;;;48250:67:0::1;::::0;::::1;12042:51:1::0;12109:18;;;12102:34;12015:18;;48250:67:0::1;11868:274:1::0;39482:152:0;39593:33;;-1:-1:-1;;;39593:33:0;;:8;:33;;;12352:25:1;-1:-1:-1;;;;;12413:32:1;;12393:18;;;12386:60;39545:20:0;;39593:24;;;;12325:18:1;;39593: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;42240:186::-;42370:15;;;:48;;-1:-1:-1;;;42370:48:0;;-1:-1:-1;;;;;363:32:1;;;42370:48:0;;;345:51:1;42338:7:0;;42370:15;;;:38;;318:18:1;42370:48:0;199:203:1;2432:234:0;2547:4;1270:10;2608:28;1270:10;2625:2;2629:6;2608:9;:28::i;47626: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;;;;;47733:26:0;;;::::1;;::::0;;;:16:::1;:26;::::0;;;;:45;;-1:-1:-1;;47733:45:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47626:160::o;50035:324::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;50111:9:::1;50106:246;50126:16:::0;;::::1;50106:246;;;50198:13;::::0;-1:-1:-1;;;;;50198:13:0::1;50186:5:::0;;50192:1;50186:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50186:25:0::1;;;:82;;;;-1:-1:-1::0;50252:15:0::1;::::0;-1:-1:-1;;;;;50252:15:0::1;50232:5:::0;;50238:1;50232:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50232:36:0::1;;;50186:82;50164:177;;;50321:4;50303:5;:15;50309:5;;50315:1;50309:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50303:15:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50303:15:0;:22;;-1:-1:-1;;50303:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50164:177:::1;50144:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50106:246;;;;50035:324:::0;;:::o;57957:149::-;58019:7;58046:52;58075:22;;58046:24;58064:4;58046:9;:24::i;37958:1057::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;38043:11:::1;::::0;-1:-1:-1;;;38043:11:0;::::1;;;38042:12;38034:53;;;::::0;-1:-1:-1;;;38034:53:0;;13337:2:1;38034:53:0::1;::::0;::::1;13319:21:1::0;13376:2;13356:18;;;13349:30;13415;13395:18;;;13388:58;13463:18;;38034:53:0::1;13135:352:1::0;38034:53:0::1;38142:15;;;;;;;;;-1:-1:-1::0;;;;;38142:15:0::1;-1:-1:-1::0;;;;;38142:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38124:55:0::1;;38206:4;38230:15;;;;;;;;;-1:-1:-1::0;;;;;38230:15:0::1;-1:-1:-1::0;;;;;38230:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38124:143;::::0;-1:-1:-1;;;;;;38124:143:0::1;::::0;;;;;;-1:-1:-1;;;;;13722:15:1;;;38124:143:0::1;::::0;::::1;13704:34:1::0;13774:15;;13754:18;;;13747:43;13639:18;;38124:143:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38108:13;:159:::0;;-1:-1:-1;;;;;;38108:159:0::1;-1:-1:-1::0;;;;;38108:159:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;38278:52:0;;;:28:::1;:52;::::0;;;;;;;:59;;-1:-1:-1;;38278:59:0;;::::1;-1:-1:-1::0;38278:59:0;;::::1;::::0;;;38376:13;;;::::1;38350:40:::0;;:25:::1;:40:::0;;;;;;;:47;;;;::::1;::::0;;::::1;::::0;;38408:15:::1;::::0;;38445:13;;38408:51;;-1:-1:-1;;;38408:51:0;;38445:13;;::::1;38408:51;::::0;::::1;345::1::0;38408:15:0;;;::::1;::::0;:36:::1;::::0;318:18:1;38408:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38472:61;38485:24;38503:4;38485:9;:24::i;:::-;38511:21;38472:12;:61::i;:::-;38551:13;::::0;38596:15:::1;::::0;38544:111:::1;::::0;-1:-1:-1;;;38544:111:0;;-1:-1:-1;;;;;38596:15:0;;::::1;38544:111;::::0;::::1;12042:51:1::0;-1:-1:-1;;12109:18:1;;;12102:34;38551:13:0;::::1;::::0;38544:29:::1;::::0;12015:18:1;;38544:111:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;38668:11:0::1;:18:::0;;-1:-1:-1;;;;38668:18:0::1;-1:-1:-1::0;;;38668:18:0::1;::::0;;38701:13:::1;::::0;38668:18:::1;38701:13;38697:274;;;38779:15;38811:16;:30:::0;;;38912:17:::1;::::0;38878:81:::1;::::0;38912:32:::1;::::0;38934:9:::1;38912:21;:32::i;:::-;38878:11:::0;;:15:::1;:81::i;:::-;38856:19;:103:::0;-1:-1:-1;38697:274:0::1;38995:12;38981:11;:26:::0;37958:1057::o;48344:300::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;48468:9:::1;48463:174;48483:41:::0;;::::1;48463:174;;;48550:15;::::0;-1:-1:-1;;;;;48550:15:0::1;:36;48587:30:::0;;48618:1;48587:33;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48550:71;::::0;-1:-1:-1;;;;;;48550:71:0::1;::::0;;;;;;-1:-1:-1;;;;;363:32:1;;;48550:71:0::1;::::0;::::1;345:51:1::0;318:18;;48550:71:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48526:3;;;;;:::i;:::-;;;;48463:174;;39023:100:::0;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;39090:11:::1;:25:::0;;;::::1;;-1:-1:-1::0;;;39090:25:0::1;-1:-1:-1::0;;;;39090:25:0;;::::1;::::0;;;::::1;::::0;;39023:100::o;47794: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;;;;;47925:38:0;;;::::1;;::::0;;;:28:::1;:38;::::0;;;;:69;;-1:-1:-1;;47925:69:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47794:208::o;49590:311::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;49751:29:::1;::::0;;::::1;;::::0;;;:21:::1;:29;::::0;;;;:42;;;49804:32:::1;::::0;::::1;:38:::0;49853:33:::1;;:40:::0;49590:311::o;58114:968::-;58246:19;58295:1;58286:6;:10;:29;;;;;58314:1;58300:11;:15;58286:29;58278:64;;;;-1:-1:-1;;;58278:64:0;;14253:2:1;58278:64:0;;;14235:21:1;14292:2;14272:18;;;14265:30;-1:-1:-1;;;14311:18:1;;;14304:52;14373:18;;58278:64:0;14051:346:1;58278:64:0;-1:-1:-1;;;;;58380:24:0;;58353;58380;;;:14;:24;;;;;:31;;58436:20;58450:6;58436:11;:20;:::i;:::-;58422:34;-1:-1:-1;58467:13:0;58483:12;58489:6;58422:34;58483:12;:::i;:::-;58467:28;;58522:16;58514:5;:24;58506:54;;;;-1:-1:-1;;;58506:54:0;;14734:2:1;58506:54:0;;;14716:21:1;14773:2;14753:18;;;14746:30;-1:-1:-1;;;14792:18:1;;;14785:47;14849:18;;58506:54:0;14532:341:1;58506:54:0;58587:6;58608:22;;;58604:125;;;58653:16;;-1:-1:-1;58692:25:0;58711:6;58653:16;58692:25;:::i;:::-;58684:33;;58604:125;58741:32;58793:5;58776:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;58776:23:0;;;;;;;;;;;;;;;;-1:-1:-1;58741:58:0;-1:-1:-1;58810:20:0;58862:5;58845:200;58873:3;58869:1;:7;58845:200;;;-1:-1:-1;;;;;58912:24:0;;58898:11;58912:24;;;:14;:24;;;;;:27;;58937:1;;58912:27;;;;;;:::i;:::-;;;;;;;;;58898:41;;58983:13;:18;58997:3;58983:18;;;;;;;;;;;58954:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;58967;58954:26;;;;;;;;:::i;:::-;;;;;;;;;;:47;59016:17;59032:1;59016:17;;:::i;:::-;;;58883:162;58878:3;;;;;:::i;:::-;;;;58845:200;;;-1:-1:-1;59062:12:0;;58114:968;-1:-1:-1;;;;;;;;;58114:968:0:o;40869:591::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;40921:16:::1;40940:43;40966:16;;40940:21;:25;;:43;;;;:::i;:::-;40921:62;;40996:21;41020:74;41059:24;41076:6;;41067:3;41059:16;;:24;;;;:::i;:::-;41033:6;::::0;41020:20:::1;::::0;:8;;:12:::1;:20::i;:::-;:24:::0;::::1;:74::i;:::-;40996:98;;41105:27;41135:80;41180:24;41197:6;;41188:3;41180:16;;:24;;;;:::i;:::-;41148:12;::::0;41135:26:::1;::::0;:8;;:12:::1;:26::i;:80::-;41105:110:::0;-1:-1:-1;41226:27:0::1;41256:66;41105:110:::0;41256:27:::1;:8:::0;41269:13;41256:12:::1;:27::i;:66::-;41226:96:::0;-1:-1:-1;41349:38:0::1;:13:::0;41226:96;41349:17:::1;:38::i;:::-;41333:54;;41400:52;41417:13;41432:19;41400:16;:52::i;:::-;40910:550;;;;40869:591::o:0;37235:266::-;10809:6;;-1:-1:-1;;;;;10809:6:0;10819:10;10809:20;10801:65;;;;-1:-1:-1;;;10801:65:0;;;;;;;:::i;:::-;37302:11:::1;::::0;-1:-1:-1;;;37302:11:0;::::1;;;37301:12;37293:68;;;::::0;-1:-1:-1;;;37293:68:0;;15329:2:1;37293: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;;37293:68:0::1;15127:407:1::0;37293:68:0::1;37409:84;::::0;37372:12:::1;::::0;37417:10:::1;::::0;37442:21:::1;::::0;37372:12;37409:84;37372:12;37409:84;37442:21;37417:10;37409:84:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44288:414:::0;44562:15;;;:50;;-1:-1:-1;;;44562:50:0;;-1:-1:-1;;;;;363:32:1;;;44562:50:0;;;345:51:1;44388:29:0;;;;;;44562:15;;;:40;;318:18:1;44562:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44516:96;;-1:-1:-1;44516:96:0;-1:-1:-1;44516:96:0;;44674:19;44684:8;44674:9;:19::i;:::-;44623:71;;;;;;44288:414;;;;;:::o;42702:81::-;42742:33;42757:10;42770:4;42742: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;44818:2086::-;-1:-1:-1;;;;;44962:12:0;;;;;;:5;:12;;;;;;;;44961:13;:28;;;;-1:-1:-1;;;;;;44979:10:0;;;;;;:5;:10;;;;;;;;44978:11;44961:28;44953:37;;;;;;-1:-1:-1;;;;;45010:18:0;;;;;;:11;:18;;;;;;;;45009:19;:40;;;;-1:-1:-1;;;;;;45033:16:0;;;;;;:11;:16;;;;;;;;45032:17;45009:40;45001:49;;;;;;45124:11;;45088:7;;-1:-1:-1;;;45124:11:0;;;;:113;;;;-1:-1:-1;;;;;;45153:32:0;;;;;;:25;:32;;;;;;;;;:83;;-1:-1:-1;;;;;;45206:30:0;;;;;;:25;:30;;;;;;;;45153:83;45124:154;;;;-1:-1:-1;;;;;;45255:23:0;;;;;;:16;:23;;;;;;;;45254:24;45124:154;:193;;;;-1:-1:-1;;;;;;45296:21:0;;;;;;:16;:21;;;;;;;;45295:22;45124:193;45106:952;;;45348:13;;;;:69;;;;;45402:15;45382:16;;:35;;45348:69;:127;;;;;45460:15;45438:19;;:37;45348:127;45344:356;;;45578:20;;45540:19;;:34;;-1:-1:-1;;;45540:34:0;;-1:-1:-1;;;;;363:32:1;;;45540:34:0;;;345:51:1;45540:19:0;;;;:29;;318:18:1;;45540:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;45510:174;;;;-1:-1:-1;;;45510:174:0;;17367:2:1;45510: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;;45510:174:0;17165:406:1;45510:174:0;45761:44;;-1:-1:-1;;;45761:44:0;;:8;:44;;;8501:25:1;8542:18;;;8535:34;;;45716:17:0;;45761:35;;;;8474:18:1;;45761:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45749:56;-1:-1:-1;45826:24:0;;:8;45749:56;45862:20;45749:56;45862:9;:20::i;:::-;45826:62;;-1:-1:-1;;;;;;45826: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;;45826:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45822:125;;-1:-1:-1;45929:1:0;45822:125;45992:40;46001:5;46008:3;46013:7;46022:9;45992:8;:40::i;:::-;45975:57;;45329:729;45106:952;-1:-1:-1;;;;;46072:24:0;;;;;;:19;:24;;;;;;46068:104;;-1:-1:-1;;;;;46118:24:0;;;;;;:19;:24;;;;;46145:15;46118:42;;46068:104;-1:-1:-1;;;;;46187:30:0;;;;;;:25;:30;;;;;;;;46186:31;:69;;;;-1:-1:-1;;;;;;46222:33:0;;;;;;:28;:33;;;;;;;;46221:34;46186:69;46182:229;;;46315:15;;46297:14;46280;46290:3;46280:9;:14::i;:::-;:31;;;;:::i;:::-;:50;;46272:127;;;;-1:-1:-1;;;46272:127:0;;18261:2:1;46272: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;;46272:127:0;18059:397:1;46272:127:0;46423:43;46439:5;46446:3;46451:14;46423:15;:43::i;:::-;46479:33;46508:3;46479:28;:33::i;:::-;46530:15;;;:45;;-1:-1:-1;;;46530:45:0;;-1:-1:-1;;;;;363:32:1;;;46530:45:0;;;345:51:1;46530:15:0;;;;:38;;318:18:1;46530:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46525:184;;46613:15;;-1:-1:-1;;;;;46613:15:0;:26;46648:5;46656:16;46648:5;46656:9;:16::i;:::-;46613:60;;-1:-1:-1;;;;;;46613:60:0;;;;;;;-1:-1:-1;;;;;12060:32:1;;;46613:60:0;;;12042:51:1;12109:18;;;12102:34;12015:18;;46613:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46592:106;;46724:15;;;:43;;-1:-1:-1;;;46724:43:0;;-1:-1:-1;;;;;363:32:1;;;46724:43:0;;;345:51:1;46724:15:0;;;;:38;;318:18:1;46724:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46719:178;;46805:15;;-1:-1:-1;;;;;46805:15:0;:26;46840:3;46846:14;46840:3;46846:9;:14::i;:::-;46805:56;;-1:-1:-1;;;;;;46805:56:0;;;;;;;-1:-1:-1;;;;;12060:32:1;;;46805:56:0;;;12042:51:1;12109:18;;;12102:34;12015:18;;46805:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46784:102;;;;42791:1339;42897:15;;;:72;;-1:-1:-1;;;42897:72:0;;-1:-1:-1;;;;;363:32:1;;;42897:72:0;;;345:51:1;42868:26:0;;42897:15;;;:38;;318:18:1;42897:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42868:101;;43023:1;43002:18;:22;42980:113;;;;-1:-1:-1;;;42980:113:0;;19174:2:1;42980:113:0;;;19156:21:1;19213:2;19193:18;;;19186:30;19252:34;19232:18;;;19225:62;-1:-1:-1;;;19303:18:1;;;19296:39;19352:19;;42980:113:0;18972:405:1;42980:113:0;43104:17;43132:19;43169:9;43164:521;;43221:11;;-1:-1:-1;;;43221:11:0;;;;;:41;;-1:-1:-1;;;;;;43236:26:0;;;;;;:16;:26;;;;;;;;43221:41;43195:167;;;;;-1:-1:-1;;;43195:167:0;;19584:2:1;43195:167:0;;;19566:21:1;19603:18;;;19596:30;;;;19662:34;19642:18;;;19635:62;19733:34;19713:18;;;19706:62;19785:19;;43195:167:0;19382:428:1;43195:167:0;43389:15;;;:50;;-1:-1:-1;;;43389:50:0;;-1:-1:-1;;;;;13722:15:1;;;43389:50:0;;;13704:34:1;;;13754:18;;;13747:43;;;;43389:15:0;;;:30;;13639:18:1;;43389:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43377:62;;43164:521;;;43461:9;43457:228;;;43499:15;;;:55;;-1:-1:-1;;;43499:55:0;;-1:-1:-1;;;;;13722:15:1;;;43499:55:0;;;13704:34:1;43548:4:0;13754:18:1;;;13747:43;;;;43499:15:0;;;:30;;13639:18:1;;43499:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43487:67;-1:-1:-1;43573:13:0;;43569:105;;43621:37;43638:9;43649:8;43621:16;:37::i;:::-;43607:51;;43569:105;43699:13;;43695:428;;43729:29;:17;9977:19;;9995:1;9977:19;;;9888:127;43729:29;43773:11;43787:27;:17;9858:14;;9766:114;43787:27;43829:18;;;;:13;:18;;;;;;;;:40;;;43884:30;;;;:44;;;43974:15;43943:28;;;;:46;;;;-1:-1:-1;;;;;44006:24:0;;;;;:14;:24;;;;;:34;;;;;;;;;;;;;;;;;44062:49;;20667:25:1;;;20708:18;;;20701:34;;;20751:18;;20744:60;;;;43829:18:0;;-1:-1:-1;44062:49:0;;20655:2:1;20640:18;44062:49:0;;;;;;;43714:409;43695:428;42857:1273;;;42791:1339;;:::o;8521:98::-;8579:7;8606:5;8610:1;8606;:5;:::i;:::-;8599:12;8521:98;-1:-1:-1;;;8521:98:0:o;55261:721::-;55430:16;;;55444:1;55430:16;;;;;;;;55326:7;;55374:21;;55326:7;;55430:16;;;;;;;;;;;;-1:-1:-1;55430:16:0;55406:40;;55475:4;55457;55462:1;55457:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55457:23:0;;;:7;;;;;;;;;;:23;;;;55501:15;;:22;;;-1:-1:-1;;;55501:22:0;;;;:15;;;;;:20;;:22;;;;;55457:7;;55501:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55491:4;55496:1;55491:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55491:32:0;;;:7;;;;;;;;;:32;55566:15;;55534:63;;55551:4;;55566:15;55584:12;55534:8;:63::i;:::-;55608:15;;:197;;-1:-1:-1;;;55608:197:0;;-1:-1:-1;;;;;55608:15:0;;;;:66;;:197;;55689:12;;55608:15;;55732:4;;55759;;55779:15;;55608:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55818:19;55840:44;55866:17;55840:21;:25;;:44;;;;:::i;:::-;55902:43;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;55818:66:0;;-1:-1:-1;55902:43:0;;8474:18:1;55902:43:0;;;;;;;55963:11;55261:721;-1:-1:-1;;;;55261:721:0:o;56665:419::-;56780:15;;56748:63;;56765:4;;-1:-1:-1;;;;;56780:15:0;56798:12;56748:8;:63::i;:::-;56822:15;;-1:-1:-1;;;;;56822:15:0;:31;56861:10;56895:4;56915:12;56822:15;;56974:7;10747:6;;-1:-1:-1;;;;;10747:6:0;;10682:79;56974:7;56822:200;;;;;;-1:-1:-1;;;;;;56822:200:0;;;-1:-1:-1;;;;;22480:15:1;;;56822:200:0;;;22462:34:1;22512:18;;;22505:34;;;;22555:18;;;22548:34;;;;22598:18;;;22591:34;22662:15;;;22641:19;;;22634:44;56996:15:0;22694:19:1;;;22687:35;22396:19;;56822:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;57038:38:0;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;57038:38:0;;-1:-1:-1;8474:18:1;57038:38:0;;;;;;;;56665: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;54883:370::-;54988:12;;54984:89;;55025:16;;55017:44;;55025:16;;;;-1:-1:-1;;;;;55025:16:0;;55017:44;;;;;;;;;;;;55025:16;55017:44;;;;;;;;;;;;;;;;;;;;;54984:89;55087:18;;55083:107;;55130:22;;55122:56;;-1:-1:-1;;;;;55130:22:0;;;;55122:56;;;;;55163:14;;55130:22;55122:56;55130:22;55122:56;55163:14;55130:22;55122:56;;;;;;;;;;;;;;;;;;;;;55083:107;55205:40;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;55205:40:0;;8474:18:1;55205:40:0;8296:279:1;50589:3340:0;-1:-1:-1;;;;;50830:32:0;;50731:7;50830:32;;;:25;:32;;;;;;50731:7;;;;50830:32;;;:66;;-1:-1:-1;;;;;;50866:30:0;;;;;;:25;:30;;;;;;;;50830:66;50808:143;;;;-1:-1:-1;;;50808:143:0;;23246:2:1;50808:143:0;;;23228:21:1;23285:2;23265:18;;;23258:30;23324:29;23304:18;;;23297:57;23371:18;;50808:143:0;23044:351:1;50808:143:0;-1:-1:-1;;;;;50968:32:0;;;;;;:25;:32;;;;;;;;50964:2923;;;51017:19;51051:20;51086;51141:11;;51125:12;:27;:45;;;;-1:-1:-1;51157:13:0;;;;51156:14;51125:45;51121:423;;;51205:2;51191:16;;51121:423;;;51249:11;;:15;;51263:1;51249:15;:::i;:::-;51233:12;:31;:49;;;;-1:-1:-1;51269:13:0;;;;51268:14;51233:49;51229:315;;;51317:2;51303:16;;51229:315;;;-1:-1:-1;;;;;51345:23:0;;;51341:203;;51403:60;51422:40;51459:2;51422:32;51440:13;;51422;;:17;;:32;;;;:::i;:40::-;51403:14;;;:18;:60::i;:::-;51389:74;;51341:203;;;51518:10;;51504:24;;51341:203;51567:33;51596:3;51567:24;:7;51579:11;51567;:24::i;:33::-;51560:40;-1:-1:-1;;;;;;51632:23:0;;;51629:910;;51683:36;51715:3;51683:27;51695:14;;51683:7;:11;;:27;;;;:::i;:36::-;51676:43;;51755:36;51786:4;51755:26;51767:13;;51755:7;:11;;:26;;;;:::i;:36::-;51740:51;;51825:36;51856:4;51825:26;51837:13;;51825:7;:11;;:26;;;;:::i;:36::-;51810:51;-1:-1:-1;51900:53:0;51810:51;51900:35;51922:12;51900:35;:7;51912:4;51900:11;:17::i;:53::-;51882:71;;51974:43;51990:5;52005:4;52012;51974:15;:43::i;:::-;52038:47;52054:5;52061:9;52072:12;52038:15;:47::i;:::-;52106:41;52122:5;52129:3;52134:12;52106:15;:41::i;:::-;-1:-1:-1;;;;;;;;;;;52181:5:0;52196:4;52203;52173:35;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;52242:5:0;52249:9;52260:12;52234:39;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;52307:5:0;52314:3;52319:12;52299:33;;;;;;;;:::i;:::-;;;;;;;;51629:910;;;52389:17;:7;52401:4;52389:11;:17::i;:::-;52371:35;;52423:43;52439:5;52454:4;52461;52423:15;:43::i;:::-;-1:-1:-1;;;;;;;;;;;52496:5:0;52511:4;52518;52488:35;;;;;;;;:::i;:::-;;;;;;;;51629:910;51002:1548;;;50964:2923;;;52571:20;52626:11;;52610:12;:27;52606:456;;;-1:-1:-1;52673:2:0;52606:456;;;52717:11;;:15;;52731:1;52717:15;:::i;:::-;52701:12;:31;52697:365;;;-1:-1:-1;52768:2:0;52697:365;;;52811:23;52837:41;52863:4;52870:7;52837:17;:41::i;:::-;52811:67;;52928:15;52914:11;;:29;;;;:::i;:::-;52899:44;;52983:2;52967:12;:18;52964:83;;53025:2;53010:17;;52964:83;52792:270;52697:365;53085:34;53115:3;53085:25;:7;53097:12;53085:11;:25::i;:34::-;53078:41;;53134:20;53157:87;53240:3;53157:60;53187:29;53204:11;;53187:12;:16;;:29;;;;:::i;:::-;53157:7;;:29;:60::i;:87::-;53284:22;;53134:110;;-1:-1:-1;53284:40:0;;53134:110;53284:26;:40::i;:::-;53259:22;:65;53359:17;:7;53371:4;53359:11;:17::i;:::-;53341:35;;53393:43;53409:5;53424:4;53431;53393:15;:43::i;:::-;53451:20;53474:70;53521:22;;53474:24;53492:4;53474:9;:24::i;:70::-;53451:93;;53580:23;;53565:12;:38;53561:112;;;53624:33;53644:12;53624:19;:33::i;:::-;53716:21;;53691:22;;:46;53687:131;;;53758:44;53779:22;;53758:20;:44::i;:::-;53839:36;53848:5;53863:4;53870;53839:36;;;;;;;;:::i;:::-;;;;;;;;52556:1331;;;50964:2923;53906:15;50589:3340;-1:-1:-1;;;;;;50589:3340:0:o;4231:708::-;-1:-1:-1;;;;;4362:18:0;;4354:68;;;;-1:-1:-1;;;4354:68:0;;23982:2:1;4354:68:0;;;23964:21:1;24021:2;24001:18;;;23994:30;24060:34;24040:18;;;24033:62;-1:-1:-1;;;24111:18:1;;;24104:35;24156:19;;4354:68:0;23780:401:1;4354:68:0;-1:-1:-1;;;;;4441:16:0;;4433:64;;;;-1:-1:-1;;;4433:64:0;;24388:2:1;4433:64:0;;;24370:21:1;24427:2;24407:18;;;24400:30;24466:34;24446:18;;;24439:62;-1:-1:-1;;;24517:18:1;;;24510:33;24560:19;;4433:64:0;24186: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;;24792:2:1;4609:109:0;;;24774:21:1;24831:2;24811:18;;;24804:30;24870:34;24850:18;;;24843:62;-1:-1:-1;;;24921:18:1;;;24914:36;24967:19;;4609:109:0;24590: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;50035:324;40335:318;-1:-1:-1;;;;;40412:25:0;;;;;;:16;:25;;;;;;;;;:49;;-1:-1:-1;;;;;;40441:20:0;;;;;;:11;:20;;;;;;;;40412:49;40409:87;;;40335:318;:::o;40409:87::-;40530:13;;-1:-1:-1;;;;;40511:33:0;;;40530:13;;40511:33;40508:71;;;40335:318;:::o;40508:71::-;40591:25;;:8;40617:7;40626:18;40617:7;40626:9;:18::i;:::-;40591:54;;-1:-1:-1;;;;;;40591:54:0;;;;;;;;;;25230:25:1;;;;-1:-1:-1;;;;;25291:32:1;;;25271:18;;;25264:60;25340:18;;;25333:34;25203:18;;40591:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55990:667;56084:7;56109:27;56139:24;56157:4;56139:9;:24::i;:::-;56198:16;;;56212:1;56198:16;;;;;;;;56109:54;;-1:-1:-1;56174:21:0;;56198:16;;;;;;;;;;-1:-1:-1;;56235:15:0;;:22;;;-1:-1:-1;;;56235:22:0;;;;56174:40;;-1:-1:-1;;;;;;56235:15:0;;;;:20;;-1:-1:-1;56235:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56225:4;56230:1;56225:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;56225:32:0;;;-1:-1:-1;;;;;56225:32:0;;;;;56286:4;56268;56273:1;56268:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56268:23:0;;;:7;;;;;;;;;:23;56304:15;;:140;;-1:-1:-1;;;56304:140:0;;:15;;;:66;;56392:10;;56304:140;;:15;;56417:4;;56423:3;;56428:15;;56304:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56457:22;56482:73;56525:19;56482:24;56500:4;56482:9;:24::i;:73::-;56573:44;;;8501:25:1;;;8557:2;8542:18;;8535:34;;;56457:98:0;;-1:-1:-1;56573:44:0;;8474:18:1;56573:44:0;;;;;;;56635:14;55990:667;-1:-1:-1;;;;;55990:667:0:o;53937:938::-;54007:26;54036:33;54065:3;54036:24;54053:6;;54036:12;:16;;:24;;;;:::i;:33::-;54007:62;-1:-1:-1;54082:21:0;54106:25;54007:62;54129:1;54106:22;:25::i;:::-;54082:49;-1:-1:-1;54142:21:0;54166:31;:12;54082:49;54166:16;:31::i;:::-;54142:55;;54210:16;54229:31;54246:13;54229:16;:31::i;:::-;54210:50;;54273:19;54295:29;54320:3;54295:20;54308:6;;54295:8;:12;;:20;;;;:::i;:29::-;54273:51;;54335:21;54359:29;54384:3;54359:20;54372:6;;54359:8;:12;;:20;;;;:::i;:29::-;54335:53;;54399:27;54429:35;54460:3;54429:26;54442:12;;54429:8;:12;;:26;;;;:::i;:35::-;54399:65;-1:-1:-1;54475:27:0;54505:111;54399:65;54505:72;54563:13;54505:72;:8;54532:11;54505:26;:39::i;:111::-;54475:141;-1:-1:-1;54643:38:0;:13;54475:141;54643:17;:38::i;:::-;54627:54;;54694:52;54711:13;54726:19;54694:16;:52::i;:::-;54779:1;54763:13;:17;:36;;;;;54798:1;54784:11;:15;54763:36;54759:109;;;54816:40;54829:13;54844:11;54816:12;:40::i;:::-;53996:879;;;;;;;;53937:938;:::o;57092:550::-;57163:17;57183:30;57200:12;57183:16;:30::i;:::-;57251:22;;57163:50;;-1:-1:-1;57251:40:0;;57278:12;57251:26;:40::i;:::-;57226:22;:65;57341:16;;57302:22;;57327:31;;:9;;:13;:31::i;:::-;57398:15;;57390:80;;57302:56;;-1:-1:-1;57372:12:0;;-1:-1:-1;;;;;57398:15:0;;;;57302:56;;57372:12;57390:80;57372:12;57390:80;57302:56;57398:15;57390:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57371:99;;;57487:7;57483:152;;;57516:24;;2701:25:1;;;57516:24:0;;2689:2:1;2674:18;57516:24:0;;;;;;;57483:152;;;57592:16;;:31;;57613:9;57592:20;:31::i;:::-;57573:16;:50;57152:490;;;57092: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;20815:461::-;20868:3;20906:5;20900:12;20933:6;20928:3;20921:19;20959:4;20988:2;20983:3;20979:12;20972:19;;21025:2;21018:5;21014:14;21046:1;21056:195;21070:6;21067:1;21064:13;21056:195;;;21135:13;;-1:-1:-1;;;;;21131:39:1;21119:52;;21191:12;;;;21226:15;;;;21167:1;21085:9;21056:195;;;-1:-1:-1;21267:3:1;;20815:461;-1:-1:-1;;;;;20815:461:1:o;21281:582::-;21580:6;21569:9;21562:25;21623:6;21618:2;21607:9;21603:18;21596:34;21666:3;21661:2;21650:9;21646:18;21639:31;21543:4;21687:57;21739:3;21728:9;21724:19;21716:6;21687:57;:::i;:::-;-1:-1:-1;;;;;21780:32:1;;;;21775:2;21760:18;;21753:60;-1:-1:-1;21844:3:1;21829:19;21822:35;21679:65;21281:582;-1:-1:-1;;;21281:582:1:o;22733:306::-;22821:6;22829;22837;22890:2;22878:9;22869:7;22865:23;22861:32;22858:52;;;22906:1;22903;22896:12;22858:52;22935:9;22929:16;22919:26;;22985:2;22974:9;22970:18;22964:25;22954:35;;23029:2;23018:9;23014:18;23008:25;22998:35;;22733:306;;;;;:::o;25378:510::-;25649:6;25638:9;25631:25;25692:3;25687:2;25676:9;25672:18;25665:31;25612:4;25713:57;25765:3;25754:9;25750:19;25742:6;25713:57;:::i;:::-;-1:-1:-1;;;;;25806:32:1;;;;25801:2;25786:18;;25779:60;-1:-1:-1;25870:2:1;25855:18;25848:34;25705:65;25378:510;-1:-1:-1;;25378:510:1:o

Swarm Source

ipfs://eb906fe02bcd5e6fda0c070a6d8b107cdb35d9f7d09a7216a96cc7b678a96794
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.