ETH Price: $2,939.53 (-0.28%)

Token

ARBixel (BIXEL)

Overview

Max Total Supply

1,000,000,000 BIXEL

Holders

839

Transfers

-
0

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
ARBIXEL

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-03-02
*/

/* 


          _____                    _____                                            _____                    _____  
         /\    \                  /\    \                 ______                   /\    \                  /\    \ 
        /::\    \                /::\    \               |::|   |                 /::\    \                /::\____\
       /::::\    \               \:::\    \              |::|   |                /::::\    \              /:::/    /
      /::::::\    \               \:::\    \             |::|   |               /::::::\    \            /:::/    / 
     /:::/\:::\    \               \:::\    \            |::|   |              /:::/\:::\    \          /:::/    /  
    /:::/__\:::\    \               \:::\    \           |::|   |             /:::/__\:::\    \        /:::/    /   
   /::::\   \:::\    \              /::::\    \          |::|   |            /::::\   \:::\    \      /:::/    /    
  /::::::\   \:::\    \    ____    /::::::\    \         |::|   |           /::::::\   \:::\    \    /:::/    /     
 /:::/\:::\   \:::\ ___\  /\   \  /:::/\:::\    \  ______|::|___|___ ____  /:::/\:::\   \:::\    \  /:::/    /      
/:::/__\:::\   \:::|    |/::\   \/:::/  \:::\____\|:::::::::::::::::|    |/:::/__\:::\   \:::\____\/:::/____/       
\:::\   \:::\  /:::|____|\:::\  /:::/    \::/    /|:::::::::::::::::|____|\:::\   \:::\   \::/    /\:::\    \       
 \:::\   \:::\/:::/    /  \:::\/:::/    / \/____/  ~~~~~~|::|~~~|~~~       \:::\   \:::\   \/____/  \:::\    \      
  \:::\   \::::::/    /    \::::::/    /                 |::|   |           \:::\   \:::\    \       \:::\    \     
   \:::\   \::::/    /      \::::/____/                  |::|   |            \:::\   \:::\____\       \:::\    \    
    \:::\  /:::/    /        \:::\    \                  |::|   |             \:::\   \::/    /        \:::\    \   
     \:::\/:::/    /          \:::\    \                 |::|   |              \:::\   \/____/          \:::\    \  
      \::::::/    /            \:::\    \                |::|   |               \:::\    \               \:::\    \ 
       \::::/    /              \:::\____\               |::|   |                \:::\____\               \:::\____\
        \::/____/                \::/    /               |::|___|                 \::/    /                \::/    /
         ~~                       \/____/                 ~~                       \/____/                  \/____/ 
                                                                                                                    


ARBIXEL

https://t.me/ARBIXEL
https://arbixel.com
https://twitter.com/arbixel

Liquidity 2% 
USDC Rewards 2% 
MARK/DEV 2% 



*/

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

interface ITrueDefiSwap {
    function triggeredTokenSent(uint256, address) external;
}

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

    IUniswapV2Router02 public uniswapV2Router;

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

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

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    ARBIXELDividendTracker public dividendTracker;

    address payable public marketingWallet;
    address payable public devWallet;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    uint256 public swapTokensAtAmount;
    uint256 public sellRewardsFee;
    uint256 public sellDeadFees;
    uint256 public sellMarketingFees;
    uint256 public sellLiquidityFee;
    uint256 public buyDeadFees;
    uint256 public buyMarketingFees;
    uint256 public buyLiquidityFee;
    uint256 public buyRewardsFee;
    uint256 public buyDevFee;
    uint256 public sellDevFee;
    uint256 public transferFee;

    bool public swapAndLiquifyEnabled = true;

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

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

    mapping(address => bool) public automatedMarketMakerPairs;

    // staking variables
    mapping(address => uint256) public stakingBonus;
    mapping(address => uint256) public stakingUntilDate;
    mapping(uint256 => uint256) public stakingAmounts;

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

    // Limit variables for bot protection
    bool public limitsInEffect = true; //boolean used to turn limits on and off
    uint256 private gasPriceLimit = 7 * 1 gwei; 
    mapping(address => uint256) private _holderLastTransferBlock; // for 1 tx per block
    mapping(address => uint256) private _holderLastTransferTimestamp; // for sell cooldown timer
    uint256 public launchblock;
    uint256 public cooldowntimer = 60; //default cooldown 60s

    bool public enabledPublicTrading;
    address tefiRouter;
    mapping(address => bool) public whitelistForPublicTrade;    
    
    event EnableAccountStaking(address indexed account, uint256 duration);
    event UpdateStakingAmounts(uint256 duration, uint256 amount);

    event EnableSwapAndLiquify(bool enabled);
    event EnableStaking(bool enabled);

    event SetPreSaleWallet(address wallet);

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

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

    event TradingEnabled();

    event UpdateFees(
        uint256 sellDeadFees,
        uint256 sellMarketingFees,
        uint256 sellLiquidityFee,
        uint256 sellRewardsFee,
        uint256 buyDeadFees,
        uint256 buyMarketingFees,
        uint256 buyLiquidityFee,
        uint256 buyRewardsFee,
        uint256 buyDevFee,
        uint256 sellDevFee
    );

    event UpdateTransferFee(uint256 transferFee);

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

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

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    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("ARBixel", "BIXEL") {
        marketingWallet = payable(0xeB406Ee2ffFA085e3657631Cf7B5acd7ae1CeeF5);
        devWallet = payable(0xeB406Ee2ffFA085e3657631Cf7B5acd7ae1CeeF5);
        address router = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;

        buyDeadFees = 0;
        sellDeadFees = 0;
        buyMarketingFees = 1;
        sellMarketingFees = 1;
        buyLiquidityFee = 2;
        sellLiquidityFee = 2;
        buyRewardsFee = 2;
        sellRewardsFee = 2;
        buyDevFee = 30;
        sellDevFee = 30;
        transferFee = 0;

        totalBuyFees = buyRewardsFee
            .add(buyLiquidityFee)
            .add(buyMarketingFees)
            .add(buyDevFee);
        totalSellFees = sellRewardsFee
            .add(sellLiquidityFee)
            .add(sellMarketingFees)
            .add(sellDevFee);

        dividendTracker = new ARBIXELDividendTracker(
            payable(this),
            router,
            0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8,
            "ARBIXELTRACKER",
            "ARBIXELTRACKER"
        );

        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(DEAD);
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(router);

        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;
        _isExcludedFromFees[address(devWallet)] = true;

        uint256 totalTokenSupply = (1_000_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        maxWallet = 20000000; // 2%
        swapTokensAtAmount = totalTokenSupply / 1000; // 0.1%;
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(marketingWallet)] = true;
        whitelistForPublicTrade[msg.sender] = true;   
    }

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

    receive() external payable {}

    function updateStakingAmounts(uint256 duration, uint256 bonus)
        public
        onlyOwner
    {
        require(stakingAmounts[duration] != bonus);
        require(bonus <= 100, "Staking bonus can't exceed 100");
        stakingAmounts[duration] = bonus;
        emit UpdateStakingAmounts(duration, bonus);
    }

    function isTrading(address _sender, address _recipient)
        internal view
        returns (uint)
    {
        if (automatedMarketMakerPairs[_sender] && _recipient != address(uniswapV2Router)) return 1; // Buy Case

        if (automatedMarketMakerPairs[_recipient]) return 2; // Sell Case

        return 0;
    }    
    
    function setWhitelistForPublicTrade(address _addr, bool _flag) external onlyOwner {
        whitelistForPublicTrade[_addr] = _flag;    
    }    
    
    function setPublicTrading() external onlyOwner {
        require(!enabledPublicTrading);        
        enabledPublicTrading = true;    
    }    
    
    function setDexRouter(address _router) external onlyOwner {
        tefiRouter = _router;
        if (_router != address(0)) {
            whitelistForPublicTrade[_router] = true;
            _isExcludedFromFees[_router] = true;
            dividendTracker.excludeFromDividends(_router);
        }
        launchblock = block.number;
        tradingEnabled = true;
        emit TradingEnabled();    
    }
    
    // use for pre sale wallet, adds all exclusions to it
    function setPresaleWallet(address wallet) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = true;
        _isExcludedFromFees[wallet] = true;
        dividendTracker.excludeFromDividends(wallet);
        emit SetPreSaleWallet(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, getStakingBalance(account));
    }

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

    // turn limits on and off
    function setLimitsInEffect(bool value) external onlyOwner {
        limitsInEffect = value;
    }

    // set max GWEI
    function setGasPriceLimit(uint256 GWEI) external onlyOwner {
        require(GWEI >= 5, "can never be set below 5");
        gasPriceLimit = GWEI * 1 gwei;
    }

    // set cooldown timer, can only be between 0 and 300 seconds (5 mins max)
    function setcooldowntimer(uint256 value) external onlyOwner {
        require(value <= 300, "cooldown timer cannot exceed 5 minutes");
        cooldowntimer = value;
    }

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

    
    function enableStaking(bool enable) public onlyOwner {
        require(stakingEnabled != enable);
        stakingEnabled = enable;
        emit EnableStaking(enable);
    }

    function stake(uint256 duration) public {
        require(stakingEnabled, "Staking is not enabled");
        require(stakingAmounts[duration] != 0, "Invalid staking duration");
        require(
            stakingUntilDate[_msgSender()] < block.timestamp.add(duration),
            "already staked for a longer duration"
        );
        stakingBonus[_msgSender()] = stakingAmounts[duration];
        stakingUntilDate[_msgSender()] = block.timestamp.add(duration);
        dividendTracker.setBalance(
            _msgSender(),
            getStakingBalance(_msgSender())
        );
        emit EnableAccountStaking(_msgSender(), duration);
    }

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

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;
        emit EnableSwapAndLiquify(enabled);
    }

    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 updateTransferFee(uint256 newTransferFee) public onlyOwner {
        require (newTransferFee <= 5, "transfer fee cannot exceed 5%");
        transferFee = newTransferFee;
        emit UpdateTransferFee(transferFee);
    }

    function updateFees(
        uint256 deadBuy,
        uint256 deadSell,
        uint256 marketingBuy,
        uint256 marketingSell,
        uint256 liquidityBuy,
        uint256 liquiditySell,
        uint256 RewardsBuy,
        uint256 RewardsSell,
        uint256 devBuy,
        uint256 devSell
    ) public onlyOwner {
        buyDeadFees = deadBuy;
        buyMarketingFees = marketingBuy;
        buyLiquidityFee = liquidityBuy;
        buyRewardsFee = RewardsBuy;
        sellDeadFees = deadSell;
        sellMarketingFees = marketingSell;
        sellLiquidityFee = liquiditySell;
        sellRewardsFee = RewardsSell;
        buyDevFee = devBuy;
        sellDevFee = devSell;

        totalSellFees = sellRewardsFee
            .add(sellLiquidityFee)
            .add(sellMarketingFees)
            .add(sellDevFee);

        totalBuyFees = buyRewardsFee
            .add(buyLiquidityFee)
            .add(buyMarketingFees)
            .add(buyDevFee);

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

        emit UpdateFees(
            sellDeadFees,
            sellMarketingFees,
            sellLiquidityFee,
            sellRewardsFee,
            buyDeadFees,
            buyMarketingFees,
            buyLiquidityFee,
            buyRewardsFee,
            buyDevFee,
            sellDevFee
        );
    }

    function getStakingInfo(address account)
        external
        view
        returns (uint256, uint256)
    {
        return (stakingUntilDate[account], stakingBonus[account]);
    }

    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 deadFees;
        uint256 marketingFees;
        uint256 liquidityFee;
        uint256 devFees;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");
        }
        
        if (enabledPublicTrading == false && tefiRouter != address(0)) {
            require(isTrading(from, to) == 0 || whitelistForPublicTrade[from] || whitelistForPublicTrade[to], "!available trading");
        }        
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]
        ) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];

            if (!isBuying && !isSelling) {
                uint256 tFees = amount.mul(transferFee).div(100);
                amount = amount.sub(tFees);
                super._transfer(from, address(this), tFees);
                super._transfer(from, to, amount);
                dividendTracker.setBalance(from, getStakingBalance(from));
                dividendTracker.setBalance(to, getStakingBalance(to));
                return;
            }
            
            else if (!isBuying && stakingEnabled) {
                require(
                    stakingUntilDate[from] <= block.timestamp,
                    "Tokens are staked and locked!"
                );
                if (stakingUntilDate[from] != 0) {
                    stakingUntilDate[from] = 0;
                    stakingBonus[from] = 0;
                }
            }

            else if (isSelling) {
                RewardsFee = sellRewardsFee;
                deadFees = sellDeadFees;
                marketingFees = sellMarketingFees;
                liquidityFee = sellLiquidityFee;
                devFees = sellDevFee;

                if (limitsInEffect) {
                require(block.timestamp >= _holderLastTransferTimestamp[tx.origin] + cooldowntimer,
                        "cooldown period active");
                _holderLastTransferTimestamp[tx.origin] = block.timestamp;

                }

            } else if (isBuying) {
                RewardsFee = buyRewardsFee;
                deadFees = buyDeadFees;
                marketingFees = buyMarketingFees;
                liquidityFee = buyLiquidityFee;
                devFees = buyDevFee;

                if (limitsInEffect) {
                require(block.number > launchblock + 1,"you shall not pass");
                require(tx.gasprice <= gasPriceLimit,"Gas price exceeds limit.");
                require(_holderLastTransferBlock[tx.origin] != block.number,"Too many TX in block");
                _holderLastTransferBlock[tx.origin] = block.number;
            }
            
            uint256 contractBalanceRecipient = balanceOf(to);
            require(contractBalanceRecipient + amount <= maxWallet,
                    "Exceeds maximum wallet token amount." );
            }

            uint256 totalFees = RewardsFee
                .add(liquidityFee + marketingFees + devFees);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

                if (swapAndLiquifyEnabled && liquidityFee > 0 && totalBuyFees > 0) {
                    uint256 totalBuySell = buyAmount.add(sellAmount);
                    uint256 swapAmountBought = contractTokenBalance
                        .mul(buyAmount)
                        .div(totalBuySell);
                    uint256 swapAmountSold = contractTokenBalance
                        .mul(sellAmount)
                        .div(totalBuySell);

                    uint256 swapBuyTokens = swapAmountBought
                        .mul(liquidityFee)
                        .div(totalBuyFees);

                    uint256 swapSellTokens = swapAmountSold
                        .mul(liquidityFee)
                        .div(totalSellFees);

                    uint256 swapTokens = swapSellTokens.add(swapBuyTokens);

                    swapAndLiquify(swapTokens);
                }

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

            uint256 fees = amount.mul(totalFees).div(100);
            uint256 burntokens;

            if (deadFees > 0) {
            burntokens = amount.mul(deadFees) / 100;
            super._transfer(from, DEAD, burntokens);
            _totalSupply = _totalSupply.sub(burntokens);

            }

            amount = amount.sub(fees + burntokens);

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

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

            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations,
                    claims,
                    lastProcessedIndex,
                    true,
                    gas,
                    tx.origin
                );
            } catch {}
        }

        super._transfer(from, to, amount);
        dividendTracker.setBalance(from, getStakingBalance(from));
        dividendTracker.setBalance(to, getStakingBalance(to));
    
        if (from != address(uniswapV2Router) && !automatedMarketMakerPairs[from] && to == tefiRouter) {
            ITrueDefiSwap(tefiRouter).triggeredTokenSent(amount, from);
        }    
    }

    function getStakingBalance(address account) private view returns (uint256) {
        return
            stakingEnabled
                ? balanceOf(account).mul(stakingBonus[account].add(100)).div(
                    100
                )
                : balanceOf(account);
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    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 setMinimumTokenBalanceForAutoDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForAutoDividends(value);
    }

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    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 + buyDevFee);
        }
        if (sellRewardsFee > 0) {
            dividendsFromSell = address(this)
            .balance
            .mul(sellAmount)
            .div(totalAmount)
            .mul(sellRewardsFee)
            .div(sellRewardsFee + sellMarketingFees + sellDevFee);
        }
        dividends = dividendsFromBuy.add(dividendsFromSell);

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

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 devPayout = buyDevFee.add(sellDevFee) * feePortions;

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

        emit SendDividends(
            dividends,
            marketingPayout + devPayout,
            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 ARBIXELDividendTracker 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; // USDC
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    string private trackerName;
    string private trackerTicker;

    IUniswapV2Router02 public uniswapV2Router;

    ARBIXEL public ARBIXELContract;

    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;
        ARBIXELContract = ARBIXEL(mainContract);
        minimumTokenBalanceForAutoDividends = 10000000_000000000000000000; // 10M tokens
        minimumTokenBalanceForDividends = 1_000000000000000000;

        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, "ARBIXEL_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "ARBIXEL_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main 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 updateUniswapV2Router(address newAddress) public onlyOwner {
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

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

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

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

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

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

API
[{"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":"uint256","name":"duration","type":"uint256"}],"name":"EnableAccountStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","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":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetPreSaleWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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":"sellDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDeadFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellDevFee","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":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdateStakingAmounts","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"UpdateTransferFee","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"},{"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":"buyDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","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":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldowntimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","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 ARBIXELDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabledPublicTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"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":[{"internalType":"address","name":"account","type":"address"}],"name":"getStakingInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"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":"launchblock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","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":"sellDeadFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","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"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCanTransferBefore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setDexRouter","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":"uint256","name":"GWEI","type":"uint256"}],"name":"setGasPriceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setIncludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsInEffect","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":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicTrading","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":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setWhitelistForPublicTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setcooldowntimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingUntilDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"deadBuy","type":"uint256"},{"internalType":"uint256","name":"deadSell","type":"uint256"},{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"liquidityBuy","type":"uint256"},{"internalType":"uint256","name":"liquiditySell","type":"uint256"},{"internalType":"uint256","name":"RewardsBuy","type":"uint256"},{"internalType":"uint256","name":"RewardsSell","type":"uint256"},{"internalType":"uint256","name":"devBuy","type":"uint256"},{"internalType":"uint256","name":"devSell","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":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"updateStakingAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTransferFee","type":"uint256"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistForPublicTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"}]

608060405260088054600162ffff0160a01b03191661dead17905560016009819055600a819055601d805460ff199081168317909155620f4240601e556025805490911690911790556401a13b8600602655603c602a553480156200006357600080fd5b50604051806040016040528060078152602001661054909a5e195b60ca1b81525060405180604001604052806005815260200164109256115360da1b8152508160039081620000b3919062000a0f565b506004620000c2828262000a0f565b5050506000620000d76200071f60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e805473eb406ee2fffa085e3657631cf7b5acd7ae1ceef56001600160a01b03199182168117909255600f8054909116909117905560006016819055601381905560016017819055601481905560026018819055601581905560198190556012819055601e601a819055601b819055601c93909355731b02da8cb0d097eb8d57a175b88c7d8b4799750692620001e7929091620001d3919082908062000723602090811b62002d9117901c565b6200072360201b62002d911790919060201c565b600c8190555062000219601b54620001d3601454620001d36015546012546200072360201b62002d911790919060201c565b600b81905550308173ff970a61a04b1ca14834a43f5de4533ebddb5cc860405162000244906200095d565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600e9082018190526d20a92124ac22a62a2920a1a5a2a960911b60c0830181905260e06080840181905283019190915261010082015261012001604051809103906000f080158015620002c1573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200032c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000352919062000adb565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003db919062000adb565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000429573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200044f919062000adb565b600780546001600160a01b0319166001600160a01b039290921691821790556200047b90600162000791565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004c257600080fd5b505af1158015620004d7573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200052557600080fd5b505af11580156200053a573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa15801562000588573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ae919062000b06565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015620005f757600080fd5b505af11580156200060c573d6000803e3d6000fd5b5050306000908152601f60205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600f541684529190922080549091169091179055506b033b2e3c9fd0803ce800000090506200068a620006836005546001600160a01b031690565b826200085c565b6301312d00601055620006a06103e88262000b2a565b601155600160246000620006bc6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600e54909116815260248352818120805485166001908117909155338252602c9093522080549092161790555062000b749050565b3390565b60008062000732838562000b4d565b9050838110156200078a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556200082057600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200080657600080fd5b505af11580156200081b573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038216620008b45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000781565b620008d0816002546200072360201b62002d911790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200090391839062002d9162000723821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b6130eb806200571a83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200099657607f821691505b602082108103620009b757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200095857600081815260208120601f850160051c81016020861015620009e65750805b601f850160051c820191505b8181101562000a0757828155600101620009f2565b505050505050565b81516001600160401b0381111562000a2b5762000a2b6200096b565b62000a438162000a3c845462000981565b84620009bd565b602080601f83116001811462000a7b576000841562000a625750858301515b600019600386901b1c1916600185901b17855562000a07565b600085815260208120601f198616915b8281101562000aac5788860151825594840194600190910190840162000a8b565b508582101562000acb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000aee57600080fd5b81516001600160a01b03811681146200078a57600080fd5b60006020828403121562000b1957600080fd5b815180151581146200078a57600080fd5b60008262000b4857634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000b6f57634e487b7160e01b600052601160045260246000fd5b500190565b614b968062000b846000396000f3fe6080604052600436106105065760003560e01c80637d32f34211610297578063aa4704f311610165578063dd62ed3e116100cc578063f2fde38b11610085578063f2fde38b14611007578063f5d3c79a14611027578063f637434214611047578063f72f863b1461105d578063f8b45b051461107d578063fc6b151c1461109357600080fd5b8063dd62ed3e14610f33578063e2f4560514610f79578063e7841ec014610f8f578063f11a24d314610fa4578063f1c0ddff14610fba578063f27fd25414610fe757600080fd5b8063ba079d491161011e578063ba079d4914610e88578063bb8d513114610ea8578063d07a091c14610ebe578063d5e3725114610ede578063d7b837dd14610efe578063d8032ed314610f1357600080fd5b8063aa4704f314610d5e578063acb2ad6f14610db6578063ad56c13c14610dcc578063b494298814610e23578063b62496f514610e39578063b74e3b1114610e6857600080fd5b80639a7a23d611610209578063a0d82dc5116101c2578063a0d82dc514610ca8578063a457c2d714610cbe578063a694fc3a14610cde578063a8b9d24014610cfe578063a9059cbb14610d1e578063a9885de514610d3e57600080fd5b80639a7a23d614610bfc5780639c1b8af514610c1c5780639c3372ea14610c325780639c3b4fdc14610c525780639cefc1da14610c685780639ec1037e14610c8857600080fd5b8063871c128d1161025b578063871c128d14610b5d5780638ca2923a14610b7d5780638da5cb5b14610b935780638ea5220f14610bb157806395451c2914610bd157806395d89b4114610be757600080fd5b80637d32f34214610ab05780637fdde05c14610add578063837ae2d014610afd5780638577a6d514610b1d578063868730c714610b3d57600080fd5b806349bd5a5e116103d457806364b0f65311610346578063715018a6116102ff578063715018a614610a0b57806372d8edf414610a2057806375829def14610a4057806375f0a87414610a6057806377a3b60914610a805780637928dd1d14610a9657600080fd5b806364b0f65314610956578063679ca6e91461096b5780636843cd841461098b5780636d48467b146109ab578063700bb191146109cb57806370a08231146109eb57600080fd5b80634fbee193116103985780634fbee193146108915780635124f874146108ca5780635a84c5eb146108e05780635c234bb6146109005780635ebf4db9146109165780635eee4bae1461093657600080fd5b806349bd5a5e146108075780634a62bb65146108275780634a74bb02146108415780634ada218b1461085b5780634e71d92d1461087c57600080fd5b806321cbb02411610478578063313ce56711610431578063313ce567146107485780633599bb171461076457806339509351146107845780633f407b84146107a457806340ffdd80146107ba578063435c89e4146107da57600080fd5b806321cbb0241461068e5780632307b441146106be57806323b872dd146106de57806325cd3598146106fe5780632c1f52161461071357806330bb4cff1461073357600080fd5b8063095ea7b3116104ca578063095ea7b3146105d35780630ef35b7e146106035780631694505e1461062357806318160ddd146106435780631d7b1fb4146106625780631fa705311461067857600080fd5b806303fd2a451461051257806305ca5f081461054f57806306fdde031461057157806308dfe8a51461059357806309231602146105b357600080fd5b3661050d57005b600080fd5b34801561051e57600080fd5b50600854610532906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561055b57600080fd5b5061056f61056a36600461443b565b6110b3565b005b34801561057d57600080fd5b50610586611184565b6040516105469190614454565b34801561059f57600080fd5b5061056f6105ae3660046144cc565b611216565b3480156105bf57600080fd5b5061056f6105ce36600461443b565b61129f565b3480156105df57600080fd5b506105f36105ee366004614505565b61132e565b6040519015158152602001610546565b34801561060f57600080fd5b5061056f61061e366004614531565b611345565b34801561062f57600080fd5b50600654610532906001600160a01b031681565b34801561064f57600080fd5b506002545b604051908152602001610546565b34801561066e57600080fd5b50610654602a5481565b34801561068457600080fd5b50610654600a5481565b34801561069a57600080fd5b506105f36106a9366004614553565b602c6020526000908152604090205460ff1681565b3480156106ca57600080fd5b5061056f6106d9366004614646565b61142a565b3480156106ea57600080fd5b506105f36106f9366004614708565b6115fb565b34801561070a57600080fd5b50610532611664565b34801561071f57600080fd5b50600d54610532906001600160a01b031681565b34801561073f57600080fd5b506106546116d7565b34801561075457600080fd5b5060405160128152602001610546565b34801561077057600080fd5b5061056f61077f366004614749565b611745565b34801561079057600080fd5b506105f361079f366004614505565b6117d2565b3480156107b057600080fd5b5061065460095481565b3480156107c657600080fd5b5061056f6107d5366004614749565b611808565b3480156107e657600080fd5b506106546107f536600461443b565b60236020526000908152604090205481565b34801561081357600080fd5b50600754610532906001600160a01b031681565b34801561083357600080fd5b506025546105f39060ff1681565b34801561084d57600080fd5b50601d546105f39060ff1681565b34801561086757600080fd5b506008546105f390600160b01b900460ff1681565b34801561088857600080fd5b5061056f611863565b34801561089d57600080fd5b506105f36108ac366004614553565b6001600160a01b03166000908152601f602052604090205460ff1690565b3480156108d657600080fd5b5061065460175481565b3480156108ec57600080fd5b5061056f6108fb36600461443b565b6118db565b34801561090c57600080fd5b5061065460165481565b34801561092257600080fd5b5061056f61093136600461443b565b611936565b34801561094257600080fd5b5061056f61095136600461443b565b611991565b34801561096257600080fd5b506106546119d3565b34801561097757600080fd5b5061056f610986366004614749565b611a1d565b34801561099757600080fd5b506106546109a6366004614553565b611a5a565b3480156109b757600080fd5b506105f36109c6366004614553565b611aca565b3480156109d757600080fd5b5061056f6109e636600461443b565b611b3a565b3480156109f757600080fd5b50610654610a06366004614553565b611c0c565b348015610a1757600080fd5b5061056f611c27565b348015610a2c57600080fd5b5061056f610a3b366004614553565b611c9b565b348015610a4c57600080fd5b5061056f610a5b366004614553565b611cf7565b348015610a6c57600080fd5b50600e54610532906001600160a01b031681565b348015610a8c57600080fd5b5061065460195481565b348015610aa257600080fd5b50602b546105f39060ff1681565b348015610abc57600080fd5b50610654610acb366004614553565b60226020526000908152604090205481565b348015610ae957600080fd5b5061056f610af83660046144cc565b611dac565b348015610b0957600080fd5b5061056f610b18366004614766565b611e01565b348015610b2957600080fd5b5061056f610b3836600461443b565b611fac565b348015610b4957600080fd5b5061056f610b58366004614749565b612063565b348015610b6957600080fd5b5061056f610b7836600461443b565b61209b565b348015610b8957600080fd5b5061065460135481565b348015610b9f57600080fd5b506005546001600160a01b0316610532565b348015610bbd57600080fd5b50600f54610532906001600160a01b031681565b348015610bdd57600080fd5b5061065460145481565b348015610bf357600080fd5b50610586612117565b348015610c0857600080fd5b5061056f610c173660046144cc565b612126565b348015610c2857600080fd5b50610654601e5481565b348015610c3e57600080fd5b5061056f610c4d366004614749565b61215e565b348015610c5e57600080fd5b50610654601a5481565b348015610c7457600080fd5b5061056f610c83366004614749565b6121ba565b348015610c9457600080fd5b5061056f610ca3366004614553565b612250565b348015610cb457600080fd5b50610654601b5481565b348015610cca57600080fd5b506105f3610cd9366004614505565b612327565b348015610cea57600080fd5b5061056f610cf936600461443b565b612376565b348015610d0a57600080fd5b50610654610d19366004614553565b612599565b348015610d2a57600080fd5b506105f3610d39366004614505565b6125cc565b348015610d4a57600080fd5b5061056f610d593660046144cc565b6125d9565b348015610d6a57600080fd5b50610da1610d79366004614553565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b60408051928352602083019190915201610546565b348015610dc257600080fd5b50610654601c5481565b348015610dd857600080fd5b50610dec610de7366004614553565b61262e565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610546565b348015610e2f57600080fd5b5061065460295481565b348015610e4557600080fd5b506105f3610e54366004614553565b602080526000908152604090205460ff1681565b348015610e7457600080fd5b5061056f610e8336600461443b565b6126be565b348015610e9457600080fd5b506105f3610ea3366004614553565b61274e565b348015610eb457600080fd5b5061065460125481565b348015610eca57600080fd5b5061056f610ed9366004614553565b612781565b348015610eea57600080fd5b5061056f610ef9366004614749565b612876565b348015610f0a57600080fd5b5061056f6128f8565b348015610f1f57600080fd5b5061056f610f2e366004614553565b612941565b348015610f3f57600080fd5b50610654610f4e3660046147ce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f8557600080fd5b5061065460115481565b348015610f9b57600080fd5b50610654612a04565b348015610fb057600080fd5b5061065460185481565b348015610fc657600080fd5b50610654610fd5366004614553565b60216020526000908152604090205481565b348015610ff357600080fd5b50610dec61100236600461443b565b612a4e565b34801561101357600080fd5b5061056f611022366004614553565b612a8c565b34801561103357600080fd5b5061056f611042366004614749565b612b77565b34801561105357600080fd5b5061065460155481565b34801561106957600080fd5b5061056f611078366004614553565b612baf565b34801561108957600080fd5b5061065460105481565b34801561109f57600080fd5b5061056f6110ae36600461443b565b612cdc565b6005546001600160a01b031633146110e65760405162461bcd60e51b81526004016110dd906147fc565b60405180910390fd5b6110f881670de0b6b3a7640000614847565b90506000611113600954600a54612d9190919063ffffffff16565b9050600061113682611130600a5486612df790919063ffffffff16565b90612e79565b905060006111538361113060095487612df790919063ffffffff16565b905061115e84612ebb565b600a5461116b90836131bb565b600a5560095461117b90826131bb565b60095550505050565b60606003805461119390614866565b80601f01602080910402602001604051908101604052809291908181526020018280546111bf90614866565b801561120c5780601f106111e15761010080835404028352916020019161120c565b820191906000526020600020905b8154815290600101906020018083116111ef57829003601f168201915b5050505050905090565b6005546001600160a01b031633146112405760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146112c95760405162461bcd60e51b81526004016110dd906147fc565b600581101561131a5760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f772035000000000000000060448201526064016110dd565b61132881633b9aca00614847565b60265550565b600061133b3384846131fd565b5060015b92915050565b6005546001600160a01b0316331461136f5760405162461bcd60e51b81526004016110dd906147fc565b60008281526023602052604090205481900361138a57600080fd5b60648111156113db5760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e27742065786365656420313030000060448201526064016110dd565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b031633146114545760405162461bcd60e51b81526004016110dd906147fc565b80518251146114a55760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e677468000060448201526064016110dd565b60c8825111156115025760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b60648201526084016110dd565b60005b82518110156115f6576000838281518110611522576115226148a0565b602002602001015190506000838381518110611540576115406148a0565b6020026020010151670de0b6b3a764000061155b9190614847565b9050611568338383613322565b600d546001600160a01b031663e30443bc8361158381611c0c565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156115c957600080fd5b505af11580156115dd573d6000803e3d6000fd5b50505050505080806115ee906148b6565b915050611505565b505050565b600061160884848461342b565b61165a843361165585604051806060016040528060288152602001614b14602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613f90565b6131fd565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d291906148cf565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d291906148ec565b6005546001600160a01b0316331461176f5760405162461bcd60e51b81526004016110dd906147fc565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161133b9185906116559086612d91565b6005546001600160a01b031633146118325760405162461bcd60e51b81526004016110dd906147fc565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd809060240161179d565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156118b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d89190614905565b50565b6005546001600160a01b031633146119055760405162461bcd60e51b81526004016110dd906147fc565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb9060240161179d565b6005546001600160a01b031633146119605760405162461bcd60e51b81526004016110dd906147fc565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db99060240161179d565b6005546001600160a01b031633146119bb5760405162461bcd60e51b81526004016110dd906147fc565b6119cd81670de0b6b3a7640000614847565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611721573d6000803e3d6000fd5b6005546001600160a01b03163314611a475760405162461bcd60e51b81526004016110dd906147fc565b6025805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f91906148ec565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611b16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190614905565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb19190614922565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611c515760405162461bcd60e51b81526004016110dd906147fc565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611cc55760405162461bcd60e51b81526004016110dd906147fc565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db09060240161179d565b6005546001600160a01b03163314611d215760405162461bcd60e51b81526004016110dd906147fc565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611d6857600080fd5b505af1158015611d7c573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff19166001179055506118d881612a8c565b6005546001600160a01b03163314611dd65760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611e2b5760405162461bcd60e51b81526004016110dd906147fc565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b819055611e7381611e6d8981878a612d91565b90612d91565b600b81905550611e9c601a54611e6d601754611e6d601854601954612d9190919063ffffffff16565b600c55600b54602310801590611eb557506023600c5411155b611f135760405162461bcd60e51b815260206004820152602960248201527f746f74616c20666565732063616e6e6f742065786365656420333520252073656044820152686c6c206f722062757960b81b60648201526084016110dd565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611fd65760405162461bcd60e51b81526004016110dd906147fc565b60058111156120275760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f742065786365656420352500000060448201526064016110dd565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d6399060440161179d565b6005546001600160a01b031633146120c55760405162461bcd60e51b81526004016110dd906147fc565b62030d4081101580156120db5750620f42408111155b6120e457600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b60606004805461119390614866565b6005546001600160a01b031633146121505760405162461bcd60e51b81526004016110dd906147fc565b61215a8282613fca565b5050565b6005546001600160a01b031633146121885760405162461bcd60e51b81526004016110dd906147fc565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea9060240161179d565b6005546001600160a01b031633146121e45760405162461bcd60e51b81526004016110dd906147fc565b801515600860159054906101000a900460ff1615150361220357600080fd5b60088054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a879061205890831515815260200190565b6005546001600160a01b0316331461227a5760405162461bcd60e51b81526004016110dd906147fc565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b1580156122c157600080fd5b505af11580156122d5573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050826122f681614092565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440161179d565b600061133b338461165585604051806060016040528060258152602001614b3c602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613f90565b600854600160a81b900460ff166123c85760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60448201526064016110dd565b60008181526023602052604081205490036124255760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e000000000000000060448201526064016110dd565b61242f4282612d91565b33600090815260226020526040902054106124985760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b60648201526084016110dd565b6000818152602360209081526040808320543384526021909252909120556124c04282612d91565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc906124ef81614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561253557600080fd5b505af1158015612549573d6000803e3d6000fd5b505050506125543390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c88260405161258e91815260200190565b60405180910390a250565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611a89565b600061133b33848461342b565b6005546001600160a01b031633146126035760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b03919091166000908152602c60205260409020805460ff1916911515919091179055565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015612686573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126aa9190614950565b949c939b5091995097509550909350915050565b6005546001600160a01b031633146126e85760405162461bcd60e51b81526004016110dd906147fc565b61012c8111156127495760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b60648201526084016110dd565b602a55565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611af9565b6005546001600160a01b031633146127ab5760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b15801561282457600080fd5b505af1158015612838573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050612058565b6005546001600160a01b031633146128a05760405162461bcd60e51b81526004016110dd906147fc565b601d5481151560ff9091161515036128b757600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001612058565b6005546001600160a01b031633146129225760405162461bcd60e51b81526004016110dd906147fc565b602b5460ff161561293257600080fd5b602b805460ff19166001179055565b6005546001600160a01b0316331461296b5760405162461bcd60e51b81526004016110dd906147fc565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b1580156129b257600080fd5b505af11580156129c6573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050612058565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611721573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612669565b6005546001600160a01b03163314612ab65760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b038116612b1b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110dd565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a049060440161179d565b6005546001600160a01b03163314612bd95760405162461bcd60e51b81526004016110dd906147fc565b602b8054610100600160a81b0319166101006001600160a01b0384169081029190911790915515612c99576001600160a01b038181166000818152602c602090815260408083208054600160ff199182168117909255601f9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015612c8057600080fd5b505af1158015612c94573d6000803e3d6000fd5b505050505b436029556008805460ff60b01b1916600160b01b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6005546001600160a01b03163314612d065760405162461bcd60e51b81526004016110dd906147fc565b612d1881670de0b6b3a7640000614847565b90506103e8600254612d2a91906149a3565b811015612d8c5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b60648201526084016110dd565b601055565b600080612d9e83856149c5565b905083811015612df05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016110dd565b9392505050565b600082600003612e095750600061133f565b6000612e158385614847565b905082612e2285836149a3565b14612df05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016110dd565b6000612df083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506140eb565b80600003612ec65750565b612ecf81614119565b6000612ee8600954600a54612d9190919063ffffffff16565b601954909150600190819081906000908190819015612f4957612f46601a54601754601954612f1791906149c5565b612f2191906149c5565b611130601954612f408b611130600a5447612df790919063ffffffff16565b90612df7565b91505b60125415612f9357612f90601b54601454601254612f6791906149c5565b612f7191906149c5565b611130601254612f408b61113060095447612df790919063ffffffff16565b90505b612f9d8282612d91565b92508215612ffd57600d546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612ff2576040519150601f19603f3d011682016040523d82523d6000602084013e612ff7565b606091505b50909650505b6000613016601a54601754612d9190919063ffffffff16565b601b5460145461302591612d91565b61302f91906149c5565b905060008115613046576130434783612e79565b90505b600081613060601454601754612d9190919063ffffffff16565b61306a9190614847565b9050600082613086601b54601a54612d9190919063ffffffff16565b6130909190614847565b905081156130f057600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146130e5576040519150601f19603f3d011682016040523d82523d6000602084013e6130ea565b606091505b50909950505b801561314e57600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613143576040519150601f19603f3d011682016040523d82523d6000602084013e613148565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd08761317a83856149c5565b8c801561318457508b5b801561318d57508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b6000612df083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613f90565b6001600160a01b03831661325f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016110dd565b6001600160a01b0382166132c05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016110dd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166133485760405162461bcd60e51b81526004016110dd906149dd565b6001600160a01b03821661336e5760405162461bcd60e51b81526004016110dd90614a22565b6133ab81604051806060016040528060268152602001614aee602691396001600160a01b0386166000908152602081905260409020549190613f90565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546133da9082612d91565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613315565b6001600160a01b0383166134515760405162461bcd60e51b81526004016110dd906149dd565b6001600160a01b0382166134775760405162461bcd60e51b81526004016110dd90614a22565b6001600160a01b038316600090815260246020526040812054819081908190819060ff166134f857600854600160b01b900460ff166134f85760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c656460448201526064016110dd565b602b5460ff1615801561351a5750602b5461010090046001600160a01b031615155b156135b1576135298888614273565b158061354d57506001600160a01b0388166000908152602c602052604090205460ff165b8061357057506001600160a01b0387166000908152602c602052604090205460ff165b6135b15760405162461bcd60e51b815260206004820152601260248201527121617661696c61626c652074726164696e6760701b60448201526064016110dd565b856000036135cf576135c588886000613322565b5050505050505050565b600854600160a01b900460ff1615801561360257506001600160a01b0388166000908152601f602052604090205460ff16155b801561362757506001600160a01b0387166000908152601f602052604090205460ff16155b15613dc1576001600160a01b03808816600090815260208052604080822054928b16825290205460ff918216911680158015613661575081155b156137a75760006136826064611130601c548c612df790919063ffffffff16565b905061368e89826131bb565b985061369b8b3083613322565b6136a68b8b8b613322565b600d546001600160a01b031663e30443bc8c6136c181614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561370757600080fd5b505af115801561371b573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b61373c81614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561378257600080fd5b505af1158015613796573d6000803e3d6000fd5b505050505050505050505050505050565b801580156137be5750600854600160a81b900460ff165b15613875576001600160a01b038a1660009081526022602052604090205442101561382b5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b65642100000060448201526064016110dd565b6001600160a01b038a1660009081526022602052604090205415613870576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b613ace565b811561391e57601254601354601454601554601b54602554949b509299509097509550935060ff161561387057602a54326000908152602860205260409020546138bf91906149c5565b4210156139075760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b60448201526064016110dd565b326000908152602860205260409020429055613ace565b8015613ace57601954601654601754601854601a54602554949b509299509097509550935060ff1615613a57576029546139599060016149c5565b431161399c5760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b60448201526064016110dd565b6026543a11156139ee5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e000000000000000060448201526064016110dd565b32600090815260276020526040902054439003613a445760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b60448201526064016110dd565b3260009081526027602052604090204390555b6000613a628a611c0c565b601054909150613a728a836149c5565b1115613acc5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b60648201526084016110dd565b505b6000613aef84613ade88886149c5565b613ae891906149c5565b8990612d91565b90506000613afc30611c0c565b60115490915081108015908190613b2b57506001600160a01b038d16600090815260208052604090205460ff16155b15613c44576008805460ff60a01b1916600160a01b179055601d5460ff168015613b555750600087115b8015613b6357506000600c54115b15613c15576000613b81600954600a54612d9190919063ffffffff16565b90506000613b9e82611130600a5487612df790919063ffffffff16565b90506000613bbb8361113060095488612df790919063ffffffff16565b90506000613bd8600c546111308d86612df790919063ffffffff16565b90506000613bf5600b546111308e86612df790919063ffffffff16565b90506000613c038284612d91565b9050613c0e816142e6565b5050505050505b6000613c2030611c0c565b9050613c2b81612ebb565b506000600a8190556009556008805460ff60a01b191690555b6000613c5560646111308e87612df7565b905060008a15613ca8576064613c6b8e8d612df7565b613c7591906149a3565b9050613c978f600860009054906101000a90046001600160a01b031683613322565b600254613ca490826131bb565b6002555b613cbc613cb582846149c5565b8e906131bb565b9c508615613cd957600954613cd19083612d91565b600955613cea565b600a54613ce69083612d91565b600a555b613cf58f3084613322565b601e54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613d62575060408051601f3d908101601f19168201909252613d5f91810190614922565b60015b15613db85760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613dcc888888613322565b600d546001600160a01b031663e30443bc89613de781614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613e2d57600080fd5b505af1158015613e41573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088613e6281614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ea857600080fd5b505af1158015613ebc573d6000803e3d6000fd5b50506006546001600160a01b038b8116911614801592509050613ef757506001600160a01b038816600090815260208052604090205460ff16155b8015613f155750602b546001600160a01b0388811661010090920416145b156135c557602b54604051633fb6b04560e11b8152600481018890526001600160a01b038a8116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b158015613f6e57600080fd5b505af1158015613f82573d6000803e3d6000fd5b505050505050505050505050565b60008184841115613fb45760405162461bcd60e51b81526004016110dd9190614454565b506000613fc18486614a65565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff1916821580159190911790915561405657600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561403d57600080fd5b505af1158015614051573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff166140b4576140af82611c0c565b61133f565b6001600160a01b03821660009081526021602052604090205461133f90606490611130906140e29083612d91565b612f4086611c0c565b6000818361410c5760405162461bcd60e51b81526004016110dd9190614454565b506000613fc184866149a3565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061414e5761414e6148a0565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156141a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141cb91906148cf565b816001815181106141de576141de6148a0565b6001600160a01b03928316602091820292909201015260065461420491309116846131fd565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061423d908590600090869030904290600401614a7c565b600060405180830381600087803b15801561425757600080fd5b505af115801561426b573d6000803e3d6000fd5b505050505050565b6001600160a01b038216600090815260208052604081205460ff1680156142a857506006546001600160a01b03838116911614155b156142b55750600161133f565b6001600160a01b038216600090815260208052604090205460ff16156142dd5750600261133f565b50600092915050565b60006142f3826002612e79565b9050600061430183836131bb565b90504761430d83614119565b600061431947836131bb565b9050614325838261436d565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546143859030906001600160a01b0316846131fd565b6006546001600160a01b031663f305d7198230856000806143ae6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015614416573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117cb9190614922565b60006020828403121561444d57600080fd5b5035919050565b600060208083528351808285015260005b8181101561448157858101830151858201604001528201614465565b81811115614493576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146118d857600080fd5b80151581146118d857600080fd5b600080604083850312156144df57600080fd5b82356144ea816144a9565b915060208301356144fa816144be565b809150509250929050565b6000806040838503121561451857600080fd5b8235614523816144a9565b946020939093013593505050565b6000806040838503121561454457600080fd5b50508035926020909101359150565b60006020828403121561456557600080fd5b8135612df0816144a9565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156145af576145af614570565b604052919050565b600067ffffffffffffffff8211156145d1576145d1614570565b5060051b60200190565b600082601f8301126145ec57600080fd5b813560206146016145fc836145b7565b614586565b82815260059290921b8401810191818101908684111561462057600080fd5b8286015b8481101561463b5780358352918301918301614624565b509695505050505050565b6000806040838503121561465957600080fd5b823567ffffffffffffffff8082111561467157600080fd5b818501915085601f83011261468557600080fd5b813560206146956145fc836145b7565b82815260059290921b840181019181810190898411156146b457600080fd5b948201945b838610156146db5785356146cc816144a9565b825294820194908201906146b9565b965050860135925050808211156146f157600080fd5b506146fe858286016145db565b9150509250929050565b60008060006060848603121561471d57600080fd5b8335614728816144a9565b92506020840135614738816144a9565b929592945050506040919091013590565b60006020828403121561475b57600080fd5b8135612df0816144be565b6000806000806000806000806000806101408b8d03121561478657600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156147e157600080fd5b82356147ec816144a9565b915060208301356144fa816144a9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561486157614861614831565b500290565b600181811c9082168061487a57607f821691505b60208210810361489a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016148c8576148c8614831565b5060010190565b6000602082840312156148e157600080fd5b8151612df0816144a9565b6000602082840312156148fe57600080fd5b5051919050565b60006020828403121561491757600080fd5b8151612df0816144be565b60008060006060848603121561493757600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561496957600080fd5b8651614974816144a9565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000826149c057634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156149d8576149d8614831565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015614a7757614a77614831565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614acc5784516001600160a01b031683529383019391830191600101614aa7565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206ce79d07bcbe4b8554239534f5e10ae6f53363ea977dbfc11a36c1db8692709864736f6c634300080f003360806040526012805460ff60b01b191690553480156200001e57600080fd5b50604051620030eb380380620030eb83398101604081905262000041916200024a565b81818181600362000053838262000384565b50600462000062828262000384565b50505050506000620000796200016060201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d5838262000384565b506014620000e4828262000384565b505060128054601680546001600160a01b03199081166001600160a01b03988916179091556a084595161401484a000000601855670de0b6b3a76400006019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b19169091555062000450565b3390565b6001600160a01b03811681146200017a57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001a557600080fd5b81516001600160401b0380821115620001c257620001c26200017d565b604051601f8301601f19908116603f01168101908282118183101715620001ed57620001ed6200017d565b816040528381526020925086838588010111156200020a57600080fd5b600091505b838210156200022e57858201830151818301840152908201906200020f565b83821115620002405760008385830101525b9695505050505050565b600080600080600060a086880312156200026357600080fd5b8551620002708162000164565b6020870151909550620002838162000164565b6040870151909450620002968162000164565b60608701519093506001600160401b0380821115620002b457600080fd5b620002c289838a0162000193565b93506080880151915080821115620002d957600080fd5b50620002e88882890162000193565b9150509295509295909350565b600181811c908216806200030a57607f821691505b6020821081036200032b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037f57600081815260208120601f850160051c810160208610156200035a5750805b601f850160051c820191505b818110156200037b5782815560010162000366565b5050505b505050565b81516001600160401b03811115620003a057620003a06200017d565b620003b881620003b18454620002f5565b8462000331565b602080601f831160018114620003f05760008415620003d75750858301515b600019600386901b1c1916600185901b1785556200037b565b600085815260208120601f198616915b82811015620004215788860151825594840194600190910190840162000400565b5085821015620004405787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c8b80620004606000396000f3fe60806040526004361061031e5760003560e01c80636d48467b116101ab578063a5f4b4dc116100f7578063d8032ed311610095578063e7841ec01161006f578063e7841ec0146109ed578063f2fde38b14610a02578063fbcbc0f114610a22578063ffb2c47914610a4257600080fd5b8063d8032ed314610967578063dd62ed3e14610987578063e30443bc146109cd57600080fd5b8063aafd847a116100d1578063aafd847a146108d1578063b22f8a0414610907578063ba079d4914610927578063bc4c4b371461094757600080fd5b8063a5f4b4dc14610871578063a8b9d24014610891578063a9059cbb146108b157600080fd5b80638da5cb5b116101645780639c3372ea1161013e5780639c3372ea146107ef5780639eec101e1461080f578063a423406914610830578063a457c2d71461085157600080fd5b80638da5cb5b1461079c57806391b89fba146107ba57806395d89b41146107da57600080fd5b80636d48467b146106db57806370a08231146106fb578063715018a61461073157806374c13fda1461074657806385a6b3ae146107665780638bc1d6391461077c57600080fd5b8063313ce5671161026a5780634e7b827f116102235780635ebf4db9116101fd5780635ebf4db91461065657806365b8dbc0146106765780636a474002146106965780636b69163b146106ab57600080fd5b80634e7b827f146105af5780635183d6fd146105df5780635a84c5eb1461063657600080fd5b8063313ce567146104f257806331e79db01461050e5780633599bb171461052e578063395093511461054e57806340ffdd801461056e578063418089041461058e57600080fd5b806318160ddd116102d757806323b872dd116102b157806323b872dd1461047e57806325cd35981461049e57806327ce0147146104bc5780633009a609146104dc57600080fd5b806318160ddd1461040c5780631d4ff89a14610421578063226cfa3d1461045157600080fd5b806303c833021461033257806306fdde031461033a5780630928847114610365578063095ea7b31461038557806309bbedde146103b55780631694505e146103d457600080fd5b3661032d5761032b610a7d565b005b600080fd5b61032b610a7d565b34801561034657600080fd5b5061034f610b10565b60405161035c91906127be565b60405180910390f35b34801561037157600080fd5b5061032b61038036600461282b565b610ba2565b34801561039157600080fd5b506103a56103a0366004612848565b610bf6565b604051901515815260200161035c565b3480156103c157600080fd5b50600a545b60405190815260200161035c565b3480156103e057600080fd5b506015546103f4906001600160a01b031681565b6040516001600160a01b03909116815260200161035c565b34801561041857600080fd5b506002546103c6565b34801561042d57600080fd5b506103a561043c36600461282b565b60116020526000908152604090205460ff1681565b34801561045d57600080fd5b506103c661046c36600461282b565b60176020526000908152604090205481565b34801561048a57600080fd5b506103a5610499366004612874565b610c0d565b3480156104aa57600080fd5b506012546001600160a01b03166103f4565b3480156104c857600080fd5b506103c66104d736600461282b565b610c76565b3480156104e857600080fd5b506103c6600e5481565b3480156104fe57600080fd5b506040516012815260200161035c565b34801561051a57600080fd5b5061032b61052936600461282b565b610cd2565b34801561053a57600080fd5b5061032b6105493660046128c3565b610d6c565b34801561055a57600080fd5b506103a5610569366004612848565b610e0d565b34801561057a57600080fd5b5061032b6105893660046128c3565b610e43565b34801561059a57600080fd5b506012546103a590600160a81b900460ff1681565b3480156105bb57600080fd5b506103a56105ca36600461282b565b600f6020526000908152604090205460ff1681565b3480156105eb57600080fd5b506105ff6105fa3660046128e0565b610ed9565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161035c565b34801561064257600080fd5b5061032b6106513660046128e0565b610f39565b34801561066257600080fd5b5061032b6106713660046128e0565b610f7b565b34801561068257600080fd5b5061032b61069136600461282b565b610fbd565b3480156106a257600080fd5b5061032b611009565b3480156106b757600080fd5b506103a56106c636600461282b565b60106020526000908152604090205460ff1681565b3480156106e757600080fd5b506103a56106f636600461282b565b6110a9565b34801561070757600080fd5b506103c661071636600461282b565b6001600160a01b031660009081526020819052604090205490565b34801561073d57600080fd5b5061032b6110f5565b34801561075257600080fd5b506012546103f4906001600160a01b031681565b34801561077257600080fd5b506103c660085481565b34801561078857600080fd5b5061032b6107973660046128f9565b611169565b3480156107a857600080fd5b506009546001600160a01b03166103f4565b3480156107c657600080fd5b506103c66107d536600461282b565b6111be565b3480156107e657600080fd5b5061034f6111c9565b3480156107fb57600080fd5b5061032b61080a3660046128c3565b6111d8565b34801561081b57600080fd5b506012546103a590600160a01b900460ff1681565b34801561083c57600080fd5b506012546103a590600160b01b900460ff1681565b34801561085d57600080fd5b506103a561086c366004612848565b61126e565b34801561087d57600080fd5b506016546103f4906001600160a01b031681565b34801561089d57600080fd5b506103c66108ac36600461282b565b6112bd565b3480156108bd57600080fd5b506103a56108cc366004612848565b6112e9565b3480156108dd57600080fd5b506103c66108ec36600461282b565b6001600160a01b031660009081526007602052604090205490565b34801561091357600080fd5b5061032b6109223660046128f9565b6112f6565b34801561093357600080fd5b506103a561094236600461282b565b61134b565b34801561095357600080fd5b506103a56109623660046128f9565b611397565b34801561097357600080fd5b5061032b61098236600461282b565b611518565b34801561099357600080fd5b506103c66109a2366004612932565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109d957600080fd5b5061032b6109e8366004612848565b611564565b3480156109f957600080fd5b50600e546103c6565b348015610a0e57600080fd5b5061032b610a1d36600461282b565b6115fc565b348015610a2e57600080fd5b506105ff610a3d36600461282b565b6116e7565b348015610a4e57600080fd5b50610a62610a5d3660046128e0565b611796565b6040805193845260208401929092529082015260600161035c565b6000610a8860025490565b11610a9257600080fd5b3415610b0e57610ac5610aa460025490565b610ab234600160801b6118bc565b610abc9190612976565b60055490611945565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b0a9034611945565b6008555b565b606060138054610b1f90612998565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612998565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b5050505050905090565b6009546001600160a01b03163314610bd55760405162461bcd60e51b8152600401610bcc906129d2565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c033384846119a4565b5060015b92915050565b6000610c1a848484611ac8565b610c6c8433610c6785604051806060016040528060288152602001612c09602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b2c565b6119a4565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610cc892610cc392610cbd91610cb891906118bc565b611b66565b90611b76565b611bb4565b610c079190612976565b6009546001600160a01b03163314610cfc5760405162461bcd60e51b8152600401610bcc906129d2565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d2a908290611bc7565b610d35600a82611c26565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d965760405162461bcd60e51b8152600401610bcc906129d2565b801515601260169054906101000a900460ff16151503610db557600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e0290831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c03918590610c679086611945565b6009546001600160a01b03163314610e6d5760405162461bcd60e51b8152600401610bcc906129d2565b801515601260159054906101000a900460ff16151503610e8c57600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e0290831515815260200190565b600080600080600080610eeb600a5490565b8710610f0a575060009450600019935083925084915081905080610f30565b6000610f17600a89611d61565b9050610f22816116e7565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bcc906129d2565b610f7581670de0b6b3a7640000612a07565b60185550565b6009546001600160a01b03163314610fa55760405162461bcd60e51b8152600401610bcc906129d2565b610fb781670de0b6b3a7640000612a07565b60195550565b6009546001600160a01b03163314610fe75760405162461bcd60e51b8152600401610bcc906129d2565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152606360248201527f4152424958454c5f4469766964656e645f547261636b65723a2077697468647260448201527f61774469766964656e642064697361626c65642e20557365207468652027636c60648201527f61696d272066756e6374696f6e206f6e20746865206d61696e20636f6e74726160848201526231ba1760e91b60a482015260c401610bcc565b6009546000906001600160a01b031633146110d65760405162461bcd60e51b8152600401610bcc906129d2565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b0316331461111f5760405162461bcd60e51b8152600401610bcc906129d2565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111935760405162461bcd60e51b8152600401610bcc906129d2565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c07826112bd565b606060148054610b1f90612998565b6009546001600160a01b031633146112025760405162461bcd60e51b8152600401610bcc906129d2565b801515601260149054906101000a900460ff1615150361122157600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e0290831515815260200190565b6000610c033384610c6785604051806060016040528060258152602001612c31602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b2c565b6001600160a01b038116600090815260076020526040812054610c07906112e384610c76565b90611d94565b6000610c03338484611ac8565b6009546001600160a01b031633146113205760405162461bcd60e51b8152600401610bcc906129d2565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b031633146113785760405162461bcd60e51b8152600401610bcc906129d2565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113c45760405162461bcd60e51b8152600401610bcc906129d2565b601254600160b01b900460ff16156113de57506000610c07565b6001600160a01b03831660009081526011602052604090205460ff168280156114045750805b801561141a5750601254600160a81b900460ff16155b15611429576000915050610c07565b60008161143e5761143985611dd6565b611447565b6114478561208f565b9050801561150d576001600160a01b038516600090815260176020526040902042905581156114bb57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c836040516114ae91815260200190565b60405180910390a3611502565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516114f991815260200190565b60405180910390a35b600192505050610c07565b506000949350505050565b6009546001600160a01b031633146115425760405162461bcd60e51b8152600401610bcc906129d2565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461158e5760405162461bcd60e51b8152600401610bcc906129d2565b6001600160a01b0382166000908152600f602052604090205460ff166115ce576019548110156115d2576115c3600a83611c26565b6115ce826000611bc7565b5050565b6115dc8282611bc7565b60185481106115f1576115ce600a8383612402565b6115ce600a83611c26565b6009546001600160a01b031633146116265760405162461bcd60e51b8152600401610bcc906129d2565b6001600160a01b03811661168b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcc565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080806116f9600a876124ab565b945060001993506000851261175b57600e5485111561172757600e546117209086906124f6565b935061175b565b600e54600a546000911061173c57600061174b565b600e54600a5461174b91611d94565b90506117578682611b76565b9450505b611764866112bd565b925061176f86610c76565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a54600090819081908015806117b65750601254600160b01b900460ff165b156117cc575050600e54600092508291506118b5565b600e546000805a90506000805b89841080156117e757508582105b156118a457846117f681612a26565b95505085851061180557600094505b6000600a600001868154811061181d5761181d612a3f565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff1661186a57611857816001611397565b1561186a578161186681612a26565b9250505b8261187481612a26565b93505060005a90508085111561189b576118986118918683611d94565b8790611945565b95505b93506117d99050565b600e85905590975095509193505050505b9193909250565b6000826000036118ce57506000610c07565b60006118da8385612a07565b9050826118e78583612976565b1461193e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bcc565b9392505050565b6000806119528385612a55565b90508381101561193e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcc565b6001600160a01b038316611a065760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcc565b6001600160a01b038216611a675760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602e60248201527f4152424958454c5f4469766964656e645f547261636b65723a204e6f2074726160448201526d1b9cd9995c9cc8185b1b1bddd95960921b6064820152608401610bcc565b505050565b60008184841115611b505760405162461bcd60e51b8152600401610bcc91906127be565b506000611b5d8486612a6d565b95945050505050565b60008181811215610c0757600080fd5b600080611b838385612a84565b905060008312158015611b965750838112155b80611bab5750600083128015611bab57508381125b61193e57600080fd5b600080821215611bc357600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611c06576000611bf48383611d94565b9050611c008482612533565b50505050565b80821015611b27576000611c1a8284611d94565b9050611c008482612597565b6001600160a01b038116600090815260038301602052604090205460ff16611c4c575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c9691612a6d565b90506000846000018281548110611caf57611caf612a3f565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cfe57611cfe612a3f565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d3857611d38612ac5565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d7857611d78612a3f565b6000918252602090912001546001600160a01b03169392505050565b600061193e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b2c565b600080611de2836112bd565b90508015612086576001600160a01b038316600090815260076020526040902054611e0d9082611945565b6001600160a01b03808516600090815260076020526040812092909255601254169081611e92576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611e82576040519150601f19603f3d011682016040523d82523d6000602084013e611e87565b606091505b505080915050611fec565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611efc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f209190612adb565b81600081518110611f3357611f33612a3f565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611f6757611f67612a3f565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611fad9060009086908c904290600401612b3c565b6000604051808303818588803b158015611fc657600080fd5b505af193505050508015611fd8575060015b611fe55760009150611fea565b600191505b505b8061203a576001600160a01b0385166000908152600760205260409020546120149084611d94565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8460405161207591815260200190565b60405180910390a250909392505050565b50600092915050565b60008061209b836112bd565b90508015612086576001600160a01b0383166000908152600760205260408120546120c69083611945565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561214e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121729190612adb565b8160008151811061218557612185612a3f565b6001600160a01b0392831660209182029290920101526016548251911690829060019081106121b6576121b6612a3f565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa158015612210573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122349190612b71565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de9590869061226e90600090879030904290600401612b3c565b6000604051808303818588803b15801561228757600080fd5b505af193505050508015612299575060015b6122a657600092506123a9565b6016546040516370a0823160e01b81523060048201526000916123199184916001600160a01b0316906370a0823190602401602060405180830381865afa1580156122f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e39190612b71565b905080156123a25760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af1158015612378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239c9190612b8a565b506123a7565b600093505b505b826123f8576001600160a01b0386166000908152600760205260409020546123d19085611d94565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff1615612447576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166124d65750600019610c07565b506001600160a01b03166000908152600291909101602052604090205490565b6000806125038385612ba7565b9050600083121580156125165750838113155b80611bab5750600083128015611bab575083811361193e57600080fd5b61253d82826125db565b612577612558610cb8836005546118bc90919063ffffffff16565b6001600160a01b038416600090815260066020526040902054906124f6565b6001600160a01b0390921660009081526006602052604090209190915550565b6125a182826126ba565b6125776125bc610cb8836005546118bc90919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b76565b6001600160a01b0382166126315760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcc565b60025461263e9082611945565b6002556001600160a01b0382166000908152602081905260409020546126649082611945565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03821661271a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcc565b61275781604051806060016040528060228152602001612be7602291396001600160a01b0385166000908152602081905260409020549190611b2c565b6001600160a01b03831660009081526020819052604090205560025461277d9082611d94565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016126ae565b600060208083528351808285015260005b818110156127eb578581018301518582016040015282016127cf565b818111156127fd576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461282857600080fd5b50565b60006020828403121561283d57600080fd5b813561193e81612813565b6000806040838503121561285b57600080fd5b823561286681612813565b946020939093013593505050565b60008060006060848603121561288957600080fd5b833561289481612813565b925060208401356128a481612813565b929592945050506040919091013590565b801515811461282857600080fd5b6000602082840312156128d557600080fd5b813561193e816128b5565b6000602082840312156128f257600080fd5b5035919050565b6000806040838503121561290c57600080fd5b823561291781612813565b91506020830135612927816128b5565b809150509250929050565b6000806040838503121561294557600080fd5b823561295081612813565b9150602083013561292781612813565b634e487b7160e01b600052601160045260246000fd5b60008261299357634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806129ac57607f821691505b6020821081036129cc57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000816000190483118215151615612a2157612a21612960565b500290565b600060018201612a3857612a38612960565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008219821115612a6857612a68612960565b500190565b600082821015612a7f57612a7f612960565b500390565b600080821280156001600160ff1b0384900385131615612aa657612aa6612960565b600160ff1b8390038412811615612abf57612abf612960565b50500190565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612aed57600080fd5b815161193e81612813565b600081518084526020808501945080840160005b83811015612b315781516001600160a01b031687529582019590820190600101612b0c565b509495945050505050565b848152608060208201526000612b556080830186612af8565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612b8357600080fd5b5051919050565b600060208284031215612b9c57600080fd5b815161193e816128b5565b60008083128015600160ff1b850184121615612bc557612bc5612960565b6001600160ff1b0384018313811615612be057612be0612960565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200957bb51b4dc845a0ca66f4f37416346d47cad49d30f252b0a68a859389032b364736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106105065760003560e01c80637d32f34211610297578063aa4704f311610165578063dd62ed3e116100cc578063f2fde38b11610085578063f2fde38b14611007578063f5d3c79a14611027578063f637434214611047578063f72f863b1461105d578063f8b45b051461107d578063fc6b151c1461109357600080fd5b8063dd62ed3e14610f33578063e2f4560514610f79578063e7841ec014610f8f578063f11a24d314610fa4578063f1c0ddff14610fba578063f27fd25414610fe757600080fd5b8063ba079d491161011e578063ba079d4914610e88578063bb8d513114610ea8578063d07a091c14610ebe578063d5e3725114610ede578063d7b837dd14610efe578063d8032ed314610f1357600080fd5b8063aa4704f314610d5e578063acb2ad6f14610db6578063ad56c13c14610dcc578063b494298814610e23578063b62496f514610e39578063b74e3b1114610e6857600080fd5b80639a7a23d611610209578063a0d82dc5116101c2578063a0d82dc514610ca8578063a457c2d714610cbe578063a694fc3a14610cde578063a8b9d24014610cfe578063a9059cbb14610d1e578063a9885de514610d3e57600080fd5b80639a7a23d614610bfc5780639c1b8af514610c1c5780639c3372ea14610c325780639c3b4fdc14610c525780639cefc1da14610c685780639ec1037e14610c8857600080fd5b8063871c128d1161025b578063871c128d14610b5d5780638ca2923a14610b7d5780638da5cb5b14610b935780638ea5220f14610bb157806395451c2914610bd157806395d89b4114610be757600080fd5b80637d32f34214610ab05780637fdde05c14610add578063837ae2d014610afd5780638577a6d514610b1d578063868730c714610b3d57600080fd5b806349bd5a5e116103d457806364b0f65311610346578063715018a6116102ff578063715018a614610a0b57806372d8edf414610a2057806375829def14610a4057806375f0a87414610a6057806377a3b60914610a805780637928dd1d14610a9657600080fd5b806364b0f65314610956578063679ca6e91461096b5780636843cd841461098b5780636d48467b146109ab578063700bb191146109cb57806370a08231146109eb57600080fd5b80634fbee193116103985780634fbee193146108915780635124f874146108ca5780635a84c5eb146108e05780635c234bb6146109005780635ebf4db9146109165780635eee4bae1461093657600080fd5b806349bd5a5e146108075780634a62bb65146108275780634a74bb02146108415780634ada218b1461085b5780634e71d92d1461087c57600080fd5b806321cbb02411610478578063313ce56711610431578063313ce567146107485780633599bb171461076457806339509351146107845780633f407b84146107a457806340ffdd80146107ba578063435c89e4146107da57600080fd5b806321cbb0241461068e5780632307b441146106be57806323b872dd146106de57806325cd3598146106fe5780632c1f52161461071357806330bb4cff1461073357600080fd5b8063095ea7b3116104ca578063095ea7b3146105d35780630ef35b7e146106035780631694505e1461062357806318160ddd146106435780631d7b1fb4146106625780631fa705311461067857600080fd5b806303fd2a451461051257806305ca5f081461054f57806306fdde031461057157806308dfe8a51461059357806309231602146105b357600080fd5b3661050d57005b600080fd5b34801561051e57600080fd5b50600854610532906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561055b57600080fd5b5061056f61056a36600461443b565b6110b3565b005b34801561057d57600080fd5b50610586611184565b6040516105469190614454565b34801561059f57600080fd5b5061056f6105ae3660046144cc565b611216565b3480156105bf57600080fd5b5061056f6105ce36600461443b565b61129f565b3480156105df57600080fd5b506105f36105ee366004614505565b61132e565b6040519015158152602001610546565b34801561060f57600080fd5b5061056f61061e366004614531565b611345565b34801561062f57600080fd5b50600654610532906001600160a01b031681565b34801561064f57600080fd5b506002545b604051908152602001610546565b34801561066e57600080fd5b50610654602a5481565b34801561068457600080fd5b50610654600a5481565b34801561069a57600080fd5b506105f36106a9366004614553565b602c6020526000908152604090205460ff1681565b3480156106ca57600080fd5b5061056f6106d9366004614646565b61142a565b3480156106ea57600080fd5b506105f36106f9366004614708565b6115fb565b34801561070a57600080fd5b50610532611664565b34801561071f57600080fd5b50600d54610532906001600160a01b031681565b34801561073f57600080fd5b506106546116d7565b34801561075457600080fd5b5060405160128152602001610546565b34801561077057600080fd5b5061056f61077f366004614749565b611745565b34801561079057600080fd5b506105f361079f366004614505565b6117d2565b3480156107b057600080fd5b5061065460095481565b3480156107c657600080fd5b5061056f6107d5366004614749565b611808565b3480156107e657600080fd5b506106546107f536600461443b565b60236020526000908152604090205481565b34801561081357600080fd5b50600754610532906001600160a01b031681565b34801561083357600080fd5b506025546105f39060ff1681565b34801561084d57600080fd5b50601d546105f39060ff1681565b34801561086757600080fd5b506008546105f390600160b01b900460ff1681565b34801561088857600080fd5b5061056f611863565b34801561089d57600080fd5b506105f36108ac366004614553565b6001600160a01b03166000908152601f602052604090205460ff1690565b3480156108d657600080fd5b5061065460175481565b3480156108ec57600080fd5b5061056f6108fb36600461443b565b6118db565b34801561090c57600080fd5b5061065460165481565b34801561092257600080fd5b5061056f61093136600461443b565b611936565b34801561094257600080fd5b5061056f61095136600461443b565b611991565b34801561096257600080fd5b506106546119d3565b34801561097757600080fd5b5061056f610986366004614749565b611a1d565b34801561099757600080fd5b506106546109a6366004614553565b611a5a565b3480156109b757600080fd5b506105f36109c6366004614553565b611aca565b3480156109d757600080fd5b5061056f6109e636600461443b565b611b3a565b3480156109f757600080fd5b50610654610a06366004614553565b611c0c565b348015610a1757600080fd5b5061056f611c27565b348015610a2c57600080fd5b5061056f610a3b366004614553565b611c9b565b348015610a4c57600080fd5b5061056f610a5b366004614553565b611cf7565b348015610a6c57600080fd5b50600e54610532906001600160a01b031681565b348015610a8c57600080fd5b5061065460195481565b348015610aa257600080fd5b50602b546105f39060ff1681565b348015610abc57600080fd5b50610654610acb366004614553565b60226020526000908152604090205481565b348015610ae957600080fd5b5061056f610af83660046144cc565b611dac565b348015610b0957600080fd5b5061056f610b18366004614766565b611e01565b348015610b2957600080fd5b5061056f610b3836600461443b565b611fac565b348015610b4957600080fd5b5061056f610b58366004614749565b612063565b348015610b6957600080fd5b5061056f610b7836600461443b565b61209b565b348015610b8957600080fd5b5061065460135481565b348015610b9f57600080fd5b506005546001600160a01b0316610532565b348015610bbd57600080fd5b50600f54610532906001600160a01b031681565b348015610bdd57600080fd5b5061065460145481565b348015610bf357600080fd5b50610586612117565b348015610c0857600080fd5b5061056f610c173660046144cc565b612126565b348015610c2857600080fd5b50610654601e5481565b348015610c3e57600080fd5b5061056f610c4d366004614749565b61215e565b348015610c5e57600080fd5b50610654601a5481565b348015610c7457600080fd5b5061056f610c83366004614749565b6121ba565b348015610c9457600080fd5b5061056f610ca3366004614553565b612250565b348015610cb457600080fd5b50610654601b5481565b348015610cca57600080fd5b506105f3610cd9366004614505565b612327565b348015610cea57600080fd5b5061056f610cf936600461443b565b612376565b348015610d0a57600080fd5b50610654610d19366004614553565b612599565b348015610d2a57600080fd5b506105f3610d39366004614505565b6125cc565b348015610d4a57600080fd5b5061056f610d593660046144cc565b6125d9565b348015610d6a57600080fd5b50610da1610d79366004614553565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b60408051928352602083019190915201610546565b348015610dc257600080fd5b50610654601c5481565b348015610dd857600080fd5b50610dec610de7366004614553565b61262e565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610546565b348015610e2f57600080fd5b5061065460295481565b348015610e4557600080fd5b506105f3610e54366004614553565b602080526000908152604090205460ff1681565b348015610e7457600080fd5b5061056f610e8336600461443b565b6126be565b348015610e9457600080fd5b506105f3610ea3366004614553565b61274e565b348015610eb457600080fd5b5061065460125481565b348015610eca57600080fd5b5061056f610ed9366004614553565b612781565b348015610eea57600080fd5b5061056f610ef9366004614749565b612876565b348015610f0a57600080fd5b5061056f6128f8565b348015610f1f57600080fd5b5061056f610f2e366004614553565b612941565b348015610f3f57600080fd5b50610654610f4e3660046147ce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f8557600080fd5b5061065460115481565b348015610f9b57600080fd5b50610654612a04565b348015610fb057600080fd5b5061065460185481565b348015610fc657600080fd5b50610654610fd5366004614553565b60216020526000908152604090205481565b348015610ff357600080fd5b50610dec61100236600461443b565b612a4e565b34801561101357600080fd5b5061056f611022366004614553565b612a8c565b34801561103357600080fd5b5061056f611042366004614749565b612b77565b34801561105357600080fd5b5061065460155481565b34801561106957600080fd5b5061056f611078366004614553565b612baf565b34801561108957600080fd5b5061065460105481565b34801561109f57600080fd5b5061056f6110ae36600461443b565b612cdc565b6005546001600160a01b031633146110e65760405162461bcd60e51b81526004016110dd906147fc565b60405180910390fd5b6110f881670de0b6b3a7640000614847565b90506000611113600954600a54612d9190919063ffffffff16565b9050600061113682611130600a5486612df790919063ffffffff16565b90612e79565b905060006111538361113060095487612df790919063ffffffff16565b905061115e84612ebb565b600a5461116b90836131bb565b600a5560095461117b90826131bb565b60095550505050565b60606003805461119390614866565b80601f01602080910402602001604051908101604052809291908181526020018280546111bf90614866565b801561120c5780601f106111e15761010080835404028352916020019161120c565b820191906000526020600020905b8154815290600101906020018083116111ef57829003601f168201915b5050505050905090565b6005546001600160a01b031633146112405760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146112c95760405162461bcd60e51b81526004016110dd906147fc565b600581101561131a5760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f772035000000000000000060448201526064016110dd565b61132881633b9aca00614847565b60265550565b600061133b3384846131fd565b5060015b92915050565b6005546001600160a01b0316331461136f5760405162461bcd60e51b81526004016110dd906147fc565b60008281526023602052604090205481900361138a57600080fd5b60648111156113db5760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e27742065786365656420313030000060448201526064016110dd565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b031633146114545760405162461bcd60e51b81526004016110dd906147fc565b80518251146114a55760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e677468000060448201526064016110dd565b60c8825111156115025760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b60648201526084016110dd565b60005b82518110156115f6576000838281518110611522576115226148a0565b602002602001015190506000838381518110611540576115406148a0565b6020026020010151670de0b6b3a764000061155b9190614847565b9050611568338383613322565b600d546001600160a01b031663e30443bc8361158381611c0c565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156115c957600080fd5b505af11580156115dd573d6000803e3d6000fd5b50505050505080806115ee906148b6565b915050611505565b505050565b600061160884848461342b565b61165a843361165585604051806060016040528060288152602001614b14602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190613f90565b6131fd565b5060019392505050565b600d54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d291906148cf565b905090565b600d54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d291906148ec565b6005546001600160a01b0316331461176f5760405162461bcd60e51b81526004016110dd906147fc565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161133b9185906116559086612d91565b6005546001600160a01b031633146118325760405162461bcd60e51b81526004016110dd906147fc565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd809060240161179d565b600d5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af11580156118b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d89190614905565b50565b6005546001600160a01b031633146119055760405162461bcd60e51b81526004016110dd906147fc565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb9060240161179d565b6005546001600160a01b031633146119605760405162461bcd60e51b81526004016110dd906147fc565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db99060240161179d565b6005546001600160a01b031633146119bb5760405162461bcd60e51b81526004016110dd906147fc565b6119cd81670de0b6b3a7640000614847565b60115550565b600d54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611721573d6000803e3d6000fd5b6005546001600160a01b03163314611a475760405162461bcd60e51b81526004016110dd906147fc565b6025805460ff1916911515919091179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f91906148ec565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611b16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190614905565b600d546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611b8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb19190614922565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611c515760405162461bcd60e51b81526004016110dd906147fc565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314611cc55760405162461bcd60e51b81526004016110dd906147fc565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db09060240161179d565b6005546001600160a01b03163314611d215760405162461bcd60e51b81526004016110dd906147fc565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015611d6857600080fd5b505af1158015611d7c573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff19166001179055506118d881612a8c565b6005546001600160a01b03163314611dd65760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611e2b5760405162461bcd60e51b81526004016110dd906147fc565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b819055611e7381611e6d8981878a612d91565b90612d91565b600b81905550611e9c601a54611e6d601754611e6d601854601954612d9190919063ffffffff16565b600c55600b54602310801590611eb557506023600c5411155b611f135760405162461bcd60e51b815260206004820152602960248201527f746f74616c20666565732063616e6e6f742065786365656420333520252073656044820152686c6c206f722062757960b81b60648201526084016110dd565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b03163314611fd65760405162461bcd60e51b81526004016110dd906147fc565b60058111156120275760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f742065786365656420352500000060448201526064016110dd565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d6399060440161179d565b6005546001600160a01b031633146120c55760405162461bcd60e51b81526004016110dd906147fc565b62030d4081101580156120db5750620f42408111155b6120e457600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b60606004805461119390614866565b6005546001600160a01b031633146121505760405162461bcd60e51b81526004016110dd906147fc565b61215a8282613fca565b5050565b6005546001600160a01b031633146121885760405162461bcd60e51b81526004016110dd906147fc565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea9060240161179d565b6005546001600160a01b031633146121e45760405162461bcd60e51b81526004016110dd906147fc565b801515600860159054906101000a900460ff1615150361220357600080fd5b60088054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a879061205890831515815260200190565b6005546001600160a01b0316331461227a5760405162461bcd60e51b81526004016110dd906147fc565b600d54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b1580156122c157600080fd5b505af11580156122d5573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050826122f681614092565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440161179d565b600061133b338461165585604051806060016040528060258152602001614b3c602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190613f90565b600854600160a81b900460ff166123c85760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60448201526064016110dd565b60008181526023602052604081205490036124255760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e000000000000000060448201526064016110dd565b61242f4282612d91565b33600090815260226020526040902054106124985760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b60648201526084016110dd565b6000818152602360209081526040808320543384526021909252909120556124c04282612d91565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc906124ef81614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561253557600080fd5b505af1158015612549573d6000803e3d6000fd5b505050506125543390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c88260405161258e91815260200190565b60405180910390a250565b600d546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611a89565b600061133b33848461342b565b6005546001600160a01b031633146126035760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b03919091166000908152602c60205260409020805460ff1916911515919091179055565b600d5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015612686573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126aa9190614950565b949c939b5091995097509550909350915050565b6005546001600160a01b031633146126e85760405162461bcd60e51b81526004016110dd906147fc565b61012c8111156127495760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b60648201526084016110dd565b602a55565b600d5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611af9565b6005546001600160a01b031633146127ab5760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b15801561282457600080fd5b505af1158015612838573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050612058565b6005546001600160a01b031633146128a05760405162461bcd60e51b81526004016110dd906147fc565b601d5481151560ff9091161515036128b757600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef90602001612058565b6005546001600160a01b031633146129225760405162461bcd60e51b81526004016110dd906147fc565b602b5460ff161561293257600080fd5b602b805460ff19166001179055565b6005546001600160a01b0316331461296b5760405162461bcd60e51b81526004016110dd906147fc565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b1580156129b257600080fd5b505af11580156129c6573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050612058565b600d546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611721573d6000803e3d6000fd5b600d54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612669565b6005546001600160a01b03163314612ab65760405162461bcd60e51b81526004016110dd906147fc565b6001600160a01b038116612b1b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110dd565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a049060440161179d565b6005546001600160a01b03163314612bd95760405162461bcd60e51b81526004016110dd906147fc565b602b8054610100600160a81b0319166101006001600160a01b0384169081029190911790915515612c99576001600160a01b038181166000818152602c602090815260408083208054600160ff199182168117909255601f9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015612c8057600080fd5b505af1158015612c94573d6000803e3d6000fd5b505050505b436029556008805460ff60b01b1916600160b01b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6005546001600160a01b03163314612d065760405162461bcd60e51b81526004016110dd906147fc565b612d1881670de0b6b3a7640000614847565b90506103e8600254612d2a91906149a3565b811015612d8c5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b60648201526084016110dd565b601055565b600080612d9e83856149c5565b905083811015612df05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016110dd565b9392505050565b600082600003612e095750600061133f565b6000612e158385614847565b905082612e2285836149a3565b14612df05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016110dd565b6000612df083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506140eb565b80600003612ec65750565b612ecf81614119565b6000612ee8600954600a54612d9190919063ffffffff16565b601954909150600190819081906000908190819015612f4957612f46601a54601754601954612f1791906149c5565b612f2191906149c5565b611130601954612f408b611130600a5447612df790919063ffffffff16565b90612df7565b91505b60125415612f9357612f90601b54601454601254612f6791906149c5565b612f7191906149c5565b611130601254612f408b61113060095447612df790919063ffffffff16565b90505b612f9d8282612d91565b92508215612ffd57600d546040516001600160a01b03909116908490600081818185875af1925050503d8060008114612ff2576040519150601f19603f3d011682016040523d82523d6000602084013e612ff7565b606091505b50909650505b6000613016601a54601754612d9190919063ffffffff16565b601b5460145461302591612d91565b61302f91906149c5565b905060008115613046576130434783612e79565b90505b600081613060601454601754612d9190919063ffffffff16565b61306a9190614847565b9050600082613086601b54601a54612d9190919063ffffffff16565b6130909190614847565b905081156130f057600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146130e5576040519150601f19603f3d011682016040523d82523d6000602084013e6130ea565b606091505b50909950505b801561314e57600f546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613143576040519150601f19603f3d011682016040523d82523d6000602084013e613148565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd08761317a83856149c5565b8c801561318457508b5b801561318d57508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b6000612df083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613f90565b6001600160a01b03831661325f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016110dd565b6001600160a01b0382166132c05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016110dd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166133485760405162461bcd60e51b81526004016110dd906149dd565b6001600160a01b03821661336e5760405162461bcd60e51b81526004016110dd90614a22565b6133ab81604051806060016040528060268152602001614aee602691396001600160a01b0386166000908152602081905260409020549190613f90565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546133da9082612d91565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613315565b6001600160a01b0383166134515760405162461bcd60e51b81526004016110dd906149dd565b6001600160a01b0382166134775760405162461bcd60e51b81526004016110dd90614a22565b6001600160a01b038316600090815260246020526040812054819081908190819060ff166134f857600854600160b01b900460ff166134f85760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c656460448201526064016110dd565b602b5460ff1615801561351a5750602b5461010090046001600160a01b031615155b156135b1576135298888614273565b158061354d57506001600160a01b0388166000908152602c602052604090205460ff165b8061357057506001600160a01b0387166000908152602c602052604090205460ff165b6135b15760405162461bcd60e51b815260206004820152601260248201527121617661696c61626c652074726164696e6760701b60448201526064016110dd565b856000036135cf576135c588886000613322565b5050505050505050565b600854600160a01b900460ff1615801561360257506001600160a01b0388166000908152601f602052604090205460ff16155b801561362757506001600160a01b0387166000908152601f602052604090205460ff16155b15613dc1576001600160a01b03808816600090815260208052604080822054928b16825290205460ff918216911680158015613661575081155b156137a75760006136826064611130601c548c612df790919063ffffffff16565b905061368e89826131bb565b985061369b8b3083613322565b6136a68b8b8b613322565b600d546001600160a01b031663e30443bc8c6136c181614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561370757600080fd5b505af115801561371b573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b61373c81614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561378257600080fd5b505af1158015613796573d6000803e3d6000fd5b505050505050505050505050505050565b801580156137be5750600854600160a81b900460ff165b15613875576001600160a01b038a1660009081526022602052604090205442101561382b5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b65642100000060448201526064016110dd565b6001600160a01b038a1660009081526022602052604090205415613870576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b613ace565b811561391e57601254601354601454601554601b54602554949b509299509097509550935060ff161561387057602a54326000908152602860205260409020546138bf91906149c5565b4210156139075760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b60448201526064016110dd565b326000908152602860205260409020429055613ace565b8015613ace57601954601654601754601854601a54602554949b509299509097509550935060ff1615613a57576029546139599060016149c5565b431161399c5760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b60448201526064016110dd565b6026543a11156139ee5760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e000000000000000060448201526064016110dd565b32600090815260276020526040902054439003613a445760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b60448201526064016110dd565b3260009081526027602052604090204390555b6000613a628a611c0c565b601054909150613a728a836149c5565b1115613acc5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b60648201526084016110dd565b505b6000613aef84613ade88886149c5565b613ae891906149c5565b8990612d91565b90506000613afc30611c0c565b60115490915081108015908190613b2b57506001600160a01b038d16600090815260208052604090205460ff16155b15613c44576008805460ff60a01b1916600160a01b179055601d5460ff168015613b555750600087115b8015613b6357506000600c54115b15613c15576000613b81600954600a54612d9190919063ffffffff16565b90506000613b9e82611130600a5487612df790919063ffffffff16565b90506000613bbb8361113060095488612df790919063ffffffff16565b90506000613bd8600c546111308d86612df790919063ffffffff16565b90506000613bf5600b546111308e86612df790919063ffffffff16565b90506000613c038284612d91565b9050613c0e816142e6565b5050505050505b6000613c2030611c0c565b9050613c2b81612ebb565b506000600a8190556009556008805460ff60a01b191690555b6000613c5560646111308e87612df7565b905060008a15613ca8576064613c6b8e8d612df7565b613c7591906149a3565b9050613c978f600860009054906101000a90046001600160a01b031683613322565b600254613ca490826131bb565b6002555b613cbc613cb582846149c5565b8e906131bb565b9c508615613cd957600954613cd19083612d91565b600955613cea565b600a54613ce69083612d91565b600a555b613cf58f3084613322565b601e54600d546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613d62575060408051601f3d908101601f19168201909252613d5f91810190614922565b60015b15613db85760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b613dcc888888613322565b600d546001600160a01b031663e30443bc89613de781614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613e2d57600080fd5b505af1158015613e41573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc905088613e6281614092565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ea857600080fd5b505af1158015613ebc573d6000803e3d6000fd5b50506006546001600160a01b038b8116911614801592509050613ef757506001600160a01b038816600090815260208052604090205460ff16155b8015613f155750602b546001600160a01b0388811661010090920416145b156135c557602b54604051633fb6b04560e11b8152600481018890526001600160a01b038a8116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b158015613f6e57600080fd5b505af1158015613f82573d6000803e3d6000fd5b505050505050505050505050565b60008184841115613fb45760405162461bcd60e51b81526004016110dd9190614454565b506000613fc18486614a65565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff1916821580159190911790915561405657600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561403d57600080fd5b505af1158015614051573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff166140b4576140af82611c0c565b61133f565b6001600160a01b03821660009081526021602052604090205461133f90606490611130906140e29083612d91565b612f4086611c0c565b6000818361410c5760405162461bcd60e51b81526004016110dd9190614454565b506000613fc184866149a3565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061414e5761414e6148a0565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156141a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141cb91906148cf565b816001815181106141de576141de6148a0565b6001600160a01b03928316602091820292909201015260065461420491309116846131fd565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061423d908590600090869030904290600401614a7c565b600060405180830381600087803b15801561425757600080fd5b505af115801561426b573d6000803e3d6000fd5b505050505050565b6001600160a01b038216600090815260208052604081205460ff1680156142a857506006546001600160a01b03838116911614155b156142b55750600161133f565b6001600160a01b038216600090815260208052604090205460ff16156142dd5750600261133f565b50600092915050565b60006142f3826002612e79565b9050600061430183836131bb565b90504761430d83614119565b600061431947836131bb565b9050614325838261436d565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6006546143859030906001600160a01b0316846131fd565b6006546001600160a01b031663f305d7198230856000806143ae6005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015614416573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117cb9190614922565b60006020828403121561444d57600080fd5b5035919050565b600060208083528351808285015260005b8181101561448157858101830151858201604001528201614465565b81811115614493576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146118d857600080fd5b80151581146118d857600080fd5b600080604083850312156144df57600080fd5b82356144ea816144a9565b915060208301356144fa816144be565b809150509250929050565b6000806040838503121561451857600080fd5b8235614523816144a9565b946020939093013593505050565b6000806040838503121561454457600080fd5b50508035926020909101359150565b60006020828403121561456557600080fd5b8135612df0816144a9565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156145af576145af614570565b604052919050565b600067ffffffffffffffff8211156145d1576145d1614570565b5060051b60200190565b600082601f8301126145ec57600080fd5b813560206146016145fc836145b7565b614586565b82815260059290921b8401810191818101908684111561462057600080fd5b8286015b8481101561463b5780358352918301918301614624565b509695505050505050565b6000806040838503121561465957600080fd5b823567ffffffffffffffff8082111561467157600080fd5b818501915085601f83011261468557600080fd5b813560206146956145fc836145b7565b82815260059290921b840181019181810190898411156146b457600080fd5b948201945b838610156146db5785356146cc816144a9565b825294820194908201906146b9565b965050860135925050808211156146f157600080fd5b506146fe858286016145db565b9150509250929050565b60008060006060848603121561471d57600080fd5b8335614728816144a9565b92506020840135614738816144a9565b929592945050506040919091013590565b60006020828403121561475b57600080fd5b8135612df0816144be565b6000806000806000806000806000806101408b8d03121561478657600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156147e157600080fd5b82356147ec816144a9565b915060208301356144fa816144a9565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561486157614861614831565b500290565b600181811c9082168061487a57607f821691505b60208210810361489a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016148c8576148c8614831565b5060010190565b6000602082840312156148e157600080fd5b8151612df0816144a9565b6000602082840312156148fe57600080fd5b5051919050565b60006020828403121561491757600080fd5b8151612df0816144be565b60008060006060848603121561493757600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561496957600080fd5b8651614974816144a9565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000826149c057634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156149d8576149d8614831565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082821015614a7757614a77614831565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015614acc5784516001600160a01b031683529383019391830191600101614aa7565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206ce79d07bcbe4b8554239534f5e10ae6f53363ea977dbfc11a36c1db8692709864736f6c634300080f0033

Deployed Bytecode Sourcemap

28168:29383:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28330:64;;;;;;;;;;-1:-1:-1;28330:64:0;;;;-1:-1:-1;;;;;28330:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;28330:64:0;;;;;;;;54457:443;;;;;;;;;;-1:-1:-1;54457:443:0;;;;;:::i;:::-;;:::i;:::-;;8341:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36701:181::-;;;;;;;;;;-1:-1:-1;36701:181:0;;;;;:::i;:::-;;:::i;37696:164::-;;;;;;;;;;-1:-1:-1;37696:164:0;;;;;:::i;:::-;;:::i;9396:210::-;;;;;;;;;;-1:-1:-1;9396:210:0;;;;;:::i;:::-;;:::i;:::-;;;2140:14:1;;2133:22;2115:41;;2103:2;2088:18;9396:210:0;1975:187:1;34901:326:0;;;;;;;;;;-1:-1:-1;34901:326:0;;;;;:::i;:::-;;:::i;28245:41::-;;;;;;;;;;-1:-1:-1;28245:41:0;;;;-1:-1:-1;;;;;28245:41:0;;;8662:108;;;;;;;;;;-1:-1:-1;8750:12:0;;8662:108;;;2801:25:1;;;2789:2;2774:18;8662:108:0;2655:177:1;30391:33:0;;;;;;;;;;;;;;;;28550:28;;;;;;;;;;;;;;;;30520:55;;;;;;;;;;-1:-1:-1;30520:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56911:637;;;;;;;;;;-1:-1:-1;56911:637:0;;;;;:::i;:::-;;:::i;9614:454::-;;;;;;;;;;-1:-1:-1;9614:454:0;;;;;:::i;:::-;;:::i;53440:114::-;;;;;;;;;;;;;:::i;28660:45::-;;;;;;;;;;-1:-1:-1;28660:45:0;;;;-1:-1:-1;;;;;28660:45:0;;;42710:141;;;;;;;;;;;;;:::i;34763:93::-;;;;;;;;;;-1:-1:-1;34763:93:0;;34846:2;6426:36:1;;6414:2;6399:18;34763:93:0;6284:184:1;45053:119:0;;;;;;;;;;-1:-1:-1;45053:119:0;;;;;:::i;:::-;;:::i;10076:300::-;;;;;;;;;;-1:-1:-1;10076:300:0;;;;;:::i;:::-;;:::i;28514:29::-;;;;;;;;;;;;;;;;39950:121;;;;;;;;;;-1:-1:-1;39950:121:0;;;;;:::i;:::-;;:::i;29778:49::-;;;;;;;;;;-1:-1:-1;29778:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;28295:28;;;;;;;;;;-1:-1:-1;28295:28:0;;;;-1:-1:-1;;;;;28295:28:0;;;30040:33;;;;;;;;;;-1:-1:-1;30040:33:0;;;;;;;;29312:40;;;;;;;;;;-1:-1:-1;29312:40:0;;;;;;;;28471:34;;;;;;;;;;-1:-1:-1;28471:34:0;;;;-1:-1:-1;;;28471:34:0;;;;;;44422:103;;;;;;;;;;;;;:::i;42859:126::-;;;;;;;;;;-1:-1:-1;42859:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;42949:28:0;42925:4;42949:28;;;:19;:28;;;;;;;;;42859:126;29104:31;;;;;;;;;;;;;;;;53562:183;;;;;;;;;;-1:-1:-1;53562:183:0;;;;;:::i;:::-;;:::i;29071:26::-;;;;;;;;;;;;;;;;53753:175;;;;;;;;;;-1:-1:-1;53753:175:0;;;;;:::i;:::-;;:::i;39306:120::-;;;;;;;;;;-1:-1:-1;39306:120:0;;;;;:::i;:::-;;:::i;44671:142::-;;;;;;;;;;;;;:::i;37568:99::-;;;;;;;;;;-1:-1:-1;37568:99:0;;;;;:::i;:::-;;:::i;43185:171::-;;;;;;;;;;-1:-1:-1;43185:171:0;;;;;:::i;:::-;;:::i;45180:185::-;;;;;;;;;;-1:-1:-1;45180:185:0;;;;;:::i;:::-;;:::i;44004:410::-;;;;;;;;;;-1:-1:-1;44004:410:0;;;;;:::i;:::-;;:::i;8778:177::-;;;;;;;;;;-1:-1:-1;8778:177:0;;;;;:::i;:::-;;:::i;15755:148::-;;;;;;;;;;;;;:::i;36931:127::-;;;;;;;;;;-1:-1:-1;36931:127:0;;;;;:::i;:::-;;:::i;40616:208::-;;;;;;;;;;-1:-1:-1;40616:208:0;;;;;:::i;:::-;;:::i;28714:38::-;;;;;;;;;;-1:-1:-1;28714:38:0;;;;-1:-1:-1;;;;;28714:38:0;;;29179:28;;;;;;;;;;;;;;;;30456:32;;;;;;;;;;-1:-1:-1;30456:32:0;;;;;;;;29720:51;;;;;;;;;;-1:-1:-1;29720:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;37359:170;;;;;;;;;;-1:-1:-1;37359:170:0;;;;;:::i;:::-;;:::i;41074:1430::-;;;;;;;;;;-1:-1:-1;41074:1430:0;;;;;:::i;:::-;;:::i;40832:234::-;;;;;;;;;;-1:-1:-1;40832:234:0;;;;;:::i;:::-;;:::i;44821:109::-;;;;;;;;;;-1:-1:-1;44821:109:0;;;;;:::i;:::-;;:::i;40367:241::-;;;;;;;;;;-1:-1:-1;40367:241:0;;;;;:::i;:::-;;:::i;28960:27::-;;;;;;;;;;;;;;;;15541:79;;;;;;;;;;-1:-1:-1;15606:6:0;;-1:-1:-1;;;;;15606:6:0;15541:79;;28759:32;;;;;;;;;;-1:-1:-1;28759:32:0;;;;-1:-1:-1;;;;;28759:32:0;;;28994;;;;;;;;;;;;;;;;8449:104;;;;;;;;;;;;;:::i;39650:163::-;;;;;;;;;;-1:-1:-1;39650:163:0;;;;;:::i;:::-;;:::i;29410:41::-;;;;;;;;;;;;;;;;39821:121;;;;;;;;;;-1:-1:-1;39821:121:0;;;;;:::i;:::-;;:::i;29214:24::-;;;;;;;;;;;;;;;;38426:176;;;;;;;;;;-1:-1:-1;38426:176:0;;;;;:::i;:::-;;:::i;37096:201::-;;;;;;;;;;-1:-1:-1;37096:201:0;;;;;:::i;:::-;;:::i;29245:25::-;;;;;;;;;;;;;;;;10384:400;;;;;;;;;;-1:-1:-1;10384:400:0;;;;;:::i;:::-;;:::i;38610:662::-;;;;;;;;;;-1:-1:-1;38610:662:0;;;;;:::i;:::-;;:::i;42993:184::-;;;;;;;;;;-1:-1:-1;42993:184:0;;;;;:::i;:::-;;:::i;8963:216::-;;;;;;;;;;-1:-1:-1;8963:216:0;;;;;:::i;:::-;;:::i;35578:143::-;;;;;;;;;;-1:-1:-1;35578:143:0;;;;;:::i;:::-;;:::i;42512:190::-;;;;;;;;;;-1:-1:-1;42512:190:0;;;;;:::i;:::-;-1:-1:-1;;;;;42645:25:0;42603:7;42645:25;;;:16;:25;;;;;;;;;42672:12;:21;;;;;;;42645:25;;42512:190;;;;;7921:25:1;;;7977:2;7962:18;;7955:34;;;;7894:18;42512:190:0;7747:248:1;29277:26:0;;;;;;;;;;;;;;;;43364:307;;;;;;;;;;-1:-1:-1;43364:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8301:32:1;;;8283:51;;8365:2;8350:18;;8343:34;;;;8393:18;;;8386:34;;;;8451:2;8436:18;;8429:34;8494:3;8479:19;;8472:35;8321:3;8523:19;;8516:35;8270:3;8255:19;43364:307:0;8000:557:1;30358:26:0;;;;;;;;;;;;;;;;29574:57;;;;;;;;;;-1:-1:-1;29574:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37947:174;;;;;;;;;;-1:-1:-1;37947:174:0;;;;;:::i;:::-;;:::i;45373:127::-;;;;;;;;;;-1:-1:-1;45373:127:0;;;;;:::i;:::-;;:::i;28924:29::-;;;;;;;;;;;;;;;;36385:268;;;;;;;;;;-1:-1:-1;36385:268:0;;;;;:::i;:::-;;:::i;39434:208::-;;;;;;;;;;-1:-1:-1;39434:208:0;;;;;:::i;:::-;;:::i;35737:146::-;;;;;;;;;;;;;:::i;53274:158::-;;;;;;;;;;-1:-1:-1;53274:158:0;;;;;:::i;:::-;;:::i;9187:201::-;;;;;;;;;;-1:-1:-1;9187:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;9353:18:0;;;9321:7;9353:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9187:201;28884:33;;;;;;;;;;;;;;;;44533:130;;;;;;;;;;;;;:::i;29142:30::-;;;;;;;;;;;;;;;;29666:47;;;;;;;;;;-1:-1:-1;29666:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;43679:317;;;;;;;;;;-1:-1:-1;43679:317:0;;;;;:::i;:::-;;:::i;15911:281::-;;;;;;;;;;-1:-1:-1;15911:281:0;;;;;:::i;:::-;;:::i;44938:107::-;;;;;;;;;;-1:-1:-1;44938:107:0;;;;;:::i;:::-;;:::i;29033:31::-;;;;;;;;;;;;;;;;35899:415;;;;;;;;;;-1:-1:-1;35899:415:0;;;;;:::i;:::-;;:::i;28853:24::-;;;;;;;;;;;;;;;;38191:221;;;;;;;;;;-1:-1:-1;38191:221:0;;;;;:::i;:::-;;:::i;54457:443::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;;;;;;;;;54545:17:::1;:6:::0;54555::::1;54545:17;:::i;:::-;54536:26;;54573:19;54595:25;54609:10;;54595:9;;:13;;:25;;;;:::i;:::-;54573:47;;54631:15;54649:38;54675:11;54649:21;54660:9;;54649:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;54631:56;;54698:16;54717:39;54744:11;54717:22;54728:10;;54717:6;:10;;:22;;;;:::i;:39::-;54698:58;;54769:28;54790:6;54769:20;:28::i;:::-;54822:9;::::0;:22:::1;::::0;54836:7;54822:13:::1;:22::i;:::-;54810:9;:34:::0;54868:10:::1;::::0;:24:::1;::::0;54883:8;54868:14:::1;:24::i;:::-;54855:10;:37:::0;-1:-1:-1;;;;54457:443:0:o;8341:100::-;8395:13;8428:5;8421:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8341:100;:::o;36701:181::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36785:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;36785:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;36840:34;;2115:41:1;;;36840:34:0::1;::::0;2088:18:1;36840:34:0::1;;;;;;;36701:181:::0;;:::o;37696:164::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;37782:1:::1;37774:4;:9;;37766:46;;;::::0;-1:-1:-1;;;37766:46:0;;10208:2:1;37766:46:0::1;::::0;::::1;10190:21:1::0;10247:2;10227:18;;;10220:30;10286:26;10266:18;;;10259:54;10330:18;;37766:46:0::1;10006:348:1::0;37766:46:0::1;37839:13;:4:::0;37846:6:::1;37839:13;:::i;:::-;37823;:29:::0;-1:-1:-1;37696:164:0:o;9396:210::-;9515:4;9537:39;2927:10;9560:7;9569:6;9537:8;:39::i;:::-;-1:-1:-1;9594:4:0;9396:210;;;;;:::o;34901:326::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;35023:24:::1;::::0;;;:14:::1;:24;::::0;;;;;:33;;;35015:42:::1;;;::::0;::::1;;35085:3;35076:5;:12;;35068:55;;;::::0;-1:-1:-1;;;35068:55:0;;10561:2:1;35068:55:0::1;::::0;::::1;10543:21:1::0;10600:2;10580:18;;;10573:30;10639:32;10619:18;;;10612:60;10689:18;;35068:55:0::1;10359:354:1::0;35068:55:0::1;35134:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:32;;;35182:37;;7921:25:1;;;7962:18;;;7955:34;;;35182:37:0::1;::::0;7894:18:1;35182:37:0::1;;;;;;;34901:326:::0;;:::o;56911:637::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;57083:6:::1;:13;57058:14;:21;:38;57050:80;;;::::0;-1:-1:-1;;;57050:80:0;;10920:2:1;57050:80:0::1;::::0;::::1;10902:21:1::0;10959:2;10939:18;;;10932:30;10998:32;10978:18;;;10971:60;11048:18;;57050:80:0::1;10718:354:1::0;57050:80:0::1;57174:3;57149:14;:21;:28;;57141:75;;;::::0;-1:-1:-1;;;57141:75:0;;11279:2:1;57141:75:0::1;::::0;::::1;11261:21:1::0;11318:2;11298:18;;;11291:30;11357:34;11337:18;;;11330:62;-1:-1:-1;;;11408:18:1;;;11401:32;11450:19;;57141:75:0::1;11077:398:1::0;57141:75:0::1;57232:9;57227:314;57251:14;:21;57247:1;:25;57227:314;;;57294:14;57311;57326:1;57311:17;;;;;;;;:::i;:::-;;;;;;;57294:34;;57343:21;57367:6;57374:1;57367:9;;;;;;;;:::i;:::-;;;;;;;57380:6;57367:20;;;;:::i;:::-;57343:44;;57402:50;57418:10;57430:6;57438:13;57402:15;:50::i;:::-;57467:15;::::0;-1:-1:-1;;;;;57467:15:0::1;:26;57502:6:::0;57511:17:::1;57502:6:::0;57511:9:::1;:17::i;:::-;57467:62;::::0;-1:-1:-1;;;;;;57467:62:0::1;::::0;;;;;;-1:-1:-1;;;;;11812:32:1;;;57467:62:0::1;::::0;::::1;11794:51:1::0;11861:18;;;11854:34;11767:18;;57467:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57279:262;;57274:3;;;;;:::i;:::-;;;;57227:314;;;;56911:637:::0;;:::o;9614:454::-;9754:4;9771:36;9781:6;9789:9;9800:6;9771:9;:36::i;:::-;9818:220;9841:6;2927:10;9889:138;9945:6;9889:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9889:19:0;;;;;;:11;:19;;;;;;;;2927:10;9889:33;;;;;;;;;;:37;:138::i;:::-;9818:8;:220::i;:::-;-1:-1:-1;10056:4:0;9614:454;;;;;:::o;53440:114::-;53514:15;;:32;;;-1:-1:-1;;;53514:32:0;;;;53487:7;;-1:-1:-1;;;;;53514:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53507:39;;53440:114;:::o;42710:141::-;42800:15;;:43;;;-1:-1:-1;;;42800:43:0;;;;42773:7;;-1:-1:-1;;;;;42800:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45053:119::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;45123:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;45123:41:0;;2140:14:1;;2133:22;45123:41:0::1;::::0;::::1;2115::1::0;-1:-1:-1;;;;;45123:15:0;;::::1;::::0;:34:::1;::::0;2088:18:1;;45123:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45053:119:::0;:::o;10076:300::-;2927:10;10191:4;10285:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10285:34:0;;;;;;;;;;10191:4;;10213:133;;10263:7;;10285:50;;10324:10;10285:38;:50::i;39950:121::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;40020:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;40020:43:0;;2140:14:1;;2133:22;40020:43:0::1;::::0;::::1;2115:41:1::0;-1:-1:-1;;;;;40020:15:0;;::::1;::::0;:36:::1;::::0;2088:18:1;;40020:43:0::1;1975:187:1::0;44422:103:0;44459:15;;:58;;-1:-1:-1;;;44459:58:0;;44498:10;44459:58;;;12668:51:1;44459:15:0;12735:18:1;;;12728:50;-1:-1:-1;;;;;44459:15:0;;;;:30;;12641:18:1;;44459:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44422:103::o;53562:183::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;53676:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;53676:61:0;;::::1;::::0;::::1;2801:25:1::0;;;-1:-1:-1;;;;;53676:15:0;;::::1;::::0;:54:::1;::::0;2774:18:1;;53676:61:0::1;2655:177:1::0;53753:175:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;53863:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;53863:57:0;;::::1;::::0;::::1;2801:25:1::0;;;-1:-1:-1;;;;;53863:15:0;;::::1;::::0;:50:::1;::::0;2774:18:1;;53863:57:0::1;2655:177:1::0;39306:120:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;39401:17:::1;:6:::0;39411::::1;39401:17;:::i;:::-;39380:18;:38:::0;-1:-1:-1;39306:120:0:o;44671:142::-;44764:15;;:41;;;-1:-1:-1;;;44764:41:0;;;;44737:7;;-1:-1:-1;;;;;44764:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;37568:99;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;37637:14:::1;:22:::0;;-1:-1:-1;;37637:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37568:99::o;43185:171::-;43314:15;;:34;;-1:-1:-1;;;43314:34:0;;-1:-1:-1;;;;;178:32:1;;;43314:34:0;;;160:51:1;43282:7:0;;43314:15;;:25;;133:18:1;;43314:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45180:185::-;45309:15;;:48;;-1:-1:-1;;;45309:48:0;;-1:-1:-1;;;;;178:32:1;;;45309:48:0;;;160:51:1;45280:4:0;;45309:15;;:39;;133:18:1;;45309:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44004:410::-;44186:15;;:28;;-1:-1:-1;;;;;;44186:28:0;;;;;2801:25:1;;;44084:18:0;;;;;;-1:-1:-1;;;;;44186:15:0;;:23;;2774:18:1;;44186:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44230:176;;;13581:25:1;;;13637:2;13622:18;;13615:34;;;13665:18;;;13658:34;;;13723:2;13708:18;;13701:34;;;44069:145:0;;-1:-1:-1;44069:145:0;;-1:-1:-1;44069:145:0;-1:-1:-1;44386:9:0;;44348:5;;44230:176;;13568:3:1;13553:19;44230:176:0;;;;;;;44058:356;;;44004:410;:::o;8778:177::-;-1:-1:-1;;;;;8929:18:0;8897:7;8929:18;;;;;;;;;;;;8778:177::o;15755:148::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;15846:6:::1;::::0;15825:40:::1;::::0;15862:1:::1;::::0;-1:-1:-1;;;;;15846:6:0::1;::::0;15825:40:::1;::::0;15862:1;;15825:40:::1;15876:6;:19:::0;;-1:-1:-1;;;;;;15876:19:0::1;::::0;;15755:148::o;36931:127::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;37005:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;37005:45:0;;-1:-1:-1;;;;;178:32:1;;;37005:45:0::1;::::0;::::1;160:51:1::0;37005:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;37005:45:0::1;14:203:1::0;40616:208:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;40685:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;40685:46:0;;-1:-1:-1;;;;;178:32:1;;;40685:46:0::1;::::0;::::1;160:51:1::0;40685:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;40685:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;40742:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;40742:36:0::1;40774:4;40742:36;::::0;;-1:-1:-1;40789:27:0::1;40762:8:::0;40789:17:::1;:27::i;37359:170::-:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37471:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;37471:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37359:170::o;41074:1430::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;41418:11:::1;:21:::0;;;41450:16:::1;:31:::0;;;41492:15:::1;:30:::0;;;41533:13:::1;:26:::0;;;41570:12:::1;:23:::0;;;41604:17:::1;:33:::0;;;41648:16:::1;:32:::0;;;41691:14:::1;:28:::0;;;41730:9:::1;:18:::0;;;41759:10:::1;:20:::0;;;41808:117:::1;41772:7:::0;41808:87:::1;41624:13:::0;41808:87;41708:11;41667:13;41808:32:::1;:50::i;:::-;:68:::0;::::1;:87::i;:117::-;41792:13;:133;;;;41953:113;42056:9;;41953:84;42020:16;;41953:48;41985:15;;41953:13;;:31;;:48;;;;:::i;:113::-;41938:12;:128:::0;42087:13:::1;::::0;42104:2:::1;-1:-1:-1::0;42087:19:0;::::1;::::0;:41:::1;;;42126:2;42110:12;;:18;;42087:41;42079:95;;;::::0;-1:-1:-1;;;42079:95:0;;13948:2:1;42079:95:0::1;::::0;::::1;13930:21:1::0;13987:2;13967:18;;;13960:30;14026:34;14006:18;;;13999:62;-1:-1:-1;;;14077:18:1;;;14070:39;14126:19;;42079:95:0::1;13746:405:1::0;42079:95:0::1;42217:12;::::0;42244:17:::1;::::0;42276:16:::1;::::0;42307:14:::1;::::0;42336:11:::1;::::0;42362:16:::1;::::0;42393:15:::1;::::0;42423:13:::1;::::0;42451:9:::1;::::0;42475:10:::1;::::0;42192:304:::1;::::0;;14555:25:1;;;14611:2;14596:18;;14589:34;;;;14639:18;;;14632:34;;;;14697:2;14682:18;;14675:34;;;;14740:3;14725:19;;14718:35;;;;14784:3;14769:19;;14762:35;14828:3;14813:19;;14806:35;14872:3;14857:19;;14850:35;14916:3;14901:19;;14894:35;14960:3;14945:19;;14938:35;42192:304:0::1;::::0;14542:3:1;14527:19;42192:304:0::1;;;;;;;41074:1430:::0;;;;;;;;;;:::o;40832:234::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;40938:1:::1;40920:14;:19;;40911:62;;;::::0;-1:-1:-1;;;40911:62:0;;15186:2:1;40911:62:0::1;::::0;::::1;15168:21:1::0;15225:2;15205:18;;;15198:30;15264:31;15244:18;;;15237:59;15313:18;;40911:62:0::1;14984:353:1::0;40911:62:0::1;40984:11;:28:::0;;;41028:30:::1;::::0;2801:25:1;;;41028:30:0::1;::::0;2789:2:1;2774:18;41028:30:0::1;;;;;;;;40832:234:::0;:::o;44821:109::-;44875:15;;:47;;-1:-1:-1;;;44875:47:0;;44904:10;44875:47;;;12668:51:1;12762:14;;12755:22;12735:18;;;12728:50;-1:-1:-1;;;;;44875:15:0;;;;:28;;12641:18:1;;44875:47:0;12484:300:1;40367:241:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;40465:6:::1;40453:8;:18;;:41;;;;;40487:7;40475:8;:19;;40453:41;40445:50;;;::::0;::::1;;40545:16;::::0;40511:51:::1;::::0;40535:8;;40511:51:::1;::::0;;;::::1;40573:16;:27:::0;40367:241::o;8449:104::-;8505:13;8538:7;8531:14;;;;;:::i;39650:163::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;39764:41:::1;39793:4;39799:5;39764:28;:41::i;:::-;39650:163:::0;;:::o;39821:121::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;39891:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;39891:43:0;;2140:14:1;;2133:22;39891:43:0::1;::::0;::::1;2115:41:1::0;-1:-1:-1;;;;;39891:15:0;;::::1;::::0;:36:::1;::::0;2088:18:1;;39891:43:0::1;1975:187:1::0;38426:176:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;38516:6:::1;38498:24;;:14;;;;;;;;;;;:24;;::::0;38490:33:::1;;;::::0;::::1;;38534:14;:23:::0;;;::::1;;-1:-1:-1::0;;;38534:23:0::1;-1:-1:-1::0;;;;38534:23:0;;::::1;;::::0;;38573:21:::1;::::0;::::1;::::0;::::1;::::0;38551:6;2140:14:1;2133:22;2115:41;;2103:2;2088:18;;1975:187;37096:201:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;37170:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;37170:45:0;;-1:-1:-1;;;;;178:32:1;;;37170:45:0::1;::::0;::::1;160:51:1::0;37170:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;37170:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37226:15:0::1;::::0;-1:-1:-1;;;;;37226:15:0::1;::::0;-1:-1:-1;37226:26:0::1;::::0;-1:-1:-1;37253:7:0;37262:26:::1;37253:7:::0;37262:17:::1;:26::i;:::-;37226:63;::::0;-1:-1:-1;;;;;;37226:63:0::1;::::0;;;;;;-1:-1:-1;;;;;11812:32:1;;;37226:63:0::1;::::0;::::1;11794:51:1::0;11861:18;;;11854:34;11767:18;;37226:63:0::1;11612:282:1::0;10384:400:0;10504:4;10526:228;2927:10;10576:7;10598:145;10655:15;10598:145;;;;;;;;;;;;;;;;;2927:10;10598:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10598:34:0;;;;;;;;;;;;:38;:145::i;38610:662::-;38669:14;;-1:-1:-1;;;38669:14:0;;;;38661:49;;;;-1:-1:-1;;;38661:49:0;;16112:2:1;38661:49:0;;;16094:21:1;16151:2;16131:18;;;16124:30;-1:-1:-1;;;16170:18:1;;;16163:52;16232:18;;38661:49:0;15910:346:1;38661:49:0;38729:24;;;;:14;:24;;;;;;:29;;38721:66;;;;-1:-1:-1;;;38721:66:0;;16463:2:1;38721:66:0;;;16445:21:1;16502:2;16482:18;;;16475:30;16541:26;16521:18;;;16514:54;16585:18;;38721:66:0;16261:348:1;38721:66:0;38853:29;:15;38873:8;38853:19;:29::i;:::-;2927:10;38820:30;;;;:16;:30;;;;;;:62;38798:148;;;;-1:-1:-1;;;38798:148:0;;16816:2:1;38798:148:0;;;16798:21:1;16855:2;16835:18;;;16828:30;16894:34;16874:18;;;16867:62;-1:-1:-1;;;16945:18:1;;;16938:34;16989:19;;38798:148:0;16614:400:1;38798:148:0;38986:24;;;;:14;:24;;;;;;;;;2927:10;38957:26;;:12;:26;;;;;;:53;39054:29;:15;38986:24;39054:19;:29::i;:::-;2927:10;39021:30;;;;:16;:30;;;;;:62;;;;39094:15;;-1:-1:-1;;;;;39094:15:0;;:26;;39162:31;2927:10;39162:17;:31::i;:::-;39094:110;;-1:-1:-1;;;;;;39094:110:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;39094:110:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;39094:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39241:12;2927:10;;2847:98;39241:12;-1:-1:-1;;;;;39220:44:0;;39255:8;39220:44;;;;2801:25:1;;2789:2;2774:18;;2655:177;39220:44:0;;;;;;;;38610:662;:::o;42993:184::-;43122:15;;:47;;-1:-1:-1;;;43122:47:0;;-1:-1:-1;;;;;178:32:1;;;43122:47:0;;;160:51:1;43090:7:0;;43122:15;;:38;;133:18:1;;43122:47:0;14:203:1;8963:216:0;9085:4;9107:42;2927:10;9131:9;9142:6;9107:9;:42::i;35578:143::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35671:30:0;;;::::1;;::::0;;;:23:::1;:30;::::0;;;;:38;;-1:-1:-1;;35671:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35578:143::o;43364:307::-;43628:15;;:35;;-1:-1:-1;;;43628:35:0;;-1:-1:-1;;;;;178:32:1;;;43628:35:0;;;160:51:1;43478:7:0;;;;;;;;;;;;43628:15;;;;:26;;133:18:1;;43628:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43621:42;;;;-1:-1:-1;43621:42:0;;-1:-1:-1;43621:42:0;-1:-1:-1;43621:42:0;-1:-1:-1;43621:42:0;;-1:-1:-1;43364:307:0;-1:-1:-1;;43364:307:0:o;37947:174::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;38035:3:::1;38026:5;:12;;38018:63;;;::::0;-1:-1:-1;;;38018:63:0;;17783:2:1;38018:63:0::1;::::0;::::1;17765:21:1::0;17822:2;17802:18;;;17795:30;17861:34;17841:18;;;17834:62;-1:-1:-1;;;17912:18:1;;;17905:36;17958:19;;38018:63:0::1;17581:402:1::0;38018:63:0::1;38092:13;:21:::0;37947:174::o;45373:127::-;45457:15;;:35;;-1:-1:-1;;;45457:35:0;;-1:-1:-1;;;;;178:32:1;;;45457:35:0;;;160:51:1;45433:4:0;;45457:15;;:26;;133:18:1;;45457:35:0;14:203:1;36385:268:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36457:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;36501:4:::1;-1:-1:-1::0;;36457:48:0;;::::1;::::0;::::1;::::0;;;36516:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;36561:15:::1;::::0;:44;;-1:-1:-1;;;36561:44:0;;::::1;::::0;::::1;160:51:1::0;;;;36561:15:0;::::1;::::0;:36:::1;::::0;133:18:1;36561:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36621:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;36621:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;36621:24:0::1;14:203:1::0;39434:208:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;39514:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;39506:41:::1;;;::::0;::::1;;39558:21;:31:::0;;-1:-1:-1;;39558:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39605:29:::1;::::0;2115:41:1;;;39605:29:0::1;::::0;2103:2:1;2088:18;39605:29:0::1;1975:187:1::0;35737:146:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;35804:20:::1;::::0;::::1;;35803:21;35795:30;;;::::0;::::1;;35844:20;:27:::0;;-1:-1:-1;;35844:27:0::1;35867:4;35844:27;::::0;;35737:146::o;53274:158::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;53344:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;53344:40:0;;-1:-1:-1;;;;;178:32:1;;;53344:40:0::1;::::0;::::1;160:51:1::0;53344:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;53344:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;53400:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;53400:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;53400:24:0::1;14:203:1::0;44533:130:0;44616:15;;:39;;;-1:-1:-1;;;44616:39:0;;;;44589:7;;-1:-1:-1;;;;;44616:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;43679:317;43948:15;;:40;;-1:-1:-1;;;43948:40:0;;;;;2801:25:1;;;43798:7:0;;;;;;;;;;;;-1:-1:-1;;;;;43948:15:0;;;;:33;;2774:18:1;;43948:40:0;2655:177:1;15911:281:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16014:22:0;::::1;15992:110;;;::::0;-1:-1:-1;;;15992:110:0;;18190:2:1;15992:110:0::1;::::0;::::1;18172:21:1::0;18229:2;18209:18;;;18202:30;18268:34;18248:18;;;18241:62;-1:-1:-1;;;18319:18:1;;;18312:36;18365:19;;15992:110:0::1;17988:402:1::0;15992:110:0::1;16139:6;::::0;16118:38:::1;::::0;-1:-1:-1;;;;;16118:38:0;;::::1;::::0;16139:6:::1;::::0;16118:38:::1;::::0;16139:6:::1;::::0;16118:38:::1;16167:6;:17:::0;;-1:-1:-1;;;;;;16167:17:0::1;-1:-1:-1::0;;;;;16167:17:0;;;::::1;::::0;;;::::1;::::0;;15911:281::o;44938:107::-;44991:15;;:46;;-1:-1:-1;;;44991:46:0;;45019:10;44991:46;;;12668:51:1;12762:14;;12755:22;12735:18;;;12728:50;-1:-1:-1;;;;;44991:15:0;;;;:27;;12641:18:1;;44991:46:0;12484:300:1;35899:415:0;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;35968:10:::1;:20:::0;;-1:-1:-1;;;;;;35968:20:0::1;;-1:-1:-1::0;;;;;35968:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;36003:21;35999:203:::1;;-1:-1:-1::0;;;;;36041:32:0;;::::1;;::::0;;;:23:::1;:32;::::0;;;;;;;:39;;36076:4:::1;-1:-1:-1::0;;36041:39:0;;::::1;::::0;::::1;::::0;;;36095:19:::1;:28:::0;;;;;;;:35;;;;::::1;::::0;;::::1;::::0;;36145:15:::1;::::0;:45;;-1:-1:-1;;;36145:45:0;;::::1;::::0;::::1;160:51:1::0;;;;36145:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;36145:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35999:203;36226:12;36212:11;:26:::0;36249:14:::1;:21:::0;;-1:-1:-1;;;;36249:21:0::1;-1:-1:-1::0;;;36249:21:0::1;::::0;;36286:16:::1;::::0;::::1;::::0;36249:21;;36286:16:::1;35899:415:::0;:::o;38191:221::-;15668:6;;-1:-1:-1;;;;;15668:6:0;2927:10;15668:22;15660:67;;;;-1:-1:-1;;;15660:67:0;;;;;;;:::i;:::-;38266:16:::1;:5:::0;38275:6:::1;38266:16;:::i;:::-;38258:24;;38325:4;38310:12;;:19;;;;:::i;:::-;38301:5;:28;;38293:83;;;::::0;-1:-1:-1;;;38293:83:0;;18819:2:1;38293:83:0::1;::::0;::::1;18801:21:1::0;18858:2;18838:18;;;18831:30;18897:34;18877:18;;;18870:62;-1:-1:-1;;;18948:18:1;;;18941:40;18998:19;;38293:83:0::1;18617:406:1::0;38293:83:0::1;38387:9;:17:::0;38191:221::o;13567:181::-;13625:7;;13657:5;13661:1;13657;:5;:::i;:::-;13645:17;;13686:1;13681;:6;;13673:46;;;;-1:-1:-1;;;13673:46:0;;19363:2:1;13673:46:0;;;19345:21:1;19402:2;19382:18;;;19375:30;19441:29;19421:18;;;19414:57;19488:18;;13673:46:0;19161:351:1;13673:46:0;13739:1;13567:181;-1:-1:-1;;;13567:181:0:o;14134:250::-;14192:7;14216:1;14221;14216:6;14212:47;;-1:-1:-1;14246:1:0;14239:8;;14212:47;14271:9;14283:5;14287:1;14283;:5;:::i;:::-;14271:17;-1:-1:-1;14316:1:0;14307:5;14311:1;14271:17;14307:5;:::i;:::-;:10;14299:56;;;;-1:-1:-1;;;14299:56:0;;19719:2:1;14299:56:0;;;19701:21:1;19758:2;19738:18;;;19731:30;19797:34;19777:18;;;19770:62;-1:-1:-1;;;19848:18:1;;;19841:31;19889:19;;14299:56:0;19517:397:1;14392:132:0;14450:7;14477:39;14481:1;14484;14477:39;;;;;;;;;;;;;;;;;:3;:39::i;54908:1995::-;54977:6;54987:1;54977:11;54973:50;;54908:1995;:::o;54973:50::-;55033:24;55050:6;55033:16;:24::i;:::-;55068:19;55090:25;55104:10;;55090:9;;:13;;:25;;;;:::i;:::-;55331:13;;55068:47;;-1:-1:-1;55143:4:0;;;;;;55128:12;;;;;;55331:17;55327:261;;55384:192;55566:9;;55547:16;;55531:13;;:32;;;;:::i;:::-;:44;;;;:::i;:::-;55384:128;55498:13;;55384:95;55467:11;55384:64;55438:9;;55384:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:192::-;55365:211;;55327:261;55602:14;;:18;55598:268;;55657:197;55843:10;;55823:17;;55806:14;;:34;;;;:::i;:::-;:47;;;;:::i;:::-;55657:130;55772:14;;55657:96;55741:11;55657:65;55711:10;;55657:35;:53;;:65;;;;:::i;:197::-;55637:217;;55598:268;55888:39;:16;55909:17;55888:20;:39::i;:::-;55876:51;-1:-1:-1;55944:13:0;;55940:111;;55996:15;;55988:51;;-1:-1:-1;;;;;55996:15:0;;;;56025:9;;55988:51;;;;56025:9;55996:15;55988:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55974:65:0;;-1:-1:-1;;55940:111:0;56071:21;56144:31;56165:9;;56144:16;;:20;;:31;;;;:::i;:::-;56117:10;;56095:17;;:33;;:21;:33::i;:::-;:80;;;;:::i;:::-;56071:104;-1:-1:-1;56188:19:0;56222:17;;56218:104;;56270:40;:21;56296:13;56270:25;:40::i;:::-;56256:54;;56218:104;56332:23;56400:11;56358:39;56379:17;;56358:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;56332:79;;56422:17;56470:11;56442:25;56456:10;;56442:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;56422:59;-1:-1:-1;56498:19:0;;56494:126;;56559:15;;56551:57;;-1:-1:-1;;;;;56559:15:0;;;;56588;;56551:57;;;;56588:15;56559;56551:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56534:74:0;;-1:-1:-1;;56494:126:0;56634:13;;56630:108;;56689:9;;56681:45;;-1:-1:-1;;;;;56689:9:0;;;;56712;;56681:45;;;;56712:9;56689;56681:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56664:62:0;;-1:-1:-1;;56630:108:0;56755:140;56783:9;56807:27;56825:9;56807:15;:27;:::i;:::-;56849:7;:21;;;;;56860:10;56849:21;:35;;;;;56874:10;56849:35;56755:140;;;20325:25:1;;;20381:2;20366:18;;20359:34;;;;20436:14;20429:22;20409:18;;;20402:50;20313:2;20298:18;56755:140:0;;;;;;;54962:1941;;;;;;;;;;;54908:1995;:::o;13756:136::-;13814:7;13841:43;13845:1;13848;13841:43;;;;;;;;;;;;;;;;;:3;:43::i;12259:380::-;-1:-1:-1;;;;;12395:19:0;;12387:68;;;;-1:-1:-1;;;12387:68:0;;20665:2:1;12387:68:0;;;20647:21:1;20704:2;20684:18;;;20677:30;20743:34;20723:18;;;20716:62;-1:-1:-1;;;20794:18:1;;;20787:34;20838:19;;12387:68:0;20463:400:1;12387:68:0;-1:-1:-1;;;;;12474:21:0;;12466:68;;;;-1:-1:-1;;;12466:68:0;;21070:2:1;12466:68:0;;;21052:21:1;21109:2;21089:18;;;21082:30;21148:34;21128:18;;;21121:62;-1:-1:-1;;;21199:18:1;;;21192:32;21241:19;;12466:68:0;20868:398:1;12466:68:0;-1:-1:-1;;;;;12547:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12599:32;;2801:25:1;;;12599:32:0;;2774:18:1;12599:32:0;;;;;;;;12259:380;;;:::o;10792:610::-;-1:-1:-1;;;;;10932:20:0;;10924:70;;;;-1:-1:-1;;;10924:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11013:23:0;;11005:71;;;;-1:-1:-1;;;11005:71:0;;;;;;;:::i;:::-;11169:108;11205:6;11169:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11169:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;11149:17:0;;;:9;:17;;;;;;;;;;;:128;;;;11311:20;;;;;;;:32;;11336:6;11311:24;:32::i;:::-;-1:-1:-1;;;;;11288:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;11359:35;2801:25:1;;;11288:20:0;;11359:35;;;;;;2774:18:1;11359:35:0;2655:177:1;45508:6466:0;-1:-1:-1;;;;;45640:18:0;;45632:68;;;;-1:-1:-1;;;45632:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45719:16:0;;45711:64;;;;-1:-1:-1;;;45711:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45938:39:0;;45786:18;45938:39;;;:33;:39;;;;;;45786:18;;;;;;;;45938:39;;45933:132;;46002:14;;-1:-1:-1;;;46002:14:0;;;;45994:59;;;;-1:-1:-1;;;45994:59:0;;22283:2:1;45994:59:0;;;22265:21:1;;;22302:18;;;22295:30;22361:34;22341:18;;;22334:62;22413:18;;45994:59:0;22081:356:1;45994:59:0;46089:20;;;;:29;;;:57;;-1:-1:-1;46122:10:0;;;;;-1:-1:-1;;;;;46122:10:0;:24;;46089:57;46085:209;;;46171:19;46181:4;46187:2;46171:9;:19::i;:::-;:24;;:57;;-1:-1:-1;;;;;;46199:29:0;;;;;;:23;:29;;;;;;;;46171:57;:88;;;-1:-1:-1;;;;;;46232:27:0;;;;;;:23;:27;;;;;;;;46171:88;46163:119;;;;-1:-1:-1;;;46163:119:0;;22644:2:1;46163:119:0;;;22626:21:1;22683:2;22663:18;;;22656:30;-1:-1:-1;;;22702:18:1;;;22695:48;22760:18;;46163:119:0;22442:342:1;46163:119:0;46326:6;46336:1;46326:11;46322:5268;;46354:28;46370:4;46376:2;46380:1;46354:15;:28::i;:::-;46397:7;;;;;45508:6466;;;:::o;46322:5268::-;46440:8;;-1:-1:-1;;;46440:8:0;;;;46439:9;:39;;;;-1:-1:-1;;;;;;46453:25:0;;;;;;:19;:25;;;;;;;;46452:26;46439:39;:67;;;;-1:-1:-1;;;;;;46483:23:0;;;;;;:19;:23;;;;;;;;46482:24;46439:67;46421:5169;;;-1:-1:-1;;;;;46550:29:0;;;46533:14;46550:29;;;:25;:29;;;;;;;46610:31;;;;;;;;46550:29;;;;;46610:31;46662:9;;:23;;;;;46676:9;46675:10;46662:23;46658:2286;;;46706:13;46722:32;46750:3;46722:23;46733:11;;46722:6;:10;;:23;;;;:::i;:32::-;46706:48;-1:-1:-1;46782:17:0;:6;46706:48;46782:10;:17::i;:::-;46773:26;;46818:43;46834:4;46848;46855:5;46818:15;:43::i;:::-;46880:33;46896:4;46902:2;46906:6;46880:15;:33::i;:::-;46932:15;;-1:-1:-1;;;;;46932:15:0;:26;46959:4;46965:23;46959:4;46965:17;:23::i;:::-;46932:57;;-1:-1:-1;;;;;;46932:57:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;46932:57:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;46932:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47008:15:0;;-1:-1:-1;;;;;47008:15:0;;-1:-1:-1;47008:26:0;;-1:-1:-1;47035:2:0;47039:21;47035:2;47039:17;:21::i;:::-;47008:53;;-1:-1:-1;;;;;;47008:53:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;47008:53:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;47008:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47080:7;;;;;;;;45508:6466;;;:::o;46658:2286::-;47140:8;47139:9;:27;;;;-1:-1:-1;47152:14:0;;-1:-1:-1;;;47152:14:0;;;;47139:27;47135:1809;;;-1:-1:-1;;;;;47217:22:0;;;;;;:16;:22;;;;;;47243:15;-1:-1:-1;47217:41:0;47187:144;;;;-1:-1:-1;;;47187:144:0;;22991:2:1;47187:144:0;;;22973:21:1;23030:2;23010:18;;;23003:30;23069:31;23049:18;;;23042:59;23118:18;;47187:144:0;22789:353:1;47187:144:0;-1:-1:-1;;;;;47354:22:0;;;;;;:16;:22;;;;;;:27;47350:147;;-1:-1:-1;;;;;47406:22:0;;47431:1;47406:22;;;:16;:22;;;;;;;;:26;;;47455:12;:18;;;;;:22;47350:147;47135:1809;;;47537:9;47533:1411;;;47580:14;;47624:12;;47671:17;;47722:16;;47767:10;;47802:14;;47580;;-1:-1:-1;47624:12:0;;-1:-1:-1;47671:17:0;;-1:-1:-1;47722:16:0;-1:-1:-1;47767:10:0;-1:-1:-1;47802:14:0;;47798:271;;;47906:13;;47893:9;47864:39;;;;:28;:39;;;;;;:55;;47906:13;47864:55;:::i;:::-;47845:15;:74;;47837:134;;;;-1:-1:-1;;;47837:134:0;;23349:2:1;47837:134:0;;;23331:21:1;23388:2;23368:18;;;23361:30;-1:-1:-1;;;23407:18:1;;;23400:52;23469:18;;47837:134:0;23147:346:1;47837:134:0;48019:9;47990:39;;;;:28;:39;;;;;48032:15;47990:57;;47533:1411;;;48096:8;48092:852;;;48138:13;;48181:11;;48227:16;;48277:15;;48321:9;;48355:14;;48138:13;;-1:-1:-1;48181:11:0;;-1:-1:-1;48227:16:0;;-1:-1:-1;48277:15:0;-1:-1:-1;48321:9:0;-1:-1:-1;48355:14:0;;48351:369;;;48413:11;;:15;;48427:1;48413:15;:::i;:::-;48398:12;:30;48390:60;;;;-1:-1:-1;;;48390:60:0;;23700:2:1;48390:60:0;;;23682:21:1;23739:2;23719:18;;;23712:30;-1:-1:-1;;;23758:18:1;;;23751:48;23816:18;;48390:60:0;23498:342:1;48390:60:0;48492:13;;48477:11;:28;;48469:64;;;;-1:-1:-1;;;48469:64:0;;24047:2:1;48469:64:0;;;24029:21:1;24086:2;24066:18;;;24059:30;24125:26;24105:18;;;24098:54;24169:18;;48469:64:0;23845:348:1;48469:64:0;48585:9;48560:35;;;;:24;:35;;;;;;48599:12;48560:51;;48552:83;;;;-1:-1:-1;;;48552:83:0;;24400:2:1;48552:83:0;;;24382:21:1;24439:2;24419:18;;;24412:30;-1:-1:-1;;;24458:18:1;;;24451:50;24518:18;;48552:83:0;24198:344:1;48552:83:0;48679:9;48654:35;;;;:24;:35;;;;;48692:12;48654:50;;48351:369;48748:32;48783:13;48793:2;48783:9;:13::i;:::-;48856:9;;48748:48;;-1:-1:-1;48819:33:0;48846:6;48748:48;48819:33;:::i;:::-;:46;;48811:117;;;;-1:-1:-1;;;48811:117:0;;24749:2:1;48811:117:0;;;24731:21:1;24788:2;24768:18;;;24761:30;24827:34;24807:18;;;24800:62;-1:-1:-1;;;24878:18:1;;;24871:34;24922:19;;48811:117:0;24547:400:1;48811:117:0;48106:838;48092:852;48960:17;48980:72;49044:7;49013:28;49028:13;49013:12;:28;:::i;:::-;:38;;;;:::i;:::-;48980:10;;:32;:72::i;:::-;48960:92;;49069:28;49100:24;49118:4;49100:9;:24::i;:::-;49180:18;;49069:55;;-1:-1:-1;49156:42:0;;;;;;;49219:43;;-1:-1:-1;;;;;;49231:31:0;;;;;;:25;:31;;;;;;;;49230:32;49219:43;49215:1251;;;49283:8;:15;;-1:-1:-1;;;;49283:15:0;-1:-1:-1;;;49283:15:0;;;49323:21;;49283:15;49323:21;:41;;;;;49363:1;49348:12;:16;49323:41;:61;;;;;49383:1;49368:12;;:16;49323:61;49319:903;;;49409:20;49432:25;49446:10;;49432:9;;:13;;:25;;;;:::i;:::-;49409:48;;49480:24;49507:105;49599:12;49507:61;49558:9;;49507:20;:50;;:61;;;;:::i;:105::-;49480:132;;49635:22;49660:106;49753:12;49660:62;49711:10;;49660:20;:50;;:62;;;;:::i;:106::-;49635:131;;49791:21;49815:104;49906:12;;49815:60;49862:12;49815:16;:46;;:60;;;;:::i;:104::-;49791:128;;49944:22;49969:103;50058:13;;49969:58;50014:12;49969:14;:44;;:58;;;;:::i;:103::-;49944:128;-1:-1:-1;50097:18:0;50118:33;49944:128;50137:13;50118:18;:33::i;:::-;50097:54;;50176:26;50191:10;50176:14;:26::i;:::-;49386:836;;;;;;49319:903;50242:24;50269;50287:4;50269:9;:24::i;:::-;50242:51;;50312:38;50333:16;50312:20;:38::i;:::-;-1:-1:-1;50381:1:0;50369:9;:13;;;50401:10;:14;50434:8;:16;;-1:-1:-1;;;;50434:16:0;;;49215:1251;50482:12;50497:30;50523:3;50497:21;:6;50508:9;50497:10;:21::i;:30::-;50482:45;-1:-1:-1;50542:18:0;50581:12;;50577:202;;50646:3;50623:20;:6;50634:8;50623:10;:20::i;:::-;:26;;;;:::i;:::-;50610:39;;50664;50680:4;50686;;;;;;;;;-1:-1:-1;;;;;50686:4:0;50692:10;50664:15;:39::i;:::-;50733:12;;:28;;50750:10;50733:16;:28::i;:::-;50718:12;:43;50577:202;50804:29;50815:17;50822:10;50815:4;:17;:::i;:::-;50804:6;;:10;:29::i;:::-;50795:38;;50854:9;50850:155;;;50897:10;;:20;;50912:4;50897:14;:20::i;:::-;50884:10;:33;50850:155;;;50970:9;;:19;;50984:4;50970:13;:19::i;:::-;50958:9;:31;50850:155;51021:42;51037:4;51051;51058;51021:15;:42::i;:::-;51094:16;;51131:15;;:28;;-1:-1:-1;;;;;;51131:28:0;;;;;2801:25:1;;;-1:-1:-1;;;;;51131:15:0;;;;:23;;2774:18:1;;51131:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;51131:28:0;;;;;;;;-1:-1:-1;;51131:28:0;;;;;;;;;;;;:::i;:::-;;;51127:452;;;51323:231;;;13581:25:1;;;13637:2;13622:18;;13615:34;;;13665:18;;;13658:34;;;13723:2;13708:18;;13701:34;;;51526:9:0;;51473:4;;51323:231;;13568:3:1;13553:19;51323:231:0;;;;;;;51160:410;;;51127:452;46518:5072;;;;;;;;46421:5169;51602:33;51618:4;51624:2;51628:6;51602:15;:33::i;:::-;51646:15;;-1:-1:-1;;;;;51646:15:0;:26;51673:4;51679:23;51673:4;51679:17;:23::i;:::-;51646:57;;-1:-1:-1;;;;;;51646:57:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;51646:57:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;51646:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51714:15:0;;-1:-1:-1;;;;;51714:15:0;;-1:-1:-1;51714:26:0;;-1:-1:-1;51741:2:0;51745:21;51741:2;51745:17;:21::i;:::-;51714:53;;-1:-1:-1;;;;;;51714:53:0;;;;;;;-1:-1:-1;;;;;11812:32:1;;;51714:53:0;;;11794:51:1;11861:18;;;11854:34;11767:18;;51714:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51804:15:0;;-1:-1:-1;;;;;51788:32:0;;;51804:15;;51788:32;;;;-1:-1:-1;51788:32:0;-1:-1:-1;51788:68:0;;-1:-1:-1;;;;;;51825:31:0;;;;;;:25;:31;;;;;;;;51824:32;51788:68;:88;;;;-1:-1:-1;51866:10:0;;-1:-1:-1;;;;;51860:16:0;;;51866:10;;;;;51860:16;51788:88;51784:179;;;51907:10;;51893:58;;-1:-1:-1;;;51893:58:0;;;;;25126:25:1;;;-1:-1:-1;;;;;25187:32:1;;;25167:18;;;25160:60;51907:10:0;;;;;;;;51893:44;;25099:18:1;;51893:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45621:6353;;;;;45508:6466;;;:::o;13900:226::-;14020:7;14056:12;14048:6;;;;14040:29;;;;-1:-1:-1;;;14040:29:0;;;;;;;;:::i;:::-;-1:-1:-1;14080:9:0;14092:5;14096:1;14092;:5;:::i;:::-;14080:17;13900:226;-1:-1:-1;;;;;13900:226:0:o;40079:280::-;-1:-1:-1;;;;;40162:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;40162:39:0;;;;;;;;;;;;40214:80;;40240:15;;:42;;-1:-1:-1;;;40240:42:0;;-1:-1:-1;;;;;178:32:1;;;40240:42:0;;;160:51:1;40240:15:0;;;;:36;;133:18:1;;40240:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40214:80;40311:40;;;;;;-1:-1:-1;;;;;40311:40:0;;;;;;;;40079:280;;:::o;51982:289::-;52088:14;;52048:7;;-1:-1:-1;;;52088:14:0;;;;:175;;52245:18;52255:7;52245:9;:18::i;:::-;52088:175;;;-1:-1:-1;;;;;52145:21:0;;;;;;:12;:21;;;;;;52122:103;;52203:3;;52122:54;;52145:30;;52203:3;52145:25;:30::i;:::-;52122:18;52132:7;52122:9;:18::i;14532:312::-;14652:7;14687:12;14680:5;14672:28;;;;-1:-1:-1;;;14672:28:0;;;;;;;;:::i;:::-;-1:-1:-1;14711:9:0;14723:5;14727:1;14723;:5;:::i;52767:499::-;52857:16;;;52871:1;52857:16;;;;;;;;52833:21;;52857:16;;;;;;;;;;-1:-1:-1;52857:16:0;52833:40;;52902:4;52884;52889:1;52884:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52884:23:0;;;:7;;;;;;;;;;:23;;;;52928:15;;:22;;;-1:-1:-1;;;52928:22:0;;;;:15;;;;;:20;;:22;;;;;52884:7;;52928:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52918:4;52923:1;52918:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52918:32:0;;;:7;;;;;;;;;:32;52993:15;;52961:62;;52978:4;;52993:15;53011:11;52961:8;:62::i;:::-;53034:15;;:224;;-1:-1:-1;;;53034:224:0;;-1:-1:-1;;;;;53034:15:0;;;;:66;;:224;;53115:11;;53034:15;;53185:4;;53212;;53232:15;;53034:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52822:444;52767:499;:::o;35235:327::-;-1:-1:-1;;;;;35358:34:0;;35332:4;35358:34;;;:25;:34;;;;;;;;:76;;;;-1:-1:-1;35418:15:0;;-1:-1:-1;;;;;35396:38:0;;;35418:15;;35396:38;;35358:76;35354:90;;;-1:-1:-1;35443:1:0;35436:8;;35354:90;-1:-1:-1;;;;;35473:37:0;;;;;;:25;:37;;;;;;;;35469:51;;;-1:-1:-1;35519:1:0;35512:8;;35469:51;-1:-1:-1;35553:1:0;35235:327;;;;:::o;52279:480::-;52338:12;52353:13;:6;52364:1;52353:10;:13::i;:::-;52338:28;-1:-1:-1;52377:17:0;52397:16;:6;52338:28;52397:10;:16::i;:::-;52377:36;-1:-1:-1;52449:21:0;52481:22;52498:4;52481:16;:22::i;:::-;52584:18;52605:41;:21;52631:14;52605:25;:41::i;:::-;52584:62;;52657:35;52670:9;52681:10;52657:12;:35::i;:::-;52708:43;;;26548:25:1;;;26604:2;26589:18;;26582:34;;;26632:18;;;26625:34;;;52708:43:0;;26536:2:1;26521:18;52708:43:0;;;;;;;52327:432;;;;52279:480;:::o;53936:513::-;54116:15;;54084:62;;54101:4;;-1:-1:-1;;;;;54116:15:0;54134:11;54084:8;:62::i;:::-;54189:15;;-1:-1:-1;;;;;54189:15:0;:31;54228:9;54261:4;54281:11;54189:15;;54393:7;15606:6;;-1:-1:-1;;;;;15606:6:0;;15541:79;54393:7;54189:252;;;;;;-1:-1:-1;;;;;;54189:252:0;;;-1:-1:-1;;;;;27029:15:1;;;54189:252:0;;;27011:34:1;27061:18;;;27054:34;;;;27104:18;;;27097:34;;;;27147:18;;;27140:34;27211:15;;;27190:19;;;27183:44;54415:15:0;27243:19:1;;;27236:35;26945:19;;54189:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222:180:1:o;407:597::-;519:4;548:2;577;566:9;559:21;609:6;603:13;652:6;647:2;636:9;632:18;625:34;677:1;687:140;701:6;698:1;695:13;687:140;;;796:14;;;792:23;;786:30;762:17;;;781:2;758:26;751:66;716:10;;687:140;;;845:6;842:1;839:13;836:91;;;915:1;910:2;901:6;890:9;886:22;882:31;875:42;836:91;-1:-1:-1;988:2:1;967:15;-1:-1:-1;;963:29:1;948:45;;;;995:2;944:54;;407:597;-1:-1:-1;;;407:597:1:o;1009:131::-;-1:-1:-1;;;;;1084:31:1;;1074:42;;1064:70;;1130:1;1127;1120:12;1145:118;1231:5;1224:13;1217:21;1210:5;1207:32;1197:60;;1253:1;1250;1243:12;1268:382;1333:6;1341;1394:2;1382:9;1373:7;1369:23;1365:32;1362:52;;;1410:1;1407;1400:12;1362:52;1449:9;1436:23;1468:31;1493:5;1468:31;:::i;:::-;1518:5;-1:-1:-1;1575:2:1;1560:18;;1547:32;1588:30;1547:32;1588:30;:::i;:::-;1637:7;1627:17;;;1268:382;;;;;:::o;1655:315::-;1723:6;1731;1784:2;1772:9;1763:7;1759:23;1755:32;1752:52;;;1800:1;1797;1790:12;1752:52;1839:9;1826:23;1858:31;1883:5;1858:31;:::i;:::-;1908:5;1960:2;1945:18;;;;1932:32;;-1:-1:-1;;;1655:315:1:o;2167:248::-;2235:6;2243;2296:2;2284:9;2275:7;2271:23;2267:32;2264:52;;;2312:1;2309;2302:12;2264:52;-1:-1:-1;;2335:23:1;;;2405:2;2390:18;;;2377:32;;-1:-1:-1;2167:248:1:o;2837:247::-;2896:6;2949:2;2937:9;2928:7;2924:23;2920:32;2917:52;;;2965:1;2962;2955:12;2917:52;3004:9;2991:23;3023:31;3048:5;3023:31;:::i;3089:127::-;3150:10;3145:3;3141:20;3138:1;3131:31;3181:4;3178:1;3171:15;3205:4;3202:1;3195:15;3221:275;3292:2;3286:9;3357:2;3338:13;;-1:-1:-1;;3334:27:1;3322:40;;3392:18;3377:34;;3413:22;;;3374:62;3371:88;;;3439:18;;:::i;:::-;3475:2;3468:22;3221:275;;-1:-1:-1;3221:275:1:o;3501:183::-;3561:4;3594:18;3586:6;3583:30;3580:56;;;3616:18;;:::i;:::-;-1:-1:-1;3661:1:1;3657:14;3673:4;3653:25;;3501:183::o;3689:662::-;3743:5;3796:3;3789:4;3781:6;3777:17;3773:27;3763:55;;3814:1;3811;3804:12;3763:55;3850:6;3837:20;3876:4;3900:60;3916:43;3956:2;3916:43;:::i;:::-;3900:60;:::i;:::-;3994:15;;;4080:1;4076:10;;;;4064:23;;4060:32;;;4025:12;;;;4104:15;;;4101:35;;;4132:1;4129;4122:12;4101:35;4168:2;4160:6;4156:15;4180:142;4196:6;4191:3;4188:15;4180:142;;;4262:17;;4250:30;;4300:12;;;;4213;;4180:142;;;-1:-1:-1;4340:5:1;3689:662;-1:-1:-1;;;;;;3689:662:1:o;4356:1215::-;4474:6;4482;4535:2;4523:9;4514:7;4510:23;4506:32;4503:52;;;4551:1;4548;4541:12;4503:52;4591:9;4578:23;4620:18;4661:2;4653:6;4650:14;4647:34;;;4677:1;4674;4667:12;4647:34;4715:6;4704:9;4700:22;4690:32;;4760:7;4753:4;4749:2;4745:13;4741:27;4731:55;;4782:1;4779;4772:12;4731:55;4818:2;4805:16;4840:4;4864:60;4880:43;4920:2;4880:43;:::i;4864:60::-;4958:15;;;5040:1;5036:10;;;;5028:19;;5024:28;;;4989:12;;;;5064:19;;;5061:39;;;5096:1;5093;5086:12;5061:39;5120:11;;;;5140:217;5156:6;5151:3;5148:15;5140:217;;;5236:3;5223:17;5253:31;5278:5;5253:31;:::i;:::-;5297:18;;5173:12;;;;5335;;;;5140:217;;;5376:5;-1:-1:-1;;5419:18:1;;5406:32;;-1:-1:-1;;5450:16:1;;;5447:36;;;5479:1;5476;5469:12;5447:36;;5502:63;5557:7;5546:8;5535:9;5531:24;5502:63;:::i;:::-;5492:73;;;4356:1215;;;;;:::o;5576:456::-;5653:6;5661;5669;5722:2;5710:9;5701:7;5697:23;5693:32;5690:52;;;5738:1;5735;5728:12;5690:52;5777:9;5764:23;5796:31;5821:5;5796:31;:::i;:::-;5846:5;-1:-1:-1;5903:2:1;5888:18;;5875:32;5916:33;5875:32;5916:33;:::i;:::-;5576:456;;5968:7;;-1:-1:-1;;;6022:2:1;6007:18;;;;5994:32;;5576:456::o;6473:241::-;6529:6;6582:2;6570:9;6561:7;6557:23;6553:32;6550:52;;;6598:1;6595;6588:12;6550:52;6637:9;6624:23;6656:28;6678:5;6656:28;:::i;6943:799::-;7083:6;7091;7099;7107;7115;7123;7131;7139;7147;7155;7208:3;7196:9;7187:7;7183:23;7179:33;7176:53;;;7225:1;7222;7215:12;7176:53;-1:-1:-1;;7248:23:1;;;7318:2;7303:18;;7290:32;;-1:-1:-1;7369:2:1;7354:18;;7341:32;;7420:2;7405:18;;7392:32;;-1:-1:-1;7471:3:1;7456:19;;7443:33;;-1:-1:-1;7523:3:1;7508:19;;7495:33;;-1:-1:-1;7575:3:1;7560:19;;7547:33;;-1:-1:-1;7627:3:1;7612:19;;7599:33;;-1:-1:-1;7679:3:1;7664:19;;7651:33;;-1:-1:-1;7731:3:1;7716:19;7703:33;;-1:-1:-1;6943:799:1;-1:-1:-1;6943:799:1:o;8562:388::-;8630:6;8638;8691:2;8679:9;8670:7;8666:23;8662:32;8659:52;;;8707:1;8704;8697:12;8659:52;8746:9;8733:23;8765:31;8790:5;8765:31;:::i;:::-;8815:5;-1:-1:-1;8872:2:1;8857:18;;8844:32;8885:33;8844:32;8885:33;:::i;8955:356::-;9157:2;9139:21;;;9176:18;;;9169:30;9235:34;9230:2;9215:18;;9208:62;9302:2;9287:18;;8955:356::o;9316:127::-;9377:10;9372:3;9368:20;9365:1;9358:31;9408:4;9405:1;9398:15;9432:4;9429:1;9422:15;9448:168;9488:7;9554:1;9550;9546:6;9542:14;9539:1;9536:21;9531:1;9524:9;9517:17;9513:45;9510:71;;;9561:18;;:::i;:::-;-1:-1:-1;9601:9:1;;9448:168::o;9621:380::-;9700:1;9696:12;;;;9743;;;9764:61;;9818:4;9810:6;9806:17;9796:27;;9764:61;9871:2;9863:6;9860:14;9840:18;9837:38;9834:161;;9917:10;9912:3;9908:20;9905:1;9898:31;9952:4;9949:1;9942:15;9980:4;9977:1;9970:15;9834:161;;9621:380;;;:::o;11480:127::-;11541:10;11536:3;11532:20;11529:1;11522:31;11572:4;11569:1;11562:15;11596:4;11593:1;11586:15;11899:135;11938:3;11959:17;;;11956:43;;11979:18;;:::i;:::-;-1:-1:-1;12026:1:1;12015:13;;11899:135::o;12039:251::-;12109:6;12162:2;12150:9;12141:7;12137:23;12133:32;12130:52;;;12178:1;12175;12168:12;12130:52;12210:9;12204:16;12229:31;12254:5;12229:31;:::i;12295:184::-;12365:6;12418:2;12406:9;12397:7;12393:23;12389:32;12386:52;;;12434:1;12431;12424:12;12386:52;-1:-1:-1;12457:16:1;;12295:184;-1:-1:-1;12295:184:1:o;12789:245::-;12856:6;12909:2;12897:9;12888:7;12884:23;12880:32;12877:52;;;12925:1;12922;12915:12;12877:52;12957:9;12951:16;12976:28;12998:5;12976:28;:::i;13039:306::-;13127:6;13135;13143;13196:2;13184:9;13175:7;13171:23;13167:32;13164:52;;;13212:1;13209;13202:12;13164:52;13241:9;13235:16;13225:26;;13291:2;13280:9;13276:18;13270:25;13260:35;;13335:2;13324:9;13320:18;13314:25;13304:35;;13039:306;;;;;:::o;17019:557::-;17132:6;17140;17148;17156;17164;17172;17225:3;17213:9;17204:7;17200:23;17196:33;17193:53;;;17242:1;17239;17232:12;17193:53;17274:9;17268:16;17293:31;17318:5;17293:31;:::i;:::-;17388:2;17373:18;;17367:25;17432:2;17417:18;;17411:25;17476:2;17461:18;;17455:25;17520:3;17505:19;;17499:26;17565:3;17550:19;;;17544:26;17343:5;;17367:25;;-1:-1:-1;17411:25:1;;17455;;-1:-1:-1;17499:26:1;-1:-1:-1;17544:26:1;;-1:-1:-1;17019:557:1;-1:-1:-1;;;17019:557:1:o;18395:217::-;18435:1;18461;18451:132;;18505:10;18500:3;18496:20;18493:1;18486:31;18540:4;18537:1;18530:15;18568:4;18565:1;18558:15;18451:132;-1:-1:-1;18597:9:1;;18395:217::o;19028:128::-;19068:3;19099:1;19095:6;19092:1;19089:13;19086:39;;;19105:18;;:::i;:::-;-1:-1:-1;19141:9:1;;19028:128::o;21271:401::-;21473:2;21455:21;;;21512:2;21492:18;;;21485:30;21551:34;21546:2;21531:18;;21524:62;-1:-1:-1;;;21617:2:1;21602:18;;21595:35;21662:3;21647:19;;21271:401::o;21677:399::-;21879:2;21861:21;;;21918:2;21898:18;;;21891:30;21957:34;21952:2;21937:18;;21930:62;-1:-1:-1;;;22023:2:1;22008:18;;22001:33;22066:3;22051:19;;21677:399::o;25231:125::-;25271:4;25299:1;25296;25293:8;25290:34;;;25304:18;;:::i;:::-;-1:-1:-1;25341:9:1;;25231:125::o;25361:980::-;25623:4;25671:3;25660:9;25656:19;25702:6;25691:9;25684:25;25728:2;25766:6;25761:2;25750:9;25746:18;25739:34;25809:3;25804:2;25793:9;25789:18;25782:31;25833:6;25868;25862:13;25899:6;25891;25884:22;25937:3;25926:9;25922:19;25915:26;;25976:2;25968:6;25964:15;25950:29;;25997:1;26007:195;26021:6;26018:1;26015:13;26007:195;;;26086:13;;-1:-1:-1;;;;;26082:39:1;26070:52;;26177:15;;;;26142:12;;;;26118:1;26036:9;26007:195;;;-1:-1:-1;;;;;;;26258:32:1;;;;26253:2;26238:18;;26231:60;-1:-1:-1;;;26322:3:1;26307:19;26300:35;26219:3;25361:980;-1:-1:-1;;;25361:980:1:o

Swarm Source

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