ETH Price: $3,482.00 (+0.83%)

Token

MAGA VP (MVP)
 

Overview

Max Total Supply

47,498,448.379898404881813637 MVP

Holders

1,968

Market

Price

$0.02 @ 0.000005 ETH (+1.69%)

Onchain Market Cap

$753,017.60

Circulating Supply Market Cap

$700,968.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
healthydistrust.eth
Balance
3,075.928146698152065207 MVP

Value
$48.76 ( ~0.0140034522017314 Eth) [0.0065%]
0x695Cb15d501B4f9Ca7A835e6493800d2c350C7cb
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

MVP is a meme rewards token that supports the MAGA TRUMP ecosystem by adding to its liquidity while passively rewarding MVP holders in TRUMP tokens through buy and sell tax.

Market

Volume (24H):$53,136.00
Market Capitalization:$700,968.00
Circulating Supply:44,200,829.00 MVP
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MAGAVP

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// 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 MAGAVP 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;

    MAGAVPDividendTracker 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("MAGA VP", "MVP") {
        marketingWallet = payable(0x2b486FE86f88EA5a29Ab9c53dD70Da38b043B137);
        buybackWallet = payable(0xD53cF51AF3280BEaa3eb95BE6Ba983B6B6982b5c);
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

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

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

        dividendTracker = new MAGAVPDividendTracker(
            payable(this),
            router,
            0x576e2BeD8F7b46D34016198911Cdf9886f78bea7,
            "MAGAVPTRACKER",
            "MVPTTRACKER"
        );

        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 = (50_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 MAGAVPDividendTracker 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;

    MAGAVP public MAGAVPContract;

    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;
        MAGAVPContract = MAGAVP(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, "MAGAVP_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "MAGAVP_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(MAGAVPContract);

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

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = MAGAVPContract
                    .balanceOf(address(this))
                    .sub(prevBalance);
                if (received > 0) {
                    success = true;
                    MAGAVPContract.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 MAGAVPDividendTracker","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"}]

608060405260088054600161ff0160a01b03191661dead17905560016009819055600a55620493e06018553480156200003757600080fd5b506040518060400160405280600781526020016604d4147412056560cc1b8152506040518060400160405280600381526020016204d56560ec1b815250816003908162000085919062000b28565b50600462000094828262000b28565b5050506000620000a96200083560201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e8054732b486fe86f88ea5a29ab9c53dd70da38b043b1376001600160a01b031991821617909155600f805473d53cf51af3280beaa3eb95be6ba983b6b6982b5c921691909117905560326014819055601381905560646015819055601281905560168290556017829055737a250d5630b4cf539739df2c5dacb4c659f2488d91620001aa9162000196908262000839602090811b6200229417901c565b6200083960201b620022941790919060201c565b600c81905550620001d5601754620001966013546012546200083960201b620022941790919060201c565b600b81905550308173576e2bed8f7b46d34016198911cdf9886f78bea7604051620002009062000a76565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600d908201526c26a0a3a0ab282a2920a1a5a2a960991b60c082015260e060808201819052600b908201526a26ab282a2a2920a1a5a2a960a91b61010082015261012001604051809103906000f08015801562000287573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620002f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000318919062000bf4565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200037b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a1919062000bf4565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000415919062000bf4565b600780546001600160a01b0319166001600160a01b0392909216918217905562000441906001620008a9565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200048857600080fd5b505af11580156200049d573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004e757600080fd5b505af1158015620004fc573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200054a57600080fd5b505af11580156200055f573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa158015620005ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d3919062000c1f565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156200061c57600080fd5b505af115801562000631573d6000803e3d6000fd5b5050600d54600e5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200067f57600080fd5b505af115801562000694573d6000803e3d6000fd5b5050600d546001600160a01b031691506331e79db09050620006be6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200070057600080fd5b505af115801562000715573d6000803e3d6000fd5b5050306000908152601960205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f5416845282842080548216831790553384529190922080549091169091179055506a295be96e640669720000009050620007b2620007ab6005546001600160a01b031690565b8262000975565b620007bf60328262000c43565b601055620007d06103e88262000c43565b6011556001601b6000620007ec6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152601b9092529020805490911660011790555062000c889050565b3390565b60008062000848838562000c66565b905083811015620008a05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b6001600160a01b0382166000908152601a60205260409020805460ff191682158015919091179091556200093957600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200091f57600080fd5b505af115801562000934573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038216620009cd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000897565b620009e9816002546200083960201b620022941790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a1c9183906200229462000839821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b61307980620045bd83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000aaf57607f821691505b60208210810362000ad057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a7157600081815260208120601f850160051c8101602086101562000aff5750805b601f850160051c820191505b8181101562000b205782815560010162000b0b565b505050505050565b81516001600160401b0381111562000b445762000b4462000a84565b62000b5c8162000b55845462000a9a565b8462000ad6565b602080601f83116001811462000b94576000841562000b7b5750858301515b600019600386901b1c1916600185901b17855562000b20565b600085815260208120601f198616915b8281101562000bc55788860151825594840194600190910190840162000ba4565b508582101562000be45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c0757600080fd5b81516001600160a01b0381168114620008a057600080fd5b60006020828403121562000c3257600080fd5b81518015158114620008a057600080fd5b60008262000c6157634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620008a357634e487b7160e01b600052601160045260246000fd5b6139258062000c986000396000f3fe6080604052600436106104145760003560e01c8063715018a61161021e578063a8b9d24011610123578063deab8aea116100ab578063f27fd2541161007a578063f27fd25414610c3f578063f2fde38b14610c5f578063f5d3c79a14610c7f578063f8b45b0514610c9f578063fc6b151c14610cb557600080fd5b8063deab8aea14610bdf578063e2f4560514610bff578063e7841ec014610c15578063e7cb7f8714610c2a57600080fd5b8063ba079d49116100f2578063ba079d4914610b2e578063bb8d513114610b4e578063bdd4f29f14610b64578063d8032ed314610b79578063dd62ed3e14610b9957600080fd5b8063a8b9d24014610a67578063a9059cbb14610a87578063ad56c13c14610aa7578063b62496f514610afe57600080fd5b80638da5cb5b116101a65780639a7a23d6116101755780639a7a23d6146109d15780639c1b8af5146109f15780639c3372ea14610a075780639ec1037e14610a27578063a457c2d714610a4757600080fd5b80638da5cb5b1461096857806395451c291461098657806395d89b411461099c578063992c58e4146109b157600080fd5b806377a3b609116101ed57806377a3b609146108dd5780637fdde05c146108f3578063868730c714610913578063871c128d146109335780638a8c523c1461095357600080fd5b8063715018a61461086857806372d8edf41461087d57806375829def1461089d57806375f0a874146108bd57600080fd5b80633599bb17116103245780635a84c5eb116102ac57806364b0f6531161027b57806364b0f653146107d35780636843cd84146107e85780636d48467b14610808578063700bb1911461082857806370a082311461084857600080fd5b80635a84c5eb146107535780635d098b38146107735780635ebf4db9146107935780635eee4bae146107b357600080fd5b806349bd5a5e116102f357806349bd5a5e146106ae5780634ada218b146106ce5780634e71d92d146106ef5780634fbee193146107045780635124f8741461073d57600080fd5b80633599bb171461063857806339509351146106585780633f407b841461067857806340ffdd801461068e57600080fd5b80631d0adc07116103a757806323b872dd1161037657806323b872dd146105b257806325cd3598146105d25780632c1f5216146105e757806330bb4cff14610607578063313ce5671461061c57600080fd5b80631d0adc07146105465780631fa70531146105665780631fe70a981461057c5780632307b4411461059257600080fd5b8063095ea7b3116103e3578063095ea7b3146104c15780631694505e146104f157806318160ddd146105115780631a221dbb1461053057600080fd5b806303fd2a451461042057806305ca5f081461045d57806306fdde031461047f57806308dfe8a5146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50600854610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047d610478366004613207565b610cd5565b005b34801561048b57600080fd5b50610494610da6565b6040516104549190613220565b3480156104ad57600080fd5b5061047d6104bc366004613291565b610e38565b3480156104cd57600080fd5b506104e16104dc3660046132ca565b610ec1565b6040519015158152602001610454565b3480156104fd57600080fd5b50600654610440906001600160a01b031681565b34801561051d57600080fd5b506002545b604051908152602001610454565b34801561053c57600080fd5b5061052260175481565b34801561055257600080fd5b5061047d6105613660046132f6565b610ed8565b34801561057257600080fd5b50610522600a5481565b34801561058857600080fd5b5061052260165481565b34801561059e57600080fd5b5061047d6105ad3660046133e9565b610f6f565b3480156105be57600080fd5b506104e16105cd3660046134ab565b611140565b3480156105de57600080fd5b506104406111a9565b3480156105f357600080fd5b50600d54610440906001600160a01b031681565b34801561061357600080fd5b5061052261121c565b34801561062857600080fd5b5060405160128152602001610454565b34801561064457600080fd5b5061047d6106533660046134ec565b61128a565b34801561066457600080fd5b506104e16106733660046132ca565b611317565b34801561068457600080fd5b5061052260095481565b34801561069a57600080fd5b5061047d6106a93660046134ec565b61134d565b3480156106ba57600080fd5b50600754610440906001600160a01b031681565b3480156106da57600080fd5b506008546104e190600160a81b900460ff1681565b3480156106fb57600080fd5b5061047d6113a8565b34801561071057600080fd5b506104e161071f3660046132f6565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561074957600080fd5b5061052260145481565b34801561075f57600080fd5b5061047d61076e366004613207565b611420565b34801561077f57600080fd5b5061047d61078e3660046132f6565b61147b565b34801561079f57600080fd5b5061047d6107ae366004613207565b61150b565b3480156107bf57600080fd5b5061047d6107ce366004613207565b611566565b3480156107df57600080fd5b506105226115a8565b3480156107f457600080fd5b506105226108033660046132f6565b6115f2565b34801561081457600080fd5b506104e16108233660046132f6565b611662565b34801561083457600080fd5b5061047d610843366004613207565b6116d2565b34801561085457600080fd5b506105226108633660046132f6565b6117a4565b34801561087457600080fd5b5061047d6117bf565b34801561088957600080fd5b5061047d6108983660046132f6565b611833565b3480156108a957600080fd5b5061047d6108b83660046132f6565b61188f565b3480156108c957600080fd5b50600e54610440906001600160a01b031681565b3480156108e957600080fd5b5061052260155481565b3480156108ff57600080fd5b5061047d61090e366004613291565b611944565b34801561091f57600080fd5b5061047d61092e3660046134ec565b611999565b34801561093f57600080fd5b5061047d61094e366004613207565b6119d1565b34801561095f57600080fd5b5061047d611a4d565b34801561097457600080fd5b506005546001600160a01b0316610440565b34801561099257600080fd5b5061052260135481565b3480156109a857600080fd5b50610494611acc565b3480156109bd57600080fd5b5061047d6109cc366004613509565b611adb565b3480156109dd57600080fd5b5061047d6109ec366004613291565b611c35565b3480156109fd57600080fd5b5061052260185481565b348015610a1357600080fd5b5061047d610a223660046134ec565b611c6d565b348015610a3357600080fd5b5061047d610a423660046132f6565b611cc9565b348015610a5357600080fd5b506104e1610a623660046132ca565b611d8b565b348015610a7357600080fd5b50610522610a823660046132f6565b611dda565b348015610a9357600080fd5b506104e1610aa23660046132ca565b611e0d565b348015610ab357600080fd5b50610ac7610ac23660046132f6565b611e1a565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610454565b348015610b0a57600080fd5b506104e1610b193660046132f6565b601a6020526000908152604090205460ff1681565b348015610b3a57600080fd5b506104e1610b493660046132f6565b611eaa565b348015610b5a57600080fd5b5061052260125481565b348015610b7057600080fd5b50610522611edd565b348015610b8557600080fd5b5061047d610b943660046132f6565b611f27565b348015610ba557600080fd5b50610522610bb436600461354c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610beb57600080fd5b50600f54610440906001600160a01b031681565b348015610c0b57600080fd5b5061052260115481565b348015610c2157600080fd5b50610522611fea565b348015610c3657600080fd5b50610522612034565b348015610c4b57600080fd5b50610ac7610c5a366004613207565b61207e565b348015610c6b57600080fd5b5061047d610c7a3660046132f6565b6120bc565b348015610c8b57600080fd5b5061047d610c9a3660046134ec565b6121a7565b348015610cab57600080fd5b5061052260105481565b348015610cc157600080fd5b5061047d610cd0366004613207565b6121df565b6005546001600160a01b03163314610d085760405162461bcd60e51b8152600401610cff9061357a565b60405180910390fd5b610d1a81670de0b6b3a76400006135c5565b90506000610d35600954600a5461229490919063ffffffff16565b90506000610d5882610d52600a54866122fa90919063ffffffff16565b9061237c565b90506000610d7583610d52600954876122fa90919063ffffffff16565b9050610d80846123be565b600a54610d8d90836126be565b600a55600954610d9d90826126be565b60095550505050565b606060038054610db5906135dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610de1906135dc565b8015610e2e5780601f10610e0357610100808354040283529160200191610e2e565b820191906000526020600020905b815481529060010190602001808311610e1157829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e625760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000610ece338484612700565b5060015b92915050565b6005546001600160a01b03163314610f025760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b038116600081815260196020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527f3c2a46a28084880d3bc39c8f240a57690614613728ce03d2a8c6dc645892e4fb91015b60405180910390a150565b6005546001600160a01b03163314610f995760405162461bcd60e51b8152600401610cff9061357a565b8051825114610fea5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cff565b60c8825111156110475760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610cff565b60005b825181101561113b57600083828151811061106757611067613616565b60200260200101519050600083838151811061108557611085613616565b6020026020010151670de0b6b3a76400006110a091906135c5565b90506110ad338383612825565b600d546001600160a01b031663e30443bc836110c8816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561110e57600080fd5b505af1158015611122573d6000803e3d6000fd5b50505050505080806111339061362c565b91505061104a565b505050565b600061114d84848461292e565b61119f843361119a856040518060600160405280602881526020016138a3602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612e79565b612700565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613645565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613662565b6005546001600160a01b031633146112b45760405162461bcd60e51b8152600401610cff9061357a565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b1580156112fc57600080fd5b505af1158015611310573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ece91859061119a9086612294565b6005546001600160a01b031633146113775760405162461bcd60e51b8152600401610cff9061357a565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016112e2565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d919061367b565b50565b6005546001600160a01b0316331461144a5760405162461bcd60e51b8152600401610cff9061357a565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016112e2565b6005546001600160a01b031633146114a55760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b038116600081815260196020908152604091829020805460ff19166001179055600e80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101610f64565b6005546001600160a01b031633146115355760405162461bcd60e51b8152600401610cff9061357a565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016112e2565b6005546001600160a01b031633146115905760405162461bcd60e51b8152600401610cff9061357a565b6115a281670de0b6b3a76400006135c5565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561163e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613662565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed2919061367b565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117499190613698565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146117e95760405162461bcd60e51b8152600401610cff9061357a565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461185d5760405162461bcd60e51b8152600401610cff9061357a565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016112e2565b6005546001600160a01b031633146118b95760405162461bcd60e51b8152600401610cff9061357a565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561190057600080fd5b505af1158015611914573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601960205260409020805460ff191660011790555061141d816120bc565b6005546001600160a01b0316331461196e5760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016112e2565b6005546001600160a01b031633146119fb5760405162461bcd60e51b8152600401610cff9061357a565b62030d408110158015611a115750620f42408111155b611a1a57600080fd5b60185460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601855565b6005546001600160a01b03163314611a775760405162461bcd60e51b8152600401610cff9061357a565b600854600160a81b900460ff1615611a8e57600080fd5b6008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610db5906135dc565b6005546001600160a01b03163314611b055760405162461bcd60e51b8152600401610cff9061357a565b601486905560158490556013859055601283905560168290556017819055611b3781611b318588612294565b90612294565b600b55601654601454601554611b529291611b319190612294565b600c55600b546101f410801590611b6d57506101f4600c5411155b611bc95760405162461bcd60e51b815260206004820152602760248201527f746f74616c20666565732063616e6e6f74206578636565642035252073656c6c604482015266206f722062757960c81b6064820152608401610cff565b601354601254601454601554601654601754604080519687526020870195909552938501929092526060840152608083015260a08201527ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff9060c00160405180910390a1505050505050565b6005546001600160a01b03163314611c5f5760405162461bcd60e51b8152600401610cff9061357a565b611c698282612eb3565b5050565b6005546001600160a01b03163314611c975760405162461bcd60e51b8152600401610cff9061357a565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016112e2565b6005546001600160a01b03163314611cf35760405162461bcd60e51b8152600401610cff9061357a565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b158015611d3a57600080fd5b505af1158015611d4e573d6000803e3d6000fd5b5050600d546040516338c110ef60e21b81526001600160a01b03858116600483015260006024830152909116925063e30443bc91506044016112e2565b6000610ece338461119a856040518060600160405280602581526020016138cb602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612e79565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611621565b6000610ece33848461292e565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015611e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9691906136c6565b949c939b5091995097509550909350915050565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611691565b600d546040805163bdd4f29f60e01b815290516000926001600160a01b03169163bdd4f29f9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b6005546001600160a01b03163314611f515760405162461bcd60e51b8152600401610cff9061357a565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050610f64565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d546040805163e7cb7f8760e01b815290516000926001600160a01b03169163e7cb7f879160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401611e55565b6005546001600160a01b031633146120e65760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b03811661214b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cff565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016112e2565b6005546001600160a01b031633146122095760405162461bcd60e51b8152600401610cff9061357a565b61221b81670de0b6b3a76400006135c5565b90506103e860025461222d9190613719565b81101561228f5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610cff565b601055565b6000806122a1838561373b565b9050838110156122f35760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cff565b9392505050565b60008260000361230c57506000610ed2565b600061231883856135c5565b9050826123258583613719565b146122f35760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cff565b60006122f383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f7c565b806000036123c95750565b6123d281612faa565b60006123eb600954600a5461229490919063ffffffff16565b60155490915060019081908190600090819081901561244c5761244960165460145460155461241a919061373b565b612424919061373b565b610d526015546124438b610d52600a54476122fa90919063ffffffff16565b906122fa565b91505b601254156124965761249360175460135460125461246a919061373b565b612474919061373b565b610d526012546124438b610d52600954476122fa90919063ffffffff16565b90505b6124a08282612294565b9250821561250057600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146124f5576040519150601f19603f3d011682016040523d82523d6000602084013e6124fa565b606091505b50909650505b600061251960165460145461229490919063ffffffff16565b60175460135461252891612294565b612532919061373b565b90506000811561254957612546478361237c565b90505b60008161256360135460145461229490919063ffffffff16565b61256d91906135c5565b905060008261258960175460165461229490919063ffffffff16565b61259391906135c5565b905081156125f357600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146125e8576040519150601f19603f3d011682016040523d82523d6000602084013e6125ed565b606091505b50909950505b801561265157600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612646576040519150601f19603f3d011682016040523d82523d6000602084013e61264b565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd08761267d838561373b565b8c801561268757508b5b801561269057508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006122f383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e79565b6001600160a01b0383166127625760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cff565b6001600160a01b0382166127c35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cff565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661284b5760405162461bcd60e51b8152600401610cff9061374e565b6001600160a01b0382166128715760405162461bcd60e51b8152600401610cff90613793565b6128ae8160405180606001604052806026815260200161387d602691396001600160a01b0386166000908152602081905260409020549190612e79565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546128dd9082612294565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612818565b6001600160a01b0383166129545760405162461bcd60e51b8152600401610cff9061374e565b6001600160a01b03821661297a5760405162461bcd60e51b8152600401610cff90613793565b6001600160a01b0383166000908152601b60205260408120548190819060ff166129f757600854600160a81b900460ff166129f75760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610cff565b83600003612a1357612a0b86866000612825565b505050505050565b6008546001600160a01b0390811690861603612a3357612a0b86856130fc565b600854600160a01b900460ff16158015612a6657506001600160a01b03861660009081526019602052604090205460ff16155b8015612a8b57506001600160a01b03851660009081526019602052604090205460ff16155b15612d72576001600160a01b038086166000908152601a602052604080822054928916825290205460ff918216911680158015612ac6575081155b15612bd457612ad6888888612825565b600d546001600160a01b031663e30443bc89612af1816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b3757600080fd5b505af1158015612b4b573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088612b6c816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612bb257600080fd5b505af1158015612bc6573d6000803e3d6000fd5b505050505050505050505050565b8115612bee57601254945060135493506017549250612c7a565b8015612c7a576015549450601454935060165492506000612c0e886117a4565b601054909150612c1e888361373b565b1115612c785760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610cff565b505b6000612c90612c89858761373b565b8790612294565b90506000612c9d306117a4565b60115490915081108015908190612ccd57506001600160a01b038b166000908152601a602052604090205460ff16155b15612d14576008805460ff60a01b1916600160a01b1790556000612cf0306117a4565b9050612cfb816123be565b506001600a8190556009556008805460ff60a01b191690555b6000612d26612710610d528c876122fa565b9050612d328a826126be565b99508515612d4f57600954612d479082612294565b600955612d60565b600a54612d5c9082612294565b600a555b612d6b8c3083612825565b5050505050505b612d7d868686612825565b600d546001600160a01b031663e30443bc87612d98816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612dde57600080fd5b505af1158015612df2573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905086612e13816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612e5957600080fd5b505af1158015612e6d573d6000803e3d6000fd5b50505050505050505050565b60008184841115612e9d5760405162461bcd60e51b8152600401610cff9190613220565b506000612eaa84866137d6565b95945050505050565b6001600160a01b0382166000908152601a60205260409020805460ff19168215801591909117909155612f4057600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612f2757600080fd5b505af1158015612f3b573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60008183612f9d5760405162461bcd60e51b8152600401610cff9190613220565b506000612eaa8486613719565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612fdf57612fdf613616565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305c9190613645565b8160018151811061306f5761306f613616565b6001600160a01b0392831660209182029290920101526006546130959130911684612700565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906130ce9085906000908690309042906004016137e9565b600060405180830381600087803b1580156130e857600080fd5b505af1158015612a0b573d6000803e3d6000fd5b6001600160a01b03821661315c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cff565b6131998160405180606001604052806022815260200161385b602291396001600160a01b0385166000908152602081905260409020549190612e79565b6001600160a01b0383166000908152602081905260409020556002546131bf90826126be565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006020828403121561321957600080fd5b5035919050565b600060208083528351808285015260005b8181101561324d57858101830151858201604001528201613231565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461141d57600080fd5b801515811461141d57600080fd5b600080604083850312156132a457600080fd5b82356132af8161326e565b915060208301356132bf81613283565b809150509250929050565b600080604083850312156132dd57600080fd5b82356132e88161326e565b946020939093013593505050565b60006020828403121561330857600080fd5b81356122f38161326e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561335257613352613313565b604052919050565b600067ffffffffffffffff82111561337457613374613313565b5060051b60200190565b600082601f83011261338f57600080fd5b813560206133a461339f8361335a565b613329565b82815260059290921b840181019181810190868411156133c357600080fd5b8286015b848110156133de57803583529183019183016133c7565b509695505050505050565b600080604083850312156133fc57600080fd5b823567ffffffffffffffff8082111561341457600080fd5b818501915085601f83011261342857600080fd5b8135602061343861339f8361335a565b82815260059290921b8401810191818101908984111561345757600080fd5b948201945b8386101561347e57853561346f8161326e565b8252948201949082019061345c565b9650508601359250508082111561349457600080fd5b506134a18582860161337e565b9150509250929050565b6000806000606084860312156134c057600080fd5b83356134cb8161326e565b925060208401356134db8161326e565b929592945050506040919091013590565b6000602082840312156134fe57600080fd5b81356122f381613283565b60008060008060008060c0878903121561352257600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000806040838503121561355f57600080fd5b823561356a8161326e565b915060208301356132bf8161326e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ed257610ed26135af565b600181811c908216806135f057607f821691505b60208210810361361057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161363e5761363e6135af565b5060010190565b60006020828403121561365757600080fd5b81516122f38161326e565b60006020828403121561367457600080fd5b5051919050565b60006020828403121561368d57600080fd5b81516122f381613283565b6000806000606084860312156136ad57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c087890312156136df57600080fd5b86516136ea8161326e565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b60008261373657634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610ed257610ed26135af565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610ed257610ed26135af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156138395784516001600160a01b031683529383019391830191600101613814565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203f20dd3d1b131e19b3137a32c0388d789dfb91f0c0b0ae44aa235a4d70f4c6e464736f6c6343000811003360806040526012805460ff60b01b191690553480156200001e57600080fd5b506040516200307938038062003079833981016040819052620000419162000243565b8181818160036200005383826200037d565b5060046200006282826200037d565b50505050506000620000796200016160201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d583826200037d565b506014620000e482826200037d565b505060128054601680546001600160a01b03199081166001600160a01b03988916179091556a295be96e6406697200000060185568056bc75e2d631000006019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b19169091555062000449565b3390565b6001600160a01b03811681146200017b57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001a657600080fd5b81516001600160401b0380821115620001c357620001c36200017e565b604051601f8301601f19908116603f01168101908282118183101715620001ee57620001ee6200017e565b816040528381526020925086838588010111156200020b57600080fd5b600091505b838210156200022f578582018301518183018401529082019062000210565b600093810190920192909252949350505050565b600080600080600060a086880312156200025c57600080fd5b8551620002698162000165565b60208701519095506200027c8162000165565b60408701519094506200028f8162000165565b60608701519093506001600160401b0380821115620002ad57600080fd5b620002bb89838a0162000194565b93506080880151915080821115620002d257600080fd5b50620002e18882890162000194565b9150509295509295909350565b600181811c908216806200030357607f821691505b6020821081036200032457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037857600081815260208120601f850160051c81016020861015620003535750805b601f850160051c820191505b8181101562000374578281556001016200035f565b5050505b505050565b81516001600160401b038111156200039957620003996200017e565b620003b181620003aa8454620002ee565b846200032a565b602080601f831160018114620003e95760008415620003d05750858301515b600019600386901b1c1916600185901b17855562000374565b600085815260208120601f198616915b828110156200041a57888601518255948401946001909101908401620003f9565b5085821015620004395787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c2080620004596000396000f3fe6080604052600436106103395760003560e01c806370a08231116101ab578063a9059cbb116100f7578063dd62ed3e11610095578063e7cb7f871161006f578063e7cb7f8714610a12578063f2fde38b14610a27578063fbcbc0f114610a47578063ffb2c47914610a6757600080fd5b8063dd62ed3e14610997578063e30443bc146109dd578063e7841ec0146109fd57600080fd5b8063ba079d49116100d1578063ba079d4914610922578063bc4c4b3714610942578063bdd4f29f14610962578063d8032ed31461097757600080fd5b8063a9059cbb146108ac578063aafd847a146108cc578063b22f8a041461090257600080fd5b806391b89fba116101645780639eec101e1161013e5780639eec101e1461082a578063a42340691461084b578063a457c2d71461086c578063a8b9d2401461088c57600080fd5b806391b89fba146107d557806395d89b41146107f55780639c3372ea1461080a57600080fd5b806370a0823114610716578063715018a61461074c57806374c13fda1461076157806385a6b3ae146107815780638bc1d639146107975780638da5cb5b146107b757600080fd5b8063313ce567116102855780635183d6fd1161022357806369aaae40116101fd57806369aaae40146106915780636a474002146106b15780636b69163b146106c65780636d48467b146106f657600080fd5b80635183d6fd146105fa5780635a84c5eb146106515780635ebf4db91461067157600080fd5b8063395093511161025f578063395093511461056957806340ffdd801461058957806341808904146105a95780634e7b827f146105ca57600080fd5b8063313ce5671461050d57806331e79db0146105295780633599bb171461054957600080fd5b806318160ddd116102f257806323b872dd116102cc57806323b872dd1461049957806325cd3598146104b957806327ce0147146104d75780633009a609146104f757600080fd5b806318160ddd146104275780631d4ff89a1461043c578063226cfa3d1461046c57600080fd5b806303c833021461034d57806306fdde03146103555780630928847114610380578063095ea7b3146103a057806309bbedde146103d05780631694505e146103ef57600080fd5b3661034857610346610aa2565b005b600080fd5b610346610aa2565b34801561036157600080fd5b5061036a610b35565b604051610377919061279c565b60405180910390f35b34801561038c57600080fd5b5061034661039b366004612802565b610bc7565b3480156103ac57600080fd5b506103c06103bb36600461281f565b610c1b565b6040519015158152602001610377565b3480156103dc57600080fd5b50600a545b604051908152602001610377565b3480156103fb57600080fd5b5060155461040f906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b34801561043357600080fd5b506002546103e1565b34801561044857600080fd5b506103c0610457366004612802565b60116020526000908152604090205460ff1681565b34801561047857600080fd5b506103e1610487366004612802565b60176020526000908152604090205481565b3480156104a557600080fd5b506103c06104b436600461284b565b610c32565b3480156104c557600080fd5b506012546001600160a01b031661040f565b3480156104e357600080fd5b506103e16104f2366004612802565b610c9b565b34801561050357600080fd5b506103e1600e5481565b34801561051957600080fd5b5060405160128152602001610377565b34801561053557600080fd5b50610346610544366004612802565b610cf7565b34801561055557600080fd5b5061034661056436600461289a565b610d91565b34801561057557600080fd5b506103c061058436600461281f565b610e32565b34801561059557600080fd5b506103466105a436600461289a565b610e68565b3480156105b557600080fd5b506012546103c090600160a81b900460ff1681565b3480156105d657600080fd5b506103c06105e5366004612802565b600f6020526000908152604090205460ff1681565b34801561060657600080fd5b5061061a6106153660046128b7565b610efe565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610377565b34801561065d57600080fd5b5061034661066c3660046128b7565b610f5e565b34801561067d57600080fd5b5061034661068c3660046128b7565b610fa0565b34801561069d57600080fd5b5060165461040f906001600160a01b031681565b3480156106bd57600080fd5b50610346610fe2565b3480156106d257600080fd5b506103c06106e1366004612802565b60106020526000908152604090205460ff1681565b34801561070257600080fd5b506103c0610711366004612802565b611088565b34801561072257600080fd5b506103e1610731366004612802565b6001600160a01b031660009081526020819052604090205490565b34801561075857600080fd5b506103466110d4565b34801561076d57600080fd5b5060125461040f906001600160a01b031681565b34801561078d57600080fd5b506103e160085481565b3480156107a357600080fd5b506103466107b23660046128d0565b611148565b3480156107c357600080fd5b506009546001600160a01b031661040f565b3480156107e157600080fd5b506103e16107f0366004612802565b61119d565b34801561080157600080fd5b5061036a6111a8565b34801561081657600080fd5b5061034661082536600461289a565b6111b7565b34801561083657600080fd5b506012546103c090600160a01b900460ff1681565b34801561085757600080fd5b506012546103c090600160b01b900460ff1681565b34801561087857600080fd5b506103c061088736600461281f565b61124d565b34801561089857600080fd5b506103e16108a7366004612802565b61129c565b3480156108b857600080fd5b506103c06108c736600461281f565b6112c8565b3480156108d857600080fd5b506103e16108e7366004612802565b6001600160a01b031660009081526007602052604090205490565b34801561090e57600080fd5b5061034661091d3660046128d0565b6112d5565b34801561092e57600080fd5b506103c061093d366004612802565b61132a565b34801561094e57600080fd5b506103c061095d3660046128d0565b611376565b34801561096e57600080fd5b506019546103e1565b34801561098357600080fd5b50610346610992366004612802565b6114f7565b3480156109a357600080fd5b506103e16109b2366004612909565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109e957600080fd5b506103466109f836600461281f565b611543565b348015610a0957600080fd5b50600e546103e1565b348015610a1e57600080fd5b506018546103e1565b348015610a3357600080fd5b50610346610a42366004612802565b6115db565b348015610a5357600080fd5b5061061a610a62366004612802565b6116c6565b348015610a7357600080fd5b50610a87610a823660046128b7565b611775565b60408051938452602084019290925290820152606001610377565b6000610aad60025490565b11610ab757600080fd5b3415610b3357610aea610ac960025490565b610ad734600160801b61189b565b610ae1919061294d565b60055490611924565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b2f9034611924565b6008555b565b606060138054610b449061296f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b709061296f565b8015610bbd5780601f10610b9257610100808354040283529160200191610bbd565b820191906000526020600020905b815481529060010190602001808311610ba057829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bfa5760405162461bcd60e51b8152600401610bf1906129a9565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c28338484611983565b5060015b92915050565b6000610c3f848484611aa7565b610c918433610c8c85604051806060016040528060288152602001612b9e602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b0a565b611983565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610ced92610ce892610ce291610cdd919061189b565b611b44565b90611b54565b611b92565b610c2c919061294d565b6009546001600160a01b03163314610d215760405162461bcd60e51b8152600401610bf1906129a9565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d4f908290611ba5565b610d5a600a82611c04565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610dbb5760405162461bcd60e51b8152600401610bf1906129a9565b801515601260169054906101000a900460ff16151503610dda57600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e2790831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c28918590610c8c9086611924565b6009546001600160a01b03163314610e925760405162461bcd60e51b8152600401610bf1906129a9565b801515601260159054906101000a900460ff16151503610eb157600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e2790831515815260200190565b600080600080600080610f10600a5490565b8710610f2f575060009450600019935083925084915081905080610f55565b6000610f3c600a89611d3f565b9050610f47816116c6565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f885760405162461bcd60e51b8152600401610bf1906129a9565b610f9a81670de0b6b3a76400006129de565b60185550565b6009546001600160a01b03163314610fca5760405162461bcd60e51b8152600401610bf1906129a9565b610fdc81670de0b6b3a76400006129de565b60195550565b60405162461bcd60e51b815260206004820152606960248201527f4d41474156505f4469766964656e645f547261636b65723a207769746864726160448201527f774469766964656e642064697361626c65642e20557365207468652027636c6160648201527f696d272066756e6374696f6e206f6e20746865206d61696e204d41474156502060848201526831b7b73a3930b1ba1760b91b60a482015260c401610bf1565b6009546000906001600160a01b031633146110b55760405162461bcd60e51b8152600401610bf1906129a9565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146110fe5760405162461bcd60e51b8152600401610bf1906129a9565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111725760405162461bcd60e51b8152600401610bf1906129a9565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c2c8261129c565b606060148054610b449061296f565b6009546001600160a01b031633146111e15760405162461bcd60e51b8152600401610bf1906129a9565b801515601260149054906101000a900460ff1615150361120057600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e2790831515815260200190565b6000610c283384610c8c85604051806060016040528060258152602001612bc6602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b0a565b6001600160a01b038116600090815260076020526040812054610c2c906112c284610c9b565b90611d72565b6000610c28338484611aa7565b6009546001600160a01b031633146112ff5760405162461bcd60e51b8152600401610bf1906129a9565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b031633146113575760405162461bcd60e51b8152600401610bf1906129a9565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113a35760405162461bcd60e51b8152600401610bf1906129a9565b601254600160b01b900460ff16156113bd57506000610c2c565b6001600160a01b03831660009081526011602052604090205460ff168280156113e35750805b80156113f95750601254600160a81b900460ff16155b15611408576000915050610c2c565b60008161141d5761141885611db4565b611426565b6114268561206d565b905080156114ec576001600160a01b0385166000908152601760205260409020429055811561149a57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c8360405161148d91815260200190565b60405180910390a36114e1565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114d891815260200190565b60405180910390a35b600192505050610c2c565b506000949350505050565b6009546001600160a01b031633146115215760405162461bcd60e51b8152600401610bf1906129a9565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461156d5760405162461bcd60e51b8152600401610bf1906129a9565b6001600160a01b0382166000908152600f602052604090205460ff166115ad576019548110156115b1576115a2600a83611c04565b6115ad826000611ba5565b5050565b6115bb8282611ba5565b60185481106115d0576115ad600a83836123e0565b6115ad600a83611c04565b6009546001600160a01b031633146116055760405162461bcd60e51b8152600401610bf1906129a9565b6001600160a01b03811661166a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bf1565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080806116d8600a87612489565b945060001993506000851261173a57600e5485111561170657600e546116ff9086906124d4565b935061173a565b600e54600a546000911061171b57600061172a565b600e54600a5461172a91611d72565b90506117368682611b54565b9450505b6117438661129c565b925061174e86610c9b565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a54600090819081908015806117955750601254600160b01b900460ff165b156117ab575050600e5460009250829150611894565b600e546000805a90506000805b89841080156117c657508582105b1561188357846117d5816129f5565b9550508585106117e457600094505b6000600a60000186815481106117fc576117fc612a0e565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff1661184957611836816001611376565b156118495781611845816129f5565b9250505b82611853816129f5565b93505060005a90508085111561187a576118776118708683611d72565b8790611924565b95505b93506117b89050565b600e85905590975095509193505050505b9193909250565b6000826000036118ad57506000610c2c565b60006118b983856129de565b9050826118c6858361294d565b1461191d5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bf1565b9392505050565b6000806119318385612a24565b90508381101561191d5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bf1565b6001600160a01b0383166119e55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bf1565b6001600160a01b038216611a465760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bf1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602d60248201527f4d41474156505f4469766964656e645f547261636b65723a204e6f207472616e60448201526c1cd9995c9cc8185b1b1bddd959609a1b6064820152608401610bf1565b505050565b60008184841115611b2e5760405162461bcd60e51b8152600401610bf1919061279c565b506000611b3b8486612a37565b95945050505050565b60008181811215610c2c57600080fd5b600080611b618385612a4a565b905060008312158015611b745750838112155b80611b895750600083128015611b8957508381125b61191d57600080fd5b600080821215611ba157600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611be4576000611bd28383611d72565b9050611bde8482612511565b50505050565b80821015611b05576000611bf88284611d72565b9050611bde8482612575565b6001600160a01b038116600090815260038301602052604090205460ff16611c2a575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c7491612a37565b90506000846000018281548110611c8d57611c8d612a0e565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cdc57611cdc612a0e565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d1657611d16612a72565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d5657611d56612a0e565b6000918252602090912001546001600160a01b03169392505050565b600061191d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b0a565b600080611dc08361129c565b90508015612064576001600160a01b038316600090815260076020526040902054611deb9082611924565b6001600160a01b03808516600090815260076020526040812092909255601254169081611e70576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e60576040519150601f19603f3d011682016040523d82523d6000602084013e611e65565b606091505b505080915050611fca565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efe9190612a88565b81600081518110611f1157611f11612a0e565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f4557611f45612a0e565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611f8b9060009086908c904290600401612ae9565b6000604051808303818588803b158015611fa457600080fd5b505af193505050508015611fb6575060015b611fc35760009150611fc8565b600191505b505b80612018576001600160a01b038516600090815260076020526040902054611ff29084611d72565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161205391815260200190565b60405180910390a250909392505050565b50600092915050565b6000806120798361129c565b90508015612064576001600160a01b0383166000908152600760205260408120546120a49083611924565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561212c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121509190612a88565b8160008151811061216357612163612a0e565b6001600160a01b03928316602091820292909201015260165482519116908290600190811061219457612194612a0e565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa1580156121ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122129190612b1e565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061224c90600090879030904290600401612ae9565b6000604051808303818588803b15801561226557600080fd5b505af193505050508015612277575060015b6122845760009250612387565b6016546040516370a0823160e01b81523060048201526000916122f79184916001600160a01b0316906370a0823190602401602060405180830381865afa1580156122d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c29190612b1e565b905080156123805760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af1158015612356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237a9190612b37565b50612385565b600093505b505b826123d6576001600160a01b0386166000908152600760205260409020546123af9085611d72565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff1615612425576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166124b45750600019610c2c565b506001600160a01b03166000908152600291909101602052604090205490565b6000806124e18385612b54565b9050600083121580156124f45750838113155b80611b895750600083128015611b89575083811361191d57600080fd5b61251b82826125b9565b612555612536610cdd8360055461189b90919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906124d4565b6001600160a01b0390921660009081526006602052604090209190915550565b61257f8282612698565b61255561259a610cdd8360055461189b90919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b54565b6001600160a01b03821661260f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bf1565b60025461261c9082611924565b6002556001600160a01b0382166000908152602081905260409020546126429082611924565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166126f85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bf1565b61273581604051806060016040528060228152602001612b7c602291396001600160a01b0385166000908152602081905260409020549190611b0a565b6001600160a01b03831660009081526020819052604090205560025461275b9082611d72565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161268c565b600060208083528351808285015260005b818110156127c9578581018301518582016040015282016127ad565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146127ff57600080fd5b50565b60006020828403121561281457600080fd5b813561191d816127ea565b6000806040838503121561283257600080fd5b823561283d816127ea565b946020939093013593505050565b60008060006060848603121561286057600080fd5b833561286b816127ea565b9250602084013561287b816127ea565b929592945050506040919091013590565b80151581146127ff57600080fd5b6000602082840312156128ac57600080fd5b813561191d8161288c565b6000602082840312156128c957600080fd5b5035919050565b600080604083850312156128e357600080fd5b82356128ee816127ea565b915060208301356128fe8161288c565b809150509250929050565b6000806040838503121561291c57600080fd5b8235612927816127ea565b915060208301356128fe816127ea565b634e487b7160e01b600052601160045260246000fd5b60008261296a57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061298357607f821691505b6020821081036129a357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082028115828204841417610c2c57610c2c612937565b600060018201612a0757612a07612937565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820180821115610c2c57610c2c612937565b81810381811115610c2c57610c2c612937565b8082018281126000831280158216821582161715612a6a57612a6a612937565b505092915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612a9a57600080fd5b815161191d816127ea565b600081518084526020808501945080840160005b83811015612ade5781516001600160a01b031687529582019590820190600101612ab9565b509495945050505050565b848152608060208201526000612b026080830186612aa5565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b3057600080fd5b5051919050565b600060208284031215612b4957600080fd5b815161191d8161288c565b8181036000831280158383131683831282161715612b7457612b74612937565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220dc8ba06d694f13c3b73a01233220b58dd03cc55a385877431e46f702d1024d0464736f6c63430008110033

Deployed Bytecode

0x6080604052600436106104145760003560e01c8063715018a61161021e578063a8b9d24011610123578063deab8aea116100ab578063f27fd2541161007a578063f27fd25414610c3f578063f2fde38b14610c5f578063f5d3c79a14610c7f578063f8b45b0514610c9f578063fc6b151c14610cb557600080fd5b8063deab8aea14610bdf578063e2f4560514610bff578063e7841ec014610c15578063e7cb7f8714610c2a57600080fd5b8063ba079d49116100f2578063ba079d4914610b2e578063bb8d513114610b4e578063bdd4f29f14610b64578063d8032ed314610b79578063dd62ed3e14610b9957600080fd5b8063a8b9d24014610a67578063a9059cbb14610a87578063ad56c13c14610aa7578063b62496f514610afe57600080fd5b80638da5cb5b116101a65780639a7a23d6116101755780639a7a23d6146109d15780639c1b8af5146109f15780639c3372ea14610a075780639ec1037e14610a27578063a457c2d714610a4757600080fd5b80638da5cb5b1461096857806395451c291461098657806395d89b411461099c578063992c58e4146109b157600080fd5b806377a3b609116101ed57806377a3b609146108dd5780637fdde05c146108f3578063868730c714610913578063871c128d146109335780638a8c523c1461095357600080fd5b8063715018a61461086857806372d8edf41461087d57806375829def1461089d57806375f0a874146108bd57600080fd5b80633599bb17116103245780635a84c5eb116102ac57806364b0f6531161027b57806364b0f653146107d35780636843cd84146107e85780636d48467b14610808578063700bb1911461082857806370a082311461084857600080fd5b80635a84c5eb146107535780635d098b38146107735780635ebf4db9146107935780635eee4bae146107b357600080fd5b806349bd5a5e116102f357806349bd5a5e146106ae5780634ada218b146106ce5780634e71d92d146106ef5780634fbee193146107045780635124f8741461073d57600080fd5b80633599bb171461063857806339509351146106585780633f407b841461067857806340ffdd801461068e57600080fd5b80631d0adc07116103a757806323b872dd1161037657806323b872dd146105b257806325cd3598146105d25780632c1f5216146105e757806330bb4cff14610607578063313ce5671461061c57600080fd5b80631d0adc07146105465780631fa70531146105665780631fe70a981461057c5780632307b4411461059257600080fd5b8063095ea7b3116103e3578063095ea7b3146104c15780631694505e146104f157806318160ddd146105115780631a221dbb1461053057600080fd5b806303fd2a451461042057806305ca5f081461045d57806306fdde031461047f57806308dfe8a5146104a157600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b50600854610440906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046957600080fd5b5061047d610478366004613207565b610cd5565b005b34801561048b57600080fd5b50610494610da6565b6040516104549190613220565b3480156104ad57600080fd5b5061047d6104bc366004613291565b610e38565b3480156104cd57600080fd5b506104e16104dc3660046132ca565b610ec1565b6040519015158152602001610454565b3480156104fd57600080fd5b50600654610440906001600160a01b031681565b34801561051d57600080fd5b506002545b604051908152602001610454565b34801561053c57600080fd5b5061052260175481565b34801561055257600080fd5b5061047d6105613660046132f6565b610ed8565b34801561057257600080fd5b50610522600a5481565b34801561058857600080fd5b5061052260165481565b34801561059e57600080fd5b5061047d6105ad3660046133e9565b610f6f565b3480156105be57600080fd5b506104e16105cd3660046134ab565b611140565b3480156105de57600080fd5b506104406111a9565b3480156105f357600080fd5b50600d54610440906001600160a01b031681565b34801561061357600080fd5b5061052261121c565b34801561062857600080fd5b5060405160128152602001610454565b34801561064457600080fd5b5061047d6106533660046134ec565b61128a565b34801561066457600080fd5b506104e16106733660046132ca565b611317565b34801561068457600080fd5b5061052260095481565b34801561069a57600080fd5b5061047d6106a93660046134ec565b61134d565b3480156106ba57600080fd5b50600754610440906001600160a01b031681565b3480156106da57600080fd5b506008546104e190600160a81b900460ff1681565b3480156106fb57600080fd5b5061047d6113a8565b34801561071057600080fd5b506104e161071f3660046132f6565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561074957600080fd5b5061052260145481565b34801561075f57600080fd5b5061047d61076e366004613207565b611420565b34801561077f57600080fd5b5061047d61078e3660046132f6565b61147b565b34801561079f57600080fd5b5061047d6107ae366004613207565b61150b565b3480156107bf57600080fd5b5061047d6107ce366004613207565b611566565b3480156107df57600080fd5b506105226115a8565b3480156107f457600080fd5b506105226108033660046132f6565b6115f2565b34801561081457600080fd5b506104e16108233660046132f6565b611662565b34801561083457600080fd5b5061047d610843366004613207565b6116d2565b34801561085457600080fd5b506105226108633660046132f6565b6117a4565b34801561087457600080fd5b5061047d6117bf565b34801561088957600080fd5b5061047d6108983660046132f6565b611833565b3480156108a957600080fd5b5061047d6108b83660046132f6565b61188f565b3480156108c957600080fd5b50600e54610440906001600160a01b031681565b3480156108e957600080fd5b5061052260155481565b3480156108ff57600080fd5b5061047d61090e366004613291565b611944565b34801561091f57600080fd5b5061047d61092e3660046134ec565b611999565b34801561093f57600080fd5b5061047d61094e366004613207565b6119d1565b34801561095f57600080fd5b5061047d611a4d565b34801561097457600080fd5b506005546001600160a01b0316610440565b34801561099257600080fd5b5061052260135481565b3480156109a857600080fd5b50610494611acc565b3480156109bd57600080fd5b5061047d6109cc366004613509565b611adb565b3480156109dd57600080fd5b5061047d6109ec366004613291565b611c35565b3480156109fd57600080fd5b5061052260185481565b348015610a1357600080fd5b5061047d610a223660046134ec565b611c6d565b348015610a3357600080fd5b5061047d610a423660046132f6565b611cc9565b348015610a5357600080fd5b506104e1610a623660046132ca565b611d8b565b348015610a7357600080fd5b50610522610a823660046132f6565b611dda565b348015610a9357600080fd5b506104e1610aa23660046132ca565b611e0d565b348015610ab357600080fd5b50610ac7610ac23660046132f6565b611e1a565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610454565b348015610b0a57600080fd5b506104e1610b193660046132f6565b601a6020526000908152604090205460ff1681565b348015610b3a57600080fd5b506104e1610b493660046132f6565b611eaa565b348015610b5a57600080fd5b5061052260125481565b348015610b7057600080fd5b50610522611edd565b348015610b8557600080fd5b5061047d610b943660046132f6565b611f27565b348015610ba557600080fd5b50610522610bb436600461354c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610beb57600080fd5b50600f54610440906001600160a01b031681565b348015610c0b57600080fd5b5061052260115481565b348015610c2157600080fd5b50610522611fea565b348015610c3657600080fd5b50610522612034565b348015610c4b57600080fd5b50610ac7610c5a366004613207565b61207e565b348015610c6b57600080fd5b5061047d610c7a3660046132f6565b6120bc565b348015610c8b57600080fd5b5061047d610c9a3660046134ec565b6121a7565b348015610cab57600080fd5b5061052260105481565b348015610cc157600080fd5b5061047d610cd0366004613207565b6121df565b6005546001600160a01b03163314610d085760405162461bcd60e51b8152600401610cff9061357a565b60405180910390fd5b610d1a81670de0b6b3a76400006135c5565b90506000610d35600954600a5461229490919063ffffffff16565b90506000610d5882610d52600a54866122fa90919063ffffffff16565b9061237c565b90506000610d7583610d52600954876122fa90919063ffffffff16565b9050610d80846123be565b600a54610d8d90836126be565b600a55600954610d9d90826126be565b60095550505050565b606060038054610db5906135dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610de1906135dc565b8015610e2e5780601f10610e0357610100808354040283529160200191610e2e565b820191906000526020600020905b815481529060010190602001808311610e1157829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e625760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000610ece338484612700565b5060015b92915050565b6005546001600160a01b03163314610f025760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b038116600081815260196020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527f3c2a46a28084880d3bc39c8f240a57690614613728ce03d2a8c6dc645892e4fb91015b60405180910390a150565b6005546001600160a01b03163314610f995760405162461bcd60e51b8152600401610cff9061357a565b8051825114610fea5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cff565b60c8825111156110475760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610cff565b60005b825181101561113b57600083828151811061106757611067613616565b60200260200101519050600083838151811061108557611085613616565b6020026020010151670de0b6b3a76400006110a091906135c5565b90506110ad338383612825565b600d546001600160a01b031663e30443bc836110c8816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561110e57600080fd5b505af1158015611122573d6000803e3d6000fd5b50505050505080806111339061362c565b91505061104a565b505050565b600061114d84848461292e565b61119f843361119a856040518060600160405280602881526020016138a3602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612e79565b612700565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613645565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613662565b6005546001600160a01b031633146112b45760405162461bcd60e51b8152600401610cff9061357a565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b1580156112fc57600080fd5b505af1158015611310573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ece91859061119a9086612294565b6005546001600160a01b031633146113775760405162461bcd60e51b8152600401610cff9061357a565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016112e2565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156113f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141d919061367b565b50565b6005546001600160a01b0316331461144a5760405162461bcd60e51b8152600401610cff9061357a565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016112e2565b6005546001600160a01b031633146114a55760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b038116600081815260196020908152604091829020805460ff19166001179055600e80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101610f64565b6005546001600160a01b031633146115355760405162461bcd60e51b8152600401610cff9061357a565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016112e2565b6005546001600160a01b031633146115905760405162461bcd60e51b8152600401610cff9061357a565b6115a281670de0b6b3a76400006135c5565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561163e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613662565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed2919061367b565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117499190613698565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146117e95760405162461bcd60e51b8152600401610cff9061357a565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461185d5760405162461bcd60e51b8152600401610cff9061357a565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016112e2565b6005546001600160a01b031633146118b95760405162461bcd60e51b8152600401610cff9061357a565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561190057600080fd5b505af1158015611914573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601960205260409020805460ff191660011790555061141d816120bc565b6005546001600160a01b0316331461196e5760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016112e2565b6005546001600160a01b031633146119fb5760405162461bcd60e51b8152600401610cff9061357a565b62030d408110158015611a115750620f42408111155b611a1a57600080fd5b60185460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601855565b6005546001600160a01b03163314611a775760405162461bcd60e51b8152600401610cff9061357a565b600854600160a81b900460ff1615611a8e57600080fd5b6008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610db5906135dc565b6005546001600160a01b03163314611b055760405162461bcd60e51b8152600401610cff9061357a565b601486905560158490556013859055601283905560168290556017819055611b3781611b318588612294565b90612294565b600b55601654601454601554611b529291611b319190612294565b600c55600b546101f410801590611b6d57506101f4600c5411155b611bc95760405162461bcd60e51b815260206004820152602760248201527f746f74616c20666565732063616e6e6f74206578636565642035252073656c6c604482015266206f722062757960c81b6064820152608401610cff565b601354601254601454601554601654601754604080519687526020870195909552938501929092526060840152608083015260a08201527ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff9060c00160405180910390a1505050505050565b6005546001600160a01b03163314611c5f5760405162461bcd60e51b8152600401610cff9061357a565b611c698282612eb3565b5050565b6005546001600160a01b03163314611c975760405162461bcd60e51b8152600401610cff9061357a565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016112e2565b6005546001600160a01b03163314611cf35760405162461bcd60e51b8152600401610cff9061357a565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b158015611d3a57600080fd5b505af1158015611d4e573d6000803e3d6000fd5b5050600d546040516338c110ef60e21b81526001600160a01b03858116600483015260006024830152909116925063e30443bc91506044016112e2565b6000610ece338461119a856040518060600160405280602581526020016138cb602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612e79565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611621565b6000610ece33848461292e565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015611e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9691906136c6565b949c939b5091995097509550909350915050565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611691565b600d546040805163bdd4f29f60e01b815290516000926001600160a01b03169163bdd4f29f9160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b6005546001600160a01b03163314611f515760405162461bcd60e51b8152600401610cff9061357a565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050610f64565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d546040805163e7cb7f8760e01b815290516000926001600160a01b03169163e7cb7f879160048083019260209291908290030181865afa158015611266573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401611e55565b6005546001600160a01b031633146120e65760405162461bcd60e51b8152600401610cff9061357a565b6001600160a01b03811661214b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cff565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016112e2565b6005546001600160a01b031633146122095760405162461bcd60e51b8152600401610cff9061357a565b61221b81670de0b6b3a76400006135c5565b90506103e860025461222d9190613719565b81101561228f5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401610cff565b601055565b6000806122a1838561373b565b9050838110156122f35760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cff565b9392505050565b60008260000361230c57506000610ed2565b600061231883856135c5565b9050826123258583613719565b146122f35760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cff565b60006122f383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f7c565b806000036123c95750565b6123d281612faa565b60006123eb600954600a5461229490919063ffffffff16565b60155490915060019081908190600090819081901561244c5761244960165460145460155461241a919061373b565b612424919061373b565b610d526015546124438b610d52600a54476122fa90919063ffffffff16565b906122fa565b91505b601254156124965761249360175460135460125461246a919061373b565b612474919061373b565b610d526012546124438b610d52600954476122fa90919063ffffffff16565b90505b6124a08282612294565b9250821561250057600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146124f5576040519150601f19603f3d011682016040523d82523d6000602084013e6124fa565b606091505b50909650505b600061251960165460145461229490919063ffffffff16565b60175460135461252891612294565b612532919061373b565b90506000811561254957612546478361237c565b90505b60008161256360135460145461229490919063ffffffff16565b61256d91906135c5565b905060008261258960175460165461229490919063ffffffff16565b61259391906135c5565b905081156125f357600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146125e8576040519150601f19603f3d011682016040523d82523d6000602084013e6125ed565b606091505b50909950505b801561265157600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114612646576040519150601f19603f3d011682016040523d82523d6000602084013e61264b565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd08761267d838561373b565b8c801561268757508b5b801561269057508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006122f383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e79565b6001600160a01b0383166127625760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cff565b6001600160a01b0382166127c35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cff565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661284b5760405162461bcd60e51b8152600401610cff9061374e565b6001600160a01b0382166128715760405162461bcd60e51b8152600401610cff90613793565b6128ae8160405180606001604052806026815260200161387d602691396001600160a01b0386166000908152602081905260409020549190612e79565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546128dd9082612294565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612818565b6001600160a01b0383166129545760405162461bcd60e51b8152600401610cff9061374e565b6001600160a01b03821661297a5760405162461bcd60e51b8152600401610cff90613793565b6001600160a01b0383166000908152601b60205260408120548190819060ff166129f757600854600160a81b900460ff166129f75760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610cff565b83600003612a1357612a0b86866000612825565b505050505050565b6008546001600160a01b0390811690861603612a3357612a0b86856130fc565b600854600160a01b900460ff16158015612a6657506001600160a01b03861660009081526019602052604090205460ff16155b8015612a8b57506001600160a01b03851660009081526019602052604090205460ff16155b15612d72576001600160a01b038086166000908152601a602052604080822054928916825290205460ff918216911680158015612ac6575081155b15612bd457612ad6888888612825565b600d546001600160a01b031663e30443bc89612af1816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612b3757600080fd5b505af1158015612b4b573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088612b6c816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612bb257600080fd5b505af1158015612bc6573d6000803e3d6000fd5b505050505050505050505050565b8115612bee57601254945060135493506017549250612c7a565b8015612c7a576015549450601454935060165492506000612c0e886117a4565b601054909150612c1e888361373b565b1115612c785760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610cff565b505b6000612c90612c89858761373b565b8790612294565b90506000612c9d306117a4565b60115490915081108015908190612ccd57506001600160a01b038b166000908152601a602052604090205460ff16155b15612d14576008805460ff60a01b1916600160a01b1790556000612cf0306117a4565b9050612cfb816123be565b506001600a8190556009556008805460ff60a01b191690555b6000612d26612710610d528c876122fa565b9050612d328a826126be565b99508515612d4f57600954612d479082612294565b600955612d60565b600a54612d5c9082612294565b600a555b612d6b8c3083612825565b5050505050505b612d7d868686612825565b600d546001600160a01b031663e30443bc87612d98816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612dde57600080fd5b505af1158015612df2573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905086612e13816117a4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612e5957600080fd5b505af1158015612e6d573d6000803e3d6000fd5b50505050505050505050565b60008184841115612e9d5760405162461bcd60e51b8152600401610cff9190613220565b506000612eaa84866137d6565b95945050505050565b6001600160a01b0382166000908152601a60205260409020805460ff19168215801591909117909155612f4057600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015612f2757600080fd5b505af1158015612f3b573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60008183612f9d5760405162461bcd60e51b8152600401610cff9190613220565b506000612eaa8486613719565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612fdf57612fdf613616565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305c9190613645565b8160018151811061306f5761306f613616565b6001600160a01b0392831660209182029290920101526006546130959130911684612700565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906130ce9085906000908690309042906004016137e9565b600060405180830381600087803b1580156130e857600080fd5b505af1158015612a0b573d6000803e3d6000fd5b6001600160a01b03821661315c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cff565b6131998160405180606001604052806022815260200161385b602291396001600160a01b0385166000908152602081905260409020549190612e79565b6001600160a01b0383166000908152602081905260409020556002546131bf90826126be565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60006020828403121561321957600080fd5b5035919050565b600060208083528351808285015260005b8181101561324d57858101830151858201604001528201613231565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461141d57600080fd5b801515811461141d57600080fd5b600080604083850312156132a457600080fd5b82356132af8161326e565b915060208301356132bf81613283565b809150509250929050565b600080604083850312156132dd57600080fd5b82356132e88161326e565b946020939093013593505050565b60006020828403121561330857600080fd5b81356122f38161326e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561335257613352613313565b604052919050565b600067ffffffffffffffff82111561337457613374613313565b5060051b60200190565b600082601f83011261338f57600080fd5b813560206133a461339f8361335a565b613329565b82815260059290921b840181019181810190868411156133c357600080fd5b8286015b848110156133de57803583529183019183016133c7565b509695505050505050565b600080604083850312156133fc57600080fd5b823567ffffffffffffffff8082111561341457600080fd5b818501915085601f83011261342857600080fd5b8135602061343861339f8361335a565b82815260059290921b8401810191818101908984111561345757600080fd5b948201945b8386101561347e57853561346f8161326e565b8252948201949082019061345c565b9650508601359250508082111561349457600080fd5b506134a18582860161337e565b9150509250929050565b6000806000606084860312156134c057600080fd5b83356134cb8161326e565b925060208401356134db8161326e565b929592945050506040919091013590565b6000602082840312156134fe57600080fd5b81356122f381613283565b60008060008060008060c0878903121561352257600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b6000806040838503121561355f57600080fd5b823561356a8161326e565b915060208301356132bf8161326e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ed257610ed26135af565b600181811c908216806135f057607f821691505b60208210810361361057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161363e5761363e6135af565b5060010190565b60006020828403121561365757600080fd5b81516122f38161326e565b60006020828403121561367457600080fd5b5051919050565b60006020828403121561368d57600080fd5b81516122f381613283565b6000806000606084860312156136ad57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c087890312156136df57600080fd5b86516136ea8161326e565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b60008261373657634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610ed257610ed26135af565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610ed257610ed26135af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156138395784516001600160a01b031683529383019391830191600101613814565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203f20dd3d1b131e19b3137a32c0388d789dfb91f0c0b0ae44aa235a4d70f4c6e464736f6c63430008110033

Deployed Bytecode Sourcemap

25318:19778:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25479:64;;;;;;;;;;-1:-1:-1;25479:64:0;;;;-1:-1:-1;;;;;25479:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25479:64:0;;;;;;;;41958:443;;;;;;;;;;-1:-1:-1;41958:443:0;;;;;:::i;:::-;;:::i;:::-;;5588:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31260:181::-;;;;;;;;;;-1:-1:-1;31260:181:0;;;;;:::i;:::-;;:::i;6643:210::-;;;;;;;;;;-1:-1:-1;6643:210:0;;;;;:::i;:::-;;:::i;:::-;;;2091:14:1;;2084:22;2066:41;;2054:2;2039:18;6643:210:0;1926:187:1;25394:41:0;;;;;;;;;;-1:-1:-1;25394:41:0;;;;-1:-1:-1;;;;;25394:41:0;;;5909:108;;;;;;;;;;-1:-1:-1;5997:12:0;;5909:108;;;2499:25:1;;;2487:2;2472:18;5909:108:0;2353:177:1;26217:29:0;;;;;;;;;;;;;;;;31009:199;;;;;;;;;;-1:-1:-1;31009:199:0;;;;;:::i;:::-;;:::i;25657:28::-;;;;;;;;;;;;;;;;26182;;;;;;;;;;;;;;;;44456:637;;;;;;;;;;-1:-1:-1;44456:637:0;;;;;:::i;:::-;;:::i;6861:454::-;;;;;;;;;;-1:-1:-1;6861:454:0;;;;;:::i;:::-;;:::i;41122:114::-;;;;;;;;;;;;;:::i;25767:44::-;;;;;;;;;;-1:-1:-1;25767:44:0;;;;-1:-1:-1;;;;;25767:44:0;;;34725:141;;;;;;;;;;;;;:::i;30432:93::-;;;;;;;;;;-1:-1:-1;30432:93:0;;30515:2;6123:36:1;;6111:2;6096:18;30432:93:0;5981:184:1;37068:119:0;;;;;;;;;;-1:-1:-1;37068:119:0;;;;;:::i;:::-;;:::i;7323:300::-;;;;;;;;;;-1:-1:-1;7323:300:0;;;;;:::i;:::-;;:::i;25621:29::-;;;;;;;;;;;;;;;;32816:121;;;;;;;;;;-1:-1:-1;32816:121:0;;;;;:::i;:::-;;:::i;25444:28::-;;;;;;;;;;-1:-1:-1;25444:28:0;;;;-1:-1:-1;;;;;25444:28:0;;;25578:34;;;;;;;;;;-1:-1:-1;25578:34:0;;;;-1:-1:-1;;;25578:34:0;;;;;;36437:103;;;;;;;;;;;;;:::i;34874:126::-;;;;;;;;;;-1:-1:-1;34874:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;34964:28:0;34940:4;34964:28;;;:19;:28;;;;;;;;;34874:126;26109:31;;;;;;;;;;;;;;;;41584:183;;;;;;;;;;-1:-1:-1;41584:183:0;;;;;:::i;:::-;;:::i;30766:205::-;;;;;;;;;;-1:-1:-1;30766:205:0;;;;;:::i;:::-;;:::i;41775:175::-;;;;;;;;;;-1:-1:-1;41775:175:0;;;;;:::i;:::-;;:::i;32388:120::-;;;;;;;;;;-1:-1:-1;32388:120:0;;;;;:::i;:::-;;:::i;36686:142::-;;;;;;;;;;;;;:::i;35200:171::-;;;;;;;;;;-1:-1:-1;35200:171:0;;;;;:::i;:::-;;:::i;37195:185::-;;;;;;;;;;-1:-1:-1;37195:185:0;;;;;:::i;:::-;;:::i;36019:410::-;;;;;;;;;;-1:-1:-1;36019:410:0;;;;;:::i;:::-;;:::i;6025:177::-;;;;;;;;;;-1:-1:-1;6025:177:0;;;;;:::i;:::-;;:::i;13002:148::-;;;;;;;;;;;;;:::i;31490:127::-;;;;;;;;;;-1:-1:-1;31490:127:0;;;;;:::i;:::-;;:::i;33482:208::-;;;;;;;;;;-1:-1:-1;33482:208:0;;;;;:::i;:::-;;:::i;25820:38::-;;;;;;;;;;-1:-1:-1;25820:38:0;;;;-1:-1:-1;;;;;25820:38:0;;;26147:28;;;;;;;;;;;;;;;;31893:170;;;;;;;;;;-1:-1:-1;31893:170:0;;;;;:::i;:::-;;:::i;36836:109::-;;;;;;;;;;-1:-1:-1;36836:109:0;;;;;:::i;:::-;;:::i;33233:241::-;;;;;;;;;;-1:-1:-1;33233:241:0;;;;;:::i;:::-;;:::i;30570:151::-;;;;;;;;;;;;;:::i;12788:79::-;;;;;;;;;;-1:-1:-1;12853:6:0;;-1:-1:-1;;;;;12853:6:0;12788:79;;26070:32;;;;;;;;;;;;;;;;5696:104;;;;;;;;;;;;;:::i;33698:1019::-;;;;;;;;;;-1:-1:-1;33698:1019:0;;;;;:::i;:::-;;:::i;32516:163::-;;;;;;;;;;-1:-1:-1;32516:163:0;;;;;:::i;:::-;;:::i;26304:40::-;;;;;;;;;;;;;;;;32687:121;;;;;;;;;;-1:-1:-1;32687:121:0;;;;;:::i;:::-;;:::i;31655:176::-;;;;;;;;;;-1:-1:-1;31655:176:0;;;;;:::i;:::-;;:::i;7631:400::-;;;;;;;;;;-1:-1:-1;7631:400:0;;;;;:::i;:::-;;:::i;35008:184::-;;;;;;;;;;-1:-1:-1;35008:184:0;;;;;:::i;:::-;;:::i;6210:216::-;;;;;;;;;;-1:-1:-1;6210:216:0;;;;;:::i;:::-;;:::i;35379:307::-;;;;;;;;;;-1:-1:-1;35379:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7469:32:1;;;7451:51;;7533:2;7518:18;;7511:34;;;;7561:18;;;7554:34;;;;7619:2;7604:18;;7597:34;7662:3;7647:19;;7640:35;7489:3;7691:19;;7684:35;7438:3;7423:19;35379:307:0;7168:557:1;26467:57:0;;;;;;;;;;-1:-1:-1;26467:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37388:127;;;;;;;;;;-1:-1:-1;37388:127:0;;;;;:::i;:::-;;:::i;26034:29::-;;;;;;;;;;;;;;;;41414:154;;;;;;;;;;;;;:::i;40956:158::-;;;;;;;;;;-1:-1:-1;40956:158:0;;;;;:::i;:::-;;:::i;6434:201::-;;;;;;;;;;-1:-1:-1;6434:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6600:18:0;;;6568:7;6600:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6434:201;25865:36;;;;;;;;;;-1:-1:-1;25865:36:0;;;;-1:-1:-1;;;;;25865:36:0;;;25994:33;;;;;;;;;;;;;;;;36548:130;;;;;;;;;;;;;:::i;41244:162::-;;;;;;;;;;;;;:::i;35694:317::-;;;;;;;;;;-1:-1:-1;35694:317:0;;;;;:::i;:::-;;:::i;13158:281::-;;;;;;;;;;-1:-1:-1;13158:281:0;;;;;:::i;:::-;;:::i;36953:107::-;;;;;;;;;;-1:-1:-1;36953:107:0;;;;;:::i;:::-;;:::i;25963:24::-;;;;;;;;;;;;;;;;32133:221;;;;;;;;;;-1:-1:-1;32133:221:0;;;;;:::i;:::-;;:::i;41958:443::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;;;;;;;;;42046:17:::1;:6:::0;42056::::1;42046:17;:::i;:::-;42037:26;;42074:19;42096:25;42110:10;;42096:9;;:13;;:25;;;;:::i;:::-;42074:47;;42132:15;42150:38;42176:11;42150:21;42161:9;;42150:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;42132:56;;42199:16;42218:39;42245:11;42218:22;42229:10;;42218:6;:10;;:22;;;;:::i;:39::-;42199:58;;42270:28;42291:6;42270:20;:28::i;:::-;42323:9;::::0;:22:::1;::::0;42337:7;42323:13:::1;:22::i;:::-;42311:9;:34:::0;42369:10:::1;::::0;:24:::1;::::0;42384:8;42369:14:::1;:24::i;:::-;42356:10;:37:::0;-1:-1:-1;;;;41958:443:0:o;5588:100::-;5642:13;5675:5;5668:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5588:100;:::o;31260:181::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31344:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;31344:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31399:34;;2066:41:1;;;31399:34:0::1;::::0;2039:18:1;31399:34:0::1;;;;;;;31260:181:::0;;:::o;6643:210::-;6762:4;6784:39;174:10;6807:7;6816:6;6784:8;:39::i;:::-;-1:-1:-1;6841:4:0;6643:210;;;;;:::o;31009:199::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31081:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;31081:34:0::1;31111:4;31081:34;::::0;;31126:13:::1;:31:::0;;-1:-1:-1;;;;;;31126:31:0::1;::::0;::::1;::::0;;31173:27;;160:51:1;;;31173:27:0::1;::::0;133:18:1;31173:27:0::1;;;;;;;;31009:199:::0;:::o;44456:637::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;44628:6:::1;:13;44603:14;:21;:38;44595:80;;;::::0;-1:-1:-1;;;44595:80:0;;9376:2:1;44595:80:0::1;::::0;::::1;9358:21:1::0;9415:2;9395:18;;;9388:30;9454:32;9434:18;;;9427:60;9504:18;;44595:80:0::1;9174:354:1::0;44595:80:0::1;44719:3;44694:14;:21;:28;;44686:75;;;::::0;-1:-1:-1;;;44686:75:0;;9735:2:1;44686:75:0::1;::::0;::::1;9717:21:1::0;9774:2;9754:18;;;9747:30;9813:34;9793:18;;;9786:62;-1:-1:-1;;;9864:18:1;;;9857:32;9906:19;;44686:75:0::1;9533:398:1::0;44686:75:0::1;44777:9;44772:314;44796:14;:21;44792:1;:25;44772:314;;;44839:14;44856;44871:1;44856:17;;;;;;;;:::i;:::-;;;;;;;44839:34;;44888:21;44912:6;44919:1;44912:9;;;;;;;;:::i;:::-;;;;;;;44925:6;44912:20;;;;:::i;:::-;44888:44;;44947:50;44963:10;44975:6;44983:13;44947:15;:50::i;:::-;45012:15;::::0;-1:-1:-1;;;;;45012:15:0::1;:26;45047:6:::0;45056:17:::1;45047:6:::0;45056:9:::1;:17::i;:::-;45012:62;::::0;-1:-1:-1;;;;;;45012:62:0::1;::::0;;;;;;-1:-1:-1;;;;;10268:32:1;;;45012:62:0::1;::::0;::::1;10250:51:1::0;10317:18;;;10310:34;10223:18;;45012:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44824:262;;44819:3;;;;;:::i;:::-;;;;44772:314;;;;44456:637:::0;;:::o;6861:454::-;7001:4;7018:36;7028:6;7036:9;7047:6;7018:9;:36::i;:::-;7065:220;7088:6;174:10;7136:138;7192:6;7136:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7136:19:0;;;;;;:11;:19;;;;;;;;174:10;7136:33;;;;;;;;;;:37;:138::i;:::-;7065:8;:220::i;:::-;-1:-1:-1;7303:4:0;6861:454;;;;;:::o;41122:114::-;41196:15;;:32;;;-1:-1:-1;;;41196:32:0;;;;41169:7;;-1:-1:-1;;;;;41196:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41189:39;;41122:114;:::o;34725:141::-;34815:15;;:43;;;-1:-1:-1;;;34815:43:0;;;;34788:7;;-1:-1:-1;;;;;34815:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37068:119::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;37138:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;37138:41:0;;2091:14:1;;2084:22;37138:41:0::1;::::0;::::1;2066::1::0;-1:-1:-1;;;;;37138:15:0;;::::1;::::0;:34:::1;::::0;2039:18:1;;37138:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37068:119:::0;:::o;7323:300::-;174:10;7438:4;7532:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7532:34:0;;;;;;;;;;7438:4;;7460:133;;7510:7;;7532:50;;7571:10;7532:38;:50::i;32816:121::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;32886:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;32886:43:0;;2091:14:1;;2084:22;32886:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;32886:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;32886:43:0::1;1926:187:1::0;36437:103:0;36474:15;;:58;;-1:-1:-1;;;36474:58:0;;36513:10;36474:58;;;11124:51:1;36474:15:0;11191:18:1;;;11184:50;-1:-1:-1;;;;;36474:15:0;;;;:30;;11097:18:1;;36474:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36437:103::o;41584:183::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;41698:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;41698:61:0;;::::1;::::0;::::1;2499:25:1::0;;;-1:-1:-1;;;;;41698:15:0;;::::1;::::0;:54:::1;::::0;2472:18:1;;41698:61:0::1;2353:177:1::0;30766:205:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30840:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;30840:34:0::1;30870:4;30840:34;::::0;;30885:15:::1;:33:::0;;-1:-1:-1;;;;;;30885:33:0::1;::::0;::::1;::::0;;30934:29;;160:51:1;;;30934:29:0::1;::::0;133:18:1;30934:29:0::1;14:203:1::0;41775:175:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;41885:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;41885:57:0;;::::1;::::0;::::1;2499:25:1::0;;;-1:-1:-1;;;;;41885:15:0;;::::1;::::0;:50:::1;::::0;2472:18:1;;41885:57:0::1;2353:177:1::0;32388:120:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;32483:17:::1;:6:::0;32493::::1;32483:17;:::i;:::-;32462:18;:38:::0;-1:-1:-1;32388:120:0:o;36686:142::-;36779:15;;:41;;;-1:-1:-1;;;36779:41:0;;;;36752:7;;-1:-1:-1;;;;;36779:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;35200:171;35329:15;;:34;;-1:-1:-1;;;35329:34:0;;-1:-1:-1;;;;;178:32:1;;;35329:34:0;;;160:51:1;35297:7:0;;35329:15;;:25;;133:18:1;;35329:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37195:185::-;37324:15;;:48;;-1:-1:-1;;;37324:48:0;;-1:-1:-1;;;;;178:32:1;;;37324:48:0;;;160:51:1;37295:4:0;;37324:15;;:39;;133:18:1;;37324:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36019:410::-;36201:15;;:28;;-1:-1:-1;;;;;;36201:28:0;;;;;2499:25:1;;;36099:18:0;;;;;;-1:-1:-1;;;;;36201:15:0;;:23;;2472:18:1;;36201:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36245:176;;;12037:25:1;;;12093:2;12078:18;;12071:34;;;12121:18;;;12114:34;;;12179:2;12164:18;;12157:34;;;36084:145:0;;-1:-1:-1;36084:145:0;;-1:-1:-1;36084:145:0;-1:-1:-1;36401:9:0;;36363:5;;36245:176;;12024:3:1;12009:19;36245:176:0;;;;;;;36073:356;;;36019:410;:::o;6025:177::-;-1:-1:-1;;;;;6176:18:0;6144:7;6176:18;;;;;;;;;;;;6025:177::o;13002:148::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;13093:6:::1;::::0;13072:40:::1;::::0;13109:1:::1;::::0;-1:-1:-1;;;;;13093:6:0::1;::::0;13072:40:::1;::::0;13109:1;;13072:40:::1;13123:6;:19:::0;;-1:-1:-1;;;;;;13123:19:0::1;::::0;;13002:148::o;31490:127::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;31564:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31564:45:0;;-1:-1:-1;;;;;178:32:1;;;31564:45:0::1;::::0;::::1;160:51:1::0;31564:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;31564:45:0::1;14:203:1::0;33482:208:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;33551:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;33551:46:0;;-1:-1:-1;;;;;178:32:1;;;33551:46:0::1;::::0;::::1;160:51:1::0;33551:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;33551:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;33608:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;33608:36:0::1;33640:4;33608:36;::::0;;-1:-1:-1;33655:27:0::1;33628:8:::0;33655:17:::1;:27::i;31893:170::-:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32005:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;32005:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31893:170::o;36836:109::-;36890:15;;:47;;-1:-1:-1;;;36890:47:0;;36919:10;36890:47;;;11124:51:1;11218:14;;11211:22;11191:18;;;11184:50;-1:-1:-1;;;;;36890:15:0;;;;:28;;11097:18:1;;36890:47:0;10940:300:1;33233:241:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;33331:6:::1;33319:8;:18;;:41;;;;;33353:7;33341:8;:19;;33319:41;33311:50;;;::::0;::::1;;33411:16;::::0;33377:51:::1;::::0;33401:8;;33377:51:::1;::::0;;;::::1;33439:16;:27:::0;33233:241::o;30570:151::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;30634:14:::1;::::0;-1:-1:-1;;;30634:14:0;::::1;;;30633:15;30625:24;;;::::0;::::1;;30660:14;:21:::0;;-1:-1:-1;;;;30660:21:0::1;-1:-1:-1::0;;;30660:21:0::1;::::0;;30697:16:::1;::::0;::::1;::::0;30660:21;;30697:16:::1;30570:151::o:0;5696:104::-;5752:13;5785:7;5778:14;;;;;:::i;33698:1019::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;33934:16:::1;:31:::0;;;33976:13:::1;:26:::0;;;34013:17:::1;:33:::0;;;34057:14:::1;:28:::0;;;34096:13:::1;:26:::0;;;34133:14:::1;:28:::0;;;34190:85:::1;34150:11:::0;34190:51:::1;34074:11:::0;34033:13;34190:32:::1;:51::i;:::-;:69:::0;::::1;:85::i;:::-;34174:13;:101:::0;34371:13:::1;::::0;34335:16:::1;::::0;34303:13:::1;::::0;:82:::1;::::0;34371:13;34303:49:::1;::::0;:13;:31:::1;:49::i;:82::-;34288:12;:97:::0;34406:13:::1;::::0;34423:3:::1;-1:-1:-1::0;34406:20:0;::::1;::::0;:43:::1;;;34446:3;34430:12;;:19;;34406:43;34398:95;;;::::0;-1:-1:-1;;;34398:95:0;;12693:2:1;34398:95:0::1;::::0;::::1;12675:21:1::0;12732:2;12712:18;;;12705:30;12771:34;12751:18;;;12744:62;-1:-1:-1;;;12822:18:1;;;12815:37;12869:19;;34398:95:0::1;12491:403:1::0;34398:95:0::1;34536:17;::::0;34568:14:::1;::::0;34597:16:::1;::::0;34628:13:::1;::::0;34656::::1;::::0;34684:14:::1;::::0;34511:198:::1;::::0;;13186:25:1;;;13242:2;13227:18;;13220:34;;;;13270:18;;;13263:34;;;;13328:2;13313:18;;13306:34;13371:3;13356:19;;13349:35;13415:3;13400:19;;13393:35;34511:198:0::1;::::0;13173:3:1;13158:19;34511:198:0::1;;;;;;;33698:1019:::0;;;;;;:::o;32516:163::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;32630:41:::1;32659:4;32665:5;32630:28;:41::i;:::-;32516:163:::0;;:::o;32687:121::-;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;32757:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;32757:43:0;;2091:14:1;;2084:22;32757:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;32757:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;32757:43:0::1;1926:187:1::0;31655:176:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;31729:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31729:45:0;;-1:-1:-1;;;;;178:32:1;;;31729:45:0::1;::::0;::::1;160:51:1::0;31729:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;31729:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31785:15:0::1;::::0;:38:::1;::::0;-1:-1:-1;;;31785:38:0;;-1:-1:-1;;;;;10268:32:1;;;31785:38:0::1;::::0;::::1;10250:51:1::0;31785:15:0::1;10317:18:1::0;;;10310:34;31785:15:0;;::::1;::::0;-1:-1:-1;31785:26:0::1;::::0;-1:-1:-1;10223:18:1;;31785:38:0::1;10068:282:1::0;7631:400:0;7751:4;7773:228;174:10;7823:7;7845:145;7902:15;7845:145;;;;;;;;;;;;;;;;;174:10;7845:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7845:34:0;;;;;;;;;;;;:38;:145::i;35008:184::-;35137:15;;:47;;-1:-1:-1;;;35137:47:0;;-1:-1:-1;;;;;178:32:1;;;35137:47:0;;;160:51:1;35105:7:0;;35137:15;;:38;;133:18:1;;35137:47:0;14:203:1;6210:216:0;6332:4;6354:42;174:10;6378:9;6389:6;6354:9;:42::i;35379:307::-;35643:15;;:35;;-1:-1:-1;;;35643:35:0;;-1:-1:-1;;;;;178:32:1;;;35643:35:0;;;160:51:1;35493:7:0;;;;;;;;;;;;35643:15;;;;:26;;133:18:1;;35643:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35636:42;;;;-1:-1:-1;35636:42:0;;-1:-1:-1;35636:42:0;-1:-1:-1;35636:42:0;-1:-1:-1;35636:42:0;;-1:-1:-1;35379:307:0;-1:-1:-1;;35379:307:0:o;37388:127::-;37472:15;;:35;;-1:-1:-1;;;37472:35:0;;-1:-1:-1;;;;;178:32:1;;;37472:35:0;;;160:51:1;37448:4:0;;37472:15;;:26;;133:18:1;;37472:35:0;14:203:1;41414:154:0;41508:15;;:52;;;-1:-1:-1;;;41508:52:0;;;;41481:7;;-1:-1:-1;;;;;41508:15:0;;:50;;:52;;;;;;;;;;;;;;:15;:52;;;;;;;;;;;;;;40956:158;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;41026:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;41026:40:0;;-1:-1:-1;;;;;178:32:1;;;41026:40:0::1;::::0;::::1;160:51:1::0;41026:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;41026:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41082:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;41082:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;41082:24:0::1;14:203:1::0;36548:130:0;36631:15;;:39;;;-1:-1:-1;;;36631:39:0;;;;36604:7;;-1:-1:-1;;;;;36631:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;41244:162;41342:15;;:56;;;-1:-1:-1;;;41342:56:0;;;;41315:7;;-1:-1:-1;;;;;41342:15:0;;:54;;:56;;;;;;;;;;;;;;:15;:56;;;;;;;;;;;;;;35694:317;35963:15;;:40;;-1:-1:-1;;;35963:40:0;;;;;2499:25:1;;;35813:7:0;;;;;;;;;;;;-1:-1:-1;;;;;35963:15:0;;;;:33;;2472:18:1;;35963:40:0;2353:177:1;13158:281:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13261:22:0;::::1;13239:110;;;::::0;-1:-1:-1;;;13239:110:0;;14490:2:1;13239:110:0::1;::::0;::::1;14472:21:1::0;14529:2;14509:18;;;14502:30;14568:34;14548:18;;;14541:62;-1:-1:-1;;;14619:18:1;;;14612:36;14665:19;;13239:110:0::1;14288:402:1::0;13239:110:0::1;13386:6;::::0;13365:38:::1;::::0;-1:-1:-1;;;;;13365:38:0;;::::1;::::0;13386:6:::1;::::0;13365:38:::1;::::0;13386:6:::1;::::0;13365:38:::1;13414:6;:17:::0;;-1:-1:-1;;;;;;13414:17:0::1;-1:-1:-1::0;;;;;13414:17:0;;;::::1;::::0;;;::::1;::::0;;13158:281::o;36953:107::-;37006:15;;:46;;-1:-1:-1;;;37006:46:0;;37034:10;37006:46;;;11124:51:1;11218:14;;11211:22;11191:18;;;11184:50;-1:-1:-1;;;;;37006:15:0;;;;:27;;11097:18:1;;37006:46:0;10940:300:1;32133:221:0;12915:6;;-1:-1:-1;;;;;12915:6:0;174:10;12915:22;12907:67;;;;-1:-1:-1;;;12907:67:0;;;;;;;:::i;:::-;32208:16:::1;:5:::0;32217:6:::1;32208:16;:::i;:::-;32200:24;;32267:4;32252:12;;:19;;;;:::i;:::-;32243:5;:28;;32235:83;;;::::0;-1:-1:-1;;;32235:83:0;;15119:2:1;32235:83:0::1;::::0;::::1;15101:21:1::0;15158:2;15138:18;;;15131:30;15197:34;15177:18;;;15170:62;-1:-1:-1;;;15248:18:1;;;15241:40;15298:19;;32235:83:0::1;14917:406:1::0;32235:83:0::1;32329:9;:17:::0;32133:221::o;10814:181::-;10872:7;;10904:5;10908:1;10904;:5;:::i;:::-;10892:17;;10933:1;10928;:6;;10920:46;;;;-1:-1:-1;;;10920:46:0;;15660:2:1;10920:46:0;;;15642:21:1;15699:2;15679:18;;;15672:30;15738:29;15718:18;;;15711:57;15785:18;;10920:46:0;15458:351:1;10920:46:0;10986:1;10814:181;-1:-1:-1;;;10814:181:0:o;11381:250::-;11439:7;11463:1;11468;11463:6;11459:47;;-1:-1:-1;11493:1:0;11486:8;;11459:47;11518:9;11530:5;11534:1;11530;:5;:::i;:::-;11518:17;-1:-1:-1;11563:1:0;11554:5;11558:1;11518:17;11554:5;:::i;:::-;:10;11546:56;;;;-1:-1:-1;;;11546:56:0;;16016:2:1;11546:56:0;;;15998:21:1;16055:2;16035:18;;;16028:30;16094:34;16074:18;;;16067:62;-1:-1:-1;;;16145:18:1;;;16138:31;16186:19;;11546:56:0;15814:397:1;11639:132:0;11697:7;11724:39;11728:1;11731;11724:39;;;;;;;;;;;;;;;;;:3;:39::i;42409:2039::-;42478:6;42488:1;42478:11;42474:50;;42409:2039;:::o;42474:50::-;42534:24;42551:6;42534:16;:24::i;:::-;42569:19;42591:25;42605:10;;42591:9;;:13;;:25;;;;:::i;:::-;42832:13;;42569:47;;-1:-1:-1;42644:4:0;;;;;;42629:12;;;;;;42832:17;42828:265;;42885:196;43067:13;;43048:16;;43032:13;;:32;;;;:::i;:::-;:48;;;;:::i;:::-;42885:128;42999:13;;42885:95;42968:11;42885:64;42939:9;;42885:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:196::-;42866:215;;42828:265;43107:14;;:18;43103:272;;43162:201;43348:14;;43328:17;;43311:14;;:34;;;;:::i;:::-;:51;;;;:::i;:::-;43162:130;43277:14;;43162:96;43246:11;43162:65;43216:10;;43162:35;:53;;:65;;;;:::i;:201::-;43142:221;;43103:272;43397:39;:16;43418:17;43397:20;:39::i;:::-;43385:51;-1:-1:-1;43453:13:0;;43449:111;;43505:15;;43497:51;;-1:-1:-1;;;;;43505:15:0;;;;43534:9;;43497:51;;;;43534:9;43505:15;43497:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43483:65:0;;-1:-1:-1;;43449:111:0;43580:21;43657:35;43678:13;;43657:16;;:20;;:35;;;;:::i;:::-;43626:14;;43604:17;;:37;;:21;:37::i;:::-;:88;;;;:::i;:::-;43580:112;-1:-1:-1;43705:19:0;43739:17;;43735:104;;43787:40;:21;43813:13;43787:25;:40::i;:::-;43773:54;;43735:104;43849:23;43917:11;43875:39;43896:17;;43875:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;43849:79;;43939:21;43999:11;43963:33;43981:14;;43963:13;;:17;;:33;;;;:::i;:::-;:47;;;;:::i;:::-;43939:71;-1:-1:-1;44027:19:0;;44023:126;;44088:15;;44080:57;;-1:-1:-1;;;;;44088:15:0;;;;44117;;44080:57;;;;44117:15;44088;44080:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44063:74:0;;-1:-1:-1;;44023:126:0;44163:17;;44159:120;;44222:13;;44214:53;;-1:-1:-1;;;;;44222:13:0;;;;44249;;44214:53;;;;44249:13;44222;44214:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44197:70:0;;-1:-1:-1;;44159:120:0;44296:144;44324:9;44348:31;44366:13;44348:15;:31;:::i;:::-;44394:7;:21;;;;;44405:10;44394:21;:35;;;;;44419:10;44394:35;44296:144;;;16622:25:1;;;16678:2;16663:18;;16656:34;;;;16733:14;16726:22;16706:18;;;16699:50;16610:2;16595:18;44296:144:0;;;;;;;42463:1985;;;;;;;;;;;42409:2039;:::o;11003:136::-;11061:7;11088:43;11092:1;11095;11088:43;;;;;;;;;;;;;;;;;:3;:43::i;9506:380::-;-1:-1:-1;;;;;9642:19:0;;9634:68;;;;-1:-1:-1;;;9634:68:0;;16962:2:1;9634:68:0;;;16944:21:1;17001:2;16981:18;;;16974:30;17040:34;17020:18;;;17013:62;-1:-1:-1;;;17091:18:1;;;17084:34;17135:19;;9634:68:0;16760:400:1;9634:68:0;-1:-1:-1;;;;;9721:21:0;;9713:68;;;;-1:-1:-1;;;9713:68:0;;17367:2:1;9713:68:0;;;17349:21:1;17406:2;17386:18;;;17379:30;17445:34;17425:18;;;17418:62;-1:-1:-1;;;17496:18:1;;;17489:32;17538:19;;9713:68:0;17165:398:1;9713:68:0;-1:-1:-1;;;;;9794:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9846:32;;2499:25:1;;;9846:32:0;;2472:18:1;9846:32:0;;;;;;;;9506:380;;;:::o;8039:610::-;-1:-1:-1;;;;;8179:20:0;;8171:70;;;;-1:-1:-1;;;8171:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8260:23:0;;8252:71;;;;-1:-1:-1;;;8252:71:0;;;;;;;:::i;:::-;8416:108;8452:6;8416:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8416:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;8396:17:0;;;:9;:17;;;;;;;;;;;:128;;;;8558:20;;;;;;;:32;;8583:6;8558:24;:32::i;:::-;-1:-1:-1;;;;;8535:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8606:35;2499:25:1;;;8535:20:0;;8606:35;;;;;;2472:18:1;8606:35:0;2353:177:1;37523:2918:0;-1:-1:-1;;;;;37655:18:0;;37647:68;;;;-1:-1:-1;;;37647:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37734:16:0;;37726:64;;;;-1:-1:-1;;;37726:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37898:39:0;;37801:18;37898:39;;;:33;:39;;;;;;37801:18;;;;37898:39;;37893:132;;37962:14;;-1:-1:-1;;;37962:14:0;;;;37954:59;;;;-1:-1:-1;;;37954:59:0;;18580:2:1;37954:59:0;;;18562:21:1;;;18599:18;;;18592:30;18658:34;18638:18;;;18631:62;18710:18;;37954:59:0;18378:356:1;37954:59:0;38057:6;38067:1;38057:11;38053:93;;38085:28;38101:4;38107:2;38111:1;38085:15;:28::i;:::-;38128:7;;;37523:2918;;;:::o;38053:93::-;38177:4;;-1:-1:-1;;;;;38177:4:0;;;38171:10;;;;38167:2095;;38198:19;38204:4;38210:6;38198:5;:19::i;38167:2095::-;38286:8;;-1:-1:-1;;;38286:8:0;;;;38285:9;:39;;;;-1:-1:-1;;;;;;38299:25:0;;;;;;:19;:25;;;;;;;;38298:26;38285:39;:67;;;;-1:-1:-1;;;;;;38329:23:0;;;;;;:19;:23;;;;;;;;38328:24;38285:67;38267:1995;;;-1:-1:-1;;;;;38396:29:0;;;38379:14;38396:29;;;:25;:29;;;;;;;38456:31;;;;;;;;38396:29;;;;;38456:31;38520:9;;:23;;;;;38534:9;38533:10;38520:23;38516:812;;;38564:33;38580:4;38586:2;38590:6;38564:15;:33::i;:::-;38616:15;;-1:-1:-1;;;;;38616:15:0;:26;38643:4;38649:15;38643:4;38649:9;:15::i;:::-;38616:49;;-1:-1:-1;;;;;;38616:49:0;;;;;;;-1:-1:-1;;;;;10268:32:1;;;38616:49:0;;;10250:51:1;10317:18;;;10310:34;10223:18;;38616:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38684:15:0;;-1:-1:-1;;;;;38684:15:0;;-1:-1:-1;38684:26:0;;-1:-1:-1;38711:2:0;38715:13;38711:2;38715:9;:13::i;:::-;38684:45;;-1:-1:-1;;;;;;38684:45:0;;;;;;;-1:-1:-1;;;;;10268:32:1;;;38684:45:0;;;10250:51:1;10317:18;;;10310:34;10223:18;;38684:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38748:7;;;;;37523:2918;;;:::o;38516:812::-;38795:9;38791:537;;;38838:14;;38825:27;;38887:17;;38871:33;;38936:14;;38923:27;;38791:537;;;38978:8;38974:354;;;39020:13;;39007:26;;39068:16;;39052:32;;39116:13;;39103:26;;39150:32;39185:13;39195:2;39185:9;:13::i;:::-;39262:9;;39150:48;;-1:-1:-1;39225:33:0;39252:6;39150:48;39225:33;:::i;:::-;:46;;39217:95;;;;-1:-1:-1;;;39217:95:0;;19220:2:1;39217:95:0;;;19202:21:1;19259:2;19239:18;;;19232:30;19298:34;19278:18;;;19271:62;-1:-1:-1;;;19349:18:1;;;19342:34;19393:19;;39217:95:0;19018:400:1;39217:95:0;38988:340;38974:354;39342:17;39362:60;39395:26;39411:10;39395:13;:26;:::i;:::-;39362:10;;:32;:60::i;:::-;39342:80;;39439:28;39470:24;39488:4;39470:9;:24::i;:::-;39550:18;;39439:55;;-1:-1:-1;39526:42:0;;;;;;;39589:43;;-1:-1:-1;;;;;;39601:31:0;;;;;;:25;:31;;;;;;;;39600:32;39589:43;39585:328;;;39653:8;:15;;-1:-1:-1;;;;39653:15:0;-1:-1:-1;;;39653:15:0;;;;39716:24;39734:4;39716:9;:24::i;:::-;39689:51;;39759:38;39780:16;39759:20;:38::i;:::-;-1:-1:-1;39828:1:0;39816:9;:13;;;39848:10;:14;39881:8;:16;;-1:-1:-1;;;;39881:16:0;;;39585:328;39929:12;39944:32;39970:5;39944:21;:6;39955:9;39944:10;:21::i;:32::-;39929:47;-1:-1:-1;40002:16:0;:6;39929:47;40002:10;:16::i;:::-;39993:25;;40039:9;40035:155;;;40082:10;;:20;;40097:4;40082:14;:20::i;:::-;40069:10;:33;40035:155;;;40155:9;;:19;;40169:4;40155:13;:19::i;:::-;40143:9;:31;40035:155;40206:42;40222:4;40236;40243;40206:15;:42::i;:::-;38364:1898;;;;;;38267:1995;40274:33;40290:4;40296:2;40300:6;40274:15;:33::i;:::-;40318:15;;-1:-1:-1;;;;;40318:15:0;:26;40345:4;40351:15;40345:4;40351:9;:15::i;:::-;40318:49;;-1:-1:-1;;;;;;40318:49:0;;;;;;;-1:-1:-1;;;;;10268:32:1;;;40318:49:0;;;10250:51:1;10317:18;;;10310:34;10223:18;;40318:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40378:15:0;;-1:-1:-1;;;;;40378:15:0;;-1:-1:-1;40378:26:0;;-1:-1:-1;40405:2:0;40409:13;40405:2;40409:9;:13::i;:::-;40378:45;;-1:-1:-1;;;;;;40378:45:0;;;;;;;-1:-1:-1;;;;;10268:32:1;;;40378:45:0;;;10250:51:1;10317:18;;;10310:34;10223:18;;40378:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37636:2805;;;37523:2918;;;:::o;11147:226::-;11267:7;11303:12;11295:6;;;;11287:29;;;;-1:-1:-1;;;11287:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11327:9:0;11339:5;11343:1;11339;:5;:::i;:::-;11327:17;11147:226;-1:-1:-1;;;;;11147:226:0:o;32945:280::-;-1:-1:-1;;;;;33028:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;33028:39:0;;;;;;;;;;;;33080:80;;33106:15;;:42;;-1:-1:-1;;;33106:42:0;;-1:-1:-1;;;;;178:32:1;;;33106:42:0;;;160:51:1;33106:15:0;;;;:36;;133:18:1;;33106:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33080:80;33177:40;;;;;;-1:-1:-1;;;;;33177:40:0;;;;;;;;32945:280;;:::o;11779:312::-;11899:7;11934:12;11927:5;11919:28;;;;-1:-1:-1;;;11919:28:0;;;;;;;;:::i;:::-;-1:-1:-1;11958:9:0;11970:5;11974:1;11970;:5;:::i;40449:499::-;40539:16;;;40553:1;40539:16;;;;;;;;40515:21;;40539:16;;;;;;;;;;-1:-1:-1;40539:16:0;40515:40;;40584:4;40566;40571:1;40566:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40566:23:0;;;:7;;;;;;;;;;:23;;;;40610:15;;:22;;;-1:-1:-1;;;40610:22:0;;;;:15;;;;;:20;;:22;;;;;40566:7;;40610:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40600:4;40605:1;40600:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40600:32:0;;;:7;;;;;;;;;:32;40675:15;;40643:62;;40660:4;;40675:15;40693:11;40643:8;:62::i;:::-;40716:15;;:224;;-1:-1:-1;;;40716:224:0;;-1:-1:-1;;;;;40716:15:0;;;;:66;;:224;;40797:11;;40716:15;;40867:4;;40894;;40914:15;;40716:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9043:455;-1:-1:-1;;;;;9127:21:0;;9119:67;;;;-1:-1:-1;;;9119:67:0;;20743:2:1;9119:67:0;;;20725:21:1;20782:2;20762:18;;;20755:30;20821:34;20801:18;;;20794:62;-1:-1:-1;;;20872:18:1;;;20865:31;20913:19;;9119:67:0;20541:397:1;9119:67:0;9282:105;9319:6;9282:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9282:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;9261:18:0;;:9;:18;;;;;;;;;;:126;9413:12;;:24;;9430:6;9413:16;:24::i;:::-;9398:12;:39;9453:37;;2499:25:1;;;9479:1:0;;-1:-1:-1;;;;;9453:37:0;;;;;2487:2:1;2472:18;9453:37:0;;;;;;;9043: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:548::-;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;;;691:3;876:1;871:2;862:6;851:9;847:22;843:31;836:42;946:2;939;935:7;930:2;922:6;918:15;914:29;903:9;899:45;895:54;887:62;;;;407:548;;;;:::o;960:131::-;-1:-1:-1;;;;;1035:31:1;;1025:42;;1015:70;;1081:1;1078;1071:12;1096:118;1182:5;1175:13;1168:21;1161:5;1158:32;1148:60;;1204:1;1201;1194:12;1219:382;1284:6;1292;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1400:9;1387:23;1419:31;1444:5;1419:31;:::i;:::-;1469:5;-1:-1:-1;1526:2:1;1511:18;;1498:32;1539:30;1498:32;1539:30;:::i;:::-;1588:7;1578:17;;;1219:382;;;;;:::o;1606:315::-;1674:6;1682;1735:2;1723:9;1714:7;1710:23;1706:32;1703:52;;;1751:1;1748;1741:12;1703:52;1790:9;1777:23;1809:31;1834:5;1809:31;:::i;:::-;1859:5;1911:2;1896:18;;;;1883:32;;-1:-1:-1;;;1606:315:1:o;2535:247::-;2594:6;2647:2;2635:9;2626:7;2622:23;2618:32;2615:52;;;2663:1;2660;2653:12;2615:52;2702:9;2689:23;2721:31;2746:5;2721:31;:::i;2787:127::-;2848:10;2843:3;2839:20;2836:1;2829:31;2879:4;2876:1;2869:15;2903:4;2900:1;2893:15;2919:275;2990:2;2984:9;3055:2;3036:13;;-1:-1:-1;;3032:27:1;3020:40;;3090:18;3075:34;;3111:22;;;3072:62;3069:88;;;3137:18;;:::i;:::-;3173:2;3166:22;2919:275;;-1:-1:-1;2919:275:1:o;3199:183::-;3259:4;3292:18;3284:6;3281:30;3278:56;;;3314:18;;:::i;:::-;-1:-1:-1;3359:1:1;3355:14;3371:4;3351:25;;3199:183::o;3387:662::-;3441:5;3494:3;3487:4;3479:6;3475:17;3471:27;3461:55;;3512:1;3509;3502:12;3461:55;3548:6;3535:20;3574:4;3598:60;3614:43;3654:2;3614:43;:::i;:::-;3598:60;:::i;:::-;3692:15;;;3778:1;3774:10;;;;3762:23;;3758:32;;;3723:12;;;;3802:15;;;3799:35;;;3830:1;3827;3820:12;3799:35;3866:2;3858:6;3854:15;3878:142;3894:6;3889:3;3886:15;3878:142;;;3960:17;;3948:30;;3998:12;;;;3911;;3878:142;;;-1:-1:-1;4038:5:1;3387:662;-1:-1:-1;;;;;;3387:662:1:o;4054:1215::-;4172:6;4180;4233:2;4221:9;4212:7;4208:23;4204:32;4201:52;;;4249:1;4246;4239:12;4201:52;4289:9;4276:23;4318:18;4359:2;4351:6;4348:14;4345:34;;;4375:1;4372;4365:12;4345:34;4413:6;4402:9;4398:22;4388:32;;4458:7;4451:4;4447:2;4443:13;4439:27;4429:55;;4480:1;4477;4470:12;4429:55;4516:2;4503:16;4538:4;4562:60;4578:43;4618:2;4578:43;:::i;4562:60::-;4656:15;;;4738:1;4734:10;;;;4726:19;;4722:28;;;4687:12;;;;4762:19;;;4759:39;;;4794:1;4791;4784:12;4759:39;4818:11;;;;4838:217;4854:6;4849:3;4846:15;4838:217;;;4934:3;4921:17;4951:31;4976:5;4951:31;:::i;:::-;4995:18;;4871:12;;;;5033;;;;4838:217;;;5074:5;-1:-1:-1;;5117:18:1;;5104:32;;-1:-1:-1;;5148:16:1;;;5145:36;;;5177:1;5174;5167:12;5145:36;;5200:63;5255:7;5244:8;5233:9;5229:24;5200:63;:::i;:::-;5190:73;;;4054:1215;;;;;:::o;5274:456::-;5351:6;5359;5367;5420:2;5408:9;5399:7;5395:23;5391:32;5388:52;;;5436:1;5433;5426:12;5388:52;5475:9;5462:23;5494:31;5519:5;5494:31;:::i;:::-;5544:5;-1:-1:-1;5601:2:1;5586:18;;5573:32;5614:33;5573:32;5614:33;:::i;:::-;5274:456;;5666:7;;-1:-1:-1;;;5720:2:1;5705:18;;;;5692:32;;5274:456::o;6170:241::-;6226:6;6279:2;6267:9;6258:7;6254:23;6250:32;6247:52;;;6295:1;6292;6285:12;6247:52;6334:9;6321:23;6353:28;6375:5;6353:28;:::i;6640:523::-;6744:6;6752;6760;6768;6776;6784;6837:3;6825:9;6816:7;6812:23;6808:33;6805:53;;;6854:1;6851;6844:12;6805:53;-1:-1:-1;;6877:23:1;;;6947:2;6932:18;;6919:32;;-1:-1:-1;6998:2:1;6983:18;;6970:32;;7049:2;7034:18;;7021:32;;-1:-1:-1;7100:3:1;7085:19;;7072:33;;-1:-1:-1;7152:3:1;7137:19;7124:33;;-1:-1:-1;6640:523:1;-1:-1:-1;6640:523:1:o;7730:388::-;7798:6;7806;7859:2;7847:9;7838:7;7834:23;7830:32;7827:52;;;7875:1;7872;7865:12;7827:52;7914:9;7901:23;7933:31;7958:5;7933:31;:::i;:::-;7983:5;-1:-1:-1;8040:2:1;8025:18;;8012:32;8053:33;8012:32;8053:33;:::i;8123:356::-;8325:2;8307:21;;;8344:18;;;8337:30;8403:34;8398:2;8383:18;;8376:62;8470:2;8455:18;;8123:356::o;8484:127::-;8545:10;8540:3;8536:20;8533:1;8526:31;8576:4;8573:1;8566:15;8600:4;8597:1;8590:15;8616:168;8689:9;;;8720;;8737:15;;;8731:22;;8717:37;8707:71;;8758:18;;:::i;8789:380::-;8868:1;8864:12;;;;8911;;;8932:61;;8986:4;8978:6;8974:17;8964:27;;8932:61;9039:2;9031:6;9028:14;9008:18;9005:38;9002:161;;9085:10;9080:3;9076:20;9073:1;9066:31;9120:4;9117:1;9110:15;9148:4;9145:1;9138:15;9002:161;;8789:380;;;:::o;9936:127::-;9997:10;9992:3;9988:20;9985:1;9978:31;10028:4;10025:1;10018:15;10052:4;10049:1;10042:15;10355:135;10394:3;10415:17;;;10412:43;;10435:18;;:::i;:::-;-1:-1:-1;10482:1:1;10471:13;;10355:135::o;10495:251::-;10565:6;10618:2;10606:9;10597:7;10593:23;10589:32;10586:52;;;10634:1;10631;10624:12;10586:52;10666:9;10660:16;10685:31;10710:5;10685:31;:::i;10751:184::-;10821:6;10874:2;10862:9;10853:7;10849:23;10845:32;10842:52;;;10890:1;10887;10880:12;10842:52;-1:-1:-1;10913:16:1;;10751:184;-1:-1:-1;10751:184:1:o;11245:245::-;11312:6;11365:2;11353:9;11344:7;11340:23;11336:32;11333:52;;;11381:1;11378;11371:12;11333:52;11413:9;11407:16;11432:28;11454:5;11432:28;:::i;11495:306::-;11583:6;11591;11599;11652:2;11640:9;11631:7;11627:23;11623:32;11620:52;;;11668:1;11665;11658:12;11620:52;11697:9;11691:16;11681:26;;11747:2;11736:9;11732:18;11726:25;11716:35;;11791:2;11780:9;11776:18;11770:25;11760:35;;11495:306;;;;;:::o;13726:557::-;13839:6;13847;13855;13863;13871;13879;13932:3;13920:9;13911:7;13907:23;13903:33;13900:53;;;13949:1;13946;13939:12;13900:53;13981:9;13975:16;14000:31;14025:5;14000:31;:::i;:::-;14095:2;14080:18;;14074:25;14139:2;14124:18;;14118:25;14183:2;14168:18;;14162:25;14227:3;14212:19;;14206:26;14272:3;14257:19;;;14251:26;14050:5;;14074:25;;-1:-1:-1;14118:25:1;;14162;;-1:-1:-1;14206:26:1;-1:-1:-1;14251:26:1;;-1:-1:-1;13726:557:1;-1:-1:-1;;;13726:557:1:o;14695:217::-;14735:1;14761;14751:132;;14805:10;14800:3;14796:20;14793:1;14786:31;14840:4;14837:1;14830:15;14868:4;14865:1;14858:15;14751:132;-1:-1:-1;14897:9:1;;14695:217::o;15328:125::-;15393:9;;;15414:10;;;15411:36;;;15427:18;;:::i;17568:401::-;17770:2;17752:21;;;17809:2;17789:18;;;17782:30;17848:34;17843:2;17828:18;;17821:62;-1:-1:-1;;;17914:2:1;17899:18;;17892:35;17959:3;17944:19;;17568:401::o;17974:399::-;18176:2;18158:21;;;18215:2;18195:18;;;18188:30;18254:34;18249:2;18234:18;;18227:62;-1:-1:-1;;;18320:2:1;18305:18;;18298:33;18363:3;18348:19;;17974:399::o;19423:128::-;19490:9;;;19511:11;;;19508:37;;;19525:18;;:::i;19556:980::-;19818:4;19866:3;19855:9;19851:19;19897:6;19886:9;19879:25;19923:2;19961:6;19956:2;19945:9;19941:18;19934:34;20004:3;19999:2;19988:9;19984:18;19977:31;20028:6;20063;20057:13;20094:6;20086;20079:22;20132:3;20121:9;20117:19;20110:26;;20171:2;20163:6;20159:15;20145:29;;20192:1;20202:195;20216:6;20213:1;20210:13;20202:195;;;20281:13;;-1:-1:-1;;;;;20277:39:1;20265:52;;20372:15;;;;20337:12;;;;20313:1;20231:9;20202:195;;;-1:-1:-1;;;;;;;20453:32:1;;;;20448:2;20433:18;;20426:60;-1:-1:-1;;;20517:3:1;20502:19;20495:35;20414:3;19556:980;-1:-1:-1;;;19556:980:1:o

Swarm Source

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