ETH Price: $3,326.59 (+6.87%)
 

More Info

Private Name Tags

TokenTracker

Multichain Info

1 address found via
Transaction Hash
Block
From
To
Approve401628032025-12-30 17:15:5314 days ago1767114953IN
Doge Base: Dbase Token
0 ETH0.000000220.0047702
Approve401495542025-12-30 9:54:1514 days ago1767088455IN
Doge Base: Dbase Token
0 ETH0.000000550.0119325
Approve396420882025-12-18 15:58:4326 days ago1766073523IN
Doge Base: Dbase Token
0 ETH0.000000230.0050556
Approve391160242025-12-06 11:43:1538 days ago1765021395IN
Doge Base: Dbase Token
0 ETH0.000000520.0112
Approve391071242025-12-06 6:46:3538 days ago1765003595IN
Doge Base: Dbase Token
0 ETH0.000000050.0012
Transfer391069182025-12-06 6:39:4338 days ago1765003183IN
Doge Base: Dbase Token
0 ETH0.000000280.0012
Transfer380331022025-11-11 10:05:5163 days ago1762855551IN
Doge Base: Dbase Token
0 ETH0.000000210.00438327
Approve379705642025-11-09 23:21:1565 days ago1762730475IN
Doge Base: Dbase Token
0 ETH0.000000140.00305045
Approve378754352025-11-07 18:30:1767 days ago1762540217IN
Doge Base: Dbase Token
0 ETH0.000000250.00938863
Transfer378680982025-11-07 14:25:4367 days ago1762525543IN
Doge Base: Dbase Token
0 ETH0.000001420.00597258
Approve374178572025-10-28 4:17:4177 days ago1761625061IN
Doge Base: Dbase Token
0 ETH0.000000450.00985511
Approve370717142025-10-20 3:59:3585 days ago1760932775IN
Doge Base: Dbase Token
0 ETH0.000000150.00523639
Approve370716342025-10-20 3:56:5585 days ago1760932615IN
Doge Base: Dbase Token
0 ETH0.000000180.004
Approve370713212025-10-20 3:46:2985 days ago1760931989IN
Doge Base: Dbase Token
0 ETH0.00000010.00221592
Approve369180512025-10-16 14:37:2989 days ago1760625449IN
Doge Base: Dbase Token
0 ETH0.000001470.03189242
Transfer367308132025-10-12 6:36:1393 days ago1760250973IN
Doge Base: Dbase Token
0 ETH0.000001330.00542921
Approve360592092025-09-26 17:29:25109 days ago1758907765IN
Doge Base: Dbase Token
0 ETH0.000000360.00785125
Approve359533832025-09-24 6:41:53111 days ago1758696113IN
Doge Base: Dbase Token
0 ETH0.000000270.00579496
Approve355730402025-09-15 11:23:47120 days ago1757935427IN
Doge Base: Dbase Token
0 ETH0.000000140.00308483
Transfer355492672025-09-14 22:11:21121 days ago1757887881IN
Doge Base: Dbase Token
0 ETH0.000000570.00233192
Claim353294082025-09-09 20:02:43126 days ago1757448163IN
Doge Base: Dbase Token
0 ETH0.000000120.00285031
Approve353294032025-09-09 20:02:33126 days ago1757448153IN
Doge Base: Dbase Token
0 ETH0.000000130.00294101
Set Auto Claim353293302025-09-09 20:00:07126 days ago1757448007IN
Doge Base: Dbase Token
0 ETH0.000000150.00302759
Process Dividend...353293132025-09-09 19:59:33126 days ago1757447973IN
Doge Base: Dbase Token
0 ETH0.00000050.00304744
Claim353292822025-09-09 19:58:31126 days ago1757447911IN
Doge Base: Dbase Token
0 ETH0.000000140.00340198
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
343733972025-08-18 16:55:41148 days ago1755536141
Doge Base: Dbase Token
0.0004741 ETH
343733972025-08-18 16:55:41148 days ago1755536141
Doge Base: Dbase Token
0.0004741 ETH
343733972025-08-18 16:55:41148 days ago1755536141
Doge Base: Dbase Token
0.0009482 ETH
343733972025-08-18 16:55:41148 days ago1755536141
Doge Base: Dbase Token
0.00012128 ETH
343733972025-08-18 16:55:41148 days ago1755536141
Doge Base: Dbase Token
0.00012128 ETH
342236522025-08-15 5:44:11151 days ago1755236651
Doge Base: Dbase Token
0.00089928 ETH
342236522025-08-15 5:44:11151 days ago1755236651
Doge Base: Dbase Token
0.00089928 ETH
342236522025-08-15 5:44:11151 days ago1755236651
Doge Base: Dbase Token
0.00179852 ETH
342236522025-08-15 5:44:11151 days ago1755236651
Doge Base: Dbase Token
0.00000004 ETH
342236522025-08-15 5:44:11151 days ago1755236651
Doge Base: Dbase Token
0.00023123 ETH
342236522025-08-15 5:44:11151 days ago1755236651
Doge Base: Dbase Token
0.00023123 ETH
339464522025-08-08 19:44:11158 days ago1754682251
Doge Base: Dbase Token
0.00054632 ETH
339464522025-08-08 19:44:11158 days ago1754682251
Doge Base: Dbase Token
0.00054632 ETH
339464522025-08-08 19:44:11158 days ago1754682251
Doge Base: Dbase Token
0.00109264 ETH
339464522025-08-08 19:44:11158 days ago1754682251
Doge Base: Dbase Token
0.00013924 ETH
339464522025-08-08 19:44:11158 days ago1754682251
Doge Base: Dbase Token
0.00013924 ETH
338846942025-08-07 9:25:35159 days ago1754558735
Doge Base: Dbase Token
0.00054632 ETH
338846942025-08-07 9:25:35159 days ago1754558735
Doge Base: Dbase Token
0.00054632 ETH
338846942025-08-07 9:25:35159 days ago1754558735
Doge Base: Dbase Token
0.00109264 ETH
338846942025-08-07 9:25:35159 days ago1754558735
Doge Base: Dbase Token
0.00013924 ETH
338846942025-08-07 9:25:35159 days ago1754558735
Doge Base: Dbase Token
0.00013924 ETH
338831812025-08-07 8:35:09159 days ago1754555709
Doge Base: Dbase Token
0.00054632 ETH
338831812025-08-07 8:35:09159 days ago1754555709
Doge Base: Dbase Token
0.00054632 ETH
338831812025-08-07 8:35:09159 days ago1754555709
Doge Base: Dbase Token
0.00109264 ETH
338831812025-08-07 8:35:09159 days ago1754555709
Doge Base: Dbase Token
0.00013924 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
dbase

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2023-08-01
*/

/**

██████╗░░█████╗░░██████╗░███████╗  ██████╗░░█████╗░░██████╗███████╗
██╔══██╗██╔══██╗██╔════╝░██╔════╝  ██╔══██╗██╔══██╗██╔════╝██╔════╝
██║░░██║██║░░██║██║░░██╗░█████╗░░  ██████╦╝███████║╚█████╗░█████╗░░
██║░░██║██║░░██║██║░░╚██╗██╔══╝░░  ██╔══██╗██╔══██║░╚═══██╗██╔══╝░░
██████╔╝╚█████╔╝╚██████╔╝███████╗  ██████╦╝██║░░██║██████╔╝███████╗
╚═════╝░░╚════╝░░╚═════╝░╚══════╝  ╚═════╝░╚═╝░░╚═╝╚═════╝░╚══════╝

Doge Base

Total Supply: 1.000.000.000.000.000 Dbase

2% LEET Reward
2% Marketing
1% LP


https://t.me/doge_base



*/



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

    dbaseDividendTracker 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("Doge Base", "Dbase") {
        marketingWallet = payable(0x1C8E90B1258Ace8B47Bb33618B98A71e7bc41e66);
        devWallet = payable(0x735a75425f4A7066AA1a73E018322e295072c828);
        address router = 0x4cf76043B3f97ba06917cBd90F9e3A2AAC1B306e;

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

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

        dividendTracker = new dbaseDividendTracker(
            payable(this),
            router,
            0x0963a1aBAF36Ca88C21032b82e479353126A1C4b,
            "dbaseTRACKER",
            "dbaseTRACKER"
        );

        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(marketingWallet)] = true;
        _isExcludedFromFees[address(devWallet)] = true;

        uint256 totalTokenSupply = (1_000_000_000_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        maxWallet = 5000000000000; // 0.5%;
        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 >= 1, "can never be set below 1");
        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 <= 15 && totalBuyFees <= 15, "total fees cannot exceed 15% 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 + 2,"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 dbaseDividendTracker 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;

    dbase public dbaseContract;

    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;
        dbaseContract = dbase(mainContract);
        minimumTokenBalanceForAutoDividends = 100000000_000000000000000000; // 100M tokens
        minimumTokenBalanceForDividends = minimumTokenBalanceForAutoDividends;

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

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

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

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

608060405260088054600162ffff0160a01b03191661dead17905560016009819055600a819055601d805460ff199081168317909155620f4240601e556025805490911690911790556401a13b8600602655603c602a553480156200006357600080fd5b5060405180604001604052806009815260200168446f6765204261736560b81b81525060405180604001604052806005815260200164446261736560d81b8152508160039081620000b5919062000a37565b506004620000c4828262000a37565b5050506000620000d96200074760201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e8054731c8e90b1258ace8b47bb33618b98a71e7bc41e666001600160a01b031991821617909155600f805473735a75425f4a7066aa1a73e018322e295072c828921691909117905560006016819055601381905560026017819055601481905560016018819055601581905560198290556012829055601a839055601b839055601c839055734cf76043b3f97ba06917cbd90f9e3a2aac1b306e92620001fb929091620001e79190829082906200074b602090811b6200357e17901c565b6200074b60201b6200357e1790919060201c565b600c819055506200022d601b54620001e7601454620001e76015546012546200074b60201b6200357e1790919060201c565b600b819055503081730963a1abaf36ca88c21032b82e479353126a1c4b604051620002589062000985565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600c9082018190526b323130b9b2aa2920a1a5a2a960a11b60c0830181905260e06080840181905283019190915261010082015261012001604051809103906000f080158015620002d3573d6000803e3d6000fd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200033e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000364919062000b03565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ed919062000b03565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200043b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000461919062000b03565b600780546001600160a01b0319166001600160a01b039290921691821790556200048d906001620007b9565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004d457600080fd5b505af1158015620004e9573d6000803e3d6000fd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200053757600080fd5b505af11580156200054c573d6000803e3d6000fd5b5050600d54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa1580156200059a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005c0919062000b2e565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b1580156200060957600080fd5b505af11580156200061e573d6000803e3d6000fd5b5050306000908152601f60205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f541684529190922080549091169091179055506d314dc6448d9338c15b0a000000009050620006b0620006a96005546001600160a01b031690565b8262000884565b65048c27395000601055620006c86103e88262000b52565b601155600160246000620006e46005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600e54909116815260248352818120805485166001908117909155338252602c9093522080549092161790555062000b9c9050565b3390565b6000806200075a838562000b75565b905083811015620007b25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b03821660009081526020805260409020805460ff191682158015919091179091556200084857600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200082e57600080fd5b505af115801562000843573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b038216620008dc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620007a9565b620008f8816002546200074b60201b6200357e1790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200092b9183906200357e6200074b821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b61370b806200617d83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620009be57607f821691505b602082108103620009df57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200098057600081815260208120601f850160051c8101602086101562000a0e5750805b601f850160051c820191505b8181101562000a2f5782815560010162000a1a565b505050505050565b81516001600160401b0381111562000a535762000a5362000993565b62000a6b8162000a648454620009a9565b84620009e5565b602080601f83116001811462000aa3576000841562000a8a5750858301515b600019600386901b1c1916600185901b17855562000a2f565b600085815260208120601f198616915b8281101562000ad45788860151825594840194600190910190840162000ab3565b508582101562000af35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000b1657600080fd5b81516001600160a01b0381168114620007b257600080fd5b60006020828403121562000b4157600080fd5b81518015158114620007b257600080fd5b60008262000b7057634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562000b9757634e487b7160e01b600052601160045260246000fd5b500190565b6155d18062000bac6000396000f3fe6080604052600436106106065760003560e01c80637d32f34211610317578063aa4704f3116101a5578063dd62ed3e116100ec578063f2fde38b11610095578063f72f863b1161006f578063f72f863b14611186578063f8b45b05146111a6578063fc6b151c146111bc57600080fd5b8063f2fde38b14611130578063f5d3c79a14611150578063f63743421461117057600080fd5b8063f11a24d3116100c6578063f11a24d3146110cd578063f1c0ddff146110e3578063f27fd2541461111057600080fd5b8063dd62ed3e1461105c578063e2f45605146110a2578063e7841ec0146110b857600080fd5b8063ba079d491161014e578063d5e3725111610128578063d5e3725114611007578063d7b837dd14611027578063d8032ed31461103c57600080fd5b8063ba079d4914610fb1578063bb8d513114610fd1578063d07a091c14610fe757600080fd5b8063b49429881161017f578063b494298814610f4c578063b62496f514610f62578063b74e3b1114610f9157600080fd5b8063aa4704f314610e87578063acb2ad6f14610edf578063ad56c13c14610ef557600080fd5b80639a7a23d611610269578063a0d82dc511610212578063a8b9d240116101ec578063a8b9d24014610e27578063a9059cbb14610e47578063a9885de514610e6757600080fd5b8063a0d82dc514610dd1578063a457c2d714610de7578063a694fc3a14610e0757600080fd5b80639c3b4fdc116102435780639c3b4fdc14610d7b5780639cefc1da14610d915780639ec1037e14610db157600080fd5b80639a7a23d614610d255780639c1b8af514610d455780639c3372ea14610d5b57600080fd5b8063871c128d116102cb5780638ea5220f116102a55780638ea5220f14610cda57806395451c2914610cfa57806395d89b4114610d1057600080fd5b8063871c128d14610c865780638ca2923a14610ca65780638da5cb5b14610cbc57600080fd5b8063837ae2d0116102fc578063837ae2d014610c265780638577a6d514610c46578063868730c714610c6657600080fd5b80637d32f34214610bd95780637fdde05c14610c0657600080fd5b806349bd5a5e1161049457806364b0f653116103e6578063715018a61161038f57806375f0a8741161036957806375f0a87414610b8957806377a3b60914610ba95780637928dd1d14610bbf57600080fd5b8063715018a614610b3457806372d8edf414610b4957806375829def14610b6957600080fd5b80636d48467b116103c05780636d48467b14610abe578063700bb19114610ade57806370a0823114610afe57600080fd5b806364b0f65314610a69578063679ca6e914610a7e5780636843cd8414610a9e57600080fd5b80634fbee193116104485780635c234bb6116104225780635c234bb614610a135780635ebf4db914610a295780635eee4bae14610a4957600080fd5b80634fbee193146109a45780635124f874146109dd5780635a84c5eb146109f357600080fd5b80634a74bb02116104795780634a74bb02146109415780634ada218b1461095b5780634e71d92d1461098f57600080fd5b806349bd5a5e146109075780634a62bb651461092757600080fd5b806321cbb02411610558578063313ce567116105015780633f407b84116104db5780633f407b84146108a457806340ffdd80146108ba578063435c89e4146108da57600080fd5b8063313ce567146108485780633599bb1714610864578063395093511461088457600080fd5b806325cd35981161053257806325cd3598146107fe5780632c1f52161461081357806330bb4cff1461083357600080fd5b806321cbb0241461078e5780632307b441146107be57806323b872dd146107de57600080fd5b8063095ea7b3116105ba57806318160ddd1161059457806318160ddd146107435780631d7b1fb4146107625780631fa705311461077857600080fd5b8063095ea7b3146106d35780630ef35b7e146107035780631694505e1461072357600080fd5b806306fdde03116105eb57806306fdde031461067157806308dfe8a51461069357806309231602146106b357600080fd5b806303fd2a451461061257806305ca5f081461064f57600080fd5b3661060d57005b600080fd5b34801561061e57600080fd5b50600854610632906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561065b57600080fd5b5061066f61066a366004614f12565b6111dc565b005b34801561067d57600080fd5b506106866112c7565b6040516106469190614f2b565b34801561069f57600080fd5b5061066f6106ae366004614fa3565b611359565b3480156106bf57600080fd5b5061066f6106ce366004614f12565b611400565b3480156106df57600080fd5b506106f36106ee366004614fdc565b6114ad565b6040519015158152602001610646565b34801561070f57600080fd5b5061066f61071e366004615008565b6114c4565b34801561072f57600080fd5b50600654610632906001600160a01b031681565b34801561074f57600080fd5b506002545b604051908152602001610646565b34801561076e57600080fd5b50610754602a5481565b34801561078457600080fd5b50610754600a5481565b34801561079a57600080fd5b506106f36107a936600461502a565b602c6020526000908152604090205460ff1681565b3480156107ca57600080fd5b5061066f6107d936600461511d565b6115c7565b3480156107ea57600080fd5b506106f36107f93660046151df565b6117e7565b34801561080a57600080fd5b50610632611850565b34801561081f57600080fd5b50600d54610632906001600160a01b031681565b34801561083f57600080fd5b506107546118dc565b34801561085457600080fd5b5060405160128152602001610646565b34801561087057600080fd5b5061066f61087f366004615220565b611963565b34801561089057600080fd5b506106f361089f366004614fdc565b611a27565b3480156108b057600080fd5b5061075460095481565b3480156108c657600080fd5b5061066f6108d5366004615220565b611a5d565b3480156108e657600080fd5b506107546108f5366004614f12565b60236020526000908152604090205481565b34801561091357600080fd5b50600754610632906001600160a01b031681565b34801561093357600080fd5b506025546106f39060ff1681565b34801561094d57600080fd5b50601d546106f39060ff1681565b34801561096757600080fd5b506008546106f390760100000000000000000000000000000000000000000000900460ff1681565b34801561099b57600080fd5b5061066f611af0565b3480156109b057600080fd5b506106f36109bf36600461502a565b6001600160a01b03166000908152601f602052604090205460ff1690565b3480156109e957600080fd5b5061075460175481565b3480156109ff57600080fd5b5061066f610a0e366004614f12565b611b81565b348015610a1f57600080fd5b5061075460165481565b348015610a3557600080fd5b5061066f610a44366004614f12565b611c13565b348015610a5557600080fd5b5061066f610a64366004614f12565b611ca5565b348015610a7557600080fd5b50610754611d05565b348015610a8a57600080fd5b5061066f610a99366004615220565b611d68565b348015610aaa57600080fd5b50610754610ab936600461502a565b611dc3565b348015610aca57600080fd5b506106f3610ad936600461502a565b611e4c565b348015610aea57600080fd5b5061066f610af9366004614f12565b611ed5565b348015610b0a57600080fd5b50610754610b1936600461502a565b6001600160a01b031660009081526020819052604090205490565b348015610b4057600080fd5b5061066f611fbd565b348015610b5557600080fd5b5061066f610b6436600461502a565b612067565b348015610b7557600080fd5b5061066f610b8436600461502a565b6120e1565b348015610b9557600080fd5b50600e54610632906001600160a01b031681565b348015610bb557600080fd5b5061075460195481565b348015610bcb57600080fd5b50602b546106f39060ff1681565b348015610be557600080fd5b50610754610bf436600461502a565b60226020526000908152604090205481565b348015610c1257600080fd5b5061066f610c21366004614fa3565b6121b4565b348015610c3257600080fd5b5061066f610c4136600461523d565b612227565b348015610c5257600080fd5b5061066f610c61366004614f12565b612404565b348015610c7257600080fd5b5061066f610c81366004615220565b6124d9565b348015610c9257600080fd5b5061066f610ca1366004614f12565b61252a565b348015610cb257600080fd5b5061075460135481565b348015610cc857600080fd5b506005546001600160a01b0316610632565b348015610ce657600080fd5b50600f54610632906001600160a01b031681565b348015610d0657600080fd5b5061075460145481565b348015610d1c57600080fd5b506106866125c4565b348015610d3157600080fd5b5061066f610d40366004614fa3565b6125d3565b348015610d5157600080fd5b50610754601e5481565b348015610d6757600080fd5b5061066f610d76366004615220565b612629565b348015610d8757600080fd5b50610754601a5481565b348015610d9d57600080fd5b5061066f610dac366004615220565b6126bc565b348015610dbd57600080fd5b5061066f610dcc36600461502a565b61278b565b348015610ddd57600080fd5b50610754601b5481565b348015610df357600080fd5b506106f3610e02366004614fdc565b612899565b348015610e1357600080fd5b5061066f610e22366004614f12565b6128e8565b348015610e3357600080fd5b50610754610e4236600461502a565b612b2b565b348015610e5357600080fd5b506106f3610e62366004614fdc565b612b77565b348015610e7357600080fd5b5061066f610e82366004614fa3565b612b84565b348015610e9357600080fd5b50610eca610ea236600461502a565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b60408051928352602083019190915201610646565b348015610eeb57600080fd5b50610754601c5481565b348015610f0157600080fd5b50610f15610f1036600461502a565b612bf7565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610646565b348015610f5857600080fd5b5061075460295481565b348015610f6e57600080fd5b506106f3610f7d36600461502a565b602080526000908152604090205460ff1681565b348015610f9d57600080fd5b5061066f610fac366004614f12565b612ca0565b348015610fbd57600080fd5b506106f3610fcc36600461502a565b612d65565b348015610fdd57600080fd5b5061075460125481565b348015610ff357600080fd5b5061066f61100236600461502a565b612db1565b34801561101357600080fd5b5061066f611022366004615220565b612ec4565b34801561103357600080fd5b5061066f612f64565b34801561104857600080fd5b5061066f61105736600461502a565b612fcb565b34801561106857600080fd5b506107546110773660046152a5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156110ae57600080fd5b5061075460115481565b3480156110c457600080fd5b506107546130c5565b3480156110d957600080fd5b5061075460185481565b3480156110ef57600080fd5b506107546110fe36600461502a565b60216020526000908152604090205481565b34801561111c57600080fd5b50610f1561112b366004614f12565b613128565b34801561113c57600080fd5b5061066f61114b36600461502a565b61317f565b34801561115c57600080fd5b5061066f61116b366004615220565b6132b7565b34801561117c57600080fd5b5061075460155481565b34801561119257600080fd5b5061066f6111a136600461502a565b613308565b3480156111b257600080fd5b5061075460105481565b3480156111c857600080fd5b5061066f6111d7366004614f12565b613498565b6005546001600160a01b031633146112295760405162461bcd60e51b8152602060048201819052602482015260008051602061555783398151915260448201526064015b60405180910390fd5b61123b81670de0b6b3a76400006152e9565b90506000611256600954600a5461357e90919063ffffffff16565b9050600061127982611273600a54866135e490919063ffffffff16565b90613682565b9050600061129683611273600954876135e490919063ffffffff16565b90506112a1846136c4565b600a546112ae90836139c4565b600a556009546112be90826139c4565b60095550505050565b6060600380546112d690615308565b80601f016020809104026020016040519081016040528092919081815260200182805461130290615308565b801561134f5780601f106113245761010080835404028352916020019161134f565b820191906000526020600020905b81548152906001019060200180831161133257829003601f168201915b5050505050905090565b6005546001600160a01b031633146113a15760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146114485760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b60018110156114995760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f77203100000000000000006044820152606401611220565b6114a781633b9aca006152e9565b60265550565b60006114ba338484613a06565b5060015b92915050565b6005546001600160a01b0316331461150c5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b60008281526023602052604090205481900361152757600080fd5b60648111156115785760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303000006044820152606401611220565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b0316331461160f5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b80518251146116605760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401611220565b60c8825111156116d85760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d203260448201527f30300000000000000000000000000000000000000000000000000000000000006064820152608401611220565b60005b82518110156117e25760008382815181106116f8576116f8615342565b60200260200101519050600083838151811061171657611716615342565b6020026020010151670de0b6b3a764000061173191906152e9565b905061173e338383613b5f565b600d546001600160a01b031663e30443bc8361176f816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156117b557600080fd5b505af11580156117c9573d6000803e3d6000fd5b50505050505080806117da90615358565b9150506116db565b505050565b60006117f4848484613d14565b61184684336118418560405180606001604052806028815260200161552f602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614a10565b613a06565b5060019392505050565b600d54604080517f25cd359800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156118b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d79190615372565b905090565b600d54604080517f85a6b3ae00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561193f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d7919061538f565b6005546001600160a01b031633146119ab5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f3599bb1700000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916114ba918590611841908661357e565b6005546001600160a01b03163314611aa55760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f40ffdd8000000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b03909116906340ffdd80906024016119f2565b600d546040517fbc4c4b37000000000000000000000000000000000000000000000000000000008152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7e91906153a8565b50565b6005546001600160a01b03163314611bc95760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f5a84c5eb000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0390911690635a84c5eb906024016119f2565b6005546001600160a01b03163314611c5b5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f5ebf4db9000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0390911690635ebf4db9906024016119f2565b6005546001600160a01b03163314611ced5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b611cff81670de0b6b3a76400006152e9565b60115550565b600d54604080517f09bbedde00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561193f573d6000803e3d6000fd5b6005546001600160a01b03163314611db05760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6025805460ff1916911515919091179055565b600d546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611e28573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be919061538f565b600d546040517f6d48467b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611eb1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be91906153a8565b600d546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611f3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6291906153c5565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146120055760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6005546001600160a01b031633146120af5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016119f2565b6005546001600160a01b031633146121295760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561217057600080fd5b505af1158015612184573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff1916600117905550611b7e8161317f565b6005546001600160a01b031633146121fc5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461226f5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b8190556122b7816122b18981878a61357e565b9061357e565b600b819055506122e0601a546122b16017546122b160185460195461357e90919063ffffffff16565b600c55600b54600f108015906122f95750600f600c5411155b61236b5760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203135252073656c60448201527f6c206f72206275790000000000000000000000000000000000000000000000006064820152608401611220565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b0316331461244c5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600581111561249d5760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f74206578636565642035250000006044820152606401611220565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d546040517f8bc1d63900000000000000000000000000000000000000000000000000000000815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016119f2565b6005546001600160a01b031633146125725760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b62030d4081101580156125885750620f42408111155b61259157600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b6060600480546112d690615308565b6005546001600160a01b0316331461261b5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6126258282614a4a565b5050565b6005546001600160a01b031633146126715760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f9c3372ea00000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0390911690639c3372ea906024016119f2565b6005546001600160a01b031633146127045760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b801515600860159054906101000a900460ff1615150361272357600080fd5b60088054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a87906124ce90831515815260200190565b6005546001600160a01b031633146127d35760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f092884710000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b15801561283357600080fd5b505af1158015612847573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508261286881614b12565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016119f2565b60006114ba338461184185604051806060016040528060258152602001615577602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614a10565b600854600160a81b900460ff166129415760405162461bcd60e51b815260206004820152601660248201527f5374616b696e67206973206e6f7420656e61626c6564000000000000000000006044820152606401611220565b600081815260236020526040812054900361299e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401611220565b6129a8428261357e565b3360009081526022602052604090205410612a2a5760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e676572206475726160448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401611220565b600081815260236020908152604080832054338452602190925290912055612a52428261357e565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc90612a8181614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612ac757600080fd5b505af1158015612adb573d6000803e3d6000fd5b50505050612ae63390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c882604051612b2091815260200190565b60405180910390a250565b600d546040517fa8b9d2400000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a8b9d24090602401611e0b565b60006114ba338484613d14565b6005546001600160a01b03163314612bcc5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b03919091166000908152602c60205260409020805460ff1916911515919091179055565b600d546040517ffbcbc0f10000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015612c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8c91906153f3565b949c939b5091995097509550909350915050565b6005546001600160a01b03163314612ce85760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b61012c811115612d605760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d60448201527f696e7574657300000000000000000000000000000000000000000000000000006064820152608401611220565b602a55565b600d546040517fba079d490000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063ba079d4990602401611e94565b6005546001600160a01b03163314612df95760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b158015612e7257600080fd5b505af1158015612e86573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c5925060200190506124ce565b6005546001600160a01b03163314612f0c5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b601d5481151560ff909116151503612f2357600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef906020016124ce565b6005546001600160a01b03163314612fac5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b602b5460ff1615612fbc57600080fd5b602b805460ff19166001179055565b6005546001600160a01b031633146130135760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517fd8032ed30000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b15801561307357600080fd5b505af1158015613087573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d925060200190506124ce565b600d54604080517fe7841ec000000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa15801561193f573d6000803e3d6000fd5b600d546040517f5183d6fd00000000000000000000000000000000000000000000000000000000815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612c4b565b6005546001600160a01b031633146131c75760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b0381166132435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611220565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600d546040517fb22f8a0400000000000000000000000000000000000000000000000000000000815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016119f2565b6005546001600160a01b031633146133505760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b602b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0384169081029190911790915515613427576001600160a01b038181166000818152602c602090815260408083208054600160ff199182168117909255601f9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b15801561340e57600080fd5b505af1158015613422573d6000803e3d6000fd5b505050505b43602955600880547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff167601000000000000000000000000000000000000000000001790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6005546001600160a01b031633146134e05760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6134f281670de0b6b3a76400006152e9565b90506103e86002546135049190615446565b8110156135795760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c65737360448201527f207468616e20302e3125000000000000000000000000000000000000000000006064820152608401611220565b601055565b60008061358b8385615468565b9050838110156135dd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611220565b9392505050565b6000826000036135f6575060006114be565b600061360283856152e9565b90508261360f8583615446565b146135dd5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401611220565b60006135dd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614b90565b806000036136cf5750565b6136d881614bbe565b60006136f1600954600a5461357e90919063ffffffff16565b6019549091506001908190819060009081908190156137525761374f601a546017546019546137209190615468565b61372a9190615468565b6112736019546137498b611273600a54476135e490919063ffffffff16565b906135e4565b91505b6012541561379c57613799601b546014546012546137709190615468565b61377a9190615468565b6112736012546137498b611273600954476135e490919063ffffffff16565b90505b6137a6828261357e565b9250821561380657600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146137fb576040519150601f19603f3d011682016040523d82523d6000602084013e613800565b606091505b50909650505b600061381f601a5460175461357e90919063ffffffff16565b601b5460145461382e9161357e565b6138389190615468565b90506000811561384f5761384c4783613682565b90505b60008161386960145460175461357e90919063ffffffff16565b61387391906152e9565b905060008261388f601b54601a5461357e90919063ffffffff16565b61389991906152e9565b905081156138f957600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146138ee576040519150601f19603f3d011682016040523d82523d6000602084013e6138f3565b606091505b50909950505b801561395757600f546040516001600160a01b03909116908290600081818185875af1925050503d806000811461394c576040519150601f19603f3d011682016040523d82523d6000602084013e613951565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0876139838385615468565b8c801561398d57508b5b801561399657508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006135dd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614a10565b6001600160a01b038316613a815760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b038216613afd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316613bdb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b038216613c575760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401611220565b613c9481604051806060016040528060268152602001615509602691396001600160a01b0386166000908152602081905260409020549190614a10565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613cc3908261357e565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613b52565b6001600160a01b038316613d905760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b038216613e0c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b038316600090815260246020526040812054819081908190819060ff16613ea057600854760100000000000000000000000000000000000000000000900460ff16613ea05760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401611220565b602b5460ff16158015613ec25750602b5461010090046001600160a01b031615155b15613f6457613ed18888614d4a565b1580613ef557506001600160a01b0388166000908152602c602052604090205460ff165b80613f1857506001600160a01b0387166000908152602c602052604090205460ff165b613f645760405162461bcd60e51b815260206004820152601260248201527f21617661696c61626c652074726164696e6700000000000000000000000000006044820152606401611220565b85600003613f8257613f7888886000613b5f565b5050505050505050565b60085474010000000000000000000000000000000000000000900460ff16158015613fc657506001600160a01b0388166000908152601f602052604090205460ff16155b8015613feb57506001600160a01b0387166000908152601f602052604090205460ff16155b15614828576001600160a01b03808816600090815260208052604080822054928b16825290205460ff918216911680158015614025575081155b1561416b5760006140466064611273601c548c6135e490919063ffffffff16565b905061405289826139c4565b985061405f8b3083613b5f565b61406a8b8b8b613b5f565b600d546001600160a01b031663e30443bc8c61408581614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156140cb57600080fd5b505af11580156140df573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b61410081614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561414657600080fd5b505af115801561415a573d6000803e3d6000fd5b505050505050505050505050505050565b801580156141825750600854600160a81b900460ff165b15614239576001600160a01b038a166000908152602260205260409020544210156141ef5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401611220565b6001600160a01b038a1660009081526022602052604090205415614234576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b6144d1565b81156142e957601254601354601454601554601b54602554949b509299509097509550935060ff161561423457602a54326000908152602860205260409020546142839190615468565b4210156142d25760405162461bcd60e51b815260206004820152601660248201527f636f6f6c646f776e20706572696f6420616374697665000000000000000000006044820152606401611220565b3260009081526028602052604090204290556144d1565b80156144d157601954601654601754601854601a54602554949b509299509097509550935060ff161561443657602954614324906002615468565b43116143725760405162461bcd60e51b815260206004820152601260248201527f796f75207368616c6c206e6f74207061737300000000000000000000000000006044820152606401611220565b6026543a11156143c45760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401611220565b326000908152602760205260409020544390036144235760405162461bcd60e51b815260206004820152601460248201527f546f6f206d616e7920545820696e20626c6f636b0000000000000000000000006044820152606401611220565b3260009081526027602052604090204390555b6001600160a01b03891660009081526020819052604090205460105461445c8a83615468565b11156144cf5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f60448201527f756e742e000000000000000000000000000000000000000000000000000000006064820152608401611220565b505b60006144f2846144e18888615468565b6144eb9190615468565b899061357e565b30600090815260208190526040902054601154919250908110801590819061453257506001600160a01b038d16600090815260208052604090205460ff16155b1561469557600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055601d5460ff1680156145885750600087115b801561459657506000600c54115b156146485760006145b4600954600a5461357e90919063ffffffff16565b905060006145d182611273600a54876135e490919063ffffffff16565b905060006145ee83611273600954886135e490919063ffffffff16565b9050600061460b600c546112738d866135e490919063ffffffff16565b90506000614628600b546112738e866135e490919063ffffffff16565b90506000614636828461357e565b905061464181614dbd565b5050505050505b30600090815260208190526040902054614661816136c4565b506000600a819055600955600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555b60006146a660646112738e876135e4565b905060008a156146f95760646146bc8e8d6135e4565b6146c69190615446565b90506146e88f600860009054906101000a90046001600160a01b031683613b5f565b6002546146f590826139c4565b6002555b61470d6147068284615468565b8e906139c4565b9c50861561472a57600954614722908361357e565b60095561473b565b600a54614737908361357e565b600a555b6147468f3084613b5f565b601e54600d546040517fffb2c479000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156147c9575060408051601f3d908101601f191682019092526147c6918101906153c5565b60015b1561481f5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b614833888888613b5f565b600d546001600160a01b031663e30443bc8961484e81614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561489457600080fd5b505af11580156148a8573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050886148c981614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561490f57600080fd5b505af1158015614923573d6000803e3d6000fd5b50506006546001600160a01b038b811691161480159250905061495e57506001600160a01b038816600090815260208052604090205460ff16155b801561497c5750602b546001600160a01b0388811661010090920416145b15613f7857602b546040517f7f6d608a000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b038a8116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b1580156149ee57600080fd5b505af1158015614a02573d6000803e3d6000fd5b505050505050505050505050565b60008184841115614a345760405162461bcd60e51b81526004016112209190614f2b565b506000614a418486615480565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff19168215801591909117909155614ad657600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015614abd57600080fd5b505af1158015614ad1573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff16614b44576001600160a01b0382166000908152602081905260409020546114be565b6001600160a01b0382166000908152602160205260409020546114be9060649061127390614b72908361357e565b6001600160a01b038616600090815260208190526040902054613749565b60008183614bb15760405162461bcd60e51b81526004016112209190614f2b565b506000614a418486615446565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614bf357614bf3615342565b6001600160a01b03928316602091820292909201810191909152600654604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015614c65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c899190615372565b81600181518110614c9c57614c9c615342565b6001600160a01b039283166020918202929092010152600654614cc29130911684613a06565b6006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790614d14908590600090869030904290600401615497565b600060405180830381600087803b158015614d2e57600080fd5b505af1158015614d42573d6000803e3d6000fd5b505050505050565b6001600160a01b038216600090815260208052604081205460ff168015614d7f57506006546001600160a01b03838116911614155b15614d8c575060016114be565b6001600160a01b038216600090815260208052604090205460ff1615614db4575060026114be565b50600092915050565b6000614dca826002613682565b90506000614dd883836139c4565b905047614de483614bbe565b6000614df047836139c4565b9050614dfc8382614e44565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b600654614e5c9030906001600160a01b031684613a06565b6006546001600160a01b031663f305d719823085600080614e856005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015614eed573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a2091906153c5565b600060208284031215614f2457600080fd5b5035919050565b600060208083528351808285015260005b81811015614f5857858101830151858201604001528201614f3c565b81811115614f6a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611b7e57600080fd5b8015158114611b7e57600080fd5b60008060408385031215614fb657600080fd5b8235614fc181614f80565b91506020830135614fd181614f95565b809150509250929050565b60008060408385031215614fef57600080fd5b8235614ffa81614f80565b946020939093013593505050565b6000806040838503121561501b57600080fd5b50508035926020909101359150565b60006020828403121561503c57600080fd5b81356135dd81614f80565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561508657615086615047565b604052919050565b600067ffffffffffffffff8211156150a8576150a8615047565b5060051b60200190565b600082601f8301126150c357600080fd5b813560206150d86150d38361508e565b61505d565b82815260059290921b840181019181810190868411156150f757600080fd5b8286015b8481101561511257803583529183019183016150fb565b509695505050505050565b6000806040838503121561513057600080fd5b823567ffffffffffffffff8082111561514857600080fd5b818501915085601f83011261515c57600080fd5b8135602061516c6150d38361508e565b82815260059290921b8401810191818101908984111561518b57600080fd5b948201945b838610156151b25785356151a381614f80565b82529482019490820190615190565b965050860135925050808211156151c857600080fd5b506151d5858286016150b2565b9150509250929050565b6000806000606084860312156151f457600080fd5b83356151ff81614f80565b9250602084013561520f81614f80565b929592945050506040919091013590565b60006020828403121561523257600080fd5b81356135dd81614f95565b6000806000806000806000806000806101408b8d03121561525d57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156152b857600080fd5b82356152c381614f80565b91506020830135614fd181614f80565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615303576153036152d3565b500290565b600181811c9082168061531c57607f821691505b60208210810361533c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600019820361536b5761536b6152d3565b5060010190565b60006020828403121561538457600080fd5b81516135dd81614f80565b6000602082840312156153a157600080fd5b5051919050565b6000602082840312156153ba57600080fd5b81516135dd81614f95565b6000806000606084860312156153da57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561540c57600080fd5b865161541781614f80565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b60008261546357634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561547b5761547b6152d3565b500190565b600082821015615492576154926152d3565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156154e75784516001600160a01b0316835293830193918301916001016154c2565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220780baa1dc634e3c6f260ffdef3921f7ee6d62c90e3a9f29061c9cb7423ff432064736f6c634300080f003360806040526012805460ff60b01b191690553480156200001e57600080fd5b506040516200370b3803806200370b833981016040819052620000419162000243565b8181818160036200005383826200037d565b5060046200006282826200037d565b50505050506000620000796200015960201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d583826200037d565b506014620000e482826200037d565b505060128054601680546001600160a01b03199081166001600160a01b03988916179091556a52b7d2dcc80cd2e400000060188190556019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b19169091555062000449565b3390565b6001600160a01b03811681146200017357600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200019e57600080fd5b81516001600160401b0380821115620001bb57620001bb62000176565b604051601f8301601f19908116603f01168101908282118183101715620001e657620001e662000176565b816040528381526020925086838588010111156200020357600080fd5b600091505b8382101562000227578582018301518183018401529082019062000208565b83821115620002395760008385830101525b9695505050505050565b600080600080600060a086880312156200025c57600080fd5b855162000269816200015d565b60208701519095506200027c816200015d565b60408701519094506200028f816200015d565b60608701519093506001600160401b0380821115620002ad57600080fd5b620002bb89838a016200018c565b93506080880151915080821115620002d257600080fd5b50620002e1888289016200018c565b9150509295509295909350565b600181811c908216806200030357607f821691505b6020821081036200032457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200037857600081815260208120601f850160051c81016020861015620003535750805b601f850160051c820191505b8181101562000374578281556001016200035f565b5050505b505050565b81516001600160401b0381111562000399576200039962000176565b620003b181620003aa8454620002ee565b846200032a565b602080601f831160018114620003e95760008415620003d05750858301515b600019600386901b1c1916600185901b17855562000374565b600085815260208120601f198616915b828110156200041a57888601518255948401946001909101908401620003f9565b5085821015620004395787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6132b280620004596000396000f3fe60806040526004361061034e5760003560e01c80636d48467b116101bb578063a8b9d240116100f7578063d8032ed311610095578063e7841ec01161006f578063e7841ec014610a40578063f2fde38b14610a55578063fbcbc0f114610a75578063ffb2c47914610a9557600080fd5b8063d8032ed3146109ba578063dd62ed3e146109da578063e30443bc14610a2057600080fd5b8063b22f8a04116100d1578063b22f8a041461093a578063ba079d491461095a578063bc4c4b371461097a578063d1a73b2b1461099a57600080fd5b8063a8b9d240146108c4578063a9059cbb146108e4578063aafd847a1461090457600080fd5b80638da5cb5b116101645780639c3372ea1161013e5780639c3372ea146108315780639eec101e14610851578063a423406914610883578063a457c2d7146108a457600080fd5b80638da5cb5b146107de57806391b89fba146107fc57806395d89b411461081c57600080fd5b806374c13fda1161019557806374c13fda1461078857806385a6b3ae146107a85780638bc1d639146107be57600080fd5b80636d48467b1461071d57806370a082311461073d578063715018a61461077357600080fd5b8063313ce5671161028a5780634e7b827f116102335780635ebf4db91161020d5780635ebf4db91461069857806365b8dbc0146106b85780636a474002146106d85780636b69163b146106ed57600080fd5b80634e7b827f146105f15780635183d6fd146106215780635a84c5eb1461067857600080fd5b80633950935111610264578063395093511461057e57806340ffdd801461059e57806341808904146105be57600080fd5b8063313ce5671461052257806331e79db01461053e5780633599bb171461055e57600080fd5b806318160ddd116102f757806323b872dd116102d157806323b872dd146104ae57806325cd3598146104ce57806327ce0147146104ec5780633009a6091461050c57600080fd5b806318160ddd1461043c5780631d4ff89a14610451578063226cfa3d1461048157600080fd5b8063095ea7b311610328578063095ea7b3146103b557806309bbedde146103e55780631694505e1461040457600080fd5b806303c833021461036257806306fdde031461036a578063092884711461039557600080fd5b3661035d5761035b610ad0565b005b600080fd5b61035b610ad0565b34801561037657600080fd5b5061037f610b70565b60405161038c9190612d93565b60405180910390f35b3480156103a157600080fd5b5061035b6103b0366004612e1e565b610c02565b3480156103c157600080fd5b506103d56103d0366004612e3b565b610c82565b604051901515815260200161038c565b3480156103f157600080fd5b50600a545b60405190815260200161038c565b34801561041057600080fd5b50601554610424906001600160a01b031681565b6040516001600160a01b03909116815260200161038c565b34801561044857600080fd5b506002546103f6565b34801561045d57600080fd5b506103d561046c366004612e1e565b60116020526000908152604090205460ff1681565b34801561048d57600080fd5b506103f661049c366004612e1e565b60176020526000908152604090205481565b3480156104ba57600080fd5b506103d56104c9366004612e67565b610c99565b3480156104da57600080fd5b506012546001600160a01b0316610424565b3480156104f857600080fd5b506103f6610507366004612e1e565b610d02565b34801561051857600080fd5b506103f6600e5481565b34801561052e57600080fd5b506040516012815260200161038c565b34801561054a57600080fd5b5061035b610559366004612e1e565b610d6b565b34801561056a57600080fd5b5061035b610579366004612eb6565b610e35565b34801561058a57600080fd5b506103d5610599366004612e3b565b610f21565b3480156105aa57600080fd5b5061035b6105b9366004612eb6565b610f57565b3480156105ca57600080fd5b506012546103d5907501000000000000000000000000000000000000000000900460ff1681565b3480156105fd57600080fd5b506103d561060c366004612e1e565b600f6020526000908152604090205460ff1681565b34801561062d57600080fd5b5061064161063c366004612ed3565b61104a565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161038c565b34801561068457600080fd5b5061035b610693366004612ed3565b6110aa565b3480156106a457600080fd5b5061035b6106b3366004612ed3565b61111c565b3480156106c457600080fd5b5061035b6106d3366004612e1e565b61118e565b3480156106e457600080fd5b5061035b611217565b3480156106f957600080fd5b506103d5610708366004612e1e565b60106020526000908152604090205460ff1681565b34801561072957600080fd5b506103d5610738366004612e1e565b6112d1565b34801561074957600080fd5b506103f6610758366004612e1e565b6001600160a01b031660009081526020819052604090205490565b34801561077f57600080fd5b5061035b61134d565b34801561079457600080fd5b50601254610424906001600160a01b031681565b3480156107b457600080fd5b506103f660085481565b3480156107ca57600080fd5b5061035b6107d9366004612eec565b6113fe565b3480156107ea57600080fd5b506009546001600160a01b0316610424565b34801561080857600080fd5b506103f6610817366004612e1e565b611483565b34801561082857600080fd5b5061037f61148e565b34801561083d57600080fd5b5061035b61084c366004612eb6565b61149d565b34801561085d57600080fd5b506012546103d59074010000000000000000000000000000000000000000900460ff1681565b34801561088f57600080fd5b506012546103d590600160b01b900460ff1681565b3480156108b057600080fd5b506103d56108bf366004612e3b565b61158f565b3480156108d057600080fd5b506103f66108df366004612e1e565b6115de565b3480156108f057600080fd5b506103d56108ff366004612e3b565b61160a565b34801561091057600080fd5b506103f661091f366004612e1e565b6001600160a01b031660009081526007602052604090205490565b34801561094657600080fd5b5061035b610955366004612eec565b611617565b34801561096657600080fd5b506103d5610975366004612e1e565b61169c565b34801561098657600080fd5b506103d5610995366004612eec565b611718565b3480156109a657600080fd5b50601654610424906001600160a01b031681565b3480156109c657600080fd5b5061035b6109d5366004612e1e565b6118db565b3480156109e657600080fd5b506103f66109f5366004612f25565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a2c57600080fd5b5061035b610a3b366004612e3b565b611964565b348015610a4c57600080fd5b50600e546103f6565b348015610a6157600080fd5b5061035b610a70366004612e1e565b611a2c565b348015610a8157600080fd5b50610641610a90366004612e1e565b611b6b565b348015610aa157600080fd5b50610ab5610ab0366004612ed3565b611c1a565b6040805193845260208401929092529082015260600161038c565b6000610adb60025490565b11610ae557600080fd5b3415610b6e57610b25610af760025490565b610b1234700100000000000000000000000000000000611d40565b610b1c9190612f69565b60055490611de5565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b6a9034611de5565b6008555b565b606060138054610b7f90612f8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bab90612f8b565b8015610bf85780601f10610bcd57610100808354040283529160200191610bf8565b820191906000526020600020905b815481529060010190602001808311610bdb57829003601f168201915b5050505050905090565b6009546001600160a01b03163314610c615760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c8f338484611e44565b5060015b92915050565b6000610ca6848484611f9c565b610cf88433610cf385604051806060016040528060288152602001613230602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061200f565b611e44565b5060019392505050565b6001600160a01b0381166000908152600660209081526040808320549183905282205460055470010000000000000000000000000000000092610d6192610d5c92610d5691610d519190611d40565b612049565b90612059565b612097565b610c939190612f69565b6009546001600160a01b03163314610dc55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610df39082906120aa565b610dfe600a82612109565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610e8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b801515601260169054906101000a900460ff16151503610eae57600080fd5b60128054821515600160b01b027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff9091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610f1690831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c8f918590610cf39086611de5565b6009546001600160a01b03163314610fb15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b801515601260159054906101000a900460ff16151503610fd057600080fd5b601280548215157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610f1690831515815260200190565b60008060008060008061105c600a5490565b871061107b5750600094506000199350839250849150819050806110a1565b6000611088600a8961225e565b905061109381611b6b565b965096509650965096509650505b91939550919395565b6009546001600160a01b031633146111045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b61111681670de0b6b3a7640000612fc5565b60185550565b6009546001600160a01b031633146111765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b61118881670de0b6b3a7640000612fc5565b60195550565b6009546001600160a01b031633146111e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152606160248201527f64626173655f4469766964656e645f547261636b65723a20776974686472617760448201527f4469766964656e642064697361626c65642e20557365207468652027636c616960648201527f6d272066756e6374696f6e206f6e20746865206d61696e20636f6e747261637460848201527f2e0000000000000000000000000000000000000000000000000000000000000060a482015260c401610c58565b6009546000906001600160a01b0316331461132e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146113a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36009805473ffffffffffffffffffffffffffffffffffffffff19169055565b6009546001600160a01b031633146114585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c93826115de565b606060148054610b7f90612f8b565b6009546001600160a01b031633146114f75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b801515601260149054906101000a900460ff1615150361151657600080fd5b6012805482151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610f1690831515815260200190565b6000610c8f3384610cf385604051806060016040528060258152602001613258602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061200f565b6001600160a01b038116600090815260076020526040812054610c939061160484610d02565b90612291565b6000610c8f338484611f9c565b6009546001600160a01b031633146116715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b031633146116f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146117755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b601254600160b01b900460ff161561178f57506000610c93565b6001600160a01b03831660009081526011602052604090205460ff168280156117b55750805b80156117dd57506012547501000000000000000000000000000000000000000000900460ff16155b156117ec576000915050610c93565b600081611801576117fc856122d3565b61180a565b61180a856125be565b905080156118d0576001600160a01b0385166000908152601760205260409020429055811561187e57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c8360405161187191815260200190565b60405180910390a36118c5565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040516118bc91815260200190565b60405180910390a35b600192505050610c93565b506000949350505050565b6009546001600160a01b031633146119355760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b6012805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6009546001600160a01b031633146119be5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b6001600160a01b0382166000908152600f602052604090205460ff166119fe57601954811015611a02576119f3600a83612109565b6119fe8260006120aa565b5050565b611a0c82826120aa565b6018548110611a21576119fe600a83836129ae565b6119fe600a83612109565b6009546001600160a01b03163314611a865760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c58565b6001600160a01b038116611b025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c58565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b80600080808080611b7d600a87612a64565b9450600019935060008512611bdf57600e54851115611bab57600e54611ba4908690612aaf565b9350611bdf565b600e54600a5460009110611bc0576000611bcf565b600e54600a54611bcf91612291565b9050611bdb8682612059565b9450505b611be8866115de565b9250611bf386610d02565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a5460009081908190801580611c3a5750601254600160b01b900460ff165b15611c50575050600e5460009250829150611d39565b600e546000805a90506000805b8984108015611c6b57508582105b15611d285784611c7a81612fe4565b955050858510611c8957600094505b6000600a6000018681548110611ca157611ca1612ffe565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff16611cee57611cdb816001611718565b15611cee5781611cea81612fe4565b9250505b82611cf881612fe4565b93505060005a905080851115611d1f57611d1c611d158683612291565b8790611de5565b95505b9350611c5d9050565b600e85905590975095509193505050505b9193909250565b600082600003611d5257506000610c93565b6000611d5e8385612fc5565b905082611d6b8583612f69565b14611dde5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610c58565b9392505050565b600080611df28385613014565b905083811015611dde5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c58565b6001600160a01b038316611ebf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c58565b6001600160a01b038216611f3b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610c58565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602c60248201527f64626173655f4469766964656e645f547261636b65723a204e6f207472616e7360448201527f6665727320616c6c6f77656400000000000000000000000000000000000000006064820152608401610c58565b505050565b600081848411156120335760405162461bcd60e51b8152600401610c589190612d93565b506000612040848661302c565b95945050505050565b60008181811215610c9357600080fd5b6000806120668385613043565b9050600083121580156120795750838112155b8061208e575060008312801561208e57508381125b611dde57600080fd5b6000808212156120a657600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156120e95760006120d78383612291565b90506120e38482612aec565b50505050565b8082101561200a5760006120fd8284612291565b90506120e38482612b50565b6001600160a01b038116600090815260038301602052604090205460ff1661212f575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff19169055600180860183528184208490556002860190925282205484549092916121799161302c565b9050600084600001828154811061219257612192612ffe565b60009182526020808320909101546001600160a01b039081168084526002890190925260408084208790559087168352822091909155855490915081908690859081106121e1576121e1612ffe565b6000918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790558454859080612228576122286130b7565b6000828152602090208101600019908101805473ffffffffffffffffffffffffffffffffffffffff191690550190555050505050565b600082600001828154811061227557612275612ffe565b6000918252602090912001546001600160a01b03169392505050565b6000611dde83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061200f565b6000806122df836115de565b905080156125b5576001600160a01b03831660009081526007602052604090205461230a9082611de5565b6001600160a01b0380851660009081526007602052604081209290925560125416908161238f576040516001600160a01b03861690610bb89085906000818181858888f193505050503d806000811461237f576040519150601f19603f3d011682016040523d82523d6000602084013e612384565b606091505b50508091505061251b565b6040805160028082526060820183526000926020830190803683375050601554604080517fad5c464800000000000000000000000000000000000000000000000000000000815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612412573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243691906130cd565b8160008151811061244957612449612ffe565b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061247d5761247d612ffe565b6001600160a01b0392831660209182029290920101526015546040517fb6f9de9500000000000000000000000000000000000000000000000000000000815291169063b6f9de959086906124dc9060009086908c90429060040161312e565b6000604051808303818588803b1580156124f557600080fd5b505af193505050508015612507575060015b6125145760009150612519565b600191505b505b80612569576001600160a01b0385166000908152600760205260409020546125439084612291565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d846040516125a491815260200190565b60405180910390a250909392505050565b50600092915050565b6000806125ca836115de565b905080156125b5576001600160a01b0383166000908152600760205260408120546125f59083611de5565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080517fad5c464800000000000000000000000000000000000000000000000000000000815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ba91906130cd565b816000815181106126cd576126cd612ffe565b6001600160a01b0392831660209182029290920101526016548251911690829060019081106126fe576126fe612ffe565b6001600160a01b0392831660209182029290920101526016546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009291909116906370a0823190602401602060405180830381865afa158015612771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127959190613163565b6015546040517fb6f9de950000000000000000000000000000000000000000000000000000000081529192506001600160a01b03169063b6f9de959086906127e89060009087903090429060040161312e565b6000604051808303818588803b15801561280157600080fd5b505af193505050508015612813575060015b6128205760009250612955565b6016546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916128ac9184916001600160a01b0316906370a0823190602401602060405180830381865afa158015612888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116049190613163565b9050801561294e576016546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af1158015612924573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612948919061317c565b50612953565b600093505b505b826129a4576001600160a01b03861660009081526007602052604090205461297d9085612291565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff16156129f3576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff191660019081179091558781018352818420869055875460028901845291842082905581018755868352912001805473ffffffffffffffffffffffffffffffffffffffff19169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff16612a8f5750600019610c93565b506001600160a01b03166000908152600291909101602052604090205490565b600080612abc8385613199565b905060008312158015612acf5750838113155b8061208e575060008312801561208e5750838113611dde57600080fd5b612af68282612b94565b612b30612b11610d5183600554611d4090919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490612aaf565b6001600160a01b0390921660009081526006602052604090209190915550565b612b5a8282612c73565b612b30612b75610d5183600554611d4090919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490612059565b6001600160a01b038216612bea5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c58565b600254612bf79082611de5565b6002556001600160a01b038216600090815260208190526040902054612c1d9082611de5565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216612cef5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610c58565b612d2c8160405180606001604052806022815260200161320e602291396001600160a01b038516600090815260208190526040902054919061200f565b6001600160a01b038316600090815260208190526040902055600254612d529082612291565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612c67565b600060208083528351808285015260005b81811015612dc057858101830151858201604001528201612da4565b81811115612dd2576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6001600160a01b0381168114612e1b57600080fd5b50565b600060208284031215612e3057600080fd5b8135611dde81612e06565b60008060408385031215612e4e57600080fd5b8235612e5981612e06565b946020939093013593505050565b600080600060608486031215612e7c57600080fd5b8335612e8781612e06565b92506020840135612e9781612e06565b929592945050506040919091013590565b8015158114612e1b57600080fd5b600060208284031215612ec857600080fd5b8135611dde81612ea8565b600060208284031215612ee557600080fd5b5035919050565b60008060408385031215612eff57600080fd5b8235612f0a81612e06565b91506020830135612f1a81612ea8565b809150509250929050565b60008060408385031215612f3857600080fd5b8235612f4381612e06565b91506020830135612f1a81612e06565b634e487b7160e01b600052601160045260246000fd5b600082612f8657634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680612f9f57607f821691505b602082108103612fbf57634e487b7160e01b600052602260045260246000fd5b50919050565b6000816000190483118215151615612fdf57612fdf612f53565b500290565b60006000198203612ff757612ff7612f53565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000821982111561302757613027612f53565b500190565b60008282101561303e5761303e612f53565b500390565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561307d5761307d612f53565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156130b1576130b1612f53565b50500190565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156130df57600080fd5b8151611dde81612e06565b600081518084526020808501945080840160005b838110156131235781516001600160a01b0316875295820195908201906001016130fe565b509495945050505050565b84815260806020820152600061314760808301866130ea565b6001600160a01b03949094166040830152506060015292915050565b60006020828403121561317557600080fd5b5051919050565b60006020828403121561318e57600080fd5b8151611dde81612ea8565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156131d3576131d3612f53565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561320757613207612f53565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206e626b3a42f874b81ec336c23b9f0697af305d5d4fa3f0c1ebb0dbe7dbcda82564736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106106065760003560e01c80637d32f34211610317578063aa4704f3116101a5578063dd62ed3e116100ec578063f2fde38b11610095578063f72f863b1161006f578063f72f863b14611186578063f8b45b05146111a6578063fc6b151c146111bc57600080fd5b8063f2fde38b14611130578063f5d3c79a14611150578063f63743421461117057600080fd5b8063f11a24d3116100c6578063f11a24d3146110cd578063f1c0ddff146110e3578063f27fd2541461111057600080fd5b8063dd62ed3e1461105c578063e2f45605146110a2578063e7841ec0146110b857600080fd5b8063ba079d491161014e578063d5e3725111610128578063d5e3725114611007578063d7b837dd14611027578063d8032ed31461103c57600080fd5b8063ba079d4914610fb1578063bb8d513114610fd1578063d07a091c14610fe757600080fd5b8063b49429881161017f578063b494298814610f4c578063b62496f514610f62578063b74e3b1114610f9157600080fd5b8063aa4704f314610e87578063acb2ad6f14610edf578063ad56c13c14610ef557600080fd5b80639a7a23d611610269578063a0d82dc511610212578063a8b9d240116101ec578063a8b9d24014610e27578063a9059cbb14610e47578063a9885de514610e6757600080fd5b8063a0d82dc514610dd1578063a457c2d714610de7578063a694fc3a14610e0757600080fd5b80639c3b4fdc116102435780639c3b4fdc14610d7b5780639cefc1da14610d915780639ec1037e14610db157600080fd5b80639a7a23d614610d255780639c1b8af514610d455780639c3372ea14610d5b57600080fd5b8063871c128d116102cb5780638ea5220f116102a55780638ea5220f14610cda57806395451c2914610cfa57806395d89b4114610d1057600080fd5b8063871c128d14610c865780638ca2923a14610ca65780638da5cb5b14610cbc57600080fd5b8063837ae2d0116102fc578063837ae2d014610c265780638577a6d514610c46578063868730c714610c6657600080fd5b80637d32f34214610bd95780637fdde05c14610c0657600080fd5b806349bd5a5e1161049457806364b0f653116103e6578063715018a61161038f57806375f0a8741161036957806375f0a87414610b8957806377a3b60914610ba95780637928dd1d14610bbf57600080fd5b8063715018a614610b3457806372d8edf414610b4957806375829def14610b6957600080fd5b80636d48467b116103c05780636d48467b14610abe578063700bb19114610ade57806370a0823114610afe57600080fd5b806364b0f65314610a69578063679ca6e914610a7e5780636843cd8414610a9e57600080fd5b80634fbee193116104485780635c234bb6116104225780635c234bb614610a135780635ebf4db914610a295780635eee4bae14610a4957600080fd5b80634fbee193146109a45780635124f874146109dd5780635a84c5eb146109f357600080fd5b80634a74bb02116104795780634a74bb02146109415780634ada218b1461095b5780634e71d92d1461098f57600080fd5b806349bd5a5e146109075780634a62bb651461092757600080fd5b806321cbb02411610558578063313ce567116105015780633f407b84116104db5780633f407b84146108a457806340ffdd80146108ba578063435c89e4146108da57600080fd5b8063313ce567146108485780633599bb1714610864578063395093511461088457600080fd5b806325cd35981161053257806325cd3598146107fe5780632c1f52161461081357806330bb4cff1461083357600080fd5b806321cbb0241461078e5780632307b441146107be57806323b872dd146107de57600080fd5b8063095ea7b3116105ba57806318160ddd1161059457806318160ddd146107435780631d7b1fb4146107625780631fa705311461077857600080fd5b8063095ea7b3146106d35780630ef35b7e146107035780631694505e1461072357600080fd5b806306fdde03116105eb57806306fdde031461067157806308dfe8a51461069357806309231602146106b357600080fd5b806303fd2a451461061257806305ca5f081461064f57600080fd5b3661060d57005b600080fd5b34801561061e57600080fd5b50600854610632906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561065b57600080fd5b5061066f61066a366004614f12565b6111dc565b005b34801561067d57600080fd5b506106866112c7565b6040516106469190614f2b565b34801561069f57600080fd5b5061066f6106ae366004614fa3565b611359565b3480156106bf57600080fd5b5061066f6106ce366004614f12565b611400565b3480156106df57600080fd5b506106f36106ee366004614fdc565b6114ad565b6040519015158152602001610646565b34801561070f57600080fd5b5061066f61071e366004615008565b6114c4565b34801561072f57600080fd5b50600654610632906001600160a01b031681565b34801561074f57600080fd5b506002545b604051908152602001610646565b34801561076e57600080fd5b50610754602a5481565b34801561078457600080fd5b50610754600a5481565b34801561079a57600080fd5b506106f36107a936600461502a565b602c6020526000908152604090205460ff1681565b3480156107ca57600080fd5b5061066f6107d936600461511d565b6115c7565b3480156107ea57600080fd5b506106f36107f93660046151df565b6117e7565b34801561080a57600080fd5b50610632611850565b34801561081f57600080fd5b50600d54610632906001600160a01b031681565b34801561083f57600080fd5b506107546118dc565b34801561085457600080fd5b5060405160128152602001610646565b34801561087057600080fd5b5061066f61087f366004615220565b611963565b34801561089057600080fd5b506106f361089f366004614fdc565b611a27565b3480156108b057600080fd5b5061075460095481565b3480156108c657600080fd5b5061066f6108d5366004615220565b611a5d565b3480156108e657600080fd5b506107546108f5366004614f12565b60236020526000908152604090205481565b34801561091357600080fd5b50600754610632906001600160a01b031681565b34801561093357600080fd5b506025546106f39060ff1681565b34801561094d57600080fd5b50601d546106f39060ff1681565b34801561096757600080fd5b506008546106f390760100000000000000000000000000000000000000000000900460ff1681565b34801561099b57600080fd5b5061066f611af0565b3480156109b057600080fd5b506106f36109bf36600461502a565b6001600160a01b03166000908152601f602052604090205460ff1690565b3480156109e957600080fd5b5061075460175481565b3480156109ff57600080fd5b5061066f610a0e366004614f12565b611b81565b348015610a1f57600080fd5b5061075460165481565b348015610a3557600080fd5b5061066f610a44366004614f12565b611c13565b348015610a5557600080fd5b5061066f610a64366004614f12565b611ca5565b348015610a7557600080fd5b50610754611d05565b348015610a8a57600080fd5b5061066f610a99366004615220565b611d68565b348015610aaa57600080fd5b50610754610ab936600461502a565b611dc3565b348015610aca57600080fd5b506106f3610ad936600461502a565b611e4c565b348015610aea57600080fd5b5061066f610af9366004614f12565b611ed5565b348015610b0a57600080fd5b50610754610b1936600461502a565b6001600160a01b031660009081526020819052604090205490565b348015610b4057600080fd5b5061066f611fbd565b348015610b5557600080fd5b5061066f610b6436600461502a565b612067565b348015610b7557600080fd5b5061066f610b8436600461502a565b6120e1565b348015610b9557600080fd5b50600e54610632906001600160a01b031681565b348015610bb557600080fd5b5061075460195481565b348015610bcb57600080fd5b50602b546106f39060ff1681565b348015610be557600080fd5b50610754610bf436600461502a565b60226020526000908152604090205481565b348015610c1257600080fd5b5061066f610c21366004614fa3565b6121b4565b348015610c3257600080fd5b5061066f610c4136600461523d565b612227565b348015610c5257600080fd5b5061066f610c61366004614f12565b612404565b348015610c7257600080fd5b5061066f610c81366004615220565b6124d9565b348015610c9257600080fd5b5061066f610ca1366004614f12565b61252a565b348015610cb257600080fd5b5061075460135481565b348015610cc857600080fd5b506005546001600160a01b0316610632565b348015610ce657600080fd5b50600f54610632906001600160a01b031681565b348015610d0657600080fd5b5061075460145481565b348015610d1c57600080fd5b506106866125c4565b348015610d3157600080fd5b5061066f610d40366004614fa3565b6125d3565b348015610d5157600080fd5b50610754601e5481565b348015610d6757600080fd5b5061066f610d76366004615220565b612629565b348015610d8757600080fd5b50610754601a5481565b348015610d9d57600080fd5b5061066f610dac366004615220565b6126bc565b348015610dbd57600080fd5b5061066f610dcc36600461502a565b61278b565b348015610ddd57600080fd5b50610754601b5481565b348015610df357600080fd5b506106f3610e02366004614fdc565b612899565b348015610e1357600080fd5b5061066f610e22366004614f12565b6128e8565b348015610e3357600080fd5b50610754610e4236600461502a565b612b2b565b348015610e5357600080fd5b506106f3610e62366004614fdc565b612b77565b348015610e7357600080fd5b5061066f610e82366004614fa3565b612b84565b348015610e9357600080fd5b50610eca610ea236600461502a565b6001600160a01b03166000908152602260209081526040808320546021909252909120549091565b60408051928352602083019190915201610646565b348015610eeb57600080fd5b50610754601c5481565b348015610f0157600080fd5b50610f15610f1036600461502a565b612bf7565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610646565b348015610f5857600080fd5b5061075460295481565b348015610f6e57600080fd5b506106f3610f7d36600461502a565b602080526000908152604090205460ff1681565b348015610f9d57600080fd5b5061066f610fac366004614f12565b612ca0565b348015610fbd57600080fd5b506106f3610fcc36600461502a565b612d65565b348015610fdd57600080fd5b5061075460125481565b348015610ff357600080fd5b5061066f61100236600461502a565b612db1565b34801561101357600080fd5b5061066f611022366004615220565b612ec4565b34801561103357600080fd5b5061066f612f64565b34801561104857600080fd5b5061066f61105736600461502a565b612fcb565b34801561106857600080fd5b506107546110773660046152a5565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156110ae57600080fd5b5061075460115481565b3480156110c457600080fd5b506107546130c5565b3480156110d957600080fd5b5061075460185481565b3480156110ef57600080fd5b506107546110fe36600461502a565b60216020526000908152604090205481565b34801561111c57600080fd5b50610f1561112b366004614f12565b613128565b34801561113c57600080fd5b5061066f61114b36600461502a565b61317f565b34801561115c57600080fd5b5061066f61116b366004615220565b6132b7565b34801561117c57600080fd5b5061075460155481565b34801561119257600080fd5b5061066f6111a136600461502a565b613308565b3480156111b257600080fd5b5061075460105481565b3480156111c857600080fd5b5061066f6111d7366004614f12565b613498565b6005546001600160a01b031633146112295760405162461bcd60e51b8152602060048201819052602482015260008051602061555783398151915260448201526064015b60405180910390fd5b61123b81670de0b6b3a76400006152e9565b90506000611256600954600a5461357e90919063ffffffff16565b9050600061127982611273600a54866135e490919063ffffffff16565b90613682565b9050600061129683611273600954876135e490919063ffffffff16565b90506112a1846136c4565b600a546112ae90836139c4565b600a556009546112be90826139c4565b60095550505050565b6060600380546112d690615308565b80601f016020809104026020016040519081016040528092919081815260200182805461130290615308565b801561134f5780601f106113245761010080835404028352916020019161134f565b820191906000526020600020905b81548152906001019060200180831161133257829003601f168201915b5050505050905090565b6005546001600160a01b031633146113a15760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146114485760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b60018110156114995760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f77203100000000000000006044820152606401611220565b6114a781633b9aca006152e9565b60265550565b60006114ba338484613a06565b5060015b92915050565b6005546001600160a01b0316331461150c5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b60008281526023602052604090205481900361152757600080fd5b60648111156115785760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303000006044820152606401611220565b60008281526023602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b0316331461160f5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b80518251146116605760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401611220565b60c8825111156116d85760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d203260448201527f30300000000000000000000000000000000000000000000000000000000000006064820152608401611220565b60005b82518110156117e25760008382815181106116f8576116f8615342565b60200260200101519050600083838151811061171657611716615342565b6020026020010151670de0b6b3a764000061173191906152e9565b905061173e338383613b5f565b600d546001600160a01b031663e30443bc8361176f816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156117b557600080fd5b505af11580156117c9573d6000803e3d6000fd5b50505050505080806117da90615358565b9150506116db565b505050565b60006117f4848484613d14565b61184684336118418560405180606001604052806028815260200161552f602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614a10565b613a06565b5060019392505050565b600d54604080517f25cd359800000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156118b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d79190615372565b905090565b600d54604080517f85a6b3ae00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561193f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d7919061538f565b6005546001600160a01b031633146119ab5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f3599bb1700000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b158015611a0c57600080fd5b505af1158015611a20573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916114ba918590611841908661357e565b6005546001600160a01b03163314611aa55760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f40ffdd8000000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b03909116906340ffdd80906024016119f2565b600d546040517fbc4c4b37000000000000000000000000000000000000000000000000000000008152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7e91906153a8565b50565b6005546001600160a01b03163314611bc95760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f5a84c5eb000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0390911690635a84c5eb906024016119f2565b6005546001600160a01b03163314611c5b5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f5ebf4db9000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0390911690635ebf4db9906024016119f2565b6005546001600160a01b03163314611ced5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b611cff81670de0b6b3a76400006152e9565b60115550565b600d54604080517f09bbedde00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561193f573d6000803e3d6000fd5b6005546001600160a01b03163314611db05760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6025805460ff1916911515919091179055565b600d546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611e28573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be919061538f565b600d546040517f6d48467b0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611eb1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be91906153a8565b600d546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611f3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6291906153c5565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146120055760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6005546001600160a01b031633146120af5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016119f2565b6005546001600160a01b031633146121295760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561217057600080fd5b505af1158015612184573d6000803e3d6000fd5b5050506001600160a01b0382166000908152601f60205260409020805460ff1916600117905550611b7e8161317f565b6005546001600160a01b031633146121fc5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461226f5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b60168a90556017889055601886905560198490556013899055601487905560158590556012839055601a829055601b8190556122b7816122b18981878a61357e565b9061357e565b600b819055506122e0601a546122b16017546122b160185460195461357e90919063ffffffff16565b600c55600b54600f108015906122f95750600f600c5411155b61236b5760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203135252073656c60448201527f6c206f72206275790000000000000000000000000000000000000000000000006064820152608401611220565b601354601454601554601254601654601754601854601954601a54601b54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b0316331461244c5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600581111561249d5760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f74206578636565642035250000006044820152606401611220565b601c8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c8844720343906020015b60405180910390a150565b600d546040517f8bc1d63900000000000000000000000000000000000000000000000000000000815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016119f2565b6005546001600160a01b031633146125725760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b62030d4081101580156125885750620f42408111155b61259157600080fd5b601e5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601e55565b6060600480546112d690615308565b6005546001600160a01b0316331461261b5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6126258282614a4a565b5050565b6005546001600160a01b031633146126715760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f9c3372ea00000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0390911690639c3372ea906024016119f2565b6005546001600160a01b031633146127045760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b801515600860159054906101000a900460ff1615150361272357600080fd5b60088054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a87906124ce90831515815260200190565b6005546001600160a01b031633146127d35760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517f092884710000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b15801561283357600080fd5b505af1158015612847573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508261286881614b12565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016119f2565b60006114ba338461184185604051806060016040528060258152602001615577602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614a10565b600854600160a81b900460ff166129415760405162461bcd60e51b815260206004820152601660248201527f5374616b696e67206973206e6f7420656e61626c6564000000000000000000006044820152606401611220565b600081815260236020526040812054900361299e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401611220565b6129a8428261357e565b3360009081526022602052604090205410612a2a5760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e676572206475726160448201527f74696f6e000000000000000000000000000000000000000000000000000000006064820152608401611220565b600081815260236020908152604080832054338452602190925290912055612a52428261357e565b33600081815260226020526040902091909155600d546001600160a01b03169063e30443bc90612a8181614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612ac757600080fd5b505af1158015612adb573d6000803e3d6000fd5b50505050612ae63390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c882604051612b2091815260200190565b60405180910390a250565b600d546040517fa8b9d2400000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a8b9d24090602401611e0b565b60006114ba338484613d14565b6005546001600160a01b03163314612bcc5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b03919091166000908152602c60205260409020805460ff1916911515919091179055565b600d546040517ffbcbc0f10000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015612c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8c91906153f3565b949c939b5091995097509550909350915050565b6005546001600160a01b03163314612ce85760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b61012c811115612d605760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d60448201527f696e7574657300000000000000000000000000000000000000000000000000006064820152608401611220565b602a55565b600d546040517fba079d490000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063ba079d4990602401611e94565b6005546001600160a01b03163314612df95760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b0381811660008181526024602081815260408084208054600160ff199182168117909255601f9093529381902080549092169093179055600d54915163031e79db60e41b815260048101939093529216916331e79db09101600060405180830381600087803b158015612e7257600080fd5b505af1158015612e86573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c5925060200190506124ce565b6005546001600160a01b03163314612f0c5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b601d5481151560ff909116151503612f2357600080fd5b601d805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef906020016124ce565b6005546001600160a01b03163314612fac5760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b602b5460ff1615612fbc57600080fd5b602b805460ff19166001179055565b6005546001600160a01b031633146130135760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b600d546040517fd8032ed30000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b15801561307357600080fd5b505af1158015613087573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d925060200190506124ce565b600d54604080517fe7841ec000000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa15801561193f573d6000803e3d6000fd5b600d546040517f5183d6fd00000000000000000000000000000000000000000000000000000000815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612c4b565b6005546001600160a01b031633146131c75760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6001600160a01b0381166132435760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611220565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600d546040517fb22f8a0400000000000000000000000000000000000000000000000000000000815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016119f2565b6005546001600160a01b031633146133505760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b602b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b0384169081029190911790915515613427576001600160a01b038181166000818152602c602090815260408083208054600160ff199182168117909255601f9093529281902080549092169092179055600d54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b15801561340e57600080fd5b505af1158015613422573d6000803e3d6000fd5b505050505b43602955600880547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff167601000000000000000000000000000000000000000000001790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b6005546001600160a01b031633146134e05760405162461bcd60e51b815260206004820181905260248201526000805160206155578339815191526044820152606401611220565b6134f281670de0b6b3a76400006152e9565b90506103e86002546135049190615446565b8110156135795760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c65737360448201527f207468616e20302e3125000000000000000000000000000000000000000000006064820152608401611220565b601055565b60008061358b8385615468565b9050838110156135dd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611220565b9392505050565b6000826000036135f6575060006114be565b600061360283856152e9565b90508261360f8583615446565b146135dd5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401611220565b60006135dd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614b90565b806000036136cf5750565b6136d881614bbe565b60006136f1600954600a5461357e90919063ffffffff16565b6019549091506001908190819060009081908190156137525761374f601a546017546019546137209190615468565b61372a9190615468565b6112736019546137498b611273600a54476135e490919063ffffffff16565b906135e4565b91505b6012541561379c57613799601b546014546012546137709190615468565b61377a9190615468565b6112736012546137498b611273600954476135e490919063ffffffff16565b90505b6137a6828261357e565b9250821561380657600d546040516001600160a01b03909116908490600081818185875af1925050503d80600081146137fb576040519150601f19603f3d011682016040523d82523d6000602084013e613800565b606091505b50909650505b600061381f601a5460175461357e90919063ffffffff16565b601b5460145461382e9161357e565b6138389190615468565b90506000811561384f5761384c4783613682565b90505b60008161386960145460175461357e90919063ffffffff16565b61387391906152e9565b905060008261388f601b54601a5461357e90919063ffffffff16565b61389991906152e9565b905081156138f957600e546040516001600160a01b03909116908390600081818185875af1925050503d80600081146138ee576040519150601f19603f3d011682016040523d82523d6000602084013e6138f3565b606091505b50909950505b801561395757600f546040516001600160a01b03909116908290600081818185875af1925050503d806000811461394c576040519150601f19603f3d011682016040523d82523d6000602084013e613951565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0876139838385615468565b8c801561398d57508b5b801561399657508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b60006135dd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614a10565b6001600160a01b038316613a815760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b038216613afd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316613bdb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b038216613c575760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401611220565b613c9481604051806060016040528060268152602001615509602691396001600160a01b0386166000908152602081905260409020549190614a10565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613cc3908261357e565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613b52565b6001600160a01b038316613d905760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b038216613e0c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401611220565b6001600160a01b038316600090815260246020526040812054819081908190819060ff16613ea057600854760100000000000000000000000000000000000000000000900460ff16613ea05760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401611220565b602b5460ff16158015613ec25750602b5461010090046001600160a01b031615155b15613f6457613ed18888614d4a565b1580613ef557506001600160a01b0388166000908152602c602052604090205460ff165b80613f1857506001600160a01b0387166000908152602c602052604090205460ff165b613f645760405162461bcd60e51b815260206004820152601260248201527f21617661696c61626c652074726164696e6700000000000000000000000000006044820152606401611220565b85600003613f8257613f7888886000613b5f565b5050505050505050565b60085474010000000000000000000000000000000000000000900460ff16158015613fc657506001600160a01b0388166000908152601f602052604090205460ff16155b8015613feb57506001600160a01b0387166000908152601f602052604090205460ff16155b15614828576001600160a01b03808816600090815260208052604080822054928b16825290205460ff918216911680158015614025575081155b1561416b5760006140466064611273601c548c6135e490919063ffffffff16565b905061405289826139c4565b985061405f8b3083613b5f565b61406a8b8b8b613b5f565b600d546001600160a01b031663e30443bc8c61408581614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156140cb57600080fd5b505af11580156140df573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc90508b61410081614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561414657600080fd5b505af115801561415a573d6000803e3d6000fd5b505050505050505050505050505050565b801580156141825750600854600160a81b900460ff165b15614239576001600160a01b038a166000908152602260205260409020544210156141ef5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401611220565b6001600160a01b038a1660009081526022602052604090205415614234576001600160a01b038a16600090815260226020908152604080832083905560219091528120555b6144d1565b81156142e957601254601354601454601554601b54602554949b509299509097509550935060ff161561423457602a54326000908152602860205260409020546142839190615468565b4210156142d25760405162461bcd60e51b815260206004820152601660248201527f636f6f6c646f776e20706572696f6420616374697665000000000000000000006044820152606401611220565b3260009081526028602052604090204290556144d1565b80156144d157601954601654601754601854601a54602554949b509299509097509550935060ff161561443657602954614324906002615468565b43116143725760405162461bcd60e51b815260206004820152601260248201527f796f75207368616c6c206e6f74207061737300000000000000000000000000006044820152606401611220565b6026543a11156143c45760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401611220565b326000908152602760205260409020544390036144235760405162461bcd60e51b815260206004820152601460248201527f546f6f206d616e7920545820696e20626c6f636b0000000000000000000000006044820152606401611220565b3260009081526027602052604090204390555b6001600160a01b03891660009081526020819052604090205460105461445c8a83615468565b11156144cf5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f60448201527f756e742e000000000000000000000000000000000000000000000000000000006064820152608401611220565b505b60006144f2846144e18888615468565b6144eb9190615468565b899061357e565b30600090815260208190526040902054601154919250908110801590819061453257506001600160a01b038d16600090815260208052604090205460ff16155b1561469557600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055601d5460ff1680156145885750600087115b801561459657506000600c54115b156146485760006145b4600954600a5461357e90919063ffffffff16565b905060006145d182611273600a54876135e490919063ffffffff16565b905060006145ee83611273600954886135e490919063ffffffff16565b9050600061460b600c546112738d866135e490919063ffffffff16565b90506000614628600b546112738e866135e490919063ffffffff16565b90506000614636828461357e565b905061464181614dbd565b5050505050505b30600090815260208190526040902054614661816136c4565b506000600a819055600955600880547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690555b60006146a660646112738e876135e4565b905060008a156146f95760646146bc8e8d6135e4565b6146c69190615446565b90506146e88f600860009054906101000a90046001600160a01b031683613b5f565b6002546146f590826139c4565b6002555b61470d6147068284615468565b8e906139c4565b9c50861561472a57600954614722908361357e565b60095561473b565b600a54614737908361357e565b600a555b6147468f3084613b5f565b601e54600d546040517fffb2c479000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156147c9575060408051601f3d908101601f191682019092526147c6918101906153c5565b60015b1561481f5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b50505050505050505b614833888888613b5f565b600d546001600160a01b031663e30443bc8961484e81614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561489457600080fd5b505af11580156148a8573d6000803e3d6000fd5b5050600d546001600160a01b0316915063e30443bc9050886148c981614b12565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561490f57600080fd5b505af1158015614923573d6000803e3d6000fd5b50506006546001600160a01b038b811691161480159250905061495e57506001600160a01b038816600090815260208052604090205460ff16155b801561497c5750602b546001600160a01b0388811661010090920416145b15613f7857602b546040517f7f6d608a000000000000000000000000000000000000000000000000000000008152600481018890526001600160a01b038a8116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b1580156149ee57600080fd5b505af1158015614a02573d6000803e3d6000fd5b505050505050505050505050565b60008184841115614a345760405162461bcd60e51b81526004016112209190614f2b565b506000614a418486615480565b95945050505050565b6001600160a01b03821660009081526020805260409020805460ff19168215801591909117909155614ad657600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015614abd57600080fd5b505af1158015614ad1573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600854600090600160a81b900460ff16614b44576001600160a01b0382166000908152602081905260409020546114be565b6001600160a01b0382166000908152602160205260409020546114be9060649061127390614b72908361357e565b6001600160a01b038616600090815260208190526040902054613749565b60008183614bb15760405162461bcd60e51b81526004016112209190614f2b565b506000614a418486615446565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614bf357614bf3615342565b6001600160a01b03928316602091820292909201810191909152600654604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015614c65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c899190615372565b81600181518110614c9c57614c9c615342565b6001600160a01b039283166020918202929092010152600654614cc29130911684613a06565b6006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790614d14908590600090869030904290600401615497565b600060405180830381600087803b158015614d2e57600080fd5b505af1158015614d42573d6000803e3d6000fd5b505050505050565b6001600160a01b038216600090815260208052604081205460ff168015614d7f57506006546001600160a01b03838116911614155b15614d8c575060016114be565b6001600160a01b038216600090815260208052604090205460ff1615614db4575060026114be565b50600092915050565b6000614dca826002613682565b90506000614dd883836139c4565b905047614de483614bbe565b6000614df047836139c4565b9050614dfc8382614e44565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b600654614e5c9030906001600160a01b031684613a06565b6006546001600160a01b031663f305d719823085600080614e856005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015614eed573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a2091906153c5565b600060208284031215614f2457600080fd5b5035919050565b600060208083528351808285015260005b81811015614f5857858101830151858201604001528201614f3c565b81811115614f6a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611b7e57600080fd5b8015158114611b7e57600080fd5b60008060408385031215614fb657600080fd5b8235614fc181614f80565b91506020830135614fd181614f95565b809150509250929050565b60008060408385031215614fef57600080fd5b8235614ffa81614f80565b946020939093013593505050565b6000806040838503121561501b57600080fd5b50508035926020909101359150565b60006020828403121561503c57600080fd5b81356135dd81614f80565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561508657615086615047565b604052919050565b600067ffffffffffffffff8211156150a8576150a8615047565b5060051b60200190565b600082601f8301126150c357600080fd5b813560206150d86150d38361508e565b61505d565b82815260059290921b840181019181810190868411156150f757600080fd5b8286015b8481101561511257803583529183019183016150fb565b509695505050505050565b6000806040838503121561513057600080fd5b823567ffffffffffffffff8082111561514857600080fd5b818501915085601f83011261515c57600080fd5b8135602061516c6150d38361508e565b82815260059290921b8401810191818101908984111561518b57600080fd5b948201945b838610156151b25785356151a381614f80565b82529482019490820190615190565b965050860135925050808211156151c857600080fd5b506151d5858286016150b2565b9150509250929050565b6000806000606084860312156151f457600080fd5b83356151ff81614f80565b9250602084013561520f81614f80565b929592945050506040919091013590565b60006020828403121561523257600080fd5b81356135dd81614f95565b6000806000806000806000806000806101408b8d03121561525d57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600080604083850312156152b857600080fd5b82356152c381614f80565b91506020830135614fd181614f80565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615615303576153036152d3565b500290565b600181811c9082168061531c57607f821691505b60208210810361533c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000600019820361536b5761536b6152d3565b5060010190565b60006020828403121561538457600080fd5b81516135dd81614f80565b6000602082840312156153a157600080fd5b5051919050565b6000602082840312156153ba57600080fd5b81516135dd81614f95565b6000806000606084860312156153da57600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561540c57600080fd5b865161541781614f80565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b60008261546357634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561547b5761547b6152d3565b500190565b600082821015615492576154926152d3565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156154e75784516001600160a01b0316835293830193918301916001016154c2565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220780baa1dc634e3c6f260ffdef3921f7ee6d62c90e3a9f29061c9cb7423ff432064736f6c634300080f0033

Deployed Bytecode Sourcemap

26777:29451:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26937:64;;;;;;;;;;-1:-1:-1;26937:64:0;;;;-1:-1:-1;;;;;26937:64:0;;;;;;-1:-1:-1;;;;;178:55:1;;;160:74;;148:2;133:18;26937:64:0;;;;;;;;53134:443;;;;;;;;;;-1:-1:-1;53134:443:0;;;;;:::i;:::-;;:::i;:::-;;6954:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35379:181::-;;;;;;;;;;-1:-1:-1;35379:181:0;;;;;:::i;:::-;;:::i;36374:164::-;;;;;;;;;;-1:-1:-1;36374:164:0;;;;;:::i;:::-;;:::i;8009:210::-;;;;;;;;;;-1:-1:-1;8009:210:0;;;;;:::i;:::-;;:::i;:::-;;;2245:14:1;;2238:22;2220:41;;2208:2;2193:18;8009:210:0;2080:187:1;33579:326:0;;;;;;;;;;-1:-1:-1;33579:326:0;;;;;:::i;:::-;;:::i;26852:41::-;;;;;;;;;;-1:-1:-1;26852:41:0;;;;-1:-1:-1;;;;;26852:41:0;;;7275:108;;;;;;;;;;-1:-1:-1;7363:12:0;;7275:108;;;2929:25:1;;;2917:2;2902:18;7275:108:0;2783:177:1;28996:33:0;;;;;;;;;;;;;;;;27157:28;;;;;;;;;;;;;;;;29125:55;;;;;;;;;;-1:-1:-1;29125:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;55588:637;;;;;;;;;;-1:-1:-1;55588:637:0;;;;;:::i;:::-;;:::i;8227:454::-;;;;;;;;;;-1:-1:-1;8227:454:0;;;;;:::i;:::-;;:::i;52117:114::-;;;;;;;;;;;;;:::i;27267:43::-;;;;;;;;;;-1:-1:-1;27267:43:0;;;;-1:-1:-1;;;;;27267:43:0;;;41387:141;;;;;;;;;;;;;:::i;33441:93::-;;;;;;;;;;-1:-1:-1;33441:93:0;;33524:2;6691:36:1;;6679:2;6664:18;33441:93:0;6549:184:1;43730:119:0;;;;;;;;;;-1:-1:-1;43730:119:0;;;;;:::i;:::-;;:::i;8689:300::-;;;;;;;;;;-1:-1:-1;8689:300:0;;;;;:::i;:::-;;:::i;27121:29::-;;;;;;;;;;;;;;;;38628:121;;;;;;;;;;-1:-1:-1;38628:121:0;;;;;:::i;:::-;;:::i;28383:49::-;;;;;;;;;;-1:-1:-1;28383:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;26902:28;;;;;;;;;;-1:-1:-1;26902:28:0;;;;-1:-1:-1;;;;;26902:28:0;;;28645:33;;;;;;;;;;-1:-1:-1;28645:33:0;;;;;;;;27917:40;;;;;;;;;;-1:-1:-1;27917:40:0;;;;;;;;27078:34;;;;;;;;;;-1:-1:-1;27078:34:0;;;;;;;;;;;43099:103;;;;;;;;;;;;;:::i;41536:126::-;;;;;;;;;;-1:-1:-1;41536:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;41626:28:0;41602:4;41626:28;;;:19;:28;;;;;;;;;41536:126;27709:31;;;;;;;;;;;;;;;;52239:183;;;;;;;;;;-1:-1:-1;52239:183:0;;;;;:::i;:::-;;:::i;27676:26::-;;;;;;;;;;;;;;;;52430:175;;;;;;;;;;-1:-1:-1;52430:175:0;;;;;:::i;:::-;;:::i;37984:120::-;;;;;;;;;;-1:-1:-1;37984:120:0;;;;;:::i;:::-;;:::i;43348:142::-;;;;;;;;;;;;;:::i;36246:99::-;;;;;;;;;;-1:-1:-1;36246:99:0;;;;;:::i;:::-;;:::i;41862:171::-;;;;;;;;;;-1:-1:-1;41862:171:0;;;;;:::i;:::-;;:::i;43857:185::-;;;;;;;;;;-1:-1:-1;43857:185:0;;;;;:::i;:::-;;:::i;42681:410::-;;;;;;;;;;-1:-1:-1;42681:410:0;;;;;:::i;:::-;;:::i;7391:177::-;;;;;;;;;;-1:-1:-1;7391:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;7542:18:0;7510:7;7542:18;;;;;;;;;;;;7391:177;14368:148;;;;;;;;;;;;;:::i;35609:127::-;;;;;;;;;;-1:-1:-1;35609:127:0;;;;;:::i;:::-;;:::i;39294:208::-;;;;;;;;;;-1:-1:-1;39294:208:0;;;;;:::i;:::-;;:::i;27319:38::-;;;;;;;;;;-1:-1:-1;27319:38:0;;;;-1:-1:-1;;;;;27319:38:0;;;27784:28;;;;;;;;;;;;;;;;29061:32;;;;;;;;;;-1:-1:-1;29061:32:0;;;;;;;;28325:51;;;;;;;;;;-1:-1:-1;28325:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;36037:170;;;;;;;;;;-1:-1:-1;36037:170:0;;;;;:::i;:::-;;:::i;39752:1429::-;;;;;;;;;;-1:-1:-1;39752:1429:0;;;;;:::i;:::-;;:::i;39510:234::-;;;;;;;;;;-1:-1:-1;39510:234:0;;;;;:::i;:::-;;:::i;43498:109::-;;;;;;;;;;-1:-1:-1;43498:109:0;;;;;:::i;:::-;;:::i;39045:241::-;;;;;;;;;;-1:-1:-1;39045:241:0;;;;;:::i;:::-;;:::i;27565:27::-;;;;;;;;;;;;;;;;14154:79;;;;;;;;;;-1:-1:-1;14219:6:0;;-1:-1:-1;;;;;14219:6:0;14154:79;;27364:32;;;;;;;;;;-1:-1:-1;27364:32:0;;;;-1:-1:-1;;;;;27364:32:0;;;27599;;;;;;;;;;;;;;;;7062:104;;;;;;;;;;;;;:::i;38328:163::-;;;;;;;;;;-1:-1:-1;38328:163:0;;;;;:::i;:::-;;:::i;28015:41::-;;;;;;;;;;;;;;;;38499:121;;;;;;;;;;-1:-1:-1;38499:121:0;;;;;:::i;:::-;;:::i;27819:24::-;;;;;;;;;;;;;;;;37104:176;;;;;;;;;;-1:-1:-1;37104:176:0;;;;;:::i;:::-;;:::i;35774:201::-;;;;;;;;;;-1:-1:-1;35774:201:0;;;;;:::i;:::-;;:::i;27850:25::-;;;;;;;;;;;;;;;;8997:400;;;;;;;;;;-1:-1:-1;8997:400:0;;;;;:::i;:::-;;:::i;37288:662::-;;;;;;;;;;-1:-1:-1;37288:662:0;;;;;:::i;:::-;;:::i;41670:184::-;;;;;;;;;;-1:-1:-1;41670:184:0;;;;;:::i;:::-;;:::i;7576:216::-;;;;;;;;;;-1:-1:-1;7576:216:0;;;;;:::i;:::-;;:::i;34256:143::-;;;;;;;;;;-1:-1:-1;34256:143:0;;;;;:::i;:::-;;:::i;41189:190::-;;;;;;;;;;-1:-1:-1;41189:190:0;;;;;:::i;:::-;-1:-1:-1;;;;;41322:25:0;41280:7;41322:25;;;:16;:25;;;;;;;;;41349:12;:21;;;;;;;41322:25;;41189:190;;;;;8209:25:1;;;8265:2;8250:18;;8243:34;;;;8182:18;41189:190:0;8035:248:1;27882:26:0;;;;;;;;;;;;;;;;42041:307;;;;;;;;;;-1:-1:-1;42041:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8589:55:1;;;8571:74;;8676:2;8661:18;;8654:34;;;;8704:18;;;8697:34;;;;8762:2;8747:18;;8740:34;8805:3;8790:19;;8783:35;8849:3;8834:19;;8827:35;8558:3;8543:19;42041:307:0;8288:580:1;28963:26:0;;;;;;;;;;;;;;;;28179:57;;;;;;;;;;-1:-1:-1;28179:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36625:174;;;;;;;;;;-1:-1:-1;36625:174:0;;;;;:::i;:::-;;:::i;44050:127::-;;;;;;;;;;-1:-1:-1;44050:127:0;;;;;:::i;:::-;;:::i;27529:29::-;;;;;;;;;;;;;;;;35063:268;;;;;;;;;;-1:-1:-1;35063:268:0;;;;;:::i;:::-;;:::i;38112:208::-;;;;;;;;;;-1:-1:-1;38112:208:0;;;;;:::i;:::-;;:::i;34415:146::-;;;;;;;;;;;;;:::i;51951:158::-;;;;;;;;;;-1:-1:-1;51951:158:0;;;;;:::i;:::-;;:::i;7800:201::-;;;;;;;;;;-1:-1:-1;7800:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;7966:18:0;;;7934:7;7966:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7800:201;27489:33;;;;;;;;;;;;;;;;43210:130;;;;;;;;;;;;;:::i;27747:30::-;;;;;;;;;;;;;;;;28271:47;;;;;;;;;;-1:-1:-1;28271:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;42356:317;;;;;;;;;;-1:-1:-1;42356:317:0;;;;;:::i;:::-;;:::i;14524:281::-;;;;;;;;;;-1:-1:-1;14524:281:0;;;;;:::i;:::-;;:::i;43615:107::-;;;;;;;;;;-1:-1:-1;43615:107:0;;;;;:::i;:::-;;:::i;27638:31::-;;;;;;;;;;;;;;;;34577:415;;;;;;;;;;-1:-1:-1;34577:415:0;;;;;:::i;:::-;;:::i;27458:24::-;;;;;;;;;;;;;;;;36869:221;;;;;;;;;;-1:-1:-1;36869:221:0;;;;;:::i;:::-;;:::i;53134:443::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;;;;;;;;;53222:17:::1;:6:::0;53232::::1;53222:17;:::i;:::-;53213:26;;53250:19;53272:25;53286:10;;53272:9;;:13;;:25;;;;:::i;:::-;53250:47;;53308:15;53326:38;53352:11;53326:21;53337:9;;53326:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;53308:56;;53375:16;53394:39;53421:11;53394:22;53405:10;;53394:6;:10;;:22;;;;:::i;:39::-;53375:58;;53446:28;53467:6;53446:20;:28::i;:::-;53499:9;::::0;:22:::1;::::0;53513:7;53499:13:::1;:22::i;:::-;53487:9;:34:::0;53545:10:::1;::::0;:24:::1;::::0;53560:8;53545:14:::1;:24::i;:::-;53532:10;:37:::0;-1:-1:-1;;;;53134:443:0:o;6954:100::-;7008:13;7041:5;7034:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6954:100;:::o;35379:181::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;-1:-1:-1;;;;;35463:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;35463:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;35518:34;;2220:41:1;;;35518:34:0::1;::::0;2193:18:1;35518:34:0::1;;;;;;;35379:181:::0;;:::o;36374:164::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;36460:1:::1;36452:4;:9;;36444:46;;;::::0;-1:-1:-1;;;36444:46:0;;10693:2:1;36444:46:0::1;::::0;::::1;10675:21:1::0;10732:2;10712:18;;;10705:30;10771:26;10751:18;;;10744:54;10815:18;;36444:46:0::1;10491:348:1::0;36444:46:0::1;36517:13;:4:::0;36524:6:::1;36517:13;:::i;:::-;36501;:29:::0;-1:-1:-1;36374:164:0:o;8009:210::-;8128:4;8150:39;1540:10;8173:7;8182:6;8150:8;:39::i;:::-;-1:-1:-1;8207:4:0;8009:210;;;;;:::o;33579:326::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;33701:24:::1;::::0;;;:14:::1;:24;::::0;;;;;:33;;;33693:42:::1;;;::::0;::::1;;33763:3;33754:5;:12;;33746:55;;;::::0;-1:-1:-1;;;33746:55:0;;11046:2:1;33746:55:0::1;::::0;::::1;11028:21:1::0;11085:2;11065:18;;;11058:30;11124:32;11104:18;;;11097:60;11174:18;;33746:55:0::1;10844:354:1::0;33746:55:0::1;33812:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:32;;;33860:37;;8209:25:1;;;8250:18;;;8243:34;;;33860:37:0::1;::::0;8182:18:1;33860:37:0::1;;;;;;;33579:326:::0;;:::o;55588:637::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;55760:6:::1;:13;55735:14;:21;:38;55727:80;;;::::0;-1:-1:-1;;;55727:80:0;;11405:2:1;55727:80:0::1;::::0;::::1;11387:21:1::0;11444:2;11424:18;;;11417:30;11483:32;11463:18;;;11456:60;11533:18;;55727:80:0::1;11203:354:1::0;55727:80:0::1;55851:3;55826:14;:21;:28;;55818:75;;;::::0;-1:-1:-1;;;55818:75:0;;11764:2:1;55818:75:0::1;::::0;::::1;11746:21:1::0;11803:2;11783:18;;;11776:30;11842:34;11822:18;;;11815:62;11913:4;11893:18;;;11886:32;11935:19;;55818:75:0::1;11562:398:1::0;55818:75:0::1;55909:9;55904:314;55928:14;:21;55924:1;:25;55904:314;;;55971:14;55988;56003:1;55988:17;;;;;;;;:::i;:::-;;;;;;;55971:34;;56020:21;56044:6;56051:1;56044:9;;;;;;;;:::i;:::-;;;;;;;56057:6;56044:20;;;;:::i;:::-;56020:44;;56079:50;56095:10;56107:6;56115:13;56079:15;:50::i;:::-;56144:15;::::0;-1:-1:-1;;;;;56144:15:0::1;:26;56179:6:::0;56188:17:::1;56179:6:::0;-1:-1:-1;;;;;7542:18:0;7510:7;7542:18;;;;;;;;;;;;7391:177;56188:17:::1;56144:62;::::0;-1:-1:-1;;;;;;56144:62:0::1;::::0;;;;;;-1:-1:-1;;;;;12354:55:1;;;56144:62:0::1;::::0;::::1;12336:74:1::0;12426:18;;;12419:34;12309:18;;56144:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55956:262;;55951:3;;;;;:::i;:::-;;;;55904:314;;;;55588:637:::0;;:::o;8227:454::-;8367:4;8384:36;8394:6;8402:9;8413:6;8384:9;:36::i;:::-;8431:220;8454:6;1540:10;8502:138;8558:6;8502:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8502:19:0;;;;;;:11;:19;;;;;;;;1540:10;8502:33;;;;;;;;;;:37;:138::i;:::-;8431:8;:220::i;:::-;-1:-1:-1;8669:4:0;8227:454;;;;;:::o;52117:114::-;52191:15;;:32;;;;;;;;52164:7;;-1:-1:-1;;;;;52191:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52184:39;;52117:114;:::o;41387:141::-;41477:15;;:43;;;;;;;;41450:7;;-1:-1:-1;;;;;41477:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43730:119::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;43800:15:::1;::::0;:41:::1;::::0;;;;2245:14:1;;2238:22;43800:41:0::1;::::0;::::1;2220::1::0;-1:-1:-1;;;;;43800:15:0;;::::1;::::0;:34:::1;::::0;2193:18:1;;43800:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43730:119:::0;:::o;8689:300::-;1540:10;8804:4;8898:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8898:34:0;;;;;;;;;;8804:4;;8826:133;;8876:7;;8898:50;;8937:10;8898:38;:50::i;38628:121::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;38698:15:::1;::::0;:43:::1;::::0;;;;2245:14:1;;2238:22;38698:43:0::1;::::0;::::1;2220:41:1::0;-1:-1:-1;;;;;38698:15:0;;::::1;::::0;:36:::1;::::0;2193:18:1;;38698:43:0::1;2080:187:1::0;43099:103:0;43136:15;;:58;;;;;43175:10;43136:58;;;13293:74:1;43136:15:0;13383:18:1;;;13376:50;-1:-1:-1;;;;;43136:15:0;;;;:30;;13266:18:1;;43136:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43099:103::o;52239:183::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;52353:15:::1;::::0;:61:::1;::::0;;;;::::1;::::0;::::1;2929:25:1::0;;;-1:-1:-1;;;;;52353:15:0;;::::1;::::0;:54:::1;::::0;2902:18:1;;52353:61:0::1;2783:177:1::0;52430:175:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;52540:15:::1;::::0;:57:::1;::::0;;;;::::1;::::0;::::1;2929:25:1::0;;;-1:-1:-1;;;;;52540:15:0;;::::1;::::0;:50:::1;::::0;2902:18:1;;52540:57:0::1;2783:177:1::0;37984:120:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;38079:17:::1;:6:::0;38089::::1;38079:17;:::i;:::-;38058:18;:38:::0;-1:-1:-1;37984:120:0:o;43348:142::-;43441:15;;:41;;;;;;;;43414:7;;-1:-1:-1;;;;;43441:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;36246:99;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;36315:14:::1;:22:::0;;-1:-1:-1;;36315:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36246:99::o;41862:171::-;41991:15;;:34;;;;;-1:-1:-1;;;;;178:55:1;;;41991:34:0;;;160:74:1;41959:7:0;;41991:15;;:25;;133:18:1;;41991:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43857:185::-;43986:15;;:48;;;;;-1:-1:-1;;;;;178:55:1;;;43986:48:0;;;160:74:1;43957:4:0;;43986:15;;:39;;133:18:1;;43986:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42681:410::-;42863:15;;:28;;;;;;;;2929:25:1;;;42761:18:0;;;;;;-1:-1:-1;;;;;42863:15:0;;:23;;2902:18:1;;42863:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42907:176;;;14229:25:1;;;14285:2;14270:18;;14263:34;;;14313:18;;;14306:34;;;14371:2;14356:18;;14349:34;;;42746:145:0;;-1:-1:-1;42746:145:0;;-1:-1:-1;42746:145:0;-1:-1:-1;43063:9:0;;43025:5;;42907:176;;14216:3:1;14201:19;42907:176:0;;;;;;;42735:356;;;42681:410;:::o;14368:148::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;14459:6:::1;::::0;14438:40:::1;::::0;14475:1:::1;::::0;-1:-1:-1;;;;;14459:6:0::1;::::0;14438:40:::1;::::0;14475:1;;14438:40:::1;14489:6;:19:::0;;;::::1;::::0;;14368:148::o;35609:127::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;35683:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;35683:45:0;;-1:-1:-1;;;;;178:55:1;;;35683:45:0::1;::::0;::::1;160:74:1::0;35683:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;35683:45:0::1;14:226:1::0;39294:208:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;39363:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;39363:46:0;;-1:-1:-1;;;;;178:55:1;;;39363:46:0::1;::::0;::::1;160:74:1::0;39363:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;39363:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;39420:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;39420:36:0::1;39452:4;39420:36;::::0;;-1:-1:-1;39467:27:0::1;39440:8:::0;39467:17:::1;:27::i;36037:170::-:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;-1:-1:-1;;;;;36149:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;36149:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36037:170::o;39752:1429::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;40096:11:::1;:21:::0;;;40128:16:::1;:31:::0;;;40170:15:::1;:30:::0;;;40211:13:::1;:26:::0;;;40248:12:::1;:23:::0;;;40282:17:::1;:33:::0;;;40326:16:::1;:32:::0;;;40369:14:::1;:28:::0;;;40408:9:::1;:18:::0;;;40437:10:::1;:20:::0;;;40486:117:::1;40450:7:::0;40486:87:::1;40302:13:::0;40486:87;40386:11;40345:13;40486:32:::1;:50::i;:::-;:68:::0;::::1;:87::i;:117::-;40470:13;:133;;;;40631:113;40734:9;;40631:84;40698:16;;40631:48;40663:15;;40631:13;;:31;;:48;;;;:::i;:113::-;40616:12;:128:::0;40765:13:::1;::::0;40782:2:::1;-1:-1:-1::0;40765:19:0;::::1;::::0;:41:::1;;;40804:2;40788:12;;:18;;40765:41;40757:94;;;::::0;-1:-1:-1;;;40757:94:0;;14596:2:1;40757:94:0::1;::::0;::::1;14578:21:1::0;14635:2;14615:18;;;14608:30;14674:34;14654:18;;;14647:62;14745:10;14725:18;;;14718:38;14773:19;;40757:94:0::1;14394:404:1::0;40757:94:0::1;40894:12;::::0;40921:17:::1;::::0;40953:16:::1;::::0;40984:14:::1;::::0;41013:11:::1;::::0;41039:16:::1;::::0;41070:15:::1;::::0;41100:13:::1;::::0;41128:9:::1;::::0;41152:10:::1;::::0;40869:304:::1;::::0;;15202:25:1;;;15258:2;15243:18;;15236:34;;;;15286:18;;;15279:34;;;;15344:2;15329:18;;15322:34;;;;15387:3;15372:19;;15365:35;;;;15431:3;15416:19;;15409:35;15475:3;15460:19;;15453:35;15519:3;15504:19;;15497:35;15563:3;15548:19;;15541:35;15607:3;15592:19;;15585:35;40869:304:0::1;::::0;15189:3:1;15174:19;40869:304:0::1;;;;;;;39752:1429:::0;;;;;;;;;;:::o;39510:234::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;39616:1:::1;39598:14;:19;;39589:62;;;::::0;-1:-1:-1;;;39589:62:0;;15833:2:1;39589:62:0::1;::::0;::::1;15815:21:1::0;15872:2;15852:18;;;15845:30;15911:31;15891:18;;;15884:59;15960:18;;39589:62:0::1;15631:353:1::0;39589:62:0::1;39662:11;:28:::0;;;39706:30:::1;::::0;2929:25:1;;;39706:30:0::1;::::0;2917:2:1;2902:18;39706:30:0::1;;;;;;;;39510:234:::0;:::o;43498:109::-;43552:15;;:47;;;;;43581:10;43552:47;;;13293:74:1;13410:14;;13403:22;13383:18;;;13376:50;-1:-1:-1;;;;;43552:15:0;;;;:28;;13266:18:1;;43552:47:0;13109:323:1;39045:241:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;39143:6:::1;39131:8;:18;;:41;;;;;39165:7;39153:8;:19;;39131:41;39123:50;;;::::0;::::1;;39223:16;::::0;39189:51:::1;::::0;39213:8;;39189:51:::1;::::0;;;::::1;39251:16;:27:::0;39045:241::o;7062:104::-;7118:13;7151:7;7144:14;;;;;:::i;38328:163::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;38442:41:::1;38471:4;38477:5;38442:28;:41::i;:::-;38328:163:::0;;:::o;38499:121::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;38569:15:::1;::::0;:43:::1;::::0;;;;2245:14:1;;2238:22;38569:43:0::1;::::0;::::1;2220:41:1::0;-1:-1:-1;;;;;38569:15:0;;::::1;::::0;:36:::1;::::0;2193:18:1;;38569:43:0::1;2080:187:1::0;37104:176:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;37194:6:::1;37176:24;;:14;;;;;;;;;;;:24;;::::0;37168:33:::1;;;::::0;::::1;;37212:14;:23:::0;;;::::1;;-1:-1:-1::0;;;37212:23:0::1;::::0;;;::::1;;::::0;;37251:21:::1;::::0;::::1;::::0;::::1;::::0;37229:6;2245:14:1;2238:22;2220:41;;2208:2;2193:18;;2080:187;35774:201:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;35848:15:::1;::::0;:45:::1;::::0;;;;-1:-1:-1;;;;;178:55:1;;;35848:45:0::1;::::0;::::1;160:74:1::0;35848:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;35848:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35904:15:0::1;::::0;-1:-1:-1;;;;;35904:15:0::1;::::0;-1:-1:-1;35904:26:0::1;::::0;-1:-1:-1;35931:7:0;35940:26:::1;35931:7:::0;35940:17:::1;:26::i;:::-;35904:63;::::0;-1:-1:-1;;;;;;35904:63:0::1;::::0;;;;;;-1:-1:-1;;;;;12354:55:1;;;35904:63:0::1;::::0;::::1;12336:74:1::0;12426:18;;;12419:34;12309:18;;35904:63:0::1;12154:305:1::0;8997:400:0;9117:4;9139:228;1540:10;9189:7;9211:145;9268:15;9211:145;;;;;;;;;;;;;;;;;1540:10;9211:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;9211:34:0;;;;;;;;;;;;:38;:145::i;37288:662::-;37347:14;;-1:-1:-1;;;37347:14:0;;;;37339:49;;;;-1:-1:-1;;;37339:49:0;;16805:2:1;37339:49:0;;;16787:21:1;16844:2;16824:18;;;16817:30;16883:24;16863:18;;;16856:52;16925:18;;37339:49:0;16603:346:1;37339:49:0;37407:24;;;;:14;:24;;;;;;:29;;37399:66;;;;-1:-1:-1;;;37399:66:0;;17156:2:1;37399:66:0;;;17138:21:1;17195:2;17175:18;;;17168:30;17234:26;17214:18;;;17207:54;17278:18;;37399:66:0;16954:348:1;37399:66:0;37531:29;:15;37551:8;37531:19;:29::i;:::-;1540:10;37498:30;;;;:16;:30;;;;;;:62;37476:148;;;;-1:-1:-1;;;37476:148:0;;17509:2:1;37476:148:0;;;17491:21:1;17548:2;17528:18;;;17521:30;17587:34;17567:18;;;17560:62;17658:6;17638:18;;;17631:34;17682:19;;37476:148:0;17307:400:1;37476:148:0;37664:24;;;;:14;:24;;;;;;;;;1540:10;37635:26;;:12;:26;;;;;;:53;37732:29;:15;37664:24;37732:19;:29::i;:::-;1540:10;37699:30;;;;:16;:30;;;;;:62;;;;37772:15;;-1:-1:-1;;;;;37772:15:0;;:26;;37840:31;1540:10;37840:17;:31::i;:::-;37772:110;;-1:-1:-1;;;;;;37772:110:0;;;;;;;-1:-1:-1;;;;;12354:55:1;;;37772:110:0;;;12336:74:1;12426:18;;;12419:34;12309:18;;37772:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37919:12;1540:10;;1460:98;37919:12;-1:-1:-1;;;;;37898:44:0;;37933:8;37898:44;;;;2929:25:1;;2917:2;2902:18;;2783:177;37898:44:0;;;;;;;;37288:662;:::o;41670:184::-;41799:15;;:47;;;;;-1:-1:-1;;;;;178:55:1;;;41799:47:0;;;160:74:1;41767:7:0;;41799:15;;:38;;133:18:1;;41799:47:0;14:226:1;7576:216:0;7698:4;7720:42;1540:10;7744:9;7755:6;7720:9;:42::i;34256:143::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;-1:-1:-1;;;;;34349:30:0;;;::::1;;::::0;;;:23:::1;:30;::::0;;;;:38;;-1:-1:-1;;34349:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34256:143::o;42041:307::-;42305:15;;:35;;;;;-1:-1:-1;;;;;178:55:1;;;42305:35:0;;;160:74:1;42155:7:0;;;;;;;;;;;;42305:15;;;;:26;;133:18:1;;42305:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42298:42;;;;-1:-1:-1;42298:42:0;;-1:-1:-1;42298:42:0;-1:-1:-1;42298:42:0;-1:-1:-1;42298:42:0;;-1:-1:-1;42041:307:0;-1:-1:-1;;42041:307:0:o;36625:174::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;36713:3:::1;36704:5;:12;;36696:63;;;::::0;-1:-1:-1;;;36696:63:0;;18476:2:1;36696:63:0::1;::::0;::::1;18458:21:1::0;18515:2;18495:18;;;18488:30;18554:34;18534:18;;;18527:62;18625:8;18605:18;;;18598:36;18651:19;;36696:63:0::1;18274:402:1::0;36696:63:0::1;36770:13;:21:::0;36625:174::o;44050:127::-;44134:15;;:35;;;;;-1:-1:-1;;;;;178:55:1;;;44134:35:0;;;160:74:1;44110:4:0;;44134:15;;:26;;133:18:1;;44134:35:0;14:226:1;35063:268:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;-1:-1:-1;;;;;35135:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;35179:4:::1;-1:-1:-1::0;;35135:48:0;;::::1;::::0;::::1;::::0;;;35194:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;35239:15:::1;::::0;:44;;-1:-1:-1;;;35239:44:0;;::::1;::::0;::::1;160:74:1::0;;;;35239:15:0;::::1;::::0;:36:::1;::::0;133:18:1;35239:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35299:24:0::1;::::0;-1:-1:-1;;;;;178:55:1;;160:74;;35299:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;35299:24:0::1;14:226:1::0;38112:208:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;38192:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;38184:41:::1;;;::::0;::::1;;38236:21;:31:::0;;-1:-1:-1;;38236:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;38283:29:::1;::::0;2220:41:1;;;38283:29:0::1;::::0;2208:2:1;2193:18;38283:29:0::1;2080:187:1::0;34415:146:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;34482:20:::1;::::0;::::1;;34481:21;34473:30;;;::::0;::::1;;34522:20;:27:::0;;-1:-1:-1;;34522:27:0::1;34545:4;34522:27;::::0;;34415:146::o;51951:158::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;52021:15:::1;::::0;:40:::1;::::0;;;;-1:-1:-1;;;;;178:55:1;;;52021:40:0::1;::::0;::::1;160:74:1::0;52021:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;52021:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52077:24:0::1;::::0;-1:-1:-1;;;;;178:55:1;;160:74;;52077:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;52077:24:0::1;14:226:1::0;43210:130:0;43293:15;;:39;;;;;;;;43266:7;;-1:-1:-1;;;;;43293:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;42356:317;42625:15;;:40;;;;;;;;2929:25:1;;;42475:7:0;;;;;;;;;;;;-1:-1:-1;;;;;42625:15:0;;;;:33;;2902:18:1;;42625:40:0;2783:177:1;14524:281:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;-1:-1:-1;;;;;14627:22:0;::::1;14605:110;;;::::0;-1:-1:-1;;;14605:110:0;;18883:2:1;14605:110:0::1;::::0;::::1;18865:21:1::0;18922:2;18902:18;;;18895:30;18961:34;18941:18;;;18934:62;19032:8;19012:18;;;19005:36;19058:19;;14605:110:0::1;18681:402:1::0;14605:110:0::1;14752:6;::::0;14731:38:::1;::::0;-1:-1:-1;;;;;14731:38:0;;::::1;::::0;14752:6:::1;::::0;14731:38:::1;::::0;14752:6:::1;::::0;14731:38:::1;14780:6;:17:::0;;;::::1;-1:-1:-1::0;;;;;14780:17:0;;;::::1;::::0;;;::::1;::::0;;14524:281::o;43615:107::-;43668:15;;:46;;;;;43696:10;43668:46;;;13293:74:1;13410:14;;13403:22;13383:18;;;13376:50;-1:-1:-1;;;;;43668:15:0;;;;:27;;13266:18:1;;43668:46:0;13109:323:1;34577:415:0;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;34646:10:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;;;34646:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;34681:21;34677:203:::1;;-1:-1:-1::0;;;;;34719:32:0;;::::1;;::::0;;;:23:::1;:32;::::0;;;;;;;:39;;34754:4:::1;-1:-1:-1::0;;34719:39:0;;::::1;::::0;::::1;::::0;;;34773:19:::1;:28:::0;;;;;;;:35;;;;::::1;::::0;;::::1;::::0;;34823:15:::1;::::0;:45;;-1:-1:-1;;;34823:45:0;;::::1;::::0;::::1;160:74:1::0;;;;34823:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;34823:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34677:203;34904:12;34890:11;:26:::0;34927:14:::1;:21:::0;;;::::1;::::0;::::1;::::0;;34964:16:::1;::::0;::::1;::::0;34927:21;;34964:16:::1;34577:415:::0;:::o;36869:221::-;14281:6;;-1:-1:-1;;;;;14281:6:0;1540:10;14281:22;14273:67;;;;-1:-1:-1;;;14273:67:0;;9468:2:1;14273:67:0;;;9450:21:1;;;9487:18;;;9480:30;-1:-1:-1;;;;;;;;;;;9526:18:1;;;9519:62;9598:18;;14273:67:0;9266:356:1;14273:67:0;36944:16:::1;:5:::0;36953:6:::1;36944:16;:::i;:::-;36936:24;;37003:4;36988:12;;:19;;;;:::i;:::-;36979:5;:28;;36971:83;;;::::0;-1:-1:-1;;;36971:83:0;;19569:2:1;36971:83:0::1;::::0;::::1;19551:21:1::0;19608:2;19588:18;;;19581:30;19647:34;19627:18;;;19620:62;19718:12;19698:18;;;19691:40;19748:19;;36971:83:0::1;19367:406:1::0;36971:83:0::1;37065:9;:17:::0;36869:221::o;12180:181::-;12238:7;;12270:5;12274:1;12270;:5;:::i;:::-;12258:17;;12299:1;12294;:6;;12286:46;;;;-1:-1:-1;;;12286:46:0;;20113:2:1;12286:46:0;;;20095:21:1;20152:2;20132:18;;;20125:30;20191:29;20171:18;;;20164:57;20238:18;;12286:46:0;19911:351:1;12286:46:0;12352:1;12180:181;-1:-1:-1;;;12180:181:0:o;12747:250::-;12805:7;12829:1;12834;12829:6;12825:47;;-1:-1:-1;12859:1:0;12852:8;;12825:47;12884:9;12896:5;12900:1;12896;:5;:::i;:::-;12884:17;-1:-1:-1;12929:1:0;12920:5;12924:1;12884:17;12920:5;:::i;:::-;:10;12912:56;;;;-1:-1:-1;;;12912:56:0;;20469:2:1;12912:56:0;;;20451:21:1;20508:2;20488:18;;;20481:30;20547:34;20527:18;;;20520:62;20618:3;20598:18;;;20591:31;20639:19;;12912:56:0;20267:397:1;13005:132:0;13063:7;13090:39;13094:1;13097;13090:39;;;;;;;;;;;;;;;;;:3;:39::i;53585:1995::-;53654:6;53664:1;53654:11;53650:50;;53585:1995;:::o;53650:50::-;53710:24;53727:6;53710:16;:24::i;:::-;53745:19;53767:25;53781:10;;53767:9;;:13;;:25;;;;:::i;:::-;54008:13;;53745:47;;-1:-1:-1;53820:4:0;;;;;;53805:12;;;;;;54008:17;54004:261;;54061:192;54243:9;;54224:16;;54208:13;;:32;;;;:::i;:::-;:44;;;;:::i;:::-;54061:128;54175:13;;54061:95;54144:11;54061:64;54115:9;;54061:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:192::-;54042:211;;54004:261;54279:14;;:18;54275:268;;54334:197;54520:10;;54500:17;;54483:14;;:34;;;;:::i;:::-;:47;;;;:::i;:::-;54334:130;54449:14;;54334:96;54418:11;54334:65;54388:10;;54334:35;:53;;:65;;;;:::i;:197::-;54314:217;;54275:268;54565:39;:16;54586:17;54565:20;:39::i;:::-;54553:51;-1:-1:-1;54621:13:0;;54617:111;;54673:15;;54665:51;;-1:-1:-1;;;;;54673:15:0;;;;54702:9;;54665:51;;;;54702:9;54673:15;54665:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54651:65:0;;-1:-1:-1;;54617:111:0;54748:21;54821:31;54842:9;;54821:16;;:20;;:31;;;;:::i;:::-;54794:10;;54772:17;;:33;;:21;:33::i;:::-;:80;;;;:::i;:::-;54748:104;-1:-1:-1;54865:19:0;54899:17;;54895:104;;54947:40;:21;54973:13;54947:25;:40::i;:::-;54933:54;;54895:104;55009:23;55077:11;55035:39;55056:17;;55035:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;55009:79;;55099:17;55147:11;55119:25;55133:10;;55119:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;55099:59;-1:-1:-1;55175:19:0;;55171:126;;55236:15;;55228:57;;-1:-1:-1;;;;;55236:15:0;;;;55265;;55228:57;;;;55265:15;55236;55228:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55211:74:0;;-1:-1:-1;;55171:126:0;55311:13;;55307:108;;55366:9;;55358:45;;-1:-1:-1;;;;;55366:9:0;;;;55389;;55358:45;;;;55389:9;55366;55358:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55341:62:0;;-1:-1:-1;;55307:108:0;55432:140;55460:9;55484:27;55502:9;55484:15;:27;:::i;:::-;55526:7;:21;;;;;55537:10;55526:21;:35;;;;;55551:10;55526:35;55432:140;;;21075:25:1;;;21131:2;21116:18;;21109:34;;;;21186:14;21179:22;21159:18;;;21152:50;21063:2;21048:18;55432:140:0;;;;;;;53639:1941;;;;;;;;;;;53585:1995;:::o;12369:136::-;12427:7;12454:43;12458:1;12461;12454:43;;;;;;;;;;;;;;;;;:3;:43::i;10872:380::-;-1:-1:-1;;;;;11008:19:0;;11000:68;;;;-1:-1:-1;;;11000:68:0;;21415:2:1;11000:68:0;;;21397:21:1;21454:2;21434:18;;;21427:30;21493:34;21473:18;;;21466:62;21564:6;21544:18;;;21537:34;21588:19;;11000:68:0;21213:400:1;11000:68:0;-1:-1:-1;;;;;11087:21:0;;11079:68;;;;-1:-1:-1;;;11079:68:0;;21820:2:1;11079:68:0;;;21802:21:1;21859:2;21839:18;;;21832:30;21898:34;21878:18;;;21871:62;21969:4;21949:18;;;21942:32;21991:19;;11079:68:0;21618:398:1;11079:68:0;-1:-1:-1;;;;;11160:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11212:32;;2929:25:1;;;11212:32:0;;2902:18:1;11212:32:0;;;;;;;;10872:380;;;:::o;9405:610::-;-1:-1:-1;;;;;9545:20:0;;9537:70;;;;-1:-1:-1;;;9537:70:0;;22223:2:1;9537:70:0;;;22205:21:1;22262:2;22242:18;;;22235:30;22301:34;22281:18;;;22274:62;22372:7;22352:18;;;22345:35;22397:19;;9537:70:0;22021:401:1;9537:70:0;-1:-1:-1;;;;;9626:23:0;;9618:71;;;;-1:-1:-1;;;9618:71:0;;22629:2:1;9618:71:0;;;22611:21:1;22668:2;22648:18;;;22641:30;22707:34;22687:18;;;22680:62;22778:5;22758:18;;;22751:33;22801:19;;9618:71:0;22427:399:1;9618:71:0;9782:108;9818:6;9782:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9782:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;9762:17:0;;;:9;:17;;;;;;;;;;;:128;;;;9924:20;;;;;;;:32;;9949:6;9924:24;:32::i;:::-;-1:-1:-1;;;;;9901:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;9972:35;2929:25:1;;;9901:20:0;;9972:35;;;;;;2902:18:1;9972:35:0;2783:177:1;44185:6466:0;-1:-1:-1;;;;;44317:18:0;;44309:68;;;;-1:-1:-1;;;44309:68:0;;22223:2:1;44309:68:0;;;22205:21:1;22262:2;22242:18;;;22235:30;22301:34;22281:18;;;22274:62;22372:7;22352:18;;;22345:35;22397:19;;44309:68:0;22021:401:1;44309:68:0;-1:-1:-1;;;;;44396:16:0;;44388:64;;;;-1:-1:-1;;;44388:64:0;;22629:2:1;44388:64:0;;;22611:21:1;22668:2;22648:18;;;22641:30;22707:34;22687:18;;;22680:62;22778:5;22758:18;;;22751:33;22801:19;;44388:64:0;22427:399:1;44388:64:0;-1:-1:-1;;;;;44615:39:0;;44463:18;44615:39;;;:33;:39;;;;;;44463:18;;;;;;;;44615:39;;44610:132;;44679:14;;;;;;;44671:59;;;;-1:-1:-1;;;44671:59:0;;23033:2:1;44671:59:0;;;23015:21:1;;;23052:18;;;23045:30;23111:34;23091:18;;;23084:62;23163:18;;44671:59:0;22831:356:1;44671:59:0;44766:20;;;;:29;;;:57;;-1:-1:-1;44799:10:0;;;;;-1:-1:-1;;;;;44799:10:0;:24;;44766:57;44762:209;;;44848:19;44858:4;44864:2;44848:9;:19::i;:::-;:24;;:57;;-1:-1:-1;;;;;;44876:29:0;;;;;;:23;:29;;;;;;;;44848:57;:88;;;-1:-1:-1;;;;;;44909:27:0;;;;;;:23;:27;;;;;;;;44848:88;44840:119;;;;-1:-1:-1;;;44840:119:0;;23394:2:1;44840:119:0;;;23376:21:1;23433:2;23413:18;;;23406:30;23472:20;23452:18;;;23445:48;23510:18;;44840:119:0;23192:342:1;44840:119:0;45003:6;45013:1;45003:11;44999:5268;;45031:28;45047:4;45053:2;45057:1;45031:15;:28::i;:::-;45074:7;;;;;44185:6466;;;:::o;44999:5268::-;45117:8;;;;;;;45116:9;:39;;;;-1:-1:-1;;;;;;45130:25:0;;;;;;:19;:25;;;;;;;;45129:26;45116:39;:67;;;;-1:-1:-1;;;;;;45160:23:0;;;;;;:19;:23;;;;;;;;45159:24;45116:67;45098:5169;;;-1:-1:-1;;;;;45227:29:0;;;45210:14;45227:29;;;:25;:29;;;;;;;45287:31;;;;;;;;45227:29;;;;;45287:31;45339:9;;:23;;;;;45353:9;45352:10;45339:23;45335:2286;;;45383:13;45399:32;45427:3;45399:23;45410:11;;45399:6;:10;;:23;;;;:::i;:32::-;45383:48;-1:-1:-1;45459:17:0;:6;45383:48;45459:10;:17::i;:::-;45450:26;;45495:43;45511:4;45525;45532:5;45495:15;:43::i;:::-;45557:33;45573:4;45579:2;45583:6;45557:15;:33::i;:::-;45609:15;;-1:-1:-1;;;;;45609:15:0;:26;45636:4;45642:23;45636:4;45642:17;:23::i;:::-;45609:57;;-1:-1:-1;;;;;;45609:57:0;;;;;;;-1:-1:-1;;;;;12354:55:1;;;45609:57:0;;;12336:74:1;12426:18;;;12419:34;12309:18;;45609:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45685:15:0;;-1:-1:-1;;;;;45685:15:0;;-1:-1:-1;45685:26:0;;-1:-1:-1;45712:2:0;45716:21;45712:2;45716:17;:21::i;:::-;45685:53;;-1:-1:-1;;;;;;45685:53:0;;;;;;;-1:-1:-1;;;;;12354:55:1;;;45685:53:0;;;12336:74:1;12426:18;;;12419:34;12309:18;;45685:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45757:7;;;;;;;;44185:6466;;;:::o;45335:2286::-;45817:8;45816:9;:27;;;;-1:-1:-1;45829:14:0;;-1:-1:-1;;;45829:14:0;;;;45816:27;45812:1809;;;-1:-1:-1;;;;;45894:22:0;;;;;;:16;:22;;;;;;45920:15;-1:-1:-1;45894:41:0;45864:144;;;;-1:-1:-1;;;45864:144:0;;23741:2:1;45864:144:0;;;23723:21:1;23780:2;23760:18;;;23753:30;23819:31;23799:18;;;23792:59;23868:18;;45864:144:0;23539:353:1;45864:144:0;-1:-1:-1;;;;;46031:22:0;;;;;;:16;:22;;;;;;:27;46027:147;;-1:-1:-1;;;;;46083:22:0;;46108:1;46083:22;;;:16;:22;;;;;;;;:26;;;46132:12;:18;;;;;:22;46027:147;45812:1809;;;46214:9;46210:1411;;;46257:14;;46301:12;;46348:17;;46399:16;;46444:10;;46479:14;;46257;;-1:-1:-1;46301:12:0;;-1:-1:-1;46348:17:0;;-1:-1:-1;46399:16:0;-1:-1:-1;46444:10:0;-1:-1:-1;46479:14:0;;46475:271;;;46583:13;;46570:9;46541:39;;;;:28;:39;;;;;;:55;;46583:13;46541:55;:::i;:::-;46522:15;:74;;46514:134;;;;-1:-1:-1;;;46514:134:0;;24099:2:1;46514:134:0;;;24081:21:1;24138:2;24118:18;;;24111:30;24177:24;24157:18;;;24150:52;24219:18;;46514:134:0;23897:346:1;46514:134:0;46696:9;46667:39;;;;:28;:39;;;;;46709:15;46667:57;;46210:1411;;;46773:8;46769:852;;;46815:13;;46858:11;;46904:16;;46954:15;;46998:9;;47032:14;;46815:13;;-1:-1:-1;46858:11:0;;-1:-1:-1;46904:16:0;;-1:-1:-1;46954:15:0;-1:-1:-1;46998:9:0;-1:-1:-1;47032:14:0;;47028:369;;;47090:11;;:15;;47104:1;47090:15;:::i;:::-;47075:12;:30;47067:60;;;;-1:-1:-1;;;47067:60:0;;24450:2:1;47067:60:0;;;24432:21:1;24489:2;24469:18;;;24462:30;24528:20;24508:18;;;24501:48;24566:18;;47067:60:0;24248:342:1;47067:60:0;47169:13;;47154:11;:28;;47146:64;;;;-1:-1:-1;;;47146:64:0;;24797:2:1;47146:64:0;;;24779:21:1;24836:2;24816:18;;;24809:30;24875:26;24855:18;;;24848:54;24919:18;;47146:64:0;24595:348:1;47146:64:0;47262:9;47237:35;;;;:24;:35;;;;;;47276:12;47237:51;;47229:83;;;;-1:-1:-1;;;47229:83:0;;25150:2:1;47229:83:0;;;25132:21:1;25189:2;25169:18;;;25162:30;25228:22;25208:18;;;25201:50;25268:18;;47229:83:0;24948:344:1;47229:83:0;47356:9;47331:35;;;;:24;:35;;;;;47369:12;47331:50;;47028:369;-1:-1:-1;;;;;7542:18:0;;47425:32;7542:18;;;;;;;;;;;47533:9;;47496:33;47523:6;7542:18;47496:33;:::i;:::-;:46;;47488:117;;;;-1:-1:-1;;;47488:117:0;;25499:2:1;47488:117:0;;;25481:21:1;25538:2;25518:18;;;25511:30;25577:34;25557:18;;;25550:62;25648:6;25628:18;;;25621:34;25672:19;;47488:117:0;25297:400:1;47488:117:0;46783:838;46769:852;47637:17;47657:72;47721:7;47690:28;47705:13;47690:12;:28;:::i;:::-;:38;;;;:::i;:::-;47657:10;;:32;:72::i;:::-;47795:4;47746:28;7542:18;;;;;;;;;;;47857;;47637:92;;-1:-1:-1;7542:18:0;47833:42;;;;;;;47896:43;;-1:-1:-1;;;;;;47908:31:0;;;;;;:25;:31;;;;;;;;47907:32;47896:43;47892:1251;;;47960:8;:15;;;;;;;;48000:21;;47960:15;48000:21;:41;;;;;48040:1;48025:12;:16;48000:41;:61;;;;;48060:1;48045:12;;:16;48000:61;47996:903;;;48086:20;48109:25;48123:10;;48109:9;;:13;;:25;;;;:::i;:::-;48086:48;;48157:24;48184:105;48276:12;48184:61;48235:9;;48184:20;:50;;:61;;;;:::i;:105::-;48157:132;;48312:22;48337:106;48430:12;48337:62;48388:10;;48337:20;:50;;:62;;;;:::i;:106::-;48312:131;;48468:21;48492:104;48583:12;;48492:60;48539:12;48492:16;:46;;:60;;;;:::i;:104::-;48468:128;;48621:22;48646:103;48735:13;;48646:58;48691:12;48646:14;:44;;:58;;;;:::i;:103::-;48621:128;-1:-1:-1;48774:18:0;48795:33;48621:128;48814:13;48795:18;:33::i;:::-;48774:54;;48853:26;48868:10;48853:14;:26::i;:::-;48063:836;;;;;;47996:903;48964:4;48919:24;7542:18;;;;;;;;;;;48989:38;7542:18;48989:20;:38::i;:::-;-1:-1:-1;49058:1:0;49046:9;:13;;;49078:10;:14;49111:8;:16;;;;;;47892:1251;49159:12;49174:30;49200:3;49174:21;:6;49185:9;49174:10;:21::i;:30::-;49159:45;-1:-1:-1;49219:18:0;49258:12;;49254:202;;49323:3;49300:20;:6;49311:8;49300:10;:20::i;:::-;:26;;;;:::i;:::-;49287:39;;49341;49357:4;49363;;;;;;;;;-1:-1:-1;;;;;49363:4:0;49369:10;49341:15;:39::i;:::-;49410:12;;:28;;49427:10;49410:16;:28::i;:::-;49395:12;:43;49254:202;49481:29;49492:17;49499:10;49492:4;:17;:::i;:::-;49481:6;;:10;:29::i;:::-;49472:38;;49531:9;49527:155;;;49574:10;;:20;;49589:4;49574:14;:20::i;:::-;49561:10;:33;49527:155;;;49647:9;;:19;;49661:4;49647:13;:19::i;:::-;49635:9;:31;49527:155;49698:42;49714:4;49728;49735;49698:15;:42::i;:::-;49771:16;;49808:15;;:28;;;;;;;;2929:25:1;;;-1:-1:-1;;;;;49808:15:0;;;;:23;;2902:18:1;;49808:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;49808:28:0;;;;;;;;-1:-1:-1;;49808:28:0;;;;;;;;;;;;:::i;:::-;;;49804:452;;;50000:231;;;14229:25:1;;;14285:2;14270:18;;14263:34;;;14313:18;;;14306:34;;;14371:2;14356:18;;14349:34;;;50203:9:0;;50150:4;;50000:231;;14216:3:1;14201:19;50000:231:0;;;;;;;49837:410;;;49804:452;45195:5072;;;;;;;;45098:5169;50279:33;50295:4;50301:2;50305:6;50279:15;:33::i;:::-;50323:15;;-1:-1:-1;;;;;50323:15:0;:26;50350:4;50356:23;50350:4;50356:17;:23::i;:::-;50323:57;;-1:-1:-1;;;;;;50323:57:0;;;;;;;-1:-1:-1;;;;;12354:55:1;;;50323:57:0;;;12336:74:1;12426:18;;;12419:34;12309:18;;50323:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50391:15:0;;-1:-1:-1;;;;;50391:15:0;;-1:-1:-1;50391:26:0;;-1:-1:-1;50418:2:0;50422:21;50418:2;50422:17;:21::i;:::-;50391:53;;-1:-1:-1;;;;;;50391:53:0;;;;;;;-1:-1:-1;;;;;12354:55:1;;;50391:53:0;;;12336:74:1;12426:18;;;12419:34;12309:18;;50391:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50481:15:0;;-1:-1:-1;;;;;50465:32:0;;;50481:15;;50465:32;;;;-1:-1:-1;50465:32:0;-1:-1:-1;50465:68:0;;-1:-1:-1;;;;;;50502:31:0;;;;;;:25;:31;;;;;;;;50501:32;50465:68;:88;;;;-1:-1:-1;50543:10:0;;-1:-1:-1;;;;;50537:16:0;;;50543:10;;;;;50537:16;50465:88;50461:179;;;50584:10;;50570:58;;;;;;;;25876:25:1;;;-1:-1:-1;;;;;25937:55:1;;;25917:18;;;25910:83;50584:10:0;;;;;;;;50570:44;;25849:18:1;;50570:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44298:6353;;;;;44185:6466;;;:::o;12513:226::-;12633:7;12669:12;12661:6;;;;12653:29;;;;-1:-1:-1;;;12653:29:0;;;;;;;;:::i;:::-;-1:-1:-1;12693:9:0;12705:5;12709:1;12705;:5;:::i;:::-;12693:17;12513:226;-1:-1:-1;;;;;12513:226:0:o;38757:280::-;-1:-1:-1;;;;;38840:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;38840:39:0;;;;;;;;;;;;38892:80;;38918:15;;:42;;-1:-1:-1;;;38918:42:0;;-1:-1:-1;;;;;178:55:1;;;38918:42:0;;;160:74:1;38918:15:0;;;;:36;;133:18:1;;38918:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38892:80;38989:40;;;;;;-1:-1:-1;;;;;38989:40:0;;;;;;;;38757:280;;:::o;50659:289::-;50765:14;;50725:7;;-1:-1:-1;;;50765:14:0;;;;:175;;-1:-1:-1;;;;;7542:18:0;;7510:7;7542:18;;;;;;;;;;;50765:175;;;-1:-1:-1;;;;;50822:21:0;;;;;;:12;:21;;;;;;50799:103;;50880:3;;50799:54;;50822:30;;50880:3;50822:25;:30::i;:::-;-1:-1:-1;;;;;7542:18:0;;7510:7;7542:18;;;;;;;;;;;50799;7391:177;13145:312;13265:7;13300:12;13293:5;13285:28;;;;-1:-1:-1;;;13285:28:0;;;;;;;;:::i;:::-;-1:-1:-1;13324:9:0;13336:5;13340:1;13336;:5;:::i;51444:499::-;51534:16;;;51548:1;51534:16;;;;;;;;51510:21;;51534:16;;;;;;;;;;-1:-1:-1;51534:16:0;51510:40;;51579:4;51561;51566:1;51561:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51561:23:0;;;:7;;;;;;;;;;:23;;;;51605:15;;:22;;;;;;;;:15;;;;;:20;;:22;;;;;51561:7;;51605:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51595:4;51600:1;51595:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51595:32:0;;;:7;;;;;;;;;:32;51670:15;;51638:62;;51655:4;;51670:15;51688:11;51638:8;:62::i;:::-;51711:15;;:224;;;;;-1:-1:-1;;;;;51711:15:0;;;;:66;;:224;;51792:11;;51711:15;;51862:4;;51889;;51909:15;;51711:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51499:444;51444:499;:::o;33913:327::-;-1:-1:-1;;;;;34036:34:0;;34010:4;34036:34;;;:25;:34;;;;;;;;:76;;;;-1:-1:-1;34096:15:0;;-1:-1:-1;;;;;34074:38:0;;;34096:15;;34074:38;;34036:76;34032:90;;;-1:-1:-1;34121:1:0;34114:8;;34032:90;-1:-1:-1;;;;;34151:37:0;;;;;;:25;:37;;;;;;;;34147:51;;;-1:-1:-1;34197:1:0;34190:8;;34147:51;-1:-1:-1;34231:1:0;33913:327;;;;:::o;50956:480::-;51015:12;51030:13;:6;51041:1;51030:10;:13::i;:::-;51015:28;-1:-1:-1;51054:17:0;51074:16;:6;51015:28;51074:10;:16::i;:::-;51054:36;-1:-1:-1;51126:21:0;51158:22;51175:4;51158:16;:22::i;:::-;51261:18;51282:41;:21;51308:14;51282:25;:41::i;:::-;51261:62;;51334:35;51347:9;51358:10;51334:12;:35::i;:::-;51385:43;;;27367:25:1;;;27423:2;27408:18;;27401:34;;;27451:18;;;27444:34;;;51385:43:0;;27355:2:1;27340:18;51385:43:0;;;;;;;51004:432;;;;50956:480;:::o;52613:513::-;52793:15;;52761:62;;52778:4;;-1:-1:-1;;;;;52793:15:0;52811:11;52761:8;:62::i;:::-;52866:15;;-1:-1:-1;;;;;52866:15:0;:31;52905:9;52938:4;52958:11;52866:15;;53070:7;14219:6;;-1:-1:-1;;;;;14219:6:0;;14154:79;53070:7;52866:252;;;;;;-1:-1:-1;;;;;;52866:252:0;;;-1:-1:-1;;;;;27871:15:1;;;52866:252:0;;;27853:34:1;27903:18;;;27896:34;;;;27946:18;;;27939:34;;;;27989:18;;;27982:34;28053:15;;;28032:19;;;28025:44;53092:15:0;28085:19:1;;;28078:35;27764:19;;52866:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;245:180:1:-;304:6;357:2;345:9;336:7;332:23;328:32;325:52;;;373:1;370;363:12;325:52;-1:-1:-1;396:23:1;;245:180;-1:-1:-1;245:180:1:o;430:656::-;542:4;571:2;600;589:9;582:21;632:6;626:13;675:6;670:2;659:9;655:18;648:34;700:1;710:140;724:6;721:1;718:13;710:140;;;819:14;;;815:23;;809:30;785:17;;;804:2;781:26;774:66;739:10;;710:140;;;868:6;865:1;862:13;859:91;;;938:1;933:2;924:6;913:9;909:22;905:31;898:42;859:91;-1:-1:-1;1002:2:1;990:15;-1:-1:-1;;986:88:1;971:104;;;;1077:2;967:113;;430:656;-1:-1:-1;;;430:656:1:o;1091:154::-;-1:-1:-1;;;;;1170:5:1;1166:54;1159:5;1156:65;1146:93;;1235:1;1232;1225:12;1250:118;1336:5;1329:13;1322:21;1315:5;1312:32;1302:60;;1358:1;1355;1348:12;1373:382;1438:6;1446;1499:2;1487:9;1478:7;1474:23;1470:32;1467:52;;;1515:1;1512;1505:12;1467:52;1554:9;1541:23;1573:31;1598:5;1573:31;:::i;:::-;1623:5;-1:-1:-1;1680:2:1;1665:18;;1652:32;1693:30;1652:32;1693:30;:::i;:::-;1742:7;1732:17;;;1373:382;;;;;:::o;1760:315::-;1828:6;1836;1889:2;1877:9;1868:7;1864:23;1860:32;1857:52;;;1905:1;1902;1895:12;1857:52;1944:9;1931:23;1963:31;1988:5;1963:31;:::i;:::-;2013:5;2065:2;2050:18;;;;2037:32;;-1:-1:-1;;;1760:315:1:o;2272:248::-;2340:6;2348;2401:2;2389:9;2380:7;2376:23;2372:32;2369:52;;;2417:1;2414;2407:12;2369:52;-1:-1:-1;;2440:23:1;;;2510:2;2495:18;;;2482:32;;-1:-1:-1;2272:248:1:o;2965:247::-;3024:6;3077:2;3065:9;3056:7;3052:23;3048:32;3045:52;;;3093:1;3090;3083:12;3045:52;3132:9;3119:23;3151:31;3176:5;3151:31;:::i;3217:184::-;-1:-1:-1;;;3266:1:1;3259:88;3366:4;3363:1;3356:15;3390:4;3387:1;3380:15;3406:334;3477:2;3471:9;3533:2;3523:13;;-1:-1:-1;;3519:86:1;3507:99;;3636:18;3621:34;;3657:22;;;3618:62;3615:88;;;3683:18;;:::i;:::-;3719:2;3712:22;3406:334;;-1:-1:-1;3406:334:1:o;3745:183::-;3805:4;3838:18;3830:6;3827:30;3824:56;;;3860:18;;:::i;:::-;-1:-1:-1;3905:1:1;3901:14;3917:4;3897:25;;3745:183::o;3933:662::-;3987:5;4040:3;4033:4;4025:6;4021:17;4017:27;4007:55;;4058:1;4055;4048:12;4007:55;4094:6;4081:20;4120:4;4144:60;4160:43;4200:2;4160:43;:::i;:::-;4144:60;:::i;:::-;4238:15;;;4324:1;4320:10;;;;4308:23;;4304:32;;;4269:12;;;;4348:15;;;4345:35;;;4376:1;4373;4366:12;4345:35;4412:2;4404:6;4400:15;4424:142;4440:6;4435:3;4432:15;4424:142;;;4506:17;;4494:30;;4544:12;;;;4457;;4424:142;;;-1:-1:-1;4584:5:1;3933:662;-1:-1:-1;;;;;;3933:662:1:o;4600:1215::-;4718:6;4726;4779:2;4767:9;4758:7;4754:23;4750:32;4747:52;;;4795:1;4792;4785:12;4747:52;4835:9;4822:23;4864:18;4905:2;4897:6;4894:14;4891:34;;;4921:1;4918;4911:12;4891:34;4959:6;4948:9;4944:22;4934:32;;5004:7;4997:4;4993:2;4989:13;4985:27;4975:55;;5026:1;5023;5016:12;4975:55;5062:2;5049:16;5084:4;5108:60;5124:43;5164:2;5124:43;:::i;5108:60::-;5202:15;;;5284:1;5280:10;;;;5272:19;;5268:28;;;5233:12;;;;5308:19;;;5305:39;;;5340:1;5337;5330:12;5305:39;5364:11;;;;5384:217;5400:6;5395:3;5392:15;5384:217;;;5480:3;5467:17;5497:31;5522:5;5497:31;:::i;:::-;5541:18;;5417:12;;;;5579;;;;5384:217;;;5620:5;-1:-1:-1;;5663:18:1;;5650:32;;-1:-1:-1;;5694:16:1;;;5691:36;;;5723:1;5720;5713:12;5691:36;;5746:63;5801:7;5790:8;5779:9;5775:24;5746:63;:::i;:::-;5736:73;;;4600:1215;;;;;:::o;5820:456::-;5897:6;5905;5913;5966:2;5954:9;5945:7;5941:23;5937:32;5934:52;;;5982:1;5979;5972:12;5934:52;6021:9;6008:23;6040:31;6065:5;6040:31;:::i;:::-;6090:5;-1:-1:-1;6147:2:1;6132:18;;6119:32;6160:33;6119:32;6160:33;:::i;:::-;5820:456;;6212:7;;-1:-1:-1;;;6266:2:1;6251:18;;;;6238:32;;5820:456::o;6738:241::-;6794:6;6847:2;6835:9;6826:7;6822:23;6818:32;6815:52;;;6863:1;6860;6853:12;6815:52;6902:9;6889:23;6921:28;6943:5;6921:28;:::i;7231:799::-;7371:6;7379;7387;7395;7403;7411;7419;7427;7435;7443;7496:3;7484:9;7475:7;7471:23;7467:33;7464:53;;;7513:1;7510;7503:12;7464:53;-1:-1:-1;;7536:23:1;;;7606:2;7591:18;;7578:32;;-1:-1:-1;7657:2:1;7642:18;;7629:32;;7708:2;7693:18;;7680:32;;-1:-1:-1;7759:3:1;7744:19;;7731:33;;-1:-1:-1;7811:3:1;7796:19;;7783:33;;-1:-1:-1;7863:3:1;7848:19;;7835:33;;-1:-1:-1;7915:3:1;7900:19;;7887:33;;-1:-1:-1;7967:3:1;7952:19;;7939:33;;-1:-1:-1;8019:3:1;8004:19;7991:33;;-1:-1:-1;7231:799:1;-1:-1:-1;7231:799:1:o;8873:388::-;8941:6;8949;9002:2;8990:9;8981:7;8977:23;8973:32;8970:52;;;9018:1;9015;9008:12;8970:52;9057:9;9044:23;9076:31;9101:5;9076:31;:::i;:::-;9126:5;-1:-1:-1;9183:2:1;9168:18;;9155:32;9196:33;9155:32;9196:33;:::i;9627:184::-;-1:-1:-1;;;9676:1:1;9669:88;9776:4;9773:1;9766:15;9800:4;9797:1;9790:15;9816:228;9856:7;9982:1;-1:-1:-1;;9910:74:1;9907:1;9904:81;9899:1;9892:9;9885:17;9881:105;9878:131;;;9989:18;;:::i;:::-;-1:-1:-1;10029:9:1;;9816:228::o;10049:437::-;10128:1;10124:12;;;;10171;;;10192:61;;10246:4;10238:6;10234:17;10224:27;;10192:61;10299:2;10291:6;10288:14;10268:18;10265:38;10262:218;;-1:-1:-1;;;10333:1:1;10326:88;10437:4;10434:1;10427:15;10465:4;10462:1;10455:15;10262:218;;10049:437;;;:::o;11965:184::-;-1:-1:-1;;;12014:1:1;12007:88;12114:4;12111:1;12104:15;12138:4;12135:1;12128:15;12464:195;12503:3;-1:-1:-1;;12527:5:1;12524:77;12521:103;;12604:18;;:::i;:::-;-1:-1:-1;12651:1:1;12640:13;;12464:195::o;12664:251::-;12734:6;12787:2;12775:9;12766:7;12762:23;12758:32;12755:52;;;12803:1;12800;12793:12;12755:52;12835:9;12829:16;12854:31;12879:5;12854:31;:::i;12920:184::-;12990:6;13043:2;13031:9;13022:7;13018:23;13014:32;13011:52;;;13059:1;13056;13049:12;13011:52;-1:-1:-1;13082:16:1;;12920:184;-1:-1:-1;12920:184:1:o;13437:245::-;13504:6;13557:2;13545:9;13536:7;13532:23;13528:32;13525:52;;;13573:1;13570;13563:12;13525:52;13605:9;13599:16;13624:28;13646:5;13624:28;:::i;13687:306::-;13775:6;13783;13791;13844:2;13832:9;13823:7;13819:23;13815:32;13812:52;;;13860:1;13857;13850:12;13812:52;13889:9;13883:16;13873:26;;13939:2;13928:9;13924:18;13918:25;13908:35;;13983:2;13972:9;13968:18;13962:25;13952:35;;13687:306;;;;;:::o;17712:557::-;17825:6;17833;17841;17849;17857;17865;17918:3;17906:9;17897:7;17893:23;17889:33;17886:53;;;17935:1;17932;17925:12;17886:53;17967:9;17961:16;17986:31;18011:5;17986:31;:::i;:::-;18081:2;18066:18;;18060:25;18125:2;18110:18;;18104:25;18169:2;18154:18;;18148:25;18213:3;18198:19;;18192:26;18258:3;18243:19;;;18237:26;18036:5;;18060:25;;-1:-1:-1;18104:25:1;;18148;;-1:-1:-1;18192:26:1;-1:-1:-1;18237:26:1;;-1:-1:-1;17712:557:1;-1:-1:-1;;;17712:557:1:o;19088:274::-;19128:1;19154;19144:189;;-1:-1:-1;;;19186:1:1;19179:88;19290:4;19287:1;19280:15;19318:4;19315:1;19308:15;19144:189;-1:-1:-1;19347:9:1;;19088:274::o;19778:128::-;19818:3;19849:1;19845:6;19842:1;19839:13;19836:39;;;19855:18;;:::i;:::-;-1:-1:-1;19891:9:1;;19778:128::o;26004:125::-;26044:4;26072:1;26069;26066:8;26063:34;;;26077:18;;:::i;:::-;-1:-1:-1;26114:9:1;;26004:125::o;26134:1026::-;26396:4;26444:3;26433:9;26429:19;26475:6;26464:9;26457:25;26501:2;26539:6;26534:2;26523:9;26519:18;26512:34;26582:3;26577:2;26566:9;26562:18;26555:31;26606:6;26641;26635:13;26672:6;26664;26657:22;26710:3;26699:9;26695:19;26688:26;;26749:2;26741:6;26737:15;26723:29;;26770:1;26780:218;26794:6;26791:1;26788:13;26780:218;;;26859:13;;-1:-1:-1;;;;;26855:62:1;26843:75;;26973:15;;;;26938:12;;;;26816:1;26809:9;26780:218;;;-1:-1:-1;;;;;;;27054:55:1;;;;27049:2;27034:18;;27027:83;-1:-1:-1;;;27141:3:1;27126:19;27119:35;27015:3;26134:1026;-1:-1:-1;;;26134:1026:1:o

Swarm Source

ipfs://6e626b3a42f874b81ec336c23b9f0697af305d5d4fa3f0c1ebb0dbe7dbcda825

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

06/08/23 - Token update (Afiq)

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

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

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