ETH Price: $3,132.79 (+0.11%)

Token

Baby Neiro (BABYNEIRO)
 

Overview

Max Total Supply

100,000,000 BABYNEIRO

Holders

8

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BABYNEIRO

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-08-02
*/

// https://t.me/babyneirofficial

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

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

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

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

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

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

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

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

    function transfer(address recipient, 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 sender,
        address recipient,
        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);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 internal _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 recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, 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)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, 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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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 _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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);
}

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);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

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

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        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 swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract DividendPayingToken is
    ERC20,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt 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));
    }

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

            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))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / magnitude;
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

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

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

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

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    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);
        }
    }
}

contract BABYNEIRO is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    bool private swapping;
    bool public tradingEnabled = false;

    uint256 public sellAmount = 1;
    uint256 public buyAmount = 1;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    BNEIRODividendTracker public dividendTracker;

    address payable public marketingWallet;
    address payable public buybackWallet;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    uint256 public swapTokensAtAmount;
    uint256 public sellRewardsFee;
    uint256 public sellMarketingFees;
    uint256 public buyMarketingFees;
    uint256 public buyRewardsFee;
    uint256 public buyBuyBackFee;
    uint256 public sellBuyBackFee;

    // gas for processing auto claim dividends 
    uint256 public gasForProcessing = 300000;

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;

    mapping(address => bool) public automatedMarketMakerPairs;

    //for allowing specific address to trade while trading has not been enabled yet 
    mapping(address => bool) private canTransferBeforeTradingIsEnabled;  
    
    event updateMarketingWallet(address wallet);
    event updatebuybackWallet(address wallet);

    event UpdateDividendTracker(
        address indexed newAddress,
        address indexed oldAddress
    );

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event TradingEnabled();

    event UpdateFees(
        uint256 sellMarketingFees,
        uint256 sellRewardsFee,
        uint256 buyMarketingFees,
        uint256 buyRewardsFee,
        uint256 buyBuyBackFee,
        uint256 sellBuyBackFee
    );


    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

    event SendDividends(uint256 amount, uint256 opAmount, bool success);

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    event UpdatePayoutToken(address token);

    constructor() ERC20("Baby Neiro", "BABYNEIRO") {
        marketingWallet = payable(0xB439994235723f535dFA6314d585be2dD4941E91);
        buybackWallet = payable(0xB439994235723f535dFA6314d585be2dD4941E91);
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

        buyMarketingFees = 100;
        sellMarketingFees = 100;
        buyRewardsFee = 0;
        sellRewardsFee = 0;
        buyBuyBackFee = 0;
        sellBuyBackFee = 0;

        totalBuyFees = buyRewardsFee
            .add(buyMarketingFees)
            .add(buyBuyBackFee);
        totalSellFees = sellRewardsFee
            .add(sellMarketingFees)
            .add(sellBuyBackFee);

        dividendTracker = new BNEIRODividendTracker(
            payable(this),
            router,
            0xEE2a03Aa6Dacf51C18679C516ad5283d8E7C2637,
            "BNEIROTRACKER",
            "BNEIROTRACKER"
        );

        uniswapV2Router = IUniswapV2Router02(router);
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(router);
        dividendTracker.excludeFromDividends(marketingWallet);
        dividendTracker.excludeFromDividends(owner());

        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;
        _isExcludedFromFees[address(marketingWallet)] = true;
        _isExcludedFromFees[address(buybackWallet)] = true;
        _isExcludedFromFees[msg.sender] = true;

        uint256 totalTokenSupply = (100_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        maxWallet = totalTokenSupply / 50; // 2%
        swapTokensAtAmount = totalTokenSupply / 1000; // 0.1%;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true; 
    }

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

    receive() external payable {}

    function enableTrading() external onlyOwner {
        require(!tradingEnabled);
        tradingEnabled = true;
        emit TradingEnabled();
    }
    
    // set new marketing wallet
    function setMarketingWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        marketingWallet = payable(wallet);
        emit updateMarketingWallet(wallet);
    }

    //set new buyback wallet
    function setBuybackWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        buybackWallet = payable(wallet);
        emit updatebuybackWallet(wallet);
    }    
    
    // exclude a wallet from fees 
    function setExcludeFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    // exclude from dividends (rewards)
    function setExcludeDividends(address account) public onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // include in dividends 
    function setIncludeDividends(address account) public onlyOwner {
        dividendTracker.includeFromDividends(account);
        dividendTracker.setBalance(account, 0);
    }

    //allow a wallet to trade before trading enabled
    function setCanTransferBefore(address wallet, bool enable)
        external
        onlyOwner
    {
        canTransferBeforeTradingIsEnabled[wallet] = enable;
    }

    // set max wallet, can not be lower than 0.05% of supply
    function setmaxWallet(uint256 value) external onlyOwner {
        value = value * (10**18);
        require(value >= _totalSupply / 1000, "max wallet cannot be set to less than 0.1%");
        maxWallet = value;
    }

    // rewards threshold
    function setSwapTriggerAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * (10**18);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setAllowCustomTokens(bool allow) public onlyOwner {
        dividendTracker.setAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) public onlyOwner {
        dividendTracker.setAllowAutoReinvest(allow);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 1000000);
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function transferAdmin(address newOwner) public onlyOwner {
        dividendTracker.excludeFromDividends(newOwner);
        _isExcludedFromFees[newOwner] = true;
        transferOwnership(newOwner);
    }

    function updateFees(
        uint256 marketingBuy,
        uint256 marketingSell,
        uint256 RewardsBuy,
        uint256 RewardsSell,
        uint256 buybackBuy,
        uint256 buybackSell
    ) public onlyOwner {
        buyMarketingFees = marketingBuy;
        buyRewardsFee = RewardsBuy;
        sellMarketingFees = marketingSell;
        sellRewardsFee = RewardsSell;
        buyBuyBackFee = buybackBuy;
        sellBuyBackFee = buybackSell;

        totalSellFees = sellRewardsFee
            .add(sellMarketingFees)
            .add(sellBuyBackFee);

        totalBuyFees = buyRewardsFee
            .add(buyMarketingFees)
            .add(buyBuyBackFee);

        require(totalSellFees <= 500 && totalBuyFees <= 500, "total fees cannot exceed 5% sell or buy");

        emit UpdateFees(
            sellMarketingFees,
            sellRewardsFee,
            buyMarketingFees,
            buyRewardsFee,
            buyBuyBackFee,
            sellBuyBackFee
        );
    }

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

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    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 getAccountDividendsInfo(address account)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (
            uint256 iterations,
            uint256 claims,
            uint256 lastProcessedIndex
        ) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(
            iterations,
            claims,
            lastProcessedIndex,
            false,
            gas,
            tx.origin
        );
    }

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

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

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

    function setAutoClaim(bool value) external {
        dividendTracker.setAutoClaim(msg.sender, value);
    }

    function setReinvest(bool value) external {
        dividendTracker.setReinvest(msg.sender, value);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        dividendTracker.setDividendsPaused(value);
    }

    function isExcludedFromAutoClaim(address account)
        external
        view
        returns (bool)
    {
        return dividendTracker.isExcludedFromAutoClaim(account);
    }

    function isReinvest(address account) external view returns (bool) {
        return dividendTracker.isReinvest(account);
    }

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

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");
        }        
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } 
        
        if (to == DEAD) {
            _burn(from, amount);
            return;
        }

        else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]
        ) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];
            
            if (!isBuying && !isSelling) {
                super._transfer(from, to, amount);
                dividendTracker.setBalance(from, balanceOf(from));
                dividendTracker.setBalance(to, balanceOf(to));
                return;
            }

            else if (isSelling) {
                RewardsFee = sellRewardsFee;
                marketingFees = sellMarketingFees;
                buybackFee = sellBuyBackFee;

            } else if (isBuying) {
                RewardsFee = buyRewardsFee;
                marketingFees = buyMarketingFees;
                buybackFee = buyBuyBackFee;

                uint256 contractBalanceRecipient = balanceOf(to);
                require(contractBalanceRecipient + amount <= maxWallet,"Exceeds maximum wallet token amount." );
            }
            uint256 totalFees = RewardsFee
                .add(marketingFees + buybackFee);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

            if (canSwap && !automatedMarketMakerPairs[from]) {
                swapping = true;

                uint256 remainingBalance = balanceOf(address(this));
                swapAndSendDividends(remainingBalance);
                buyAmount = 1;
                sellAmount = 1;
                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(10000);

            amount = amount.sub(fees);

            if (isSelling) {
                sellAmount = sellAmount.add(fees);
            } else {
                buyAmount = buyAmount.add(fees);
            }

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

        }

        super._transfer(from, to, amount);
        dividendTracker.setBalance(from, balanceOf(from));
        dividendTracker.setBalance(to, balanceOf(to));
        
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function updatePayoutToken(address token) public onlyOwner {
        dividendTracker.updatePayoutToken(token);
        emit UpdatePayoutToken(token);
    }

    function getPayoutToken() public view returns (address) {
        return dividendTracker.getPayoutToken();
    }

    function getMinimumTokenBalanceForAutoDividends() public view returns (uint256) {
        return dividendTracker.getMinimumTokenBalanceForAutoDividends();
    }

    function getMinimumTokenBalanceForDividends() public view returns (uint256) {
        return dividendTracker.getMinimumTokenBalanceForDividends();
    }        

    function setMinimumTokenBalanceForAutoDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForAutoDividends(value);
    }

    function setMinimumTokenBalanceForDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForDividends(value);
    }

    function forceSwapAndSendDividends(uint256 tokens) public onlyOwner {
        tokens = tokens * (10**18);
        uint256 totalAmount = buyAmount.add(sellAmount);
        uint256 fromBuy = tokens.mul(buyAmount).div(totalAmount);
        uint256 fromSell = tokens.mul(sellAmount).div(totalAmount);

        swapAndSendDividends(tokens);

        buyAmount = buyAmount.sub(fromBuy);
        sellAmount = sellAmount.sub(fromSell);
    }

    function swapAndSendDividends(uint256 tokens) private {
        if (tokens == 0) {
            return;
        }
        swapTokensForEth(tokens);
        uint256 totalAmount = buyAmount.add(sellAmount);

        bool success = true;
        bool successOp1 = true;
        bool successOp2 = true;

        uint256 dividends;
        uint256 dividendsFromBuy;
        uint256 dividendsFromSell;

        if (buyRewardsFee > 0) {
            dividendsFromBuy = address(this)
            .balance
            .mul(buyAmount)
            .div(totalAmount)
            .mul(buyRewardsFee)
            .div(buyRewardsFee + buyMarketingFees + buyBuyBackFee);
        }
        if (sellRewardsFee > 0) {
            dividendsFromSell = address(this)
            .balance
            .mul(sellAmount)
            .div(totalAmount)
            .mul(sellRewardsFee)
            .div(sellRewardsFee + sellMarketingFees + sellBuyBackFee);
        }
        dividends = dividendsFromBuy.add(dividendsFromSell);

        if (dividends > 0) {
            (success, ) = address(dividendTracker).call{value: dividends}("");
        }
        
        uint256 _completeFees = sellMarketingFees.add(sellBuyBackFee) +
            buyMarketingFees.add(buyBuyBackFee);

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 buybackPayout = buyBuyBackFee.add(sellBuyBackFee) * feePortions;

        if (marketingPayout > 0) {
            (successOp1, ) = address(marketingWallet).call{value: marketingPayout}("");
        }
        if (buybackPayout > 0) {
            (successOp2, ) = address(buybackWallet).call{value: buybackPayout}("");
        }

        emit SendDividends(
            dividends,
            marketingPayout + buybackPayout,
            success && successOp1 && successOp2
        );
    }

    function airdropToWallets(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(airdropWallets.length == amount.length,"Arrays must be the same length");
        require(airdropWallets.length <= 200, "Wallets list length must be <= 200");
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i] * (10**18);
            super._transfer(msg.sender, wallet, airdropAmount);
            dividendTracker.setBalance(payable(wallet), balanceOf(wallet));
        }
    }
}

contract BNEIRODividendTracker is DividendPayingToken, Ownable {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => bool) public excludedFromAutoClaim;
    mapping(address => bool) public autoReinvest;
    address public defaultToken; 
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    string private trackerName;
    string private trackerTicker;

    IUniswapV2Router02 public uniswapV2Router;

    BABYNEIRO public BNEIROContract;

    mapping(address => uint256) public lastClaimTimes;

    uint256 private minimumTokenBalanceForAutoDividends;
    uint256 private minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendReinvested(
        address indexed acount,
        uint256 value,
        bool indexed automatic
    );
    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );
    event DividendsPaused(bool paused);
    event SetAllowCustomTokens(bool allow);
    event SetAllowAutoReinvest(bool allow);

    constructor(
        address payable mainContract,
        address router,
        address token,
        string memory _name,
        string memory _ticker
    ) DividendPayingToken(_name, _ticker) {
        trackerName = _name;
        trackerTicker = _ticker;
        defaultToken = token;
        BNEIROContract = BABYNEIRO(mainContract);
        minimumTokenBalanceForAutoDividends = 50_000_000 * (10**18);
        minimumTokenBalanceForDividends = 100 * (10**18);

        uniswapV2Router = IUniswapV2Router02(router);
        allowCustomTokens = true;
        allowAutoReinvest = false;
    }

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

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

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

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

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

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

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

    function setAllowCustomTokens(bool allow) external onlyOwner {
        require(allowCustomTokens != allow);
        allowCustomTokens = allow;
        emit SetAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) external onlyOwner {
        require(allowAutoReinvest != allow);
        allowAutoReinvest = allow;
        emit SetAllowAutoReinvest(allow);
    }

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

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function includeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = false;
    }

    function setAutoClaim(address account, bool value) external onlyOwner {
        excludedFromAutoClaim[account] = value;
    }

    function setReinvest(address account, bool value) external onlyOwner {
        autoReinvest[account] = value;
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value)
        external
        onlyOwner
    {
        minimumTokenBalanceForAutoDividends = value * (10**18);
    }

    function setMinimumTokenBalanceForDividends(uint256 value)
        external
        onlyOwner
    {
        minimumTokenBalanceForDividends = value * (10**18);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        require(dividendsPaused != value);
        dividendsPaused = value;
        emit DividendsPaused(value);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public
        view
        returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime
        )
    {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(
                    int256(lastProcessedIndex)
                );
            } else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                    lastProcessedIndex
                    ? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
                    : 0;

                iterationsUntilProcessed = index.add(
                    int256(processesUntilEndOfArray)
                );
            }
        }

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];
    }

    function getAccountAtIndex(uint256 index)
        public
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        if (index >= tokenHoldersMap.size()) {
            return (
                0x0000000000000000000000000000000000000000,
                -1,
                -1,
                0,
                0,
                0
            );
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

        if (newBalance < minimumTokenBalanceForDividends) {
            tokenHoldersMap.remove(account);
            _setBalance(account, 0);

            return;
        }

        _setBalance(account, newBalance);

        if (newBalance >= minimumTokenBalanceForAutoDividends) {
            tokenHoldersMap.set(account, newBalance);
        } else {
            tokenHoldersMap.remove(account);
        }
    }

    function process(uint256 gas)
        public
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0 || dividendsPaused) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= numberOfTokenHolders) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (!excludedFromAutoClaim[account]) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        if (dividendsPaused) {
            return false;
        }

        bool reinvest = autoReinvest[account];

        if (automatic && reinvest && !allowAutoReinvest) {
            return false;
        }

        uint256 amount = reinvest
            ? _reinvestDividendOfUser(account)
            : _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            if (reinvest) {
                emit DividendReinvested(account, amount, automatic);
            } else {
                emit Claim(account, amount, automatic);
            }
            return true;
        }

        return false;
    }

    function updatePayoutToken(address token) public onlyOwner {
        defaultToken = token;
    }

    function getPayoutToken() public view returns (address) {
        return defaultToken;
    }

    function getMinimumTokenBalanceForAutoDividends() public view returns (uint256) {
        return minimumTokenBalanceForAutoDividends;
    }

    function getMinimumTokenBalanceForDividends() public view returns (uint256) {
        return minimumTokenBalanceForDividends;
    }        

    function _reinvestDividendOfUser(address account)
        private
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            bool success;

            withdrawnDividends[account] = withdrawnDividends[account].add(
                _withdrawableDividend
            );

            address[] memory path = new address[](2);
            path[0] = uniswapV2Router.WETH();
            path[1] = address(BNEIROContract);

            uint256 prevBalance = BNEIROContract.balanceOf(address(this));

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = BNEIROContract
                    .balanceOf(address(this))
                    .sub(prevBalance);
                if (received > 0) {
                    success = true;
                    BNEIROContract.transfer(account, received);
                } else {
                    success = false;
                }
            } catch {
                success = false;
            }

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

            return _withdrawableDividend;
        }

        return 0;
    }

    function _withdrawDividendOfUser(address payable user)
        internal
        override
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );

            address tokenAddress = defaultToken;
            bool success;

            if (tokenAddress == address(0)) {
                (success, ) = user.call{
                    value: _withdrawableDividend,
                    gas: 3000
                }("");
            } else {
                address[] memory path = new address[](2);
                path[0] = uniswapV2Router.WETH();
                path[1] = tokenAddress;
                try
                    uniswapV2Router
                        .swapExactETHForTokensSupportingFeeOnTransferTokens{
                        value: _withdrawableDividend
                    }(
                        0, // accept any amount of Tokens
                        path,
                        user,
                        block.timestamp
                    )
                {
                    success = true;
                } catch {
                    success = false;
                }
            }

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

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) internal view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
        internal
        view
        returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
        internal
        view
        returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) internal view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) internal {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) internal {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","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":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"opAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyBuyBackFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellBuyBackFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UpdatePayoutToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updatebuybackWallet","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBuyBackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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 BNEIRODividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"forceSwapAndSendDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTokenBalanceForAutoDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPayoutToken","outputs":[{"internalType":"address","name":"","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":"account","type":"address"}],"name":"isExcludedFromAutoClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isReinvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellBuyBackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowAutoReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowCustomTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setBuybackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCanTransferBefore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setDividendsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setExcludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setIncludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForAutoDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTriggerAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"RewardsBuy","type":"uint256"},{"internalType":"uint256","name":"RewardsSell","type":"uint256"},{"internalType":"uint256","name":"buybackBuy","type":"uint256"},{"internalType":"uint256","name":"buybackSell","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","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"}]

608060405260088054600161ff0160a01b03191661dead17905560016009819055600a55620493e06018553480156200003757600080fd5b506040518060400160405280600a81526020016942616279204e6569726f60b01b81525060405180604001604052806009815260200168424142594e4549524f60b81b81525081600390816200008e919062000b12565b5060046200009d828262000b12565b5050506000620000b26200082160201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e805473b439994235723f535dfa6314d585be2dd4941e916001600160a01b03199182168117909255600f8054909116909117905560646014819055601381905560006015819055601281905560168190556017819055737a250d5630b4cf539739df2c5dacb4c659f2488d91620001a191906200018d90829062000825602090811b6200229417901c565b6200082560201b620022941790919060201c565b600c81905550620001cc6017546200018d6013546012546200082560201b620022941790919060201c565b600b81905550308173ee2a03aa6dacf51c18679c516ad5283d8e7c2637604051620001f79062000a60565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600d9082018190526c212722a4a927aa2920a1a5a2a960991b60c0830181905260e06080840181905283019190915261010082015261012001604051809103906000f08015801562000273573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620002de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000304919062000bde565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000367573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038d919062000bde565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003db573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000401919062000bde565b600780546001600160a01b0319166001600160a01b039290921691821790556200042d90600162000893565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200047457600080fd5b505af115801562000489573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004d357600080fd5b505af1158015620004e8573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200053657600080fd5b505af11580156200054b573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa15801562000599573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005bf919062000c09565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156200060857600080fd5b505af11580156200061d573d6000803e3d6000fd5b5050600d54600e5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200066b57600080fd5b505af115801562000680573d6000803e3d6000fd5b5050600d546001600160a01b031691506331e79db09050620006aa6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620006ec57600080fd5b505af115801562000701573d6000803e3d6000fd5b5050306000908152601960205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f5416845282842080548216831790553384529190922080549091169091179055506a52b7d2dcc80cd2e400000090506200079e620007976005546001600160a01b031690565b826200095f565b620007ab60328262000c2d565b601055620007bc6103e88262000c2d565b6011556001601b6000620007d86005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152601b9092529020805490911660011790555062000c779050565b3390565b60008062000834838562000c50565b9050838110156200088c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b0382166000908152601a60205260409020805460ff191682158015919091179091556200092357600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200090957600080fd5b505af11580156200091e573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038216620009b75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000883565b620009d3816002546200082560201b620022941790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a069183906200229462000825821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b6130ca80620045c483390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a9957607f821691505b60208210810362000aba57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a5b57600081815260208120601f850160051c8101602086101562000ae95750805b601f850160051c820191505b8181101562000b0a5782815560010162000af5565b505050505050565b81516001600160401b0381111562000b2e5762000b2e62000a6e565b62000b468162000b3f845462000a84565b8462000ac0565b602080601f83116001811462000b7e576000841562000b655750858301515b600019600386901b1c1916600185901b17855562000b0a565b600085815260208120601f198616915b8281101562000baf5788860151825594840194600190910190840162000b8e565b508582101562000bce5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000bf157600080fd5b81516001600160a01b03811681146200088c57600080fd5b60006020828403121562000c1c57600080fd5b815180151581146200088c57600080fd5b60008262000c4b57634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000c7257634e487b7160e01b600052601160045260246000fd5b500190565b61393d8062000c876000396000f3fe6080604052600436106104145760003560e01c8063715018a61161021e578063a8b9d24011610123578063deab8aea116100ab578063f27fd2541161007a578063f27fd25414610c3f578063f2fde38b14610c5f578063f5d3c79a14610c7f578063f8b45b0514610c9f578063fc6b151c14610cb557600080fd5b8063deab8aea14610bdf578063e2f4560514610bff578063e7841ec014610c15578063e7cb7f8714610c2a57600080fd5b8063ba079d49116100f2578063ba079d4914610b2e578063bb8d513114610b4e578063bdd4f29f14610b64578063d8032ed314610b79578063dd62ed3e14610b9957600080fd5b8063a8b9d24014610a67578063a9059cbb14610a87578063ad56c13c14610aa7578063b62496f514610afe57600080fd5b80638da5cb5b116101a65780639a7a23d6116101755780639a7a23d6146109d15780639c1b8af5146109f15780639c3372ea14610a075780639ec1037e14610a27578063a457c2d714610a4757600080fd5b80638da5cb5b1461096857806395451c291461098657806395d89b411461099c578063992c58e4146109b157600080fd5b806377a3b609116101ed57806377a3b609146108dd5780637fdde05c146108f3578063868730c714610913578063871c128d146109335780638a8c523c1461095357600080fd5b8063715018a61461086857806372d8edf41461087d57806375829def1461089d57806375f0a874146108bd57600080fd5b80633599bb17116103245780635a84c5eb116102ac57806364b0f6531161027b57806364b0f653146107d35780636843cd84146107e85780636d48467b14610808578063700bb1911461082857806370a082311461084857600080fd5b80635a84c5eb146107535780635d098b38146107735780635ebf4db9146107935780635eee4bae146107b357600080fd5b806349bd5a5e116102f357806349bd5a5e146106ae5780634ada218b146106ce5780634e71d92d146106ef5780634fbee193146107045780635124f8741461073d57600080fd5b80633599bb171461063857806339509351146106585780633f407b841461067857806340ffdd801461068e57600080fd5b80631d0adc07116103a757806323b872dd1161037657806323b872dd146105b257806325cd3598146105d25780632c1f5216146105e757806330bb4cff14610607578063313ce5671461061c57600080fd5b80631d0adc07146105465780631fa70531146105665780631fe70a981461057c5780632307b4411461059257600080fd5b8063095ea7b3116103e3578063095ea7b3146104c15780631694505e146104f157806318160ddd146105115780631a221dbb1461053057600080fd5b806303fd2a451461042057806305ca5f081461045d57806306fdde031461047f57806308dfe8a5146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50600854610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047d610478366004613207565b610cd5565b005b34801561048b57600080fd5b50610494610da6565b6040516104549190613220565b3480156104ad57600080fd5b5061047d6104bc366004613298565b610e38565b3480156104cd57600080fd5b506104e16104dc3660046132d1565b610ec1565b6040519015158152602001610454565b3480156104fd57600080fd5b50600654610440906001600160a01b031681565b34801561051d57600080fd5b506002545b604051908152602001610454565b34801561053c57600080fd5b5061052260175481565b34801561055257600080fd5b5061047d6105613660046132fd565b610ed8565b34801561057257600080fd5b50610522600a5481565b34801561058857600080fd5b5061052260165481565b34801561059e57600080fd5b5061047d6105ad3660046133f0565b610f6f565b3480156105be57600080fd5b506104e16105cd3660046134b2565b611140565b3480156105de57600080fd5b506104406111a9565b3480156105f357600080fd5b50600d54610440906001600160a01b031681565b34801561061357600080fd5b5061052261121c565b34801561062857600080fd5b5060405160128152602001610454565b34801561064457600080fd5b5061047d6106533660046134f3565b61128a565b34801561066457600080fd5b506104e16106733660046132d1565b611317565b34801561068457600080fd5b5061052260095481565b34801561069a57600080fd5b5061047d6106a93660046134f3565b61134d565b3480156106ba57600080fd5b50600754610440906001600160a01b031681565b3480156106da57600080fd5b506008546104e190600160a81b900460ff1681565b3480156106fb57600080fd5b5061047d6113a8565b34801561071057600080fd5b506104e161071f3660046132fd565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561074957600080fd5b5061052260145481565b34801561075f57600080fd5b5061047d61076e366004613207565b611420565b34801561077f57600080fd5b5061047d61078e3660046132fd565b61147b565b34801561079f57600080fd5b5061047d6107ae366004613207565b61150b565b3480156107bf57600080fd5b5061047d6107ce366004613207565b611566565b3480156107df57600080fd5b506105226115a8565b3480156107f457600080fd5b506105226108033660046132fd565b6115f2565b34801561081457600080fd5b506104e16108233660046132fd565b611662565b34801561083457600080fd5b5061047d610843366004613207565b6116d2565b34801561085457600080fd5b506105226108633660046132fd565b6117a4565b34801561087457600080fd5b5061047d6117bf565b34801561088957600080fd5b5061047d6108983660046132fd565b611833565b3480156108a957600080fd5b5061047d6108b83660046132fd565b61188f565b3480156108c957600080fd5b50600e54610440906001600160a01b031681565b3480156108e957600080fd5b5061052260155481565b3480156108ff57600080fd5b5061047d61090e366004613298565b611944565b34801561091f57600080fd5b5061047d61092e3660046134f3565b611999565b34801561093f57600080fd5b5061047d61094e366004613207565b6119d1565b34801561095f57600080fd5b5061047d611a4d565b34801561097457600080fd5b506005546001600160a01b0316610440565b34801561099257600080fd5b5061052260135481565b3480156109a857600080fd5b50610494611acc565b3480156109bd57600080fd5b5061047d6109cc366004613510565b611adb565b3480156109dd57600080fd5b5061047d6109ec366004613298565b611c35565b3480156109fd57600080fd5b5061052260185481565b348015610a1357600080fd5b5061047d610a223660046134f3565b611c6d565b348015610a3357600080fd5b5061047d610a423660046132fd565b611cc9565b348015610a5357600080fd5b506104e1610a623660046132d1565b611d8b565b348015610a7357600080fd5b50610522610a823660046132fd565b611dda565b348015610a9357600080fd5b506104e1610aa23660046132d1565b611e0d565b348015610ab357600080fd5b50610ac7610ac23660046132fd565b611e1a565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610454565b348015610b0a57600080fd5b506104e1610b193660046132fd565b601a6020526000908152604090205460ff1681565b348015610b3a57600080fd5b506104e1610b493660046132fd565b611eaa565b348015610b5a57600080fd5b5061052260125481565b348015610b7057600080fd5b50610522611edd565b348015610b8557600080fd5b5061047d610b943660046132fd565b611f27565b348015610ba557600080fd5b50610522610bb4366004613553565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610beb57600080fd5b50600f54610440906001600160a01b031681565b348015610c0b57600080fd5b5061052260115481565b348015610c2157600080fd5b50610522611fea565b348015610c3657600080fd5b50610522612034565b348015610c4b57600080fd5b50610ac7610c5a366004613207565b61207e565b348015610c6b57600080fd5b5061047d610c7a3660046132fd565b6120bc565b348015610c8b57600080fd5b5061047d610c9a3660046134f3565b6121a7565b348015610cab57600080fd5b5061052260105481565b348015610cc157600080fd5b5061047d610cd0366004613207565b6121df565b6005546001600160a01b03163314610d085760405162461bcd60e51b8152600401610cff90613581565b60405180910390fd5b610d1a81670de0b6b3a76400006135cc565b90506000610d35600954600a5461229490919063ffffffff16565b90506000610d5882610d52600a54866122fa90919063ffffffff16565b9061237c565b90506000610d7583610d52600954876122fa90919063ffffffff16565b9050610d80846123be565b600a54610d8d90836126be565b600a55600954610d9d90826126be565b60095550505050565b606060038054610db5906135eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610de1906135eb565b8015610e2e5780601f10610e0357610100808354040283529160200191610e2e565b820191906000526020600020905b815481529060010190602001808311610e1157829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e625760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000610ece338484612700565b5060015b92915050565b6005546001600160a01b03163314610f025760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b038116600081815260196020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527f3c2a46a28084880d3bc39c8f240a57690614613728ce03d2a8c6dc645892e4fb91015b60405180910390a150565b6005546001600160a01b03163314610f995760405162461bcd60e51b8152600401610cff90613581565b8051825114610fea5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cff565b60c8825111156110475760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610cff565b60005b825181101561113b57600083828151811061106757611067613625565b60200260200101519050600083838151811061108557611085613625565b6020026020010151670de0b6b3a76400006110a091906135cc565b90506110ad338383612825565b600d546001600160a01b031663e30443bc836110c8816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561110e57600080fd5b505af1158015611122573d6000803e3d6000fd5b50505050505080806111339061363b565b91505061104a565b505050565b600061114d84848461292e565b61119f843361119a856040518060600160405280602881526020016138bb602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612e79565b612700565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613654565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613671565b6005546001600160a01b031633146112b45760405162461bcd60e51b8152600401610cff90613581565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b1580156112fc57600080fd5b505af1158015611310573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ece91859061119a9086612294565b6005546001600160a01b031633146113775760405162461bcd60e51b8152600401610cff90613581565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016112e2565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d919061368a565b50565b6005546001600160a01b0316331461144a5760405162461bcd60e51b8152600401610cff90613581565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016112e2565b6005546001600160a01b031633146114a55760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b038116600081815260196020908152604091829020805460ff19166001179055600e80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101610f64565b6005546001600160a01b031633146115355760405162461bcd60e51b8152600401610cff90613581565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016112e2565b6005546001600160a01b031633146115905760405162461bcd60e51b8152600401610cff90613581565b6115a281670de0b6b3a76400006135cc565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561163e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613671565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed2919061368a565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611725573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174991906136a7565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146117e95760405162461bcd60e51b8152600401610cff90613581565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461185d5760405162461bcd60e51b8152600401610cff90613581565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016112e2565b6005546001600160a01b031633146118b95760405162461bcd60e51b8152600401610cff90613581565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561190057600080fd5b505af1158015611914573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601960205260409020805460ff191660011790555061141d816120bc565b6005546001600160a01b0316331461196e5760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016112e2565b6005546001600160a01b031633146119fb5760405162461bcd60e51b8152600401610cff90613581565b62030d408110158015611a115750620f42408111155b611a1a57600080fd5b60185460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601855565b6005546001600160a01b03163314611a775760405162461bcd60e51b8152600401610cff90613581565b600854600160a81b900460ff1615611a8e57600080fd5b6008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610db5906135eb565b6005546001600160a01b03163314611b055760405162461bcd60e51b8152600401610cff90613581565b601486905560158490556013859055601283905560168290556017819055611b3781611b318588612294565b90612294565b600b55601654601454601554611b529291611b319190612294565b600c55600b546101f410801590611b6d57506101f4600c5411155b611bc95760405162461bcd60e51b815260206004820152602760248201527f746f74616c20666565732063616e6e6f74206578636565642035252073656c6c604482015266206f722062757960c81b6064820152608401610cff565b601354601254601454601554601654601754604080519687526020870195909552938501929092526060840152608083015260a08201527ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff9060c00160405180910390a1505050505050565b6005546001600160a01b03163314611c5f5760405162461bcd60e51b8152600401610cff90613581565b611c698282612eb3565b5050565b6005546001600160a01b03163314611c975760405162461bcd60e51b8152600401610cff90613581565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016112e2565b6005546001600160a01b03163314611cf35760405162461bcd60e51b8152600401610cff90613581565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b158015611d3a57600080fd5b505af1158015611d4e573d6000803e3d6000fd5b5050600d546040516338c110ef60e21b81526001600160a01b03858116600483015260006024830152909116925063e30443bc91506044016112e2565b6000610ece338461119a856040518060600160405280602581526020016138e3602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612e79565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611621565b6000610ece33848461292e565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015611e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9691906136d5565b949c939b5091995097509550909350915050565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611691565b600d546040805163bdd4f29f60e01b815290516000926001600160a01b03169163bdd4f29f9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b6005546001600160a01b03163314611f515760405162461bcd60e51b8152600401610cff90613581565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050610f64565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d546040805163e7cb7f8760e01b815290516000926001600160a01b03169163e7cb7f879160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401611e55565b6005546001600160a01b031633146120e65760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b03811661214b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cff565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016112e2565b6005546001600160a01b031633146122095760405162461bcd60e51b8152600401610cff90613581565b61221b81670de0b6b3a76400006135cc565b90506103e860025461222d9190613728565b81101561228f5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610cff565b601055565b6000806122a1838561374a565b9050838110156122f35760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cff565b9392505050565b60008260000361230c57506000610ed2565b600061231883856135cc565b9050826123258583613728565b146122f35760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cff565b60006122f383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f7c565b806000036123c95750565b6123d281612faa565b60006123eb600954600a5461229490919063ffffffff16565b60155490915060019081908190600090819081901561244c5761244960165460145460155461241a919061374a565b612424919061374a565b610d526015546124438b610d52600a54476122fa90919063ffffffff16565b906122fa565b91505b601254156124965761249360175460135460125461246a919061374a565b612474919061374a565b610d526012546124438b610d52600954476122fa90919063ffffffff16565b90505b6124a08282612294565b9250821561250057600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146124f5576040519150601f19603f3d011682016040523d82523d6000602084013e6124fa565b606091505b50909650505b600061251960165460145461229490919063ffffffff16565b60175460135461252891612294565b612532919061374a565b90506000811561254957612546478361237c565b90505b60008161256360135460145461229490919063ffffffff16565b61256d91906135cc565b905060008261258960175460165461229490919063ffffffff16565b61259391906135cc565b905081156125f357600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146125e8576040519150601f19603f3d011682016040523d82523d6000602084013e6125ed565b606091505b50909950505b801561265157600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612646576040519150601f19603f3d011682016040523d82523d6000602084013e61264b565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd08761267d838561374a565b8c801561268757508b5b801561269057508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006122f383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e79565b6001600160a01b0383166127625760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cff565b6001600160a01b0382166127c35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cff565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661284b5760405162461bcd60e51b8152600401610cff90613762565b6001600160a01b0382166128715760405162461bcd60e51b8152600401610cff906137a7565b6128ae81604051806060016040528060268152602001613895602691396001600160a01b0386166000908152602081905260409020549190612e79565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546128dd9082612294565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612818565b6001600160a01b0383166129545760405162461bcd60e51b8152600401610cff90613762565b6001600160a01b03821661297a5760405162461bcd60e51b8152600401610cff906137a7565b6001600160a01b0383166000908152601b60205260408120548190819060ff166129f757600854600160a81b900460ff166129f75760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610cff565b83600003612a1357612a0b86866000612825565b505050505050565b6008546001600160a01b0390811690861603612a3357612a0b86856130fc565b600854600160a01b900460ff16158015612a6657506001600160a01b03861660009081526019602052604090205460ff16155b8015612a8b57506001600160a01b03851660009081526019602052604090205460ff16155b15612d72576001600160a01b038086166000908152601a602052604080822054928916825290205460ff918216911680158015612ac6575081155b15612bd457612ad6888888612825565b600d546001600160a01b031663e30443bc89612af1816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b3757600080fd5b505af1158015612b4b573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088612b6c816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612bb257600080fd5b505af1158015612bc6573d6000803e3d6000fd5b505050505050505050505050565b8115612bee57601254945060135493506017549250612c7a565b8015612c7a576015549450601454935060165492506000612c0e886117a4565b601054909150612c1e888361374a565b1115612c785760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610cff565b505b6000612c90612c89858761374a565b8790612294565b90506000612c9d306117a4565b60115490915081108015908190612ccd57506001600160a01b038b166000908152601a602052604090205460ff16155b15612d14576008805460ff60a01b1916600160a01b1790556000612cf0306117a4565b9050612cfb816123be565b506001600a8190556009556008805460ff60a01b191690555b6000612d26612710610d528c876122fa565b9050612d328a826126be565b99508515612d4f57600954612d479082612294565b600955612d60565b600a54612d5c9082612294565b600a555b612d6b8c3083612825565b5050505050505b612d7d868686612825565b600d546001600160a01b031663e30443bc87612d98816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612dde57600080fd5b505af1158015612df2573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905086612e13816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612e5957600080fd5b505af1158015612e6d573d6000803e3d6000fd5b50505050505050505050565b60008184841115612e9d5760405162461bcd60e51b8152600401610cff9190613220565b506000612eaa84866137ea565b95945050505050565b6001600160a01b0382166000908152601a60205260409020805460ff19168215801591909117909155612f4057600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612f2757600080fd5b505af1158015612f3b573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60008183612f9d5760405162461bcd60e51b8152600401610cff9190613220565b506000612eaa8486613728565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612fdf57612fdf613625565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305c9190613654565b8160018151811061306f5761306f613625565b6001600160a01b0392831660209182029290920101526006546130959130911684612700565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906130ce908590600090869030904290600401613801565b600060405180830381600087803b1580156130e857600080fd5b505af1158015612a0b573d6000803e3d6000fd5b6001600160a01b03821661315c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cff565b61319981604051806060016040528060228152602001613873602291396001600160a01b0385166000908152602081905260409020549190612e79565b6001600160a01b0383166000908152602081905260409020556002546131bf90826126be565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006020828403121561321957600080fd5b5035919050565b600060208083528351808285015260005b8181101561324d57858101830151858201604001528201613231565b8181111561325f576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461141d57600080fd5b801515811461141d57600080fd5b600080604083850312156132ab57600080fd5b82356132b681613275565b915060208301356132c68161328a565b809150509250929050565b600080604083850312156132e457600080fd5b82356132ef81613275565b946020939093013593505050565b60006020828403121561330f57600080fd5b81356122f381613275565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156133595761335961331a565b604052919050565b600067ffffffffffffffff82111561337b5761337b61331a565b5060051b60200190565b600082601f83011261339657600080fd5b813560206133ab6133a683613361565b613330565b82815260059290921b840181019181810190868411156133ca57600080fd5b8286015b848110156133e557803583529183019183016133ce565b509695505050505050565b6000806040838503121561340357600080fd5b823567ffffffffffffffff8082111561341b57600080fd5b818501915085601f83011261342f57600080fd5b8135602061343f6133a683613361565b82815260059290921b8401810191818101908984111561345e57600080fd5b948201945b8386101561348557853561347681613275565b82529482019490820190613463565b9650508601359250508082111561349b57600080fd5b506134a885828601613385565b9150509250929050565b6000806000606084860312156134c757600080fd5b83356134d281613275565b925060208401356134e281613275565b929592945050506040919091013590565b60006020828403121561350557600080fd5b81356122f38161328a565b60008060008060008060c0878903121561352957600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000806040838503121561356657600080fd5b823561357181613275565b915060208301356132c681613275565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156135e6576135e66135b6565b500290565b600181811c908216806135ff57607f821691505b60208210810361361f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161364d5761364d6135b6565b5060010190565b60006020828403121561366657600080fd5b81516122f381613275565b60006020828403121561368357600080fd5b5051919050565b60006020828403121561369c57600080fd5b81516122f38161328a565b6000806000606084860312156136bc57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c087890312156136ee57600080fd5b86516136f981613275565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b60008261374557634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561375d5761375d6135b6565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000828210156137fc576137fc6135b6565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156138515784516001600160a01b03168352938301939183019160010161382c565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205400dbfd3f8324a983ba210c5d0c91ac62c8886e1bfadc5fcede4ff055a5913964736f6c634300080f003360806040526012805460ff60b01b191690553480156200001e57600080fd5b50604051620030ca380380620030ca83398101604081905262000041916200024b565b81818181600362000053838262000385565b50600462000062828262000385565b50505050506000620000796200016160201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d5838262000385565b506014620000e4828262000385565b505060128054601680546001600160a01b03199081166001600160a01b03988916179091556a295be96e6406697200000060185568056bc75e2d631000006019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b19169091555062000451565b3390565b6001600160a01b03811681146200017b57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c36200017e565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee6200017e565b816040528381526020925086838588010111156200020b57600080fd5b600091505b838210156200022f578582018301518183018401529082019062000210565b83821115620002415760008385830101525b9695505050505050565b600080600080600060a086880312156200026457600080fd5b8551620002718162000165565b6020870151909550620002848162000165565b6040870151909450620002978162000165565b60608701519093506001600160401b0380821115620002b557600080fd5b620002c389838a0162000194565b93506080880151915080821115620002da57600080fd5b50620002e98882890162000194565b9150509295509295909350565b600181811c908216806200030b57607f821691505b6020821081036200032c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038057600081815260208120601f850160051c810160208610156200035b5750805b601f850160051c820191505b818110156200037c5782815560010162000367565b5050505b505050565b81516001600160401b03811115620003a157620003a16200017e565b620003b981620003b28454620002f6565b8462000332565b602080601f831160018114620003f15760008415620003d85750858301515b600019600386901b1c1916600185901b1785556200037c565b600085815260208120601f198616915b82811015620004225788860151825594840194600190910190840162000401565b5085821015620004415787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c6980620004616000396000f3fe6080604052600436106103395760003560e01c8063715018a6116101ab578063aafd847a116100f7578063e30443bc11610095578063f2fde38b1161006f578063f2fde38b14610a07578063f335567914610a27578063fbcbc0f114610a47578063ffb2c47914610a6757600080fd5b8063e30443bc146109bd578063e7841ec0146109dd578063e7cb7f87146109f257600080fd5b8063bc4c4b37116100d1578063bc4c4b3714610922578063bdd4f29f14610942578063d8032ed314610957578063dd62ed3e1461097757600080fd5b8063aafd847a146108ac578063b22f8a04146108e2578063ba079d491461090257600080fd5b806395d89b4111610164578063a42340691161013e578063a42340691461082b578063a457c2d71461084c578063a8b9d2401461086c578063a9059cbb1461088c57600080fd5b806395d89b41146107d55780639c3372ea146107ea5780639eec101e1461080a57600080fd5b8063715018a61461072c57806374c13fda1461074157806385a6b3ae146107615780638bc1d639146107775780638da5cb5b1461079757806391b89fba146107b557600080fd5b8063313ce567116102855780635183d6fd116102235780636a474002116101fd5780636a474002146106915780636b69163b146106a65780636d48467b146106d657806370a08231146106f657600080fd5b80635183d6fd146105fa5780635a84c5eb146106515780635ebf4db91461067157600080fd5b8063395093511161025f578063395093511461056957806340ffdd801461058957806341808904146105a95780634e7b827f146105ca57600080fd5b8063313ce5671461050d57806331e79db0146105295780633599bb171461054957600080fd5b806318160ddd116102f257806323b872dd116102cc57806323b872dd1461049957806325cd3598146104b957806327ce0147146104d75780633009a609146104f757600080fd5b806318160ddd146104275780631d4ff89a1461043c578063226cfa3d1461046c57600080fd5b806303c833021461034d57806306fdde03146103555780630928847114610380578063095ea7b3146103a057806309bbedde146103d05780631694505e146103ef57600080fd5b3661034857610346610aa2565b005b600080fd5b610346610aa2565b34801561036157600080fd5b5061036a610b35565b604051610377919061279c565b60405180910390f35b34801561038c57600080fd5b5061034661039b366004612809565b610bc7565b3480156103ac57600080fd5b506103c06103bb366004612826565b610c1b565b6040519015158152602001610377565b3480156103dc57600080fd5b50600a545b604051908152602001610377565b3480156103fb57600080fd5b5060155461040f906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b34801561043357600080fd5b506002546103e1565b34801561044857600080fd5b506103c0610457366004612809565b60116020526000908152604090205460ff1681565b34801561047857600080fd5b506103e1610487366004612809565b60176020526000908152604090205481565b3480156104a557600080fd5b506103c06104b4366004612852565b610c32565b3480156104c557600080fd5b506012546001600160a01b031661040f565b3480156104e357600080fd5b506103e16104f2366004612809565b610c9b565b34801561050357600080fd5b506103e1600e5481565b34801561051957600080fd5b5060405160128152602001610377565b34801561053557600080fd5b50610346610544366004612809565b610cf7565b34801561055557600080fd5b506103466105643660046128a1565b610d91565b34801561057557600080fd5b506103c0610584366004612826565b610e32565b34801561059557600080fd5b506103466105a43660046128a1565b610e68565b3480156105b557600080fd5b506012546103c090600160a81b900460ff1681565b3480156105d657600080fd5b506103c06105e5366004612809565b600f6020526000908152604090205460ff1681565b34801561060657600080fd5b5061061a6106153660046128be565b610efe565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610377565b34801561065d57600080fd5b5061034661066c3660046128be565b610f5e565b34801561067d57600080fd5b5061034661068c3660046128be565b610fa0565b34801561069d57600080fd5b50610346610fe2565b3480156106b257600080fd5b506103c06106c1366004612809565b60106020526000908152604090205460ff1681565b3480156106e257600080fd5b506103c06106f1366004612809565b611088565b34801561070257600080fd5b506103e1610711366004612809565b6001600160a01b031660009081526020819052604090205490565b34801561073857600080fd5b506103466110d4565b34801561074d57600080fd5b5060125461040f906001600160a01b031681565b34801561076d57600080fd5b506103e160085481565b34801561078357600080fd5b506103466107923660046128d7565b611148565b3480156107a357600080fd5b506009546001600160a01b031661040f565b3480156107c157600080fd5b506103e16107d0366004612809565b61119d565b3480156107e157600080fd5b5061036a6111a8565b3480156107f657600080fd5b506103466108053660046128a1565b6111b7565b34801561081657600080fd5b506012546103c090600160a01b900460ff1681565b34801561083757600080fd5b506012546103c090600160b01b900460ff1681565b34801561085857600080fd5b506103c0610867366004612826565b61124d565b34801561087857600080fd5b506103e1610887366004612809565b61129c565b34801561089857600080fd5b506103c06108a7366004612826565b6112c8565b3480156108b857600080fd5b506103e16108c7366004612809565b6001600160a01b031660009081526007602052604090205490565b3480156108ee57600080fd5b506103466108fd3660046128d7565b6112d5565b34801561090e57600080fd5b506103c061091d366004612809565b61132a565b34801561092e57600080fd5b506103c061093d3660046128d7565b611376565b34801561094e57600080fd5b506019546103e1565b34801561096357600080fd5b50610346610972366004612809565b6114f7565b34801561098357600080fd5b506103e1610992366004612910565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109c957600080fd5b506103466109d8366004612826565b611543565b3480156109e957600080fd5b50600e546103e1565b3480156109fe57600080fd5b506018546103e1565b348015610a1357600080fd5b50610346610a22366004612809565b6115db565b348015610a3357600080fd5b5060165461040f906001600160a01b031681565b348015610a5357600080fd5b5061061a610a62366004612809565b6116c6565b348015610a7357600080fd5b50610a87610a823660046128be565b611775565b60408051938452602084019290925290820152606001610377565b6000610aad60025490565b11610ab757600080fd5b3415610b3357610aea610ac960025490565b610ad734600160801b61189b565b610ae19190612954565b60055490611924565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b2f9034611924565b6008555b565b606060138054610b4490612976565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7090612976565b8015610bbd5780601f10610b9257610100808354040283529160200191610bbd565b820191906000526020600020905b815481529060010190602001808311610ba057829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bfa5760405162461bcd60e51b8152600401610bf1906129b0565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c28338484611983565b5060015b92915050565b6000610c3f848484611aa7565b610c918433610c8c85604051806060016040528060288152602001612be7602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b0a565b611983565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610ced92610ce892610ce291610cdd919061189b565b611b44565b90611b54565b611b92565b610c2c9190612954565b6009546001600160a01b03163314610d215760405162461bcd60e51b8152600401610bf1906129b0565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d4f908290611ba5565b610d5a600a82611c04565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610dbb5760405162461bcd60e51b8152600401610bf1906129b0565b801515601260169054906101000a900460ff16151503610dda57600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e2790831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c28918590610c8c9086611924565b6009546001600160a01b03163314610e925760405162461bcd60e51b8152600401610bf1906129b0565b801515601260159054906101000a900460ff16151503610eb157600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e2790831515815260200190565b600080600080600080610f10600a5490565b8710610f2f575060009450600019935083925084915081905080610f55565b6000610f3c600a89611d3f565b9050610f47816116c6565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f885760405162461bcd60e51b8152600401610bf1906129b0565b610f9a81670de0b6b3a76400006129e5565b60185550565b6009546001600160a01b03163314610fca5760405162461bcd60e51b8152600401610bf1906129b0565b610fdc81670de0b6b3a76400006129e5565b60195550565b60405162461bcd60e51b815260206004820152606960248201527f424e4549524f5f4469766964656e645f547261636b65723a207769746864726160448201527f774469766964656e642064697361626c65642e20557365207468652027636c6160648201527f696d272066756e6374696f6e206f6e20746865206d61696e204d41474156502060848201526831b7b73a3930b1ba1760b91b60a482015260c401610bf1565b6009546000906001600160a01b031633146110b55760405162461bcd60e51b8152600401610bf1906129b0565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146110fe5760405162461bcd60e51b8152600401610bf1906129b0565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111725760405162461bcd60e51b8152600401610bf1906129b0565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c2c8261129c565b606060148054610b4490612976565b6009546001600160a01b031633146111e15760405162461bcd60e51b8152600401610bf1906129b0565b801515601260149054906101000a900460ff1615150361120057600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e2790831515815260200190565b6000610c283384610c8c85604051806060016040528060258152602001612c0f602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b0a565b6001600160a01b038116600090815260076020526040812054610c2c906112c284610c9b565b90611d72565b6000610c28338484611aa7565b6009546001600160a01b031633146112ff5760405162461bcd60e51b8152600401610bf1906129b0565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b031633146113575760405162461bcd60e51b8152600401610bf1906129b0565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113a35760405162461bcd60e51b8152600401610bf1906129b0565b601254600160b01b900460ff16156113bd57506000610c2c565b6001600160a01b03831660009081526011602052604090205460ff168280156113e35750805b80156113f95750601254600160a81b900460ff16155b15611408576000915050610c2c565b60008161141d5761141885611db4565b611426565b6114268561206d565b905080156114ec576001600160a01b0385166000908152601760205260409020429055811561149a57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c8360405161148d91815260200190565b60405180910390a36114e1565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114d891815260200190565b60405180910390a35b600192505050610c2c565b506000949350505050565b6009546001600160a01b031633146115215760405162461bcd60e51b8152600401610bf1906129b0565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461156d5760405162461bcd60e51b8152600401610bf1906129b0565b6001600160a01b0382166000908152600f602052604090205460ff166115ad576019548110156115b1576115a2600a83611c04565b6115ad826000611ba5565b5050565b6115bb8282611ba5565b60185481106115d0576115ad600a83836123e0565b6115ad600a83611c04565b6009546001600160a01b031633146116055760405162461bcd60e51b8152600401610bf1906129b0565b6001600160a01b03811661166a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bf1565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080806116d8600a87612489565b945060001993506000851261173a57600e5485111561170657600e546116ff9086906124d4565b935061173a565b600e54600a546000911061171b57600061172a565b600e54600a5461172a91611d72565b90506117368682611b54565b9450505b6117438661129c565b925061174e86610c9b565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a54600090819081908015806117955750601254600160b01b900460ff165b156117ab575050600e5460009250829150611894565b600e546000805a90506000805b89841080156117c657508582105b1561188357846117d581612a04565b9550508585106117e457600094505b6000600a60000186815481106117fc576117fc612a1d565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff1661184957611836816001611376565b15611849578161184581612a04565b9250505b8261185381612a04565b93505060005a90508085111561187a576118776118708683611d72565b8790611924565b95505b93506117b89050565b600e85905590975095509193505050505b9193909250565b6000826000036118ad57506000610c2c565b60006118b983856129e5565b9050826118c68583612954565b1461191d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bf1565b9392505050565b6000806119318385612a33565b90508381101561191d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bf1565b6001600160a01b0383166119e55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bf1565b6001600160a01b038216611a465760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bf1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602d60248201527f424e4549524f5f4469766964656e645f547261636b65723a204e6f207472616e60448201526c1cd9995c9cc8185b1b1bddd959609a1b6064820152608401610bf1565b505050565b60008184841115611b2e5760405162461bcd60e51b8152600401610bf1919061279c565b506000611b3b8486612a4b565b95945050505050565b60008181811215610c2c57600080fd5b600080611b618385612a62565b905060008312158015611b745750838112155b80611b895750600083128015611b8957508381125b61191d57600080fd5b600080821215611ba157600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611be4576000611bd28383611d72565b9050611bde8482612511565b50505050565b80821015611b05576000611bf88284611d72565b9050611bde8482612575565b6001600160a01b038116600090815260038301602052604090205460ff16611c2a575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c7491612a4b565b90506000846000018281548110611c8d57611c8d612a1d565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cdc57611cdc612a1d565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d1657611d16612aa3565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d5657611d56612a1d565b6000918252602090912001546001600160a01b03169392505050565b600061191d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b0a565b600080611dc08361129c565b90508015612064576001600160a01b038316600090815260076020526040902054611deb9082611924565b6001600160a01b03808516600090815260076020526040812092909255601254169081611e70576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e60576040519150601f19603f3d011682016040523d82523d6000602084013e611e65565b606091505b505080915050611fca565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efe9190612ab9565b81600081518110611f1157611f11612a1d565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f4557611f45612a1d565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611f8b9060009086908c904290600401612b1a565b6000604051808303818588803b158015611fa457600080fd5b505af193505050508015611fb6575060015b611fc35760009150611fc8565b600191505b505b80612018576001600160a01b038516600090815260076020526040902054611ff29084611d72565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161205391815260200190565b60405180910390a250909392505050565b50600092915050565b6000806120798361129c565b90508015612064576001600160a01b0383166000908152600760205260408120546120a49083611924565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121509190612ab9565b8160008151811061216357612163612a1d565b6001600160a01b03928316602091820292909201015260165482519116908290600190811061219457612194612a1d565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa1580156121ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122129190612b4f565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061224c90600090879030904290600401612b1a565b6000604051808303818588803b15801561226557600080fd5b505af193505050508015612277575060015b6122845760009250612387565b6016546040516370a0823160e01b81523060048201526000916122f79184916001600160a01b0316906370a0823190602401602060405180830381865afa1580156122d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c29190612b4f565b905080156123805760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af1158015612356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237a9190612b68565b50612385565b600093505b505b826123d6576001600160a01b0386166000908152600760205260409020546123af9085611d72565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff1615612425576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166124b45750600019610c2c565b506001600160a01b03166000908152600291909101602052604090205490565b6000806124e18385612b85565b9050600083121580156124f45750838113155b80611b895750600083128015611b89575083811361191d57600080fd5b61251b82826125b9565b612555612536610cdd8360055461189b90919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906124d4565b6001600160a01b0390921660009081526006602052604090209190915550565b61257f8282612698565b61255561259a610cdd8360055461189b90919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b54565b6001600160a01b03821661260f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bf1565b60025461261c9082611924565b6002556001600160a01b0382166000908152602081905260409020546126429082611924565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166126f85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bf1565b61273581604051806060016040528060228152602001612bc5602291396001600160a01b0385166000908152602081905260409020549190611b0a565b6001600160a01b03831660009081526020819052604090205560025461275b9082611d72565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161268c565b600060208083528351808285015260005b818110156127c9578581018301518582016040015282016127ad565b818111156127db576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461280657600080fd5b50565b60006020828403121561281b57600080fd5b813561191d816127f1565b6000806040838503121561283957600080fd5b8235612844816127f1565b946020939093013593505050565b60008060006060848603121561286757600080fd5b8335612872816127f1565b92506020840135612882816127f1565b929592945050506040919091013590565b801515811461280657600080fd5b6000602082840312156128b357600080fd5b813561191d81612893565b6000602082840312156128d057600080fd5b5035919050565b600080604083850312156128ea57600080fd5b82356128f5816127f1565b9150602083013561290581612893565b809150509250929050565b6000806040838503121561292357600080fd5b823561292e816127f1565b91506020830135612905816127f1565b634e487b7160e01b600052601160045260246000fd5b60008261297157634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061298a57607f821691505b6020821081036129aa57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008160001904831182151516156129ff576129ff61293e565b500290565b600060018201612a1657612a1661293e565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008219821115612a4657612a4661293e565b500190565b600082821015612a5d57612a5d61293e565b500390565b600080821280156001600160ff1b0384900385131615612a8457612a8461293e565b600160ff1b8390038412811615612a9d57612a9d61293e565b50500190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612acb57600080fd5b815161191d816127f1565b600081518084526020808501945080840160005b83811015612b0f5781516001600160a01b031687529582019590820190600101612aea565b509495945050505050565b848152608060208201526000612b336080830186612ad6565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b6157600080fd5b5051919050565b600060208284031215612b7a57600080fd5b815161191d81612893565b60008083128015600160ff1b850184121615612ba357612ba361293e565b6001600160ff1b0384018313811615612bbe57612bbe61293e565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122043d53de5ec8cf6048ebaced6486eaac88f399b5ab5fd409cd1a3602d3375cbac64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106104145760003560e01c8063715018a61161021e578063a8b9d24011610123578063deab8aea116100ab578063f27fd2541161007a578063f27fd25414610c3f578063f2fde38b14610c5f578063f5d3c79a14610c7f578063f8b45b0514610c9f578063fc6b151c14610cb557600080fd5b8063deab8aea14610bdf578063e2f4560514610bff578063e7841ec014610c15578063e7cb7f8714610c2a57600080fd5b8063ba079d49116100f2578063ba079d4914610b2e578063bb8d513114610b4e578063bdd4f29f14610b64578063d8032ed314610b79578063dd62ed3e14610b9957600080fd5b8063a8b9d24014610a67578063a9059cbb14610a87578063ad56c13c14610aa7578063b62496f514610afe57600080fd5b80638da5cb5b116101a65780639a7a23d6116101755780639a7a23d6146109d15780639c1b8af5146109f15780639c3372ea14610a075780639ec1037e14610a27578063a457c2d714610a4757600080fd5b80638da5cb5b1461096857806395451c291461098657806395d89b411461099c578063992c58e4146109b157600080fd5b806377a3b609116101ed57806377a3b609146108dd5780637fdde05c146108f3578063868730c714610913578063871c128d146109335780638a8c523c1461095357600080fd5b8063715018a61461086857806372d8edf41461087d57806375829def1461089d57806375f0a874146108bd57600080fd5b80633599bb17116103245780635a84c5eb116102ac57806364b0f6531161027b57806364b0f653146107d35780636843cd84146107e85780636d48467b14610808578063700bb1911461082857806370a082311461084857600080fd5b80635a84c5eb146107535780635d098b38146107735780635ebf4db9146107935780635eee4bae146107b357600080fd5b806349bd5a5e116102f357806349bd5a5e146106ae5780634ada218b146106ce5780634e71d92d146106ef5780634fbee193146107045780635124f8741461073d57600080fd5b80633599bb171461063857806339509351146106585780633f407b841461067857806340ffdd801461068e57600080fd5b80631d0adc07116103a757806323b872dd1161037657806323b872dd146105b257806325cd3598146105d25780632c1f5216146105e757806330bb4cff14610607578063313ce5671461061c57600080fd5b80631d0adc07146105465780631fa70531146105665780631fe70a981461057c5780632307b4411461059257600080fd5b8063095ea7b3116103e3578063095ea7b3146104c15780631694505e146104f157806318160ddd146105115780631a221dbb1461053057600080fd5b806303fd2a451461042057806305ca5f081461045d57806306fdde031461047f57806308dfe8a5146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50600854610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047d610478366004613207565b610cd5565b005b34801561048b57600080fd5b50610494610da6565b6040516104549190613220565b3480156104ad57600080fd5b5061047d6104bc366004613298565b610e38565b3480156104cd57600080fd5b506104e16104dc3660046132d1565b610ec1565b6040519015158152602001610454565b3480156104fd57600080fd5b50600654610440906001600160a01b031681565b34801561051d57600080fd5b506002545b604051908152602001610454565b34801561053c57600080fd5b5061052260175481565b34801561055257600080fd5b5061047d6105613660046132fd565b610ed8565b34801561057257600080fd5b50610522600a5481565b34801561058857600080fd5b5061052260165481565b34801561059e57600080fd5b5061047d6105ad3660046133f0565b610f6f565b3480156105be57600080fd5b506104e16105cd3660046134b2565b611140565b3480156105de57600080fd5b506104406111a9565b3480156105f357600080fd5b50600d54610440906001600160a01b031681565b34801561061357600080fd5b5061052261121c565b34801561062857600080fd5b5060405160128152602001610454565b34801561064457600080fd5b5061047d6106533660046134f3565b61128a565b34801561066457600080fd5b506104e16106733660046132d1565b611317565b34801561068457600080fd5b5061052260095481565b34801561069a57600080fd5b5061047d6106a93660046134f3565b61134d565b3480156106ba57600080fd5b50600754610440906001600160a01b031681565b3480156106da57600080fd5b506008546104e190600160a81b900460ff1681565b3480156106fb57600080fd5b5061047d6113a8565b34801561071057600080fd5b506104e161071f3660046132fd565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561074957600080fd5b5061052260145481565b34801561075f57600080fd5b5061047d61076e366004613207565b611420565b34801561077f57600080fd5b5061047d61078e3660046132fd565b61147b565b34801561079f57600080fd5b5061047d6107ae366004613207565b61150b565b3480156107bf57600080fd5b5061047d6107ce366004613207565b611566565b3480156107df57600080fd5b506105226115a8565b3480156107f457600080fd5b506105226108033660046132fd565b6115f2565b34801561081457600080fd5b506104e16108233660046132fd565b611662565b34801561083457600080fd5b5061047d610843366004613207565b6116d2565b34801561085457600080fd5b506105226108633660046132fd565b6117a4565b34801561087457600080fd5b5061047d6117bf565b34801561088957600080fd5b5061047d6108983660046132fd565b611833565b3480156108a957600080fd5b5061047d6108b83660046132fd565b61188f565b3480156108c957600080fd5b50600e54610440906001600160a01b031681565b3480156108e957600080fd5b5061052260155481565b3480156108ff57600080fd5b5061047d61090e366004613298565b611944565b34801561091f57600080fd5b5061047d61092e3660046134f3565b611999565b34801561093f57600080fd5b5061047d61094e366004613207565b6119d1565b34801561095f57600080fd5b5061047d611a4d565b34801561097457600080fd5b506005546001600160a01b0316610440565b34801561099257600080fd5b5061052260135481565b3480156109a857600080fd5b50610494611acc565b3480156109bd57600080fd5b5061047d6109cc366004613510565b611adb565b3480156109dd57600080fd5b5061047d6109ec366004613298565b611c35565b3480156109fd57600080fd5b5061052260185481565b348015610a1357600080fd5b5061047d610a223660046134f3565b611c6d565b348015610a3357600080fd5b5061047d610a423660046132fd565b611cc9565b348015610a5357600080fd5b506104e1610a623660046132d1565b611d8b565b348015610a7357600080fd5b50610522610a823660046132fd565b611dda565b348015610a9357600080fd5b506104e1610aa23660046132d1565b611e0d565b348015610ab357600080fd5b50610ac7610ac23660046132fd565b611e1a565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610454565b348015610b0a57600080fd5b506104e1610b193660046132fd565b601a6020526000908152604090205460ff1681565b348015610b3a57600080fd5b506104e1610b493660046132fd565b611eaa565b348015610b5a57600080fd5b5061052260125481565b348015610b7057600080fd5b50610522611edd565b348015610b8557600080fd5b5061047d610b943660046132fd565b611f27565b348015610ba557600080fd5b50610522610bb4366004613553565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610beb57600080fd5b50600f54610440906001600160a01b031681565b348015610c0b57600080fd5b5061052260115481565b348015610c2157600080fd5b50610522611fea565b348015610c3657600080fd5b50610522612034565b348015610c4b57600080fd5b50610ac7610c5a366004613207565b61207e565b348015610c6b57600080fd5b5061047d610c7a3660046132fd565b6120bc565b348015610c8b57600080fd5b5061047d610c9a3660046134f3565b6121a7565b348015610cab57600080fd5b5061052260105481565b348015610cc157600080fd5b5061047d610cd0366004613207565b6121df565b6005546001600160a01b03163314610d085760405162461bcd60e51b8152600401610cff90613581565b60405180910390fd5b610d1a81670de0b6b3a76400006135cc565b90506000610d35600954600a5461229490919063ffffffff16565b90506000610d5882610d52600a54866122fa90919063ffffffff16565b9061237c565b90506000610d7583610d52600954876122fa90919063ffffffff16565b9050610d80846123be565b600a54610d8d90836126be565b600a55600954610d9d90826126be565b60095550505050565b606060038054610db5906135eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610de1906135eb565b8015610e2e5780601f10610e0357610100808354040283529160200191610e2e565b820191906000526020600020905b815481529060010190602001808311610e1157829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e625760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000610ece338484612700565b5060015b92915050565b6005546001600160a01b03163314610f025760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b038116600081815260196020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527f3c2a46a28084880d3bc39c8f240a57690614613728ce03d2a8c6dc645892e4fb91015b60405180910390a150565b6005546001600160a01b03163314610f995760405162461bcd60e51b8152600401610cff90613581565b8051825114610fea5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cff565b60c8825111156110475760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610cff565b60005b825181101561113b57600083828151811061106757611067613625565b60200260200101519050600083838151811061108557611085613625565b6020026020010151670de0b6b3a76400006110a091906135cc565b90506110ad338383612825565b600d546001600160a01b031663e30443bc836110c8816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561110e57600080fd5b505af1158015611122573d6000803e3d6000fd5b50505050505080806111339061363b565b91505061104a565b505050565b600061114d84848461292e565b61119f843361119a856040518060600160405280602881526020016138bb602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612e79565b612700565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613654565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613671565b6005546001600160a01b031633146112b45760405162461bcd60e51b8152600401610cff90613581565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b1580156112fc57600080fd5b505af1158015611310573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ece91859061119a9086612294565b6005546001600160a01b031633146113775760405162461bcd60e51b8152600401610cff90613581565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016112e2565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d919061368a565b50565b6005546001600160a01b0316331461144a5760405162461bcd60e51b8152600401610cff90613581565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016112e2565b6005546001600160a01b031633146114a55760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b038116600081815260196020908152604091829020805460ff19166001179055600e80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101610f64565b6005546001600160a01b031633146115355760405162461bcd60e51b8152600401610cff90613581565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016112e2565b6005546001600160a01b031633146115905760405162461bcd60e51b8152600401610cff90613581565b6115a281670de0b6b3a76400006135cc565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561163e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613671565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed2919061368a565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611725573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174991906136a7565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146117e95760405162461bcd60e51b8152600401610cff90613581565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461185d5760405162461bcd60e51b8152600401610cff90613581565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016112e2565b6005546001600160a01b031633146118b95760405162461bcd60e51b8152600401610cff90613581565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561190057600080fd5b505af1158015611914573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601960205260409020805460ff191660011790555061141d816120bc565b6005546001600160a01b0316331461196e5760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016112e2565b6005546001600160a01b031633146119fb5760405162461bcd60e51b8152600401610cff90613581565b62030d408110158015611a115750620f42408111155b611a1a57600080fd5b60185460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601855565b6005546001600160a01b03163314611a775760405162461bcd60e51b8152600401610cff90613581565b600854600160a81b900460ff1615611a8e57600080fd5b6008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610db5906135eb565b6005546001600160a01b03163314611b055760405162461bcd60e51b8152600401610cff90613581565b601486905560158490556013859055601283905560168290556017819055611b3781611b318588612294565b90612294565b600b55601654601454601554611b529291611b319190612294565b600c55600b546101f410801590611b6d57506101f4600c5411155b611bc95760405162461bcd60e51b815260206004820152602760248201527f746f74616c20666565732063616e6e6f74206578636565642035252073656c6c604482015266206f722062757960c81b6064820152608401610cff565b601354601254601454601554601654601754604080519687526020870195909552938501929092526060840152608083015260a08201527ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff9060c00160405180910390a1505050505050565b6005546001600160a01b03163314611c5f5760405162461bcd60e51b8152600401610cff90613581565b611c698282612eb3565b5050565b6005546001600160a01b03163314611c975760405162461bcd60e51b8152600401610cff90613581565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016112e2565b6005546001600160a01b03163314611cf35760405162461bcd60e51b8152600401610cff90613581565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b158015611d3a57600080fd5b505af1158015611d4e573d6000803e3d6000fd5b5050600d546040516338c110ef60e21b81526001600160a01b03858116600483015260006024830152909116925063e30443bc91506044016112e2565b6000610ece338461119a856040518060600160405280602581526020016138e3602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612e79565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611621565b6000610ece33848461292e565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015611e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9691906136d5565b949c939b5091995097509550909350915050565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611691565b600d546040805163bdd4f29f60e01b815290516000926001600160a01b03169163bdd4f29f9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b6005546001600160a01b03163314611f515760405162461bcd60e51b8152600401610cff90613581565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050610f64565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d546040805163e7cb7f8760e01b815290516000926001600160a01b03169163e7cb7f879160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401611e55565b6005546001600160a01b031633146120e65760405162461bcd60e51b8152600401610cff90613581565b6001600160a01b03811661214b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cff565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016112e2565b6005546001600160a01b031633146122095760405162461bcd60e51b8152600401610cff90613581565b61221b81670de0b6b3a76400006135cc565b90506103e860025461222d9190613728565b81101561228f5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610cff565b601055565b6000806122a1838561374a565b9050838110156122f35760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cff565b9392505050565b60008260000361230c57506000610ed2565b600061231883856135cc565b9050826123258583613728565b146122f35760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cff565b60006122f383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f7c565b806000036123c95750565b6123d281612faa565b60006123eb600954600a5461229490919063ffffffff16565b60155490915060019081908190600090819081901561244c5761244960165460145460155461241a919061374a565b612424919061374a565b610d526015546124438b610d52600a54476122fa90919063ffffffff16565b906122fa565b91505b601254156124965761249360175460135460125461246a919061374a565b612474919061374a565b610d526012546124438b610d52600954476122fa90919063ffffffff16565b90505b6124a08282612294565b9250821561250057600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146124f5576040519150601f19603f3d011682016040523d82523d6000602084013e6124fa565b606091505b50909650505b600061251960165460145461229490919063ffffffff16565b60175460135461252891612294565b612532919061374a565b90506000811561254957612546478361237c565b90505b60008161256360135460145461229490919063ffffffff16565b61256d91906135cc565b905060008261258960175460165461229490919063ffffffff16565b61259391906135cc565b905081156125f357600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146125e8576040519150601f19603f3d011682016040523d82523d6000602084013e6125ed565b606091505b50909950505b801561265157600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612646576040519150601f19603f3d011682016040523d82523d6000602084013e61264b565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd08761267d838561374a565b8c801561268757508b5b801561269057508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006122f383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e79565b6001600160a01b0383166127625760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cff565b6001600160a01b0382166127c35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cff565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661284b5760405162461bcd60e51b8152600401610cff90613762565b6001600160a01b0382166128715760405162461bcd60e51b8152600401610cff906137a7565b6128ae81604051806060016040528060268152602001613895602691396001600160a01b0386166000908152602081905260409020549190612e79565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546128dd9082612294565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612818565b6001600160a01b0383166129545760405162461bcd60e51b8152600401610cff90613762565b6001600160a01b03821661297a5760405162461bcd60e51b8152600401610cff906137a7565b6001600160a01b0383166000908152601b60205260408120548190819060ff166129f757600854600160a81b900460ff166129f75760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610cff565b83600003612a1357612a0b86866000612825565b505050505050565b6008546001600160a01b0390811690861603612a3357612a0b86856130fc565b600854600160a01b900460ff16158015612a6657506001600160a01b03861660009081526019602052604090205460ff16155b8015612a8b57506001600160a01b03851660009081526019602052604090205460ff16155b15612d72576001600160a01b038086166000908152601a602052604080822054928916825290205460ff918216911680158015612ac6575081155b15612bd457612ad6888888612825565b600d546001600160a01b031663e30443bc89612af1816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b3757600080fd5b505af1158015612b4b573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088612b6c816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612bb257600080fd5b505af1158015612bc6573d6000803e3d6000fd5b505050505050505050505050565b8115612bee57601254945060135493506017549250612c7a565b8015612c7a576015549450601454935060165492506000612c0e886117a4565b601054909150612c1e888361374a565b1115612c785760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610cff565b505b6000612c90612c89858761374a565b8790612294565b90506000612c9d306117a4565b60115490915081108015908190612ccd57506001600160a01b038b166000908152601a602052604090205460ff16155b15612d14576008805460ff60a01b1916600160a01b1790556000612cf0306117a4565b9050612cfb816123be565b506001600a8190556009556008805460ff60a01b191690555b6000612d26612710610d528c876122fa565b9050612d328a826126be565b99508515612d4f57600954612d479082612294565b600955612d60565b600a54612d5c9082612294565b600a555b612d6b8c3083612825565b5050505050505b612d7d868686612825565b600d546001600160a01b031663e30443bc87612d98816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612dde57600080fd5b505af1158015612df2573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905086612e13816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612e5957600080fd5b505af1158015612e6d573d6000803e3d6000fd5b50505050505050505050565b60008184841115612e9d5760405162461bcd60e51b8152600401610cff9190613220565b506000612eaa84866137ea565b95945050505050565b6001600160a01b0382166000908152601a60205260409020805460ff19168215801591909117909155612f4057600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612f2757600080fd5b505af1158015612f3b573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60008183612f9d5760405162461bcd60e51b8152600401610cff9190613220565b506000612eaa8486613728565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612fdf57612fdf613625565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305c9190613654565b8160018151811061306f5761306f613625565b6001600160a01b0392831660209182029290920101526006546130959130911684612700565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906130ce908590600090869030904290600401613801565b600060405180830381600087803b1580156130e857600080fd5b505af1158015612a0b573d6000803e3d6000fd5b6001600160a01b03821661315c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cff565b61319981604051806060016040528060228152602001613873602291396001600160a01b0385166000908152602081905260409020549190612e79565b6001600160a01b0383166000908152602081905260409020556002546131bf90826126be565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006020828403121561321957600080fd5b5035919050565b600060208083528351808285015260005b8181101561324d57858101830151858201604001528201613231565b8181111561325f576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461141d57600080fd5b801515811461141d57600080fd5b600080604083850312156132ab57600080fd5b82356132b681613275565b915060208301356132c68161328a565b809150509250929050565b600080604083850312156132e457600080fd5b82356132ef81613275565b946020939093013593505050565b60006020828403121561330f57600080fd5b81356122f381613275565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156133595761335961331a565b604052919050565b600067ffffffffffffffff82111561337b5761337b61331a565b5060051b60200190565b600082601f83011261339657600080fd5b813560206133ab6133a683613361565b613330565b82815260059290921b840181019181810190868411156133ca57600080fd5b8286015b848110156133e557803583529183019183016133ce565b509695505050505050565b6000806040838503121561340357600080fd5b823567ffffffffffffffff8082111561341b57600080fd5b818501915085601f83011261342f57600080fd5b8135602061343f6133a683613361565b82815260059290921b8401810191818101908984111561345e57600080fd5b948201945b8386101561348557853561347681613275565b82529482019490820190613463565b9650508601359250508082111561349b57600080fd5b506134a885828601613385565b9150509250929050565b6000806000606084860312156134c757600080fd5b83356134d281613275565b925060208401356134e281613275565b929592945050506040919091013590565b60006020828403121561350557600080fd5b81356122f38161328a565b60008060008060008060c0878903121561352957600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000806040838503121561356657600080fd5b823561357181613275565b915060208301356132c681613275565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156135e6576135e66135b6565b500290565b600181811c908216806135ff57607f821691505b60208210810361361f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161364d5761364d6135b6565b5060010190565b60006020828403121561366657600080fd5b81516122f381613275565b60006020828403121561368357600080fd5b5051919050565b60006020828403121561369c57600080fd5b81516122f38161328a565b6000806000606084860312156136bc57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c087890312156136ee57600080fd5b86516136f981613275565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b60008261374557634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561375d5761375d6135b6565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000828210156137fc576137fc6135b6565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156138515784516001600160a01b03168352938301939183019160010161382c565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212205400dbfd3f8324a983ba210c5d0c91ac62c8886e1bfadc5fcede4ff055a5913964736f6c634300080f0033

Deployed Bytecode Sourcemap

25354:19789:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25518:64;;;;;;;;;;-1:-1:-1;25518:64:0;;;;-1:-1:-1;;;;;25518:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25518:64:0;;;;;;;;42005:443;;;;;;;;;;-1:-1:-1;42005:443:0;;;;;:::i;:::-;;:::i;:::-;;5624:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31307:181::-;;;;;;;;;;-1:-1:-1;31307:181:0;;;;;:::i;:::-;;:::i;6679:210::-;;;;;;;;;;-1:-1:-1;6679:210:0;;;;;:::i;:::-;;:::i;:::-;;;2140:14:1;;2133:22;2115:41;;2103:2;2088:18;6679:210:0;1975:187:1;25433:41:0;;;;;;;;;;-1:-1:-1;25433:41:0;;;;-1:-1:-1;;;;;25433:41:0;;;5945:108;;;;;;;;;;-1:-1:-1;6033:12:0;;5945:108;;;2548:25:1;;;2536:2;2521:18;5945:108:0;2402:177:1;26256:29:0;;;;;;;;;;;;;;;;31056:199;;;;;;;;;;-1:-1:-1;31056:199:0;;;;;:::i;:::-;;:::i;25696:28::-;;;;;;;;;;;;;;;;26221;;;;;;;;;;;;;;;;44503:637;;;;;;;;;;-1:-1:-1;44503:637:0;;;;;:::i;:::-;;:::i;6897:454::-;;;;;;;;;;-1:-1:-1;6897:454:0;;;;;:::i;:::-;;:::i;41169:114::-;;;;;;;;;;;;;:::i;25806:44::-;;;;;;;;;;-1:-1:-1;25806:44:0;;;;-1:-1:-1;;;;;25806:44:0;;;34772:141;;;;;;;;;;;;;:::i;30479:93::-;;;;;;;;;;-1:-1:-1;30479:93:0;;30562:2;6172:36:1;;6160:2;6145:18;30479:93:0;6030:184:1;37115:119:0;;;;;;;;;;-1:-1:-1;37115:119:0;;;;;:::i;:::-;;:::i;7359:300::-;;;;;;;;;;-1:-1:-1;7359:300:0;;;;;:::i;:::-;;:::i;25660:29::-;;;;;;;;;;;;;;;;32863:121;;;;;;;;;;-1:-1:-1;32863:121:0;;;;;:::i;:::-;;:::i;25483:28::-;;;;;;;;;;-1:-1:-1;25483:28:0;;;;-1:-1:-1;;;;;25483:28:0;;;25617:34;;;;;;;;;;-1:-1:-1;25617:34:0;;;;-1:-1:-1;;;25617:34:0;;;;;;36484:103;;;;;;;;;;;;;:::i;34921:126::-;;;;;;;;;;-1:-1:-1;34921:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;35011:28:0;34987:4;35011:28;;;:19;:28;;;;;;;;;34921:126;26148:31;;;;;;;;;;;;;;;;41631:183;;;;;;;;;;-1:-1:-1;41631:183:0;;;;;:::i;:::-;;:::i;30813:205::-;;;;;;;;;;-1:-1:-1;30813:205:0;;;;;:::i;:::-;;:::i;41822:175::-;;;;;;;;;;-1:-1:-1;41822:175:0;;;;;:::i;:::-;;:::i;32435:120::-;;;;;;;;;;-1:-1:-1;32435:120:0;;;;;:::i;:::-;;:::i;36733:142::-;;;;;;;;;;;;;:::i;35247:171::-;;;;;;;;;;-1:-1:-1;35247:171:0;;;;;:::i;:::-;;:::i;37242:185::-;;;;;;;;;;-1:-1:-1;37242:185:0;;;;;:::i;:::-;;:::i;36066:410::-;;;;;;;;;;-1:-1:-1;36066:410:0;;;;;:::i;:::-;;:::i;6061:177::-;;;;;;;;;;-1:-1:-1;6061:177:0;;;;;:::i;:::-;;:::i;13038:148::-;;;;;;;;;;;;;:::i;31537:127::-;;;;;;;;;;-1:-1:-1;31537:127:0;;;;;:::i;:::-;;:::i;33529:208::-;;;;;;;;;;-1:-1:-1;33529:208:0;;;;;:::i;:::-;;:::i;25859:38::-;;;;;;;;;;-1:-1:-1;25859:38:0;;;;-1:-1:-1;;;;;25859:38:0;;;26186:28;;;;;;;;;;;;;;;;31940:170;;;;;;;;;;-1:-1:-1;31940:170:0;;;;;:::i;:::-;;:::i;36883:109::-;;;;;;;;;;-1:-1:-1;36883:109:0;;;;;:::i;:::-;;:::i;33280:241::-;;;;;;;;;;-1:-1:-1;33280:241:0;;;;;:::i;:::-;;:::i;30617:151::-;;;;;;;;;;;;;:::i;12824:79::-;;;;;;;;;;-1:-1:-1;12889:6:0;;-1:-1:-1;;;;;12889:6:0;12824:79;;26109:32;;;;;;;;;;;;;;;;5732:104;;;;;;;;;;;;;:::i;33745:1019::-;;;;;;;;;;-1:-1:-1;33745:1019:0;;;;;:::i;:::-;;:::i;32563:163::-;;;;;;;;;;-1:-1:-1;32563:163:0;;;;;:::i;:::-;;:::i;26343:40::-;;;;;;;;;;;;;;;;32734:121;;;;;;;;;;-1:-1:-1;32734:121:0;;;;;:::i;:::-;;:::i;31702:176::-;;;;;;;;;;-1:-1:-1;31702:176:0;;;;;:::i;:::-;;:::i;7667:400::-;;;;;;;;;;-1:-1:-1;7667:400:0;;;;;:::i;:::-;;:::i;35055:184::-;;;;;;;;;;-1:-1:-1;35055:184:0;;;;;:::i;:::-;;:::i;6246:216::-;;;;;;;;;;-1:-1:-1;6246:216:0;;;;;:::i;:::-;;:::i;35426:307::-;;;;;;;;;;-1:-1:-1;35426:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7518:32:1;;;7500:51;;7582:2;7567:18;;7560:34;;;;7610:18;;;7603:34;;;;7668:2;7653:18;;7646:34;7711:3;7696:19;;7689:35;7538:3;7740:19;;7733:35;7487:3;7472:19;35426:307:0;7217:557:1;26506:57:0;;;;;;;;;;-1:-1:-1;26506:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37435:127;;;;;;;;;;-1:-1:-1;37435:127:0;;;;;:::i;:::-;;:::i;26073:29::-;;;;;;;;;;;;;;;;41461:154;;;;;;;;;;;;;:::i;41003:158::-;;;;;;;;;;-1:-1:-1;41003:158:0;;;;;:::i;:::-;;:::i;6470:201::-;;;;;;;;;;-1:-1:-1;6470:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6636:18:0;;;6604:7;6636:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6470:201;25904:36;;;;;;;;;;-1:-1:-1;25904:36:0;;;;-1:-1:-1;;;;;25904:36:0;;;26033:33;;;;;;;;;;;;;;;;36595:130;;;;;;;;;;;;;:::i;41291:162::-;;;;;;;;;;;;;:::i;35741:317::-;;;;;;;;;;-1:-1:-1;35741:317:0;;;;;:::i;:::-;;:::i;13194:281::-;;;;;;;;;;-1:-1:-1;13194:281:0;;;;;:::i;:::-;;:::i;37000:107::-;;;;;;;;;;-1:-1:-1;37000:107:0;;;;;:::i;:::-;;:::i;26002:24::-;;;;;;;;;;;;;;;;32180:221;;;;;;;;;;-1:-1:-1;32180:221:0;;;;;:::i;:::-;;:::i;42005:443::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;;;;;;;;;42093:17:::1;:6:::0;42103::::1;42093:17;:::i;:::-;42084:26;;42121:19;42143:25;42157:10;;42143:9;;:13;;:25;;;;:::i;:::-;42121:47;;42179:15;42197:38;42223:11;42197:21;42208:9;;42197:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;42179:56;;42246:16;42265:39;42292:11;42265:22;42276:10;;42265:6;:10;;:22;;;;:::i;:39::-;42246:58;;42317:28;42338:6;42317:20;:28::i;:::-;42370:9;::::0;:22:::1;::::0;42384:7;42370:13:::1;:22::i;:::-;42358:9;:34:::0;42416:10:::1;::::0;:24:::1;::::0;42431:8;42416:14:::1;:24::i;:::-;42403:10;:37:::0;-1:-1:-1;;;;42005:443:0:o;5624:100::-;5678:13;5711:5;5704:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5624:100;:::o;31307:181::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31391:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;31391:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31446:34;;2115:41:1;;;31446:34:0::1;::::0;2088:18:1;31446:34:0::1;;;;;;;31307:181:::0;;:::o;6679:210::-;6798:4;6820:39;210:10;6843:7;6852:6;6820:8;:39::i;:::-;-1:-1:-1;6877:4:0;6679:210;;;;;:::o;31056:199::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31128:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;31128:34:0::1;31158:4;31128:34;::::0;;31173:13:::1;:31:::0;;-1:-1:-1;;;;;;31173:31:0::1;::::0;::::1;::::0;;31220:27;;160:51:1;;;31220:27:0::1;::::0;133:18:1;31220:27:0::1;;;;;;;;31056:199:::0;:::o;44503:637::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;44675:6:::1;:13;44650:14;:21;:38;44642:80;;;::::0;-1:-1:-1;;;44642:80:0;;9425:2:1;44642:80:0::1;::::0;::::1;9407:21:1::0;9464:2;9444:18;;;9437:30;9503:32;9483:18;;;9476:60;9553:18;;44642:80:0::1;9223:354:1::0;44642:80:0::1;44766:3;44741:14;:21;:28;;44733:75;;;::::0;-1:-1:-1;;;44733:75:0;;9784:2:1;44733:75:0::1;::::0;::::1;9766:21:1::0;9823:2;9803:18;;;9796:30;9862:34;9842:18;;;9835:62;-1:-1:-1;;;9913:18:1;;;9906:32;9955:19;;44733:75:0::1;9582:398:1::0;44733:75:0::1;44824:9;44819:314;44843:14;:21;44839:1;:25;44819:314;;;44886:14;44903;44918:1;44903:17;;;;;;;;:::i;:::-;;;;;;;44886:34;;44935:21;44959:6;44966:1;44959:9;;;;;;;;:::i;:::-;;;;;;;44972:6;44959:20;;;;:::i;:::-;44935:44;;44994:50;45010:10;45022:6;45030:13;44994:15;:50::i;:::-;45059:15;::::0;-1:-1:-1;;;;;45059:15:0::1;:26;45094:6:::0;45103:17:::1;45094:6:::0;45103:9:::1;:17::i;:::-;45059:62;::::0;-1:-1:-1;;;;;;45059:62:0::1;::::0;;;;;;-1:-1:-1;;;;;10317:32:1;;;45059:62:0::1;::::0;::::1;10299:51:1::0;10366:18;;;10359:34;10272:18;;45059:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44871:262;;44866:3;;;;;:::i;:::-;;;;44819:314;;;;44503:637:::0;;:::o;6897:454::-;7037:4;7054:36;7064:6;7072:9;7083:6;7054:9;:36::i;:::-;7101:220;7124:6;210:10;7172:138;7228:6;7172:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7172:19:0;;;;;;:11;:19;;;;;;;;210:10;7172:33;;;;;;;;;;:37;:138::i;:::-;7101:8;:220::i;:::-;-1:-1:-1;7339:4:0;6897:454;;;;;:::o;41169:114::-;41243:15;;:32;;;-1:-1:-1;;;41243:32:0;;;;41216:7;;-1:-1:-1;;;;;41243:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41236:39;;41169:114;:::o;34772:141::-;34862:15;;:43;;;-1:-1:-1;;;34862:43:0;;;;34835:7;;-1:-1:-1;;;;;34862:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37115:119::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;37185:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;37185:41:0;;2140:14:1;;2133:22;37185:41:0::1;::::0;::::1;2115::1::0;-1:-1:-1;;;;;37185:15:0;;::::1;::::0;:34:::1;::::0;2088:18:1;;37185:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37115:119:::0;:::o;7359:300::-;210:10;7474:4;7568:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7568:34:0;;;;;;;;;;7474:4;;7496:133;;7546:7;;7568:50;;7607:10;7568:38;:50::i;32863:121::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;32933:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;32933:43:0;;2140:14:1;;2133:22;32933:43:0::1;::::0;::::1;2115:41:1::0;-1:-1:-1;;;;;32933:15:0;;::::1;::::0;:36:::1;::::0;2088:18:1;;32933:43:0::1;1975:187:1::0;36484:103:0;36521:15;;:58;;-1:-1:-1;;;36521:58:0;;36560:10;36521:58;;;11173:51:1;36521:15:0;11240:18:1;;;11233:50;-1:-1:-1;;;;;36521:15:0;;;;:30;;11146:18:1;;36521:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36484:103::o;41631:183::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;41745:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;41745:61:0;;::::1;::::0;::::1;2548:25:1::0;;;-1:-1:-1;;;;;41745:15:0;;::::1;::::0;:54:::1;::::0;2521:18:1;;41745:61:0::1;2402:177:1::0;30813:205:0;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30887:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;30887:34:0::1;30917:4;30887:34;::::0;;30932:15:::1;:33:::0;;-1:-1:-1;;;;;;30932:33:0::1;::::0;::::1;::::0;;30981:29;;160:51:1;;;30981:29:0::1;::::0;133:18:1;30981:29:0::1;14:203:1::0;41822:175:0;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;41932:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;41932:57:0;;::::1;::::0;::::1;2548:25:1::0;;;-1:-1:-1;;;;;41932:15:0;;::::1;::::0;:50:::1;::::0;2521:18:1;;41932:57:0::1;2402:177:1::0;32435:120:0;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;32530:17:::1;:6:::0;32540::::1;32530:17;:::i;:::-;32509:18;:38:::0;-1:-1:-1;32435:120:0:o;36733:142::-;36826:15;;:41;;;-1:-1:-1;;;36826:41:0;;;;36799:7;;-1:-1:-1;;;;;36826:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;35247:171;35376:15;;:34;;-1:-1:-1;;;35376:34:0;;-1:-1:-1;;;;;178:32:1;;;35376:34:0;;;160:51:1;35344:7:0;;35376:15;;:25;;133:18:1;;35376:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37242:185::-;37371:15;;:48;;-1:-1:-1;;;37371:48:0;;-1:-1:-1;;;;;178:32:1;;;37371:48:0;;;160:51:1;37342:4:0;;37371:15;;:39;;133:18:1;;37371:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36066:410::-;36248:15;;:28;;-1:-1:-1;;;;;;36248:28:0;;;;;2548:25:1;;;36146:18:0;;;;;;-1:-1:-1;;;;;36248:15:0;;:23;;2521:18:1;;36248:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36292:176;;;12086:25:1;;;12142:2;12127:18;;12120:34;;;12170:18;;;12163:34;;;12228:2;12213:18;;12206:34;;;36131:145:0;;-1:-1:-1;36131:145:0;;-1:-1:-1;36131:145:0;-1:-1:-1;36448:9:0;;36410:5;;36292:176;;12073:3:1;12058:19;36292:176:0;;;;;;;36120:356;;;36066:410;:::o;6061:177::-;-1:-1:-1;;;;;6212:18:0;6180:7;6212:18;;;;;;;;;;;;6061:177::o;13038:148::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;13129:6:::1;::::0;13108:40:::1;::::0;13145:1:::1;::::0;-1:-1:-1;;;;;13129:6:0::1;::::0;13108:40:::1;::::0;13145:1;;13108:40:::1;13159:6;:19:::0;;-1:-1:-1;;;;;;13159:19:0::1;::::0;;13038:148::o;31537:127::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;31611:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31611:45:0;;-1:-1:-1;;;;;178:32:1;;;31611:45:0::1;::::0;::::1;160:51:1::0;31611:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;31611:45:0::1;14:203:1::0;33529:208:0;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;33598:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;33598:46:0;;-1:-1:-1;;;;;178:32:1;;;33598:46:0::1;::::0;::::1;160:51:1::0;33598:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33598:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;33655:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;33655:36:0::1;33687:4;33655:36;::::0;;-1:-1:-1;33702:27:0::1;33675:8:::0;33702:17:::1;:27::i;31940:170::-:0;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32052:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;32052:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31940:170::o;36883:109::-;36937:15;;:47;;-1:-1:-1;;;36937:47:0;;36966:10;36937:47;;;11173:51:1;11267:14;;11260:22;11240:18;;;11233:50;-1:-1:-1;;;;;36937:15:0;;;;:28;;11146:18:1;;36937:47:0;10989:300:1;33280:241:0;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;33378:6:::1;33366:8;:18;;:41;;;;;33400:7;33388:8;:19;;33366:41;33358:50;;;::::0;::::1;;33458:16;::::0;33424:51:::1;::::0;33448:8;;33424:51:::1;::::0;;;::::1;33486:16;:27:::0;33280:241::o;30617:151::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;30681:14:::1;::::0;-1:-1:-1;;;30681:14:0;::::1;;;30680:15;30672:24;;;::::0;::::1;;30707:14;:21:::0;;-1:-1:-1;;;;30707:21:0::1;-1:-1:-1::0;;;30707:21:0::1;::::0;;30744:16:::1;::::0;::::1;::::0;30707:21;;30744:16:::1;30617:151::o:0;5732:104::-;5788:13;5821:7;5814:14;;;;;:::i;33745:1019::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;33981:16:::1;:31:::0;;;34023:13:::1;:26:::0;;;34060:17:::1;:33:::0;;;34104:14:::1;:28:::0;;;34143:13:::1;:26:::0;;;34180:14:::1;:28:::0;;;34237:85:::1;34197:11:::0;34237:51:::1;34121:11:::0;34080:13;34237:32:::1;:51::i;:::-;:69:::0;::::1;:85::i;:::-;34221:13;:101:::0;34418:13:::1;::::0;34382:16:::1;::::0;34350:13:::1;::::0;:82:::1;::::0;34418:13;34350:49:::1;::::0;:13;:31:::1;:49::i;:82::-;34335:12;:97:::0;34453:13:::1;::::0;34470:3:::1;-1:-1:-1::0;34453:20:0;::::1;::::0;:43:::1;;;34493:3;34477:12;;:19;;34453:43;34445:95;;;::::0;-1:-1:-1;;;34445:95:0;;12742:2:1;34445:95:0::1;::::0;::::1;12724:21:1::0;12781:2;12761:18;;;12754:30;12820:34;12800:18;;;12793:62;-1:-1:-1;;;12871:18:1;;;12864:37;12918:19;;34445:95:0::1;12540:403:1::0;34445:95:0::1;34583:17;::::0;34615:14:::1;::::0;34644:16:::1;::::0;34675:13:::1;::::0;34703::::1;::::0;34731:14:::1;::::0;34558:198:::1;::::0;;13235:25:1;;;13291:2;13276:18;;13269:34;;;;13319:18;;;13312:34;;;;13377:2;13362:18;;13355:34;13420:3;13405:19;;13398:35;13464:3;13449:19;;13442:35;34558:198:0::1;::::0;13222:3:1;13207:19;34558:198:0::1;;;;;;;33745:1019:::0;;;;;;:::o;32563:163::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;32677:41:::1;32706:4;32712:5;32677:28;:41::i;:::-;32563:163:::0;;:::o;32734:121::-;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;32804:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;32804:43:0;;2140:14:1;;2133:22;32804:43:0::1;::::0;::::1;2115:41:1::0;-1:-1:-1;;;;;32804:15:0;;::::1;::::0;:36:::1;::::0;2088:18:1;;32804:43:0::1;1975:187:1::0;31702:176:0;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;31776:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31776:45:0;;-1:-1:-1;;;;;178:32:1;;;31776:45:0::1;::::0;::::1;160:51:1::0;31776:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;31776:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31832:15:0::1;::::0;:38:::1;::::0;-1:-1:-1;;;31832:38:0;;-1:-1:-1;;;;;10317:32:1;;;31832:38:0::1;::::0;::::1;10299:51:1::0;31832:15:0::1;10366:18:1::0;;;10359:34;31832:15:0;;::::1;::::0;-1:-1:-1;31832:26:0::1;::::0;-1:-1:-1;10272:18:1;;31832:38:0::1;10117:282:1::0;7667:400:0;7787:4;7809:228;210:10;7859:7;7881:145;7938:15;7881:145;;;;;;;;;;;;;;;;;210:10;7881:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7881:34:0;;;;;;;;;;;;:38;:145::i;35055:184::-;35184:15;;:47;;-1:-1:-1;;;35184:47:0;;-1:-1:-1;;;;;178:32:1;;;35184:47:0;;;160:51:1;35152:7:0;;35184:15;;:38;;133:18:1;;35184:47:0;14:203:1;6246:216:0;6368:4;6390:42;210:10;6414:9;6425:6;6390:9;:42::i;35426:307::-;35690:15;;:35;;-1:-1:-1;;;35690:35:0;;-1:-1:-1;;;;;178:32:1;;;35690:35:0;;;160:51:1;35540:7:0;;;;;;;;;;;;35690:15;;;;:26;;133:18:1;;35690:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35683:42;;;;-1:-1:-1;35683:42:0;;-1:-1:-1;35683:42:0;-1:-1:-1;35683:42:0;-1:-1:-1;35683:42:0;;-1:-1:-1;35426:307:0;-1:-1:-1;;35426:307:0:o;37435:127::-;37519:15;;:35;;-1:-1:-1;;;37519:35:0;;-1:-1:-1;;;;;178:32:1;;;37519:35:0;;;160:51:1;37495:4:0;;37519:15;;:26;;133:18:1;;37519:35:0;14:203:1;41461:154:0;41555:15;;:52;;;-1:-1:-1;;;41555:52:0;;;;41528:7;;-1:-1:-1;;;;;41555:15:0;;:50;;:52;;;;;;;;;;;;;;:15;:52;;;;;;;;;;;;;;41003:158;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;41073:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;41073:40:0;;-1:-1:-1;;;;;178:32:1;;;41073:40:0::1;::::0;::::1;160:51:1::0;41073:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;41073:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41129:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;41129:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;41129:24:0::1;14:203:1::0;36595:130:0;36678:15;;:39;;;-1:-1:-1;;;36678:39:0;;;;36651:7;;-1:-1:-1;;;;;36678:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;41291:162;41389:15;;:56;;;-1:-1:-1;;;41389:56:0;;;;41362:7;;-1:-1:-1;;;;;41389:15:0;;:54;;:56;;;;;;;;;;;;;;:15;:56;;;;;;;;;;;;;;35741:317;36010:15;;:40;;-1:-1:-1;;;36010:40:0;;;;;2548:25:1;;;35860:7:0;;;;;;;;;;;;-1:-1:-1;;;;;36010:15:0;;;;:33;;2521:18:1;;36010:40:0;2402:177:1;13194:281:0;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13297:22:0;::::1;13275:110;;;::::0;-1:-1:-1;;;13275:110:0;;14539:2:1;13275:110:0::1;::::0;::::1;14521:21:1::0;14578:2;14558:18;;;14551:30;14617:34;14597:18;;;14590:62;-1:-1:-1;;;14668:18:1;;;14661:36;14714:19;;13275:110:0::1;14337:402:1::0;13275:110:0::1;13422:6;::::0;13401:38:::1;::::0;-1:-1:-1;;;;;13401:38:0;;::::1;::::0;13422:6:::1;::::0;13401:38:::1;::::0;13422:6:::1;::::0;13401:38:::1;13450:6;:17:::0;;-1:-1:-1;;;;;;13450:17:0::1;-1:-1:-1::0;;;;;13450:17:0;;;::::1;::::0;;;::::1;::::0;;13194:281::o;37000:107::-;37053:15;;:46;;-1:-1:-1;;;37053:46:0;;37081:10;37053:46;;;11173:51:1;11267:14;;11260:22;11240:18;;;11233:50;-1:-1:-1;;;;;37053:15:0;;;;:27;;11146:18:1;;37053:46:0;10989:300:1;32180:221:0;12951:6;;-1:-1:-1;;;;;12951:6:0;210:10;12951:22;12943:67;;;;-1:-1:-1;;;12943:67:0;;;;;;;:::i;:::-;32255:16:::1;:5:::0;32264:6:::1;32255:16;:::i;:::-;32247:24;;32314:4;32299:12;;:19;;;;:::i;:::-;32290:5;:28;;32282:83;;;::::0;-1:-1:-1;;;32282:83:0;;15168:2:1;32282:83:0::1;::::0;::::1;15150:21:1::0;15207:2;15187:18;;;15180:30;15246:34;15226:18;;;15219:62;-1:-1:-1;;;15297:18:1;;;15290:40;15347:19;;32282:83:0::1;14966:406:1::0;32282:83:0::1;32376:9;:17:::0;32180:221::o;10850:181::-;10908:7;;10940:5;10944:1;10940;:5;:::i;:::-;10928:17;;10969:1;10964;:6;;10956:46;;;;-1:-1:-1;;;10956:46:0;;15712:2:1;10956:46:0;;;15694:21:1;15751:2;15731:18;;;15724:30;15790:29;15770:18;;;15763:57;15837:18;;10956:46:0;15510:351:1;10956:46:0;11022:1;10850:181;-1:-1:-1;;;10850:181:0:o;11417:250::-;11475:7;11499:1;11504;11499:6;11495:47;;-1:-1:-1;11529:1:0;11522:8;;11495:47;11554:9;11566:5;11570:1;11566;:5;:::i;:::-;11554:17;-1:-1:-1;11599:1:0;11590:5;11594:1;11554:17;11590:5;:::i;:::-;:10;11582:56;;;;-1:-1:-1;;;11582:56:0;;16068:2:1;11582:56:0;;;16050:21:1;16107:2;16087:18;;;16080:30;16146:34;16126:18;;;16119:62;-1:-1:-1;;;16197:18:1;;;16190:31;16238:19;;11582:56:0;15866:397:1;11675:132:0;11733:7;11760:39;11764:1;11767;11760:39;;;;;;;;;;;;;;;;;:3;:39::i;42456:2039::-;42525:6;42535:1;42525:11;42521:50;;42456:2039;:::o;42521:50::-;42581:24;42598:6;42581:16;:24::i;:::-;42616:19;42638:25;42652:10;;42638:9;;:13;;:25;;;;:::i;:::-;42879:13;;42616:47;;-1:-1:-1;42691:4:0;;;;;;42676:12;;;;;;42879:17;42875:265;;42932:196;43114:13;;43095:16;;43079:13;;:32;;;;:::i;:::-;:48;;;;:::i;:::-;42932:128;43046:13;;42932:95;43015:11;42932:64;42986:9;;42932:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:196::-;42913:215;;42875:265;43154:14;;:18;43150:272;;43209:201;43395:14;;43375:17;;43358:14;;:34;;;;:::i;:::-;:51;;;;:::i;:::-;43209:130;43324:14;;43209:96;43293:11;43209:65;43263:10;;43209:35;:53;;:65;;;;:::i;:201::-;43189:221;;43150:272;43444:39;:16;43465:17;43444:20;:39::i;:::-;43432:51;-1:-1:-1;43500:13:0;;43496:111;;43552:15;;43544:51;;-1:-1:-1;;;;;43552:15:0;;;;43581:9;;43544:51;;;;43581:9;43552:15;43544:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43530:65:0;;-1:-1:-1;;43496:111:0;43627:21;43704:35;43725:13;;43704:16;;:20;;:35;;;;:::i;:::-;43673:14;;43651:17;;:37;;:21;:37::i;:::-;:88;;;;:::i;:::-;43627:112;-1:-1:-1;43752:19:0;43786:17;;43782:104;;43834:40;:21;43860:13;43834:25;:40::i;:::-;43820:54;;43782:104;43896:23;43964:11;43922:39;43943:17;;43922:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;43896:79;;43986:21;44046:11;44010:33;44028:14;;44010:13;;:17;;:33;;;;:::i;:::-;:47;;;;:::i;:::-;43986:71;-1:-1:-1;44074:19:0;;44070:126;;44135:15;;44127:57;;-1:-1:-1;;;;;44135:15:0;;;;44164;;44127:57;;;;44164:15;44135;44127:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44110:74:0;;-1:-1:-1;;44070:126:0;44210:17;;44206:120;;44269:13;;44261:53;;-1:-1:-1;;;;;44269:13:0;;;;44296;;44261:53;;;;44296:13;44269;44261:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44244:70:0;;-1:-1:-1;;44206:120:0;44343:144;44371:9;44395:31;44413:13;44395:15;:31;:::i;:::-;44441:7;:21;;;;;44452:10;44441:21;:35;;;;;44466:10;44441:35;44343:144;;;16674:25:1;;;16730:2;16715:18;;16708:34;;;;16785:14;16778:22;16758:18;;;16751:50;16662:2;16647:18;44343:144:0;;;;;;;42510:1985;;;;;;;;;;;42456:2039;:::o;11039:136::-;11097:7;11124:43;11128:1;11131;11124:43;;;;;;;;;;;;;;;;;:3;:43::i;9542:380::-;-1:-1:-1;;;;;9678:19:0;;9670:68;;;;-1:-1:-1;;;9670:68:0;;17014:2:1;9670:68:0;;;16996:21:1;17053:2;17033:18;;;17026:30;17092:34;17072:18;;;17065:62;-1:-1:-1;;;17143:18:1;;;17136:34;17187:19;;9670:68:0;16812:400:1;9670:68:0;-1:-1:-1;;;;;9757:21:0;;9749:68;;;;-1:-1:-1;;;9749:68:0;;17419:2:1;9749:68:0;;;17401:21:1;17458:2;17438:18;;;17431:30;17497:34;17477:18;;;17470:62;-1:-1:-1;;;17548:18:1;;;17541:32;17590:19;;9749:68:0;17217:398:1;9749:68:0;-1:-1:-1;;;;;9830:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9882:32;;2548:25:1;;;9882:32:0;;2521:18:1;9882:32:0;;;;;;;;9542:380;;;:::o;8075:610::-;-1:-1:-1;;;;;8215:20:0;;8207:70;;;;-1:-1:-1;;;8207:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8296:23:0;;8288:71;;;;-1:-1:-1;;;8288:71:0;;;;;;;:::i;:::-;8452:108;8488:6;8452:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8452:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;8432:17:0;;;:9;:17;;;;;;;;;;;:128;;;;8594:20;;;;;;;:32;;8619:6;8594:24;:32::i;:::-;-1:-1:-1;;;;;8571:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8642:35;2548:25:1;;;8571:20:0;;8642:35;;;;;;2521:18:1;8642:35:0;2402:177:1;37570:2918:0;-1:-1:-1;;;;;37702:18:0;;37694:68;;;;-1:-1:-1;;;37694:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37781:16:0;;37773:64;;;;-1:-1:-1;;;37773:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37945:39:0;;37848:18;37945:39;;;:33;:39;;;;;;37848:18;;;;37945:39;;37940:132;;38009:14;;-1:-1:-1;;;38009:14:0;;;;38001:59;;;;-1:-1:-1;;;38001:59:0;;18632:2:1;38001:59:0;;;18614:21:1;;;18651:18;;;18644:30;18710:34;18690:18;;;18683:62;18762:18;;38001:59:0;18430:356:1;38001:59:0;38104:6;38114:1;38104:11;38100:93;;38132:28;38148:4;38154:2;38158:1;38132:15;:28::i;:::-;38175:7;;;37570:2918;;;:::o;38100:93::-;38224:4;;-1:-1:-1;;;;;38224:4:0;;;38218:10;;;;38214:2095;;38245:19;38251:4;38257:6;38245:5;:19::i;38214:2095::-;38333:8;;-1:-1:-1;;;38333:8:0;;;;38332:9;:39;;;;-1:-1:-1;;;;;;38346:25:0;;;;;;:19;:25;;;;;;;;38345:26;38332:39;:67;;;;-1:-1:-1;;;;;;38376:23:0;;;;;;:19;:23;;;;;;;;38375:24;38332:67;38314:1995;;;-1:-1:-1;;;;;38443:29:0;;;38426:14;38443:29;;;:25;:29;;;;;;;38503:31;;;;;;;;38443:29;;;;;38503:31;38567:9;;:23;;;;;38581:9;38580:10;38567:23;38563:812;;;38611:33;38627:4;38633:2;38637:6;38611:15;:33::i;:::-;38663:15;;-1:-1:-1;;;;;38663:15:0;:26;38690:4;38696:15;38690:4;38696:9;:15::i;:::-;38663:49;;-1:-1:-1;;;;;;38663:49:0;;;;;;;-1:-1:-1;;;;;10317:32:1;;;38663:49:0;;;10299:51:1;10366:18;;;10359:34;10272:18;;38663:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38731:15:0;;-1:-1:-1;;;;;38731:15:0;;-1:-1:-1;38731:26:0;;-1:-1:-1;38758:2:0;38762:13;38758:2;38762:9;:13::i;:::-;38731:45;;-1:-1:-1;;;;;;38731:45:0;;;;;;;-1:-1:-1;;;;;10317:32:1;;;38731:45:0;;;10299:51:1;10366:18;;;10359:34;10272:18;;38731:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38795:7;;;;;37570:2918;;;:::o;38563:812::-;38842:9;38838:537;;;38885:14;;38872:27;;38934:17;;38918:33;;38983:14;;38970:27;;38838:537;;;39025:8;39021:354;;;39067:13;;39054:26;;39115:16;;39099:32;;39163:13;;39150:26;;39197:32;39232:13;39242:2;39232:9;:13::i;:::-;39309:9;;39197:48;;-1:-1:-1;39272:33:0;39299:6;39197:48;39272:33;:::i;:::-;:46;;39264:95;;;;-1:-1:-1;;;39264:95:0;;19272:2:1;39264:95:0;;;19254:21:1;19311:2;19291:18;;;19284:30;19350:34;19330:18;;;19323:62;-1:-1:-1;;;19401:18:1;;;19394:34;19445:19;;39264:95:0;19070:400:1;39264:95:0;39035:340;39021:354;39389:17;39409:60;39442:26;39458:10;39442:13;:26;:::i;:::-;39409:10;;:32;:60::i;:::-;39389:80;;39486:28;39517:24;39535:4;39517:9;:24::i;:::-;39597:18;;39486:55;;-1:-1:-1;39573:42:0;;;;;;;39636:43;;-1:-1:-1;;;;;;39648:31:0;;;;;;:25;:31;;;;;;;;39647:32;39636:43;39632:328;;;39700:8;:15;;-1:-1:-1;;;;39700:15:0;-1:-1:-1;;;39700:15:0;;;;39763:24;39781:4;39763:9;:24::i;:::-;39736:51;;39806:38;39827:16;39806:20;:38::i;:::-;-1:-1:-1;39875:1:0;39863:9;:13;;;39895:10;:14;39928:8;:16;;-1:-1:-1;;;;39928:16:0;;;39632:328;39976:12;39991:32;40017:5;39991:21;:6;40002:9;39991:10;:21::i;:32::-;39976:47;-1:-1:-1;40049:16:0;:6;39976:47;40049:10;:16::i;:::-;40040:25;;40086:9;40082:155;;;40129:10;;:20;;40144:4;40129:14;:20::i;:::-;40116:10;:33;40082:155;;;40202:9;;:19;;40216:4;40202:13;:19::i;:::-;40190:9;:31;40082:155;40253:42;40269:4;40283;40290;40253:15;:42::i;:::-;38411:1898;;;;;;38314:1995;40321:33;40337:4;40343:2;40347:6;40321:15;:33::i;:::-;40365:15;;-1:-1:-1;;;;;40365:15:0;:26;40392:4;40398:15;40392:4;40398:9;:15::i;:::-;40365:49;;-1:-1:-1;;;;;;40365:49:0;;;;;;;-1:-1:-1;;;;;10317:32:1;;;40365:49:0;;;10299:51:1;10366:18;;;10359:34;10272:18;;40365:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40425:15:0;;-1:-1:-1;;;;;40425:15:0;;-1:-1:-1;40425:26:0;;-1:-1:-1;40452:2:0;40456:13;40452:2;40456:9;:13::i;:::-;40425:45;;-1:-1:-1;;;;;;40425:45:0;;;;;;;-1:-1:-1;;;;;10317:32:1;;;40425:45:0;;;10299:51:1;10366:18;;;10359:34;10272:18;;40425:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37683:2805;;;37570:2918;;;:::o;11183:226::-;11303:7;11339:12;11331:6;;;;11323:29;;;;-1:-1:-1;;;11323:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11363:9:0;11375:5;11379:1;11375;:5;:::i;:::-;11363:17;11183:226;-1:-1:-1;;;;;11183:226:0:o;32992:280::-;-1:-1:-1;;;;;33075:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;33075:39:0;;;;;;;;;;;;33127:80;;33153:15;;:42;;-1:-1:-1;;;33153:42:0;;-1:-1:-1;;;;;178:32:1;;;33153:42:0;;;160:51:1;33153:15:0;;;;:36;;133:18:1;;33153:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33127:80;33224:40;;;;;;-1:-1:-1;;;;;33224:40:0;;;;;;;;32992:280;;:::o;11815:312::-;11935:7;11970:12;11963:5;11955:28;;;;-1:-1:-1;;;11955:28:0;;;;;;;;:::i;:::-;-1:-1:-1;11994:9:0;12006:5;12010:1;12006;:5;:::i;40496:499::-;40586:16;;;40600:1;40586:16;;;;;;;;40562:21;;40586:16;;;;;;;;;;-1:-1:-1;40586:16:0;40562:40;;40631:4;40613;40618:1;40613:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40613:23:0;;;:7;;;;;;;;;;:23;;;;40657:15;;:22;;;-1:-1:-1;;;40657:22:0;;;;:15;;;;;:20;;:22;;;;;40613:7;;40657:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40647:4;40652:1;40647:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40647:32:0;;;:7;;;;;;;;;:32;40722:15;;40690:62;;40707:4;;40722:15;40740:11;40690:8;:62::i;:::-;40763:15;;:224;;-1:-1:-1;;;40763:224:0;;-1:-1:-1;;;;;40763:15:0;;;;:66;;:224;;40844:11;;40763:15;;40914:4;;40941;;40961:15;;40763:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9079:455;-1:-1:-1;;;;;9163:21:0;;9155:67;;;;-1:-1:-1;;;9155:67:0;;20792:2:1;9155:67:0;;;20774:21:1;20831:2;20811:18;;;20804:30;20870:34;20850:18;;;20843:62;-1:-1:-1;;;20921:18:1;;;20914:31;20962:19;;9155:67:0;20590:397:1;9155:67:0;9318:105;9355:6;9318:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9318:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;9297:18:0;;:9;:18;;;;;;;;;;:126;9449:12;;:24;;9466:6;9449:16;:24::i;:::-;9434:12;:39;9489:37;;2548:25:1;;;9515:1:0;;-1:-1:-1;;;;;9489:37:0;;;;;2536:2:1;2521:18;9489:37:0;;;;;;;9079:455;;:::o;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222: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;1145:118;1231:5;1224:13;1217:21;1210:5;1207:32;1197:60;;1253:1;1250;1243:12;1268:382;1333:6;1341;1394:2;1382:9;1373:7;1369:23;1365:32;1362:52;;;1410:1;1407;1400:12;1362:52;1449:9;1436:23;1468:31;1493:5;1468:31;:::i;:::-;1518:5;-1:-1:-1;1575:2:1;1560:18;;1547:32;1588:30;1547:32;1588:30;:::i;:::-;1637:7;1627:17;;;1268:382;;;;;:::o;1655:315::-;1723:6;1731;1784:2;1772:9;1763:7;1759:23;1755:32;1752:52;;;1800:1;1797;1790:12;1752:52;1839:9;1826:23;1858:31;1883:5;1858:31;:::i;:::-;1908:5;1960:2;1945:18;;;;1932:32;;-1:-1:-1;;;1655:315:1:o;2584:247::-;2643:6;2696:2;2684:9;2675:7;2671:23;2667:32;2664:52;;;2712:1;2709;2702:12;2664:52;2751:9;2738:23;2770:31;2795:5;2770:31;:::i;2836:127::-;2897:10;2892:3;2888:20;2885:1;2878:31;2928:4;2925:1;2918:15;2952:4;2949:1;2942:15;2968:275;3039:2;3033:9;3104:2;3085:13;;-1:-1:-1;;3081:27:1;3069:40;;3139:18;3124:34;;3160:22;;;3121:62;3118:88;;;3186:18;;:::i;:::-;3222:2;3215:22;2968:275;;-1:-1:-1;2968:275:1:o;3248:183::-;3308:4;3341:18;3333:6;3330:30;3327:56;;;3363:18;;:::i;:::-;-1:-1:-1;3408:1:1;3404:14;3420:4;3400:25;;3248:183::o;3436:662::-;3490:5;3543:3;3536:4;3528:6;3524:17;3520:27;3510:55;;3561:1;3558;3551:12;3510:55;3597:6;3584:20;3623:4;3647:60;3663:43;3703:2;3663:43;:::i;:::-;3647:60;:::i;:::-;3741:15;;;3827:1;3823:10;;;;3811:23;;3807:32;;;3772:12;;;;3851:15;;;3848:35;;;3879:1;3876;3869:12;3848:35;3915:2;3907:6;3903:15;3927:142;3943:6;3938:3;3935:15;3927:142;;;4009:17;;3997:30;;4047:12;;;;3960;;3927:142;;;-1:-1:-1;4087:5:1;3436:662;-1:-1:-1;;;;;;3436:662:1:o;4103:1215::-;4221:6;4229;4282:2;4270:9;4261:7;4257:23;4253:32;4250:52;;;4298:1;4295;4288:12;4250:52;4338:9;4325:23;4367:18;4408:2;4400:6;4397:14;4394:34;;;4424:1;4421;4414:12;4394:34;4462:6;4451:9;4447:22;4437:32;;4507:7;4500:4;4496:2;4492:13;4488:27;4478:55;;4529:1;4526;4519:12;4478:55;4565:2;4552:16;4587:4;4611:60;4627:43;4667:2;4627:43;:::i;4611:60::-;4705:15;;;4787:1;4783:10;;;;4775:19;;4771:28;;;4736:12;;;;4811:19;;;4808:39;;;4843:1;4840;4833:12;4808:39;4867:11;;;;4887:217;4903:6;4898:3;4895:15;4887:217;;;4983:3;4970:17;5000:31;5025:5;5000:31;:::i;:::-;5044:18;;4920:12;;;;5082;;;;4887:217;;;5123:5;-1:-1:-1;;5166:18:1;;5153:32;;-1:-1:-1;;5197:16:1;;;5194:36;;;5226:1;5223;5216:12;5194:36;;5249:63;5304:7;5293:8;5282:9;5278:24;5249:63;:::i;:::-;5239:73;;;4103:1215;;;;;:::o;5323:456::-;5400:6;5408;5416;5469:2;5457:9;5448:7;5444:23;5440:32;5437:52;;;5485:1;5482;5475:12;5437:52;5524:9;5511:23;5543:31;5568:5;5543:31;:::i;:::-;5593:5;-1:-1:-1;5650:2:1;5635:18;;5622:32;5663:33;5622:32;5663:33;:::i;:::-;5323:456;;5715:7;;-1:-1:-1;;;5769:2:1;5754:18;;;;5741:32;;5323:456::o;6219:241::-;6275:6;6328:2;6316:9;6307:7;6303:23;6299:32;6296:52;;;6344:1;6341;6334:12;6296:52;6383:9;6370:23;6402:28;6424:5;6402:28;:::i;6689:523::-;6793:6;6801;6809;6817;6825;6833;6886:3;6874:9;6865:7;6861:23;6857:33;6854:53;;;6903:1;6900;6893:12;6854:53;-1:-1:-1;;6926:23:1;;;6996:2;6981:18;;6968:32;;-1:-1:-1;7047:2:1;7032:18;;7019:32;;7098:2;7083:18;;7070:32;;-1:-1:-1;7149:3:1;7134:19;;7121:33;;-1:-1:-1;7201:3:1;7186:19;7173:33;;-1:-1:-1;6689:523:1;-1:-1:-1;6689:523:1:o;7779:388::-;7847:6;7855;7908:2;7896:9;7887:7;7883:23;7879:32;7876:52;;;7924:1;7921;7914:12;7876:52;7963:9;7950:23;7982:31;8007:5;7982:31;:::i;:::-;8032:5;-1:-1:-1;8089:2:1;8074:18;;8061:32;8102:33;8061:32;8102:33;:::i;8172:356::-;8374:2;8356:21;;;8393:18;;;8386:30;8452:34;8447:2;8432:18;;8425:62;8519:2;8504:18;;8172:356::o;8533:127::-;8594:10;8589:3;8585:20;8582:1;8575:31;8625:4;8622:1;8615:15;8649:4;8646:1;8639:15;8665:168;8705:7;8771:1;8767;8763:6;8759:14;8756:1;8753:21;8748:1;8741:9;8734:17;8730:45;8727:71;;;8778:18;;:::i;:::-;-1:-1:-1;8818:9:1;;8665:168::o;8838:380::-;8917:1;8913:12;;;;8960;;;8981:61;;9035:4;9027:6;9023:17;9013:27;;8981:61;9088:2;9080:6;9077:14;9057:18;9054:38;9051:161;;9134:10;9129:3;9125:20;9122:1;9115:31;9169:4;9166:1;9159:15;9197:4;9194:1;9187:15;9051:161;;8838:380;;;:::o;9985:127::-;10046:10;10041:3;10037:20;10034:1;10027:31;10077:4;10074:1;10067:15;10101:4;10098:1;10091:15;10404:135;10443:3;10464:17;;;10461:43;;10484:18;;:::i;:::-;-1:-1:-1;10531:1:1;10520:13;;10404:135::o;10544:251::-;10614:6;10667:2;10655:9;10646:7;10642:23;10638:32;10635:52;;;10683:1;10680;10673:12;10635:52;10715:9;10709:16;10734:31;10759:5;10734:31;:::i;10800:184::-;10870:6;10923:2;10911:9;10902:7;10898:23;10894:32;10891:52;;;10939:1;10936;10929:12;10891:52;-1:-1:-1;10962:16:1;;10800:184;-1:-1:-1;10800:184:1:o;11294:245::-;11361:6;11414:2;11402:9;11393:7;11389:23;11385:32;11382:52;;;11430:1;11427;11420:12;11382:52;11462:9;11456:16;11481:28;11503:5;11481:28;:::i;11544:306::-;11632:6;11640;11648;11701:2;11689:9;11680:7;11676:23;11672:32;11669:52;;;11717:1;11714;11707:12;11669:52;11746:9;11740:16;11730:26;;11796:2;11785:9;11781:18;11775:25;11765:35;;11840:2;11829:9;11825:18;11819:25;11809:35;;11544:306;;;;;:::o;13775:557::-;13888:6;13896;13904;13912;13920;13928;13981:3;13969:9;13960:7;13956:23;13952:33;13949:53;;;13998:1;13995;13988:12;13949:53;14030:9;14024:16;14049:31;14074:5;14049:31;:::i;:::-;14144:2;14129:18;;14123:25;14188:2;14173:18;;14167:25;14232:2;14217:18;;14211:25;14276:3;14261:19;;14255:26;14321:3;14306:19;;;14300:26;14099:5;;14123:25;;-1:-1:-1;14167:25:1;;14211;;-1:-1:-1;14255:26:1;-1:-1:-1;14300:26:1;;-1:-1:-1;13775:557:1;-1:-1:-1;;;13775:557:1:o;14744:217::-;14784:1;14810;14800:132;;14854:10;14849:3;14845:20;14842:1;14835:31;14889:4;14886:1;14879:15;14917:4;14914:1;14907:15;14800:132;-1:-1:-1;14946:9:1;;14744:217::o;15377:128::-;15417:3;15448:1;15444:6;15441:1;15438:13;15435:39;;;15454:18;;:::i;:::-;-1:-1:-1;15490:9:1;;15377:128::o;17620:401::-;17822:2;17804:21;;;17861:2;17841:18;;;17834:30;17900:34;17895:2;17880:18;;17873:62;-1:-1:-1;;;17966:2:1;17951:18;;17944:35;18011:3;17996:19;;17620:401::o;18026:399::-;18228:2;18210:21;;;18267:2;18247:18;;;18240:30;18306:34;18301:2;18286:18;;18279:62;-1:-1:-1;;;18372:2:1;18357:18;;18350:33;18415:3;18400:19;;18026:399::o;19475:125::-;19515:4;19543:1;19540;19537:8;19534:34;;;19548:18;;:::i;:::-;-1:-1:-1;19585:9:1;;19475:125::o;19605:980::-;19867:4;19915:3;19904:9;19900:19;19946:6;19935:9;19928:25;19972:2;20010:6;20005:2;19994:9;19990:18;19983:34;20053:3;20048:2;20037:9;20033:18;20026:31;20077:6;20112;20106:13;20143:6;20135;20128:22;20181:3;20170:9;20166:19;20159:26;;20220:2;20212:6;20208:15;20194:29;;20241:1;20251:195;20265:6;20262:1;20259:13;20251:195;;;20330:13;;-1:-1:-1;;;;;20326:39:1;20314:52;;20421:15;;;;20386:12;;;;20362:1;20280:9;20251:195;;;-1:-1:-1;;;;;;;20502:32:1;;;;20497:2;20482:18;;20475:60;-1:-1:-1;;;20566:3:1;20551:19;20544:35;20463:3;19605:980;-1:-1:-1;;;19605:980:1:o

Swarm Source

ipfs://43d53de5ec8cf6048ebaced6486eaac88f399b5ab5fd409cd1a3602d3375cbac
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.