ETH Price: $3,379.75 (-0.82%)
Gas: 4 Gwei

Token

Wise Token (WISE)
 

Overview

Max Total Supply

492,939,508.560877108801059775 WISE

Holders

6,602 ( -0.030%)

Market

Price

$0.21 @ 0.000062 ETH (-3.00%)

Onchain Market Cap

$102,802,041.57

Circulating Supply Market Cap

$13,167,629.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Wise: WISE Token
Balance
43,058.105267333787952802 WISE

Value
$8,979.72 ( ~2.6569 Eth) [0.0087%]
0x66a0f676479cee1d7373f3dc2e2952778bff5bd6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

WISE project consists of smart contracts capitalizing on token liquidity formation, a referral system, and token staking capabilities.

Market

Volume (24H):$40,961.00
Market Capitalization:$13,167,629.00
Circulating Supply:63,139,189.00 WISE
Market Data Source: Coinmarketcap

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

Contract Source Code Verified (Exact Match)

Contract Name:
WiseToken

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license, Audited
File 12 of 12: WiseToken.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

import "./LiquidityToken.sol";

contract WiseToken is LiquidityToken {

    address public LIQUIDITY_TRANSFORMER;
    address public transformerGateKeeper;

    constructor() ERC20("Wise Token", "WISE") {
        transformerGateKeeper = msg.sender;
    }

    receive() external payable {
        revert();
    }

    /**
     * @notice ability to define liquidity transformer contract
     * @dev this method renounce transformerGateKeeper access
     * @param _immutableTransformer contract address
     */
    function setLiquidityTransfomer(
        address _immutableTransformer
    )
        external
    {
        require(
            transformerGateKeeper == msg.sender
            // 'WISE: transformer defined'
        );
        LIQUIDITY_TRANSFORMER = _immutableTransformer;
        transformerGateKeeper = address(0x0);
    }

    /**
     * @notice allows liquidityTransformer to mint supply
     * @dev executed from liquidityTransformer upon UNISWAP transfer
     * and during reservation payout to contributors and referrers
     * @param _investorAddress address for minting WISE tokens
     * @param _amount of tokens to mint for _investorAddress
     */
    function mintSupply(
        address _investorAddress,
        uint256 _amount
    )
        external
    {
        require(
            msg.sender == LIQUIDITY_TRANSFORMER
            // 'WISE: wrong transformer'
        );

        _mint(
            _investorAddress,
            _amount
        );
    }

    /**
     * @notice allows to grant permission to CM referrer status
     * @dev called from liquidityTransformer if user referred 50 ETH
     * @param _referrer - address that becomes a CM reffer
     */
    function giveStatus(
        address _referrer
    )
        external
    {
        require(
            msg.sender == LIQUIDITY_TRANSFORMER
            // 'WISE: wrong transformer'
        );
        criticalMass[_referrer].totalAmount = THRESHOLD_LIMIT;
        criticalMass[_referrer].activationDay = _nextWiseDay();
    }

    /**
     * @notice allows to create stake directly with ETH
     * if you don't have WISE tokens method will convert
     * and use amount returned from UNISWAP to open a stake
     * @param _lockDays amount of days it is locked for.
     * @param _referrer referrer address for +10% bonus
     */
    function createStakeWithETH(
        uint64 _lockDays,
        address _referrer
    )
        external
        payable
        returns (bytes16, uint256, bytes16 referralID)
    {
        address[] memory path = new address[](2);
            path[0] = WETH;
            path[1] = address(this);

        uint256[] memory amounts =
        UNISWAP_ROUTER.swapExactETHForTokens{value: msg.value}(
            1,
            path,
            msg.sender,
            block.timestamp + 2 hours
        );

        return createStake(
            amounts[1],
            _lockDays,
            _referrer
        );
    }

    /**
     * @notice allows to create stake with another token
     * if you don't have WISE tokens method will convert
     * and use amount returned from UNISWAP to open a stake
     * @dev the token must have WETH pair on UNISWAP
     * @param _tokenAddress any ERC20 token address
     * @param _tokenAmount amount to be converted to WISE
     * @param _lockDays amount of days it is locked for.
     * @param _referrer referrer address for +10% bonus
     */
    function createStakeWithToken(
        address _tokenAddress,
        uint256 _tokenAmount,
        uint64 _lockDays,
        address _referrer
    )
        external
        returns (bytes16, uint256, bytes16 referralID)
    {
        ERC20TokenI token = ERC20TokenI(
            _tokenAddress
        );

        token.transferFrom(
            msg.sender,
            address(this),
            _tokenAmount
        );

        token.approve(
            address(UNISWAP_ROUTER),
            _tokenAmount
        );

        address[] memory path = _preparePath(
            _tokenAddress,
            address(this)
        );

        uint256[] memory amounts =
        UNISWAP_ROUTER.swapExactTokensForTokens(
            _tokenAmount,
            1,
            path,
            msg.sender,
            block.timestamp + 2 hours
        );

        return createStake(
            amounts[2],
            _lockDays,
            _referrer
        );
    }
}

File 1 of 12: Declaration.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

import "./Global.sol";

interface IUniswapV2Factory {

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

interface IUniswapRouterV2 {

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

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

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

interface IUniswapV2Pair {

    function getReserves() external view returns (
        uint112 reserve0,
        uint112 reserve1,
        uint32 blockTimestampLast
    );

    function token1() external view returns (address);
}

interface ILiquidityGuard {
    function getInflation(uint32 _amount) external view returns (uint256);
}

interface ERC20TokenI {

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    )  external returns (
        bool success
    );

    function approve(
        address _spender,
        uint256 _value
    )  external returns (
        bool success
    );
}

abstract contract Declaration is Global {

    uint256 constant _decimals = 18;
    uint256 constant YODAS_PER_WISE = 10 ** _decimals;

    uint32 constant SECONDS_IN_DAY = 86400 seconds;
    uint16 constant MIN_LOCK_DAYS = 1;
    uint16 constant FORMULA_DAY = 65;
    uint16 constant MAX_LOCK_DAYS = 15330; // 42 years
    uint16 constant MAX_BONUS_DAYS_A = 1825; // 5 years
    uint16 constant MAX_BONUS_DAYS_B = 13505; // 37 years
    uint16 constant MIN_REFERRAL_DAYS = 365;

    uint32 constant MIN_STAKE_AMOUNT = 1000000;
    uint32 constant REFERRALS_RATE = 366816973; // 1.000% (direct value, can be used right away)
    uint32 constant INFLATION_RATE_MAX = 103000; // 3.000% (indirect -> checks throgh LiquidityGuard)

    uint32 public INFLATION_RATE = 103000; // 3.000% (indirect -> checks throgh LiquidityGuard)
    uint32 public LIQUIDITY_RATE = 100006; // 0.006% (indirect -> checks throgh LiquidityGuard)

    uint64 constant PRECISION_RATE = 1E18;

    uint96 constant THRESHOLD_LIMIT = 10000E18; // $10,000 DAI

    uint96 constant DAILY_BONUS_A = 13698630136986302; // 25%:1825 = 0.01369863013 per day;
    uint96 constant DAILY_BONUS_B = 370233246945576;   // 5%:13505 = 0.00037023324 per day;

    uint256 immutable LAUNCH_TIME;

    address constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
    address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    IUniswapRouterV2 public constant UNISWAP_ROUTER = IUniswapRouterV2(
        0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
    );

    IUniswapV2Factory public constant UNISWAP_FACTORY = IUniswapV2Factory(
        0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
    );

    ILiquidityGuard public constant LIQUIDITY_GUARD = ILiquidityGuard(
        0x9C306CaD86550EC80D77668c0A8bEE6eB34684B6
    );

    IUniswapV2Pair public UNISWAP_PAIR;
    bool public isLiquidityGuardActive;

    uint256 public latestDaiEquivalent;
    address[] internal _path = [address(this), WETH, DAI];

    constructor() {
        LAUNCH_TIME = 1604966400; // (10th November 2020 @00:00 GMT == day 0)
    }

    function createPair() external {
        UNISWAP_PAIR = IUniswapV2Pair(
            UNISWAP_FACTORY.createPair(
                WETH, address(this)
            )
        );
    }

    struct Stake {
        uint256 stakesShares;
        uint256 stakedAmount;
        uint256 rewardAmount;
        uint64 startDay;
        uint64 lockDays;
        uint64 finalDay;
        uint64 closeDay;
        uint256 scrapeDay;
        uint256 daiEquivalent;
        uint256 referrerShares;
        address referrer;
        bool isActive;
    }

    struct ReferrerLink {
        address staker;
        bytes16 stakeID;
        uint256 rewardAmount;
        uint256 processedDays;
        bool isActive;
    }

    struct LiquidityStake {
        uint256 stakedAmount;
        uint256 rewardAmount;
        uint64 startDay;
        uint64 closeDay;
        bool isActive;
    }

    struct CriticalMass {
        uint256 totalAmount;
        uint256 activationDay;
    }

    mapping(address => uint256) public stakeCount;
    mapping(address => uint256) public referralCount;
    mapping(address => uint256) public liquidityStakeCount;

    mapping(address => CriticalMass) public criticalMass;
    mapping(address => mapping(bytes16 => uint256)) public scrapes;
    mapping(address => mapping(bytes16 => Stake)) public stakes;
    mapping(address => mapping(bytes16 => ReferrerLink)) public referrerLinks;
    mapping(address => mapping(bytes16 => LiquidityStake)) public liquidityStakes;

    mapping(uint256 => uint256) public scheduledToEnd;
    mapping(uint256 => uint256) public referralSharesToEnd;
    mapping(uint256 => uint256) public totalPenalties;
}

File 2 of 12: ERC20.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

contract Context {

    /**
     * @dev returns address executing the method
     */
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    /**
     * @dev returns data passed into the method
     */
    function _msgData() internal view virtual returns (bytes memory) {
        this;
        return msg.data;
    }
}

contract ERC20 is Context {

    using SafeMath for uint256;

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

    /**
     * @dev initial private
     */
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev 👻 ghost supply - unclaimable
     */
    uint256 private _totalSupply = 0.404 ether;

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 value
    );

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    constructor (string memory tokenName, string memory tokenSymbol) {
        _name = tokenName;
        _symbol = tokenSymbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the decimals of the token.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev Returns the total supply of the token.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev Returns the token balance of specific address.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function transfer(
        address recipient,
        uint256 amount
    )
        public
        returns (bool)
    {
        _transfer(
            _msgSender(),
            recipient,
            amount
        );

        return true;
    }

    /**
     * @dev Returns approved balance to be spent by another address
     * by using transferFrom method
     */
    function allowance(
        address owner,
        address spender
    )
        public
        view
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev Sets the token allowance to another spender
     */
    function approve(
        address spender,
        uint256 amount
    )
        public
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            amount
        );

        return true;
    }

    /**
     * @dev Allows to transfer tokens on senders behalf
     * based on allowance approved for the executer
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    )
        public
        returns (bool)
    {
        _approve(sender,
            _msgSender(), _allowances[sender][_msgSender()].sub(
                amount
            )
        );

        _transfer(
            sender,
            recipient,
            amount
        );
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * Emits a {Transfer} event.
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    )
        internal
        virtual
    {
        require(
            sender != address(0x0)
        );

        require(
            recipient != address(0x0)
        );

        _balances[sender] =
        _balances[sender].sub(amount);

        _balances[recipient] =
        _balances[recipient].add(amount);

        emit Transfer(
            sender,
            recipient,
            amount
        );
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(
        address account,
        uint256 amount
    )
        internal
        virtual
    {
        require(
            account != address(0x0)
        );

        _totalSupply =
        _totalSupply.add(amount);

        _balances[account] =
        _balances[account].add(amount);

        emit Transfer(
            address(0x0),
            account,
            amount
        );
    }

    /**
     * @dev Allows to burn tokens if token sender
     * wants to reduce totalSupply() of the token
     */
    function burn(
        uint256 amount
    )
        external
    {
        _burn(msg.sender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(
        address account,
        uint256 amount
    )
        internal
        virtual
    {
        require(
            account != address(0x0)
        );

        _balances[account] =
        _balances[account].sub(amount);

        _totalSupply =
        _totalSupply.sub(amount);

        emit Transfer(
            account,
            address(0x0),
            amount
        );
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    )
        internal
        virtual
    {
        require(
            owner != address(0x0)
        );

        require(
            spender != address(0x0)
        );

        _allowances[owner][spender] = amount;

        emit Approval(
            owner,
            spender,
            amount
        );
    }
}

import "./SafeMath.sol";

File 3 of 12: Events.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

contract Events {

    event StakeStart(
        bytes16 indexed stakeID,
        address indexed stakerAddress,
        address indexed referralAddress,
        uint256 stakedAmount,
        uint256 stakesShares,
        uint256 referralShares,
        uint256 startDay,
        uint256 lockDays,
        uint256 daiEquivalent
    );

    event StakeEnd(
        bytes16 indexed stakeID,
        address indexed stakerAddress,
        address indexed referralAddress,
        uint256 stakedAmount,
        uint256 stakesShares,
        uint256 referralShares,
        uint256 rewardAmount,
        uint256 closeDay,
        uint256 penaltyAmount
    );

    event InterestScraped(
        bytes16 indexed stakeID,
        address indexed stakerAddress,
        uint256 scrapeAmount,
        uint256 scrapeDay,
        uint256 stakersPenalty,
        uint256 referrerPenalty,
        uint256 currentWiseDay
    );

    event ReferralCollected(
        address indexed staker,
        bytes16 indexed stakeID,
        address indexed referrer,
        bytes16 referrerID,
        uint256 rewardAmount
    );

    event NewGlobals(
        uint256 totalShares,
        uint256 totalStaked,
        uint256 shareRate,
        uint256 referrerShares,
        uint256 indexed currentWiseDay
    );

    event NewSharePrice(
        uint256 newSharePrice,
        uint256 oldSharePrice,
        uint64 currentWiseDay
    );

    event UniswapReserves(
        uint112 reserveA,
        uint112 reserveB,
        uint32 blockTimestampLast
    );

    event LiquidityGuardStatus(
        bool isActive
    );
}

File 4 of 12: Global.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

import "./ERC20.sol";
import "./Events.sol";

abstract contract Global is ERC20, Events {

    using SafeMath for uint256;

    struct Globals {
        uint256 totalStaked;
        uint256 totalShares;
        uint256 sharePrice;
        uint256 currentWiseDay;
        uint256 referralShares;
        uint256 liquidityShares;
    }

    Globals public globals;

    constructor() {
        globals.sharePrice = 100E15;
    }

    function _increaseGlobals(
        uint256 _staked,
        uint256 _shares,
        uint256 _rshares
    )
        internal
    {
        globals.totalStaked =
        globals.totalStaked.add(_staked);

        globals.totalShares =
        globals.totalShares.add(_shares);

        if (_rshares > 0) {

            globals.referralShares =
            globals.referralShares.add(_rshares);
        }

        _logGlobals();
    }

    function _decreaseGlobals(
        uint256 _staked,
        uint256 _shares,
        uint256 _rshares
    )
        internal
    {
        globals.totalStaked =
        globals.totalStaked > _staked ?
        globals.totalStaked - _staked : 0;

        globals.totalShares =
        globals.totalShares > _shares ?
        globals.totalShares - _shares : 0;

        if (_rshares > 0) {

            globals.referralShares =
            globals.referralShares > _rshares ?
            globals.referralShares - _rshares : 0;

        }

        _logGlobals();
    }

    function _logGlobals()
        private
    {
        emit NewGlobals(
            globals.totalShares,
            globals.totalStaked,
            globals.sharePrice,
            globals.referralShares,
            globals.currentWiseDay
        );
    }
}

File 5 of 12: Helper.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

import "./Timing.sol";

abstract contract Helper is Timing {

    using SafeMath for uint256;

    function notContract(address _addr) internal view returns (bool) {
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size == 0);
    }

    function toBytes16(uint256 x) internal pure returns (bytes16 b) {
       return bytes16(bytes32(x));
    }

    function generateID(address x, uint256 y, bytes1 z) public pure returns (bytes16 b) {
        b = toBytes16(
            uint256(
                keccak256(
                    abi.encodePacked(x, y, z)
                )
            )
        );
    }

    function generateStakeID(address _staker) internal view returns (bytes16 stakeID) {
        return generateID(_staker, stakeCount[_staker], 0x01);
    }

    function generateReferralID(address _referrer) internal view returns (bytes16 referralID) {
        return generateID(_referrer, referralCount[_referrer], 0x02);
    }

    function generateLiquidityStakeID(address _staker) internal view returns (bytes16 liquidityStakeID) {
        return generateID(_staker, liquidityStakeCount[_staker], 0x03);
    }

    function stakesPagination(
        address _staker,
        uint256 _offset,
        uint256 _length
    )
        external
        view
        returns (bytes16[] memory _stakes)
    {
        uint256 start = _offset > 0 &&
            stakeCount[_staker] > _offset ?
            stakeCount[_staker] - _offset : stakeCount[_staker];

        uint256 finish = _length > 0 &&
            start > _length ?
            start - _length : 0;

        uint256 i;

        _stakes = new bytes16[](start - finish);

        for (uint256 _stakeIndex = start; _stakeIndex > finish; _stakeIndex--) {
            bytes16 _stakeID = generateID(_staker, _stakeIndex - 1, 0x01);
            if (stakes[_staker][_stakeID].stakedAmount > 0) {
                _stakes[i] = _stakeID; i++;
            }
        }
    }

    function referralsPagination(
        address _referrer,
        uint256 _offset,
        uint256 _length
    )
        external
        view
        returns (bytes16[] memory _referrals)
    {
        uint256 start = _offset > 0 &&
            referralCount[_referrer] > _offset ?
            referralCount[_referrer] - _offset : referralCount[_referrer];

        uint256 finish = _length > 0 &&
            start > _length ?
            start - _length : 0;

        uint256 i;

        _referrals = new bytes16[](start - finish);

        for (uint256 _rIndex = start; _rIndex > finish; _rIndex--) {
            bytes16 _rID = generateID(_referrer, _rIndex - 1, 0x02);
            if (_nonZeroAddress(referrerLinks[_referrer][_rID].staker)) {
                _referrals[i] = _rID; i++;
            }
        }
    }

    function latestStakeID(address _staker) external view returns (bytes16) {
        return stakeCount[_staker] == 0 ? bytes16(0) : generateID(_staker, stakeCount[_staker].sub(1), 0x01);
    }

    function latestReferralID(address _referrer) external view returns (bytes16) {
        return referralCount[_referrer] == 0 ? bytes16(0) : generateID(_referrer, referralCount[_referrer].sub(1), 0x02);
    }

    function latestLiquidityStakeID(address _staker) external view returns (bytes16) {
        return liquidityStakeCount[_staker] == 0 ? bytes16(0) : generateID(_staker, liquidityStakeCount[_staker].sub(1), 0x03);
    }

    function _increaseStakeCount(address _staker) internal {
        stakeCount[_staker] = stakeCount[_staker] + 1;
    }

    function _increaseReferralCount(address _referrer) internal {
        referralCount[_referrer] = referralCount[_referrer] + 1;
    }

    function _increaseLiquidityStakeCount(address _staker) internal {
        liquidityStakeCount[_staker] = liquidityStakeCount[_staker] + 1;
    }

    function _isMatureStake(Stake memory _stake) internal view returns (bool) {
        return _stake.closeDay > 0
            ? _stake.finalDay <= _stake.closeDay
            : _stake.finalDay <= _currentWiseDay();
    }

    function _notCriticalMassReferrer(address _referrer) internal view returns (bool) {
        return criticalMass[_referrer].activationDay == 0;
    }

    function _stakeNotStarted(Stake memory _stake) internal view returns (bool) {
        return _stake.closeDay > 0
            ? _stake.startDay > _stake.closeDay
            : _stake.startDay > _currentWiseDay();
    }

    function _stakeEnded(Stake memory _stake) internal view returns (bool) {
        return _stake.isActive == false || _isMatureStake(_stake);
    }

    function _daysLeft(Stake memory _stake) internal view returns (uint256) {
        return _stake.isActive == false
            ? _daysDiff(_stake.closeDay, _stake.finalDay)
            : _daysDiff(_currentWiseDay(), _stake.finalDay);
    }

    function _daysDiff(uint256 _startDate, uint256 _endDate) internal pure returns (uint256) {
        return _startDate > _endDate ? 0 : _endDate.sub(_startDate);
    }

    function _calculationDay(Stake memory _stake) internal view returns (uint256) {
        return _stake.finalDay > globals.currentWiseDay ? globals.currentWiseDay : _stake.finalDay;
    }

    function _startingDay(Stake memory _stake) internal pure returns (uint256) {
        return _stake.scrapeDay == 0 ? _stake.startDay : _stake.scrapeDay;
    }

    function _notFuture(uint256 _day) internal view returns (bool) {
        return _day <= _currentWiseDay();
    }

    function _notPast(uint256 _day) internal view returns (bool) {
        return _day >= _currentWiseDay();
    }

    function _nonZeroAddress(address _address) internal pure returns (bool) {
        return _address != address(0x0);
    }

    function _getLockDays(Stake memory _stake) internal pure returns (uint256) {
        return
            _stake.lockDays > 1 ?
            _stake.lockDays - 1 : 1;
    }

    function _preparePath(
        address _tokenAddress,
        address _wiseAddress
    )
        internal
        pure
        returns (address[] memory _path)
    {
        _path = new address[](3);
        _path[0] = _tokenAddress;
        _path[1] = WETH;
        _path[2] = _wiseAddress;
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    )
        internal
    {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(
                0xa9059cbb,
                to,
                value
            )
        );

        require(
            success && (data.length == 0 || abi.decode(data, (bool)))
            // 'WISE: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint value
    )
        internal
    {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(
                0x23b872dd,
                from,
                to,
                value
            )
        );

        require(
            success && (data.length == 0 || abi.decode(data, (bool)))
            // 'WISE: transferFrom failed'
        );
    }
}

File 6 of 12: LiquidityToken.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

import "./StakingToken.sol";

abstract contract LiquidityToken is StakingToken {

    using SafeMath for uint;

    /**
     * @notice A method for a staker to create a liquidity stake
     * @param _liquidityTokens amount of UNI-WISE staked.
     */
    function createLiquidityStake(
        uint256 _liquidityTokens
    )
        snapshotTrigger
        external
        returns (bytes16 liquidityStakeID)
    {
        require(
            isLiquidityGuardActive == true
            // WISE: LiquidityGuard is not active
        );

        safeTransferFrom(
            address(UNISWAP_PAIR),
            msg.sender,
            address(this),
            _liquidityTokens
        );

        LiquidityStake memory newLiquidityStake;

        liquidityStakeID = generateLiquidityStakeID(
            msg.sender
        );

        newLiquidityStake.startDay = _nextWiseDay();
        newLiquidityStake.stakedAmount = _liquidityTokens;
        newLiquidityStake.isActive = true;

        globals.liquidityShares =
        globals.liquidityShares.add(_liquidityTokens);

        liquidityStakes[msg.sender][liquidityStakeID] = newLiquidityStake;

        _increaseLiquidityStakeCount(
            msg.sender
        );
    }

    /**
     * @notice A method for a staker to end a liquidity stake
     * @param _liquidityStakeID - identification number
     */
    function endLiquidityStake(
        bytes16 _liquidityStakeID
    )
        snapshotTrigger
        external
        returns (uint256)
    {
        LiquidityStake memory liquidityStake =
        liquidityStakes[msg.sender][_liquidityStakeID];

        require(
            liquidityStake.isActive
            // 'WISE: not an active stake'
        );

        liquidityStake.isActive = false;
        liquidityStake.closeDay = _currentWiseDay();

        liquidityStake.rewardAmount = _calculateRewardAmount(
            liquidityStake
        );

        _mint(
            msg.sender,
            liquidityStake.rewardAmount
        );

        safeTransfer(
            address(UNISWAP_PAIR),
            msg.sender,
            liquidityStake.stakedAmount
        );

        globals.liquidityShares =
        globals.liquidityShares.sub(liquidityStake.stakedAmount);

        liquidityStakes[msg.sender][_liquidityStakeID] = liquidityStake;

        return liquidityStake.rewardAmount;
    }

    /**
     * @notice returns full view and details of
     * a liquidity stake belonging to caller
     * @param _liquidityStakeID - stakeID
     */
    function checkLiquidityStakeByID(
        address _staker,
        bytes16 _liquidityStakeID
    )
        external
        view
        returns (
            uint256 startDay,
            uint256 stakedAmount,
            uint256 rewardAmount,
            uint256 closeDay,
            bool isActive
        )
    {
        LiquidityStake memory stake = liquidityStakes[_staker][_liquidityStakeID];
        startDay = stake.startDay;
        stakedAmount = stake.stakedAmount;
        rewardAmount = _calculateRewardAmount(stake);
        closeDay = stake.closeDay;
        isActive = stake.isActive;
    }

    /**
     * @notice calculates reward when closing liquidity stake
     * @param _liquidityStake - stake instance
     */
    function _calculateRewardAmount(
        LiquidityStake memory _liquidityStake
    )
        private
        view
        returns (uint256 _rewardAmount)
    {
        uint256 maxCalculationDay = _liquidityStake.startDay + MIN_REFERRAL_DAYS;

        uint256 calculationDay =
            globals.currentWiseDay < maxCalculationDay ?
            globals.currentWiseDay : maxCalculationDay;

        for (uint256 _day = _liquidityStake.startDay; _day < calculationDay; _day++) {
            _rewardAmount += _liquidityStake.stakedAmount * PRECISION_RATE / lsnapshots[_day].inflationAmount;
        }
    }
}

File 7 of 12: ReferralToken.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

import "./Snapshot.sol";

abstract contract ReferralToken is Snapshot {

    using SafeMath for uint256;

    function _addReferrerSharesToEnd(
        uint256 _finalDay,
        uint256 _shares
    )
        internal
    {
        referralSharesToEnd[_finalDay] =
        referralSharesToEnd[_finalDay].add(_shares);
    }

    function _removeReferrerSharesToEnd(
        uint256 _finalDay,
        uint256 _shares
    )
        internal
    {
        if (_notPast(_finalDay)) {

            referralSharesToEnd[_finalDay] =
            referralSharesToEnd[_finalDay] > _shares ?
            referralSharesToEnd[_finalDay] - _shares : 0;

        } else {

            uint256 _day = _previousWiseDay();
            rsnapshots[_day].scheduledToEnd =
            rsnapshots[_day].scheduledToEnd > _shares ?
            rsnapshots[_day].scheduledToEnd - _shares : 0;
        }
    }

    function _belowThresholdLevel(
        address _referrer
    )
        private
        view
        returns (bool)
    {
        return criticalMass[_referrer].totalAmount < THRESHOLD_LIMIT;
    }

    function _addCriticalMass(
        address _referrer,
        uint256 _daiEquivalent
    )
        internal
    {
        criticalMass[_referrer].totalAmount =
        criticalMass[_referrer].totalAmount.add(_daiEquivalent);
        criticalMass[_referrer].activationDay = _determineActivationDay(_referrer);
    }

    function _removeCriticalMass(
        address _referrer,
        uint256 _daiEquivalent,
        uint256 _startDay
    )
        internal
    {
        if (
            _notFuture(_startDay) == false &&
            _nonZeroAddress(_referrer)
        ) {
            criticalMass[_referrer].totalAmount =
            criticalMass[_referrer].totalAmount > _daiEquivalent ?
            criticalMass[_referrer].totalAmount - _daiEquivalent : 0;
            criticalMass[_referrer].activationDay = _determineActivationDay(_referrer);
        }
    }

    function _determineActivationDay(
        address _referrer
    )
        private
        view
        returns (uint256)
    {
        return _belowThresholdLevel(_referrer) ? 0 : _activationDay(_referrer);
    }

    function _activationDay(
        address _referrer
    )
        private
        view
        returns (uint256)
    {
        return
            criticalMass[_referrer].activationDay > 0 ?
            criticalMass[_referrer].activationDay : _currentWiseDay();
    }

    function _updateDaiEquivalent()
        internal
        returns (uint256)
    {
        try UNISWAP_ROUTER.getAmountsOut(
            YODAS_PER_WISE, _path
        ) returns (uint256[] memory results) {
            latestDaiEquivalent = results[2];
            return latestDaiEquivalent;
        } catch Error(string memory) {
            return latestDaiEquivalent;
        } catch (bytes memory) {
            return latestDaiEquivalent;
        }
    }

    function referrerInterest(
        bytes16 _referralID,
        uint256 _scrapeDays
    )
        external
        snapshotTrigger
    {
        _referrerInterest(
            msg.sender,
            _referralID,
            _scrapeDays
        );
    }

    function referrerInterestBulk(
        bytes16[] memory _referralIDs,
        uint256[] memory _scrapeDays
    )
        external
        snapshotTrigger
    {
        for(uint256 i = 0; i < _referralIDs.length; i++) {
            _referrerInterest(
                msg.sender,
                _referralIDs[i],
                _scrapeDays[i]
            );
        }
    }

    function _referrerInterest(
        address _referrer,
        bytes16 _referralID,
        uint256 _processDays
    )
        internal
    {
        ReferrerLink memory link =
        referrerLinks[_referrer][_referralID];

        require(
            link.isActive == true
        );

        address staker = link.staker;
        bytes16 stakeID = link.stakeID;

        Stake memory stake = stakes[staker][stakeID];

        uint256 startDay = _determineStartDay(stake, link);
        uint256 finalDay = _determineFinalDay(stake);

        if (_stakeEnded(stake)) {

            if (
                _processDays > 0 &&
                _processDays < _daysDiff(startDay, finalDay)
                )
            {

                link.processedDays =
                link.processedDays.add(_processDays);

                finalDay =
                startDay.add(_processDays);

            } else {

                link.isActive = false;
            }

        } else {

            _processDays = _daysDiff(startDay, _currentWiseDay());

            link.processedDays =
            link.processedDays.add(_processDays);

            finalDay =
            startDay.add(_processDays);
        }

        uint256 referralInterest = _checkReferralInterest(
            stake,
            startDay,
            finalDay
        );

        link.rewardAmount =
        link.rewardAmount.add(referralInterest);

        referrerLinks[_referrer][_referralID] = link;

        _mint(
            _referrer,
            referralInterest
        );

        emit ReferralCollected(
            staker,
            stakeID,
            _referrer,
            _referralID,
            referralInterest
        );
    }

    function checkReferralsByID(
        address _referrer,
        bytes16 _referralID
    )
        external
        view
        returns (
            address staker,
            bytes16 stakeID,
            uint256 referrerShares,
            uint256 referralInterest,
            bool isActiveReferral,
            bool isActiveStake,
            bool isMatureStake,
            bool isEndedStake
        )
    {
        ReferrerLink memory link = referrerLinks[_referrer][_referralID];

        staker = link.staker;
        stakeID = link.stakeID;
        isActiveReferral = link.isActive;

        Stake memory stake = stakes[staker][stakeID];
        referrerShares = stake.referrerShares;

        referralInterest = _checkReferralInterest(
            stake,
            _determineStartDay(stake, link),
            _determineFinalDay(stake)
        );

        isActiveStake = stake.isActive;
        isEndedStake = _stakeEnded(stake);
        isMatureStake = _isMatureStake(stake);
    }

    function _checkReferralInterest(Stake memory _stake, uint256 _startDay, uint256 _finalDay) internal view returns (uint256 _referralInterest) {
        return _notCriticalMassReferrer(_stake.referrer) ? 0 : _getReferralInterest(_stake, _startDay, _finalDay);
    }

    function _getReferralInterest(Stake memory _stake, uint256 _startDay, uint256 _finalDay) private view returns (uint256 _referralInterest) {
        for (uint256 _day = _startDay; _day < _finalDay; _day++) {
            _referralInterest += _stake.stakesShares * PRECISION_RATE / rsnapshots[_day].inflationAmount;
        }
    }

    function _determineStartDay(Stake memory _stake, ReferrerLink memory _link) internal view returns (uint256) {
        return (
            criticalMass[_stake.referrer].activationDay > _stake.startDay ?
            criticalMass[_stake.referrer].activationDay : _stake.startDay
        ).add(_link.processedDays);
    }

    function _determineFinalDay(
        Stake memory _stake
    )
        internal
        view
        returns (uint256)
    {
        return
            _stake.closeDay > 0 ?
            _stake.closeDay : _calculationDay(_stake);
    }
}

File 8 of 12: SafeMath.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        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);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0);
        uint256 c = a / b;
        return c;
    }

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

File 9 of 12: Snapshot.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

import "./Helper.sol";

abstract contract Snapshot is Helper {

    using SafeMath for uint;

    // regular shares
    struct SnapShot {
        uint256 totalShares;
        uint256 inflationAmount;
        uint256 scheduledToEnd;
    }

    // referral shares
    struct rSnapShot {
        uint256 totalShares;
        uint256 inflationAmount;
        uint256 scheduledToEnd;
    }

    // liquidity shares
    struct lSnapShot {
        uint256 totalShares;
        uint256 inflationAmount;
    }

    mapping(uint256 => SnapShot) public snapshots;
    mapping(uint256 => rSnapShot) public rsnapshots;
    mapping(uint256 => lSnapShot) public lsnapshots;

    modifier snapshotTrigger() {
        _dailySnapshotPoint(_currentWiseDay());
        _;
    }

    /**
     * @notice allows to activate/deactivate
     * liquidity guard manually based on the
     * liquidity in UNISWAP pair contract
     */
    function liquidityGuardTrigger() public {

        (
            uint112 reserveA,
            uint112 reserveB,
            uint32 blockTimestampLast
        ) = UNISWAP_PAIR.getReserves();

        emit UniswapReserves(
            reserveA,
            reserveB,
            blockTimestampLast
        );

        uint256 onUniswap = UNISWAP_PAIR.token1() == WETH
            ? reserveA
            : reserveB;

        uint256 ratio = totalSupply() == 0
            ? 0
            : onUniswap
                .mul(200)
                .div(totalSupply());

        if (ratio < 40 && isLiquidityGuardActive == false) enableLiquidityGuard();
        if (ratio > 60 && isLiquidityGuardActive == true) disableLiquidityGuard();

        emit LiquidityGuardStatus(
            isLiquidityGuardActive
        );
    }

    function enableLiquidityGuard() private {
        isLiquidityGuardActive = true;
    }

    function disableLiquidityGuard() private {
        isLiquidityGuardActive = false;
    }

    /**
     * @notice allows volunteer to offload snapshots
     * to save on gas during next start/end stake
     */
    function manualDailySnapshot()
        external
    {
        _dailySnapshotPoint(_currentWiseDay());
    }

    /**
     * @notice allows volunteer to offload snapshots
     * to save on gas during next start/end stake
     * in case manualDailySnapshot reach block limit
     */
    function manualDailySnapshotPoint(
        uint64 _updateDay
    )
        external
    {
        require(
            _updateDay > 0 &&
            _updateDay < _currentWiseDay()
            // 'WISE: snapshot day does not exist yet'
        );

        require(
            _updateDay > globals.currentWiseDay
            // 'WISE: snapshot already taken for that day'
        );

        _dailySnapshotPoint(_updateDay);
    }

    /**
     * @notice internal function that offloads
     * global values to daily snapshots
     * updates globals.currentWiseDay
     */
    function _dailySnapshotPoint(
        uint64 _updateDay
    )
        private
    {
        liquidityGuardTrigger();

        uint256 scheduledToEndToday;
        uint256 totalStakedToday = globals.totalStaked;

        for (uint256 _day = globals.currentWiseDay; _day < _updateDay; _day++) {

            // ------------------------------------
            // prepare snapshot for regular shares
            // reusing scheduledToEndToday variable

            scheduledToEndToday = scheduledToEnd[_day] + snapshots[_day - 1].scheduledToEnd;

            SnapShot memory snapshot = snapshots[_day];
            snapshot.scheduledToEnd = scheduledToEndToday;

            snapshot.totalShares =
                globals.totalShares > scheduledToEndToday ?
                globals.totalShares - scheduledToEndToday : 0;

            snapshot.inflationAmount =  snapshot.totalShares
                .mul(PRECISION_RATE)
                .div(
                    _inflationAmount(
                        totalStakedToday,
                        totalSupply(),
                        totalPenalties[_day],
                        LIQUIDITY_GUARD.getInflation(
                            INFLATION_RATE
                        )
                    )
                );

            // store regular snapshot
            snapshots[_day] = snapshot;


            // ------------------------------------
            // prepare snapshot for referrer shares
            // reusing scheduledToEndToday variable

            scheduledToEndToday = referralSharesToEnd[_day] + rsnapshots[_day - 1].scheduledToEnd;

            rSnapShot memory rsnapshot = rsnapshots[_day];
            rsnapshot.scheduledToEnd = scheduledToEndToday;

            rsnapshot.totalShares =
                globals.referralShares > scheduledToEndToday ?
                globals.referralShares - scheduledToEndToday : 0;

            rsnapshot.inflationAmount = rsnapshot.totalShares
                .mul(PRECISION_RATE)
                .div(
                    _referralInflation(
                        totalStakedToday,
                        totalSupply()
                    )
                );

            // store referral snapshot
            rsnapshots[_day] = rsnapshot;


            // ------------------------------------
            // prepare snapshot for liquidity shares
            // reusing scheduledToEndToday variable

            lSnapShot memory lsnapshot = lsnapshots[_day];
            lsnapshot.totalShares = globals.liquidityShares;

            lsnapshot.inflationAmount = lsnapshot.totalShares
                .mul(PRECISION_RATE).div(
                    _liquidityInflation(
                        totalStakedToday,
                        totalSupply(),
                        LIQUIDITY_GUARD.getInflation(
                            LIQUIDITY_RATE
                        )
                    )
                );

            // store liquidity snapshot
            lsnapshots[_day] = lsnapshot;

            adjustLiquidityRates();
            globals.currentWiseDay++;
        }
    }

    /**
     * @notice moves inflation up and down by 0.006%
     * from regular shares to liquidity shares
     * if the liquidityGuard is active (visa-versa)
     */
    function adjustLiquidityRates() private {
        if (
            isLiquidityGuardActive ==  true &&
            LIQUIDITY_RATE < INFLATION_RATE_MAX
            )
        {
            LIQUIDITY_RATE = LIQUIDITY_RATE + 6;
            INFLATION_RATE = INFLATION_RATE - 6;
            return;
        }
        if (
            isLiquidityGuardActive == false &&
            INFLATION_RATE < INFLATION_RATE_MAX
            )
        {
            INFLATION_RATE = INFLATION_RATE + 6;
            LIQUIDITY_RATE = LIQUIDITY_RATE - 6;
            return;
        }
    }

    function _inflationAmount(uint256 _totalStaked, uint256 _totalSupply, uint256 _totalPenalties, uint256 _INFLATION_RATE) private pure returns (uint256) {
        return (_totalStaked + _totalSupply) * 10000 / _INFLATION_RATE + _totalPenalties;
    }

    function _referralInflation(uint256 _totalStaked, uint256 _totalSupply) private pure returns (uint256) {
        return (_totalStaked + _totalSupply) * 10000 / REFERRALS_RATE;
    }

    function _liquidityInflation(uint256 _totalStaked, uint256 _totalSupply, uint256 _LIQUIDITY_RATE) private pure returns (uint256) {
        return (_totalStaked + _totalSupply) * 10000 / _LIQUIDITY_RATE;
    }
}

File 10 of 12: StakingToken.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

import "./ReferralToken.sol";

abstract contract StakingToken is ReferralToken {

    using SafeMath for uint256;

    /**
     * @notice A method for a staker to create multiple stakes
     * @param _stakedAmount amount of WISE staked.
     * @param _lockDays amount of days it is locked for.
     * @param _referrer address of the referrer
     */
    function createStakeBulk(
        uint256[] memory _stakedAmount,
        uint64[] memory _lockDays,
        address[] memory _referrer
    )
        external
    {
        for(uint256 i = 0; i < _stakedAmount.length; i++) {
            createStake(
                _stakedAmount[i],
                _lockDays[i],
                _referrer[i]
            );
        }
    }

    /**
     * @notice A method for a staker to create a stake
     * @param _stakedAmount amount of WISE staked.
     * @param _lockDays amount of days it is locked for.
     * @param _referrer address of the referrer
     */
    function createStake(
        uint256 _stakedAmount,
        uint64 _lockDays,
        address _referrer
    )
        snapshotTrigger
        public
        returns (bytes16, uint256, bytes16 referralID)
    {
        require(
            msg.sender != _referrer &&
            notContract(_referrer)
            // 'WISE: invalid referrer'
        );

        require(
            _lockDays >= MIN_LOCK_DAYS &&
            _lockDays <= MAX_LOCK_DAYS
            // 'WISE: stake is not in range'
        );

        require(
            _stakedAmount >= MIN_STAKE_AMOUNT
            // 'WISE: stake is not large enough'
        );

        (
            Stake memory newStake,
            bytes16 stakeID,
            uint256 _startDay
        ) =

        _createStake(msg.sender, _stakedAmount, _lockDays, _referrer);

        if (newStake.referrerShares > 0) {

            ReferrerLink memory referrerLink;

            referrerLink.staker = msg.sender;
            referrerLink.stakeID = stakeID;
            referrerLink.isActive = true;

            referralID = generateReferralID(_referrer);
            referrerLinks[_referrer][referralID] = referrerLink;

            _increaseReferralCount(
                _referrer
            );

            _addReferrerSharesToEnd(
                newStake.finalDay,
                newStake.referrerShares
            );
        }

        stakes[msg.sender][stakeID] = newStake;

        _increaseStakeCount(
            msg.sender
        );

        _increaseGlobals(
            newStake.stakedAmount,
            newStake.stakesShares,
            newStake.referrerShares
        );

        _addScheduledShares(
            newStake.finalDay,
            newStake.stakesShares
        );

        emit StakeStart(
            stakeID,
            msg.sender,
            _referrer,
            newStake.stakedAmount,
            newStake.stakesShares,
            newStake.referrerShares,
            newStake.startDay,
            newStake.lockDays,
            newStake.daiEquivalent
        );

        return (stakeID, _startDay, referralID);
    }

    /**
    * @notice A method for a staker to start a stake
    * @param _staker ...
    * @param _stakedAmount ...
    * @param _lockDays ...
    */
    function _createStake(
        address _staker,
        uint256 _stakedAmount,
        uint64 _lockDays,
        address _referrer
    )
        private
        returns (
            Stake memory _newStake,
            bytes16 _stakeID,
            uint64 _startDay
        )
    {
        _burn(
            _staker,
            _stakedAmount
        );

        _startDay = _nextWiseDay();
        _stakeID = generateStakeID(_staker);

        _newStake.lockDays = _lockDays;
        _newStake.startDay = _startDay;
        _newStake.finalDay = _startDay + _lockDays;
        _newStake.isActive = true;

        _newStake.stakedAmount = _stakedAmount;
        _newStake.stakesShares = _stakesShares(
            _stakedAmount,
            _lockDays,
            _referrer,
            globals.sharePrice
        );

        _updateDaiEquivalent();

        _newStake.daiEquivalent = latestDaiEquivalent
            .mul(_newStake.stakedAmount)
            .div(YODAS_PER_WISE);

        if (_nonZeroAddress(_referrer)) {

            _newStake.referrer = _referrer;

            _addCriticalMass(
                _newStake.referrer,
                _newStake.daiEquivalent
            );

            _newStake.referrerShares = _referrerShares(
                _stakedAmount,
                _lockDays,
                _referrer
            );
        }
    }

    /**
    * @notice A method for a staker to remove a stake
    * belonging to his address by providing ID of a stake.
    * @param _stakeID unique bytes sequence reference to the stake
    */
    function endStake(
        bytes16 _stakeID
    )
        snapshotTrigger
        external
        returns (uint256)
    {
        (
            Stake memory endedStake,
            uint256 penaltyAmount
        ) =

        _endStake(
            msg.sender,
            _stakeID
        );

        _decreaseGlobals(
            endedStake.stakedAmount,
            endedStake.stakesShares,
            endedStake.referrerShares
        );

        _removeScheduledShares(
            endedStake.finalDay,
            endedStake.stakesShares
        );

        _removeReferrerSharesToEnd(
            endedStake.finalDay,
            endedStake.referrerShares
        );

        _removeCriticalMass(
            endedStake.referrer,
            endedStake.daiEquivalent,
            endedStake.startDay
        );

        _storePenalty(
            endedStake.closeDay,
            penaltyAmount
        );

        _sharePriceUpdate(
            endedStake.stakedAmount > penaltyAmount ?
            endedStake.stakedAmount - penaltyAmount : 0,
            endedStake.rewardAmount + scrapes[msg.sender][_stakeID],
            endedStake.referrer,
            endedStake.lockDays,
            endedStake.stakesShares
        );

        emit StakeEnd(
            _stakeID,
            msg.sender,
            endedStake.referrer,
            endedStake.stakedAmount,
            endedStake.stakesShares,
            endedStake.referrerShares,
            endedStake.rewardAmount,
            endedStake.closeDay,
            penaltyAmount
        );

        return endedStake.rewardAmount;
    }

    function _endStake(
        address _staker,
        bytes16 _stakeID
    )
        private
        returns (
            Stake storage _stake,
            uint256 _penalty
        )
    {
        require(
            stakes[_staker][_stakeID].isActive
            // 'WISE: not an active stake'
        );

        _stake = stakes[_staker][_stakeID];
        _stake.closeDay = _currentWiseDay();
        _stake.rewardAmount = _calculateRewardAmount(_stake);
        _penalty = _calculatePenaltyAmount(_stake);

        _stake.isActive = false;

        _mint(
            _staker,
            _stake.stakedAmount > _penalty ?
            _stake.stakedAmount - _penalty : 0
        );

        _mint(
            _staker,
            _stake.rewardAmount
        );
    }

    /**
    * @notice alloes to scrape interest from active stake
    * @param _stakeID unique bytes sequence reference to the stake
    * @param _scrapeDays amount of days to proccess, 0 = all
    */
    function scrapeInterest(
        bytes16 _stakeID,
        uint64 _scrapeDays
    )
        external
        snapshotTrigger
        returns (
            uint256 scrapeDay,
            uint256 scrapeAmount,
            uint256 remainingDays,
            uint256 stakersPenalty,
            uint256 referrerPenalty
        )
    {
        require(
            stakes[msg.sender][_stakeID].isActive
            // 'WISE: not an active stake'
        );

        Stake memory stake = stakes[msg.sender][_stakeID];

        scrapeDay = _scrapeDays > 0
            ? _startingDay(stake).add(_scrapeDays)
            : _calculationDay(stake);

        scrapeDay = scrapeDay > stake.finalDay
            ? _calculationDay(stake)
            : scrapeDay;

        scrapeAmount = _loopRewardAmount(
            stake.stakesShares,
            _startingDay(stake),
            scrapeDay
        );

        if (_isMatureStake(stake) == false) {

            remainingDays = _daysLeft(stake);

            stakersPenalty = _stakesShares(
                scrapeAmount,
                remainingDays,
                msg.sender,
                globals.sharePrice
            );

            stake.stakesShares =
            stake.stakesShares.sub(stakersPenalty);

            _removeScheduledShares(
                stake.finalDay,
                stakersPenalty
            );

            if (stake.referrerShares > 0) {

                referrerPenalty = _stakesShares(
                    scrapeAmount,
                    remainingDays,
                    address(0x0),
                    globals.sharePrice
                );

                stake.referrerShares =
                stake.referrerShares.sub(referrerPenalty);

                _removeReferrerSharesToEnd(
                    stake.finalDay,
                    referrerPenalty
                );
            }

            _decreaseGlobals(
                0,
                stakersPenalty,
                referrerPenalty
            );

            _sharePriceUpdate(
                stake.stakedAmount,
                scrapeAmount,
                stake.referrer,
                stake.lockDays,
                stake.stakesShares
            );
        }
        else {
            scrapes[msg.sender][_stakeID] =
            scrapes[msg.sender][_stakeID].add(scrapeAmount);

            _sharePriceUpdate(
                stake.stakedAmount,
                scrapes[msg.sender][_stakeID],
                stake.referrer,
                stake.lockDays,
                stake.stakesShares
            );
        }

        stake.scrapeDay = scrapeDay;
        stakes[msg.sender][_stakeID] = stake;

        _mint(
            msg.sender,
            scrapeAmount
        );

        emit InterestScraped(
            _stakeID,
            msg.sender,
            scrapeAmount,
            scrapeDay,
            stakersPenalty,
            referrerPenalty,
            _currentWiseDay()
        );
    }

    function _addScheduledShares(
        uint256 _finalDay,
        uint256 _shares
    )
        internal
    {
        scheduledToEnd[_finalDay] =
        scheduledToEnd[_finalDay].add(_shares);
    }

    function _removeScheduledShares(
        uint256 _finalDay,
        uint256 _shares
    )
        internal
    {
        if (_notPast(_finalDay)) {

            scheduledToEnd[_finalDay] =
            scheduledToEnd[_finalDay] > _shares ?
            scheduledToEnd[_finalDay] - _shares : 0;

        } else {

            uint256 _day = _previousWiseDay();
            snapshots[_day].scheduledToEnd =
            snapshots[_day].scheduledToEnd > _shares ?
            snapshots[_day].scheduledToEnd - _shares : 0;
        }
    }

    function _sharePriceUpdate(
        uint256 _stakedAmount,
        uint256 _rewardAmount,
        address _referrer,
        uint256 _lockDays,
        uint256 _stakeShares
    )
        private
    {
        if (_stakeShares > 0 && _currentWiseDay() > FORMULA_DAY) {

            uint256 newSharePrice = _getNewSharePrice(
                _stakedAmount,
                _rewardAmount,
                _stakeShares,
                _lockDays,
                _referrer
            );

            if (newSharePrice > globals.sharePrice) {

                newSharePrice =
                    newSharePrice < globals.sharePrice.mul(110).div(100) ?
                    newSharePrice : globals.sharePrice.mul(110).div(100);

                emit NewSharePrice(
                    newSharePrice,
                    globals.sharePrice,
                    _currentWiseDay()
                );

                globals.sharePrice = newSharePrice;
            }

            return;
        }

        if (_currentWiseDay() == FORMULA_DAY) {
            globals.sharePrice = 110E15;
        }
    }

    function _getNewSharePrice(
        uint256 _stakedAmount,
        uint256 _rewardAmount,
        uint256 _stakeShares,
        uint256 _lockDays,
        address _referrer
    )
        private
        pure
        returns (uint256)
    {

        uint256 _bonusAmount = _getBonus(
            _lockDays, _nonZeroAddress(_referrer) ? 11E9 : 10E9
        );

        return
            _stakedAmount
                .add(_rewardAmount)
                .mul(_bonusAmount)
                .mul(1E8)
                .div(_stakeShares);
    }

    function checkMatureStake(
        address _staker,
        bytes16 _stakeID
    )
        external
        view
        returns (bool isMature)
    {
        Stake memory stake = stakes[_staker][_stakeID];
        isMature = _isMatureStake(stake);
    }

    function checkStakeByID(
        address _staker,
        bytes16 _stakeID
    )
        external
        view
        returns (
            uint256 startDay,
            uint256 lockDays,
            uint256 finalDay,
            uint256 closeDay,
            uint256 scrapeDay,
            uint256 stakedAmount,
            uint256 stakesShares,
            uint256 rewardAmount,
            uint256 penaltyAmount,
            bool isActive,
            bool isMature
        )
    {
        Stake memory stake = stakes[_staker][_stakeID];
        startDay = stake.startDay;
        lockDays = stake.lockDays;
        finalDay = stake.finalDay;
        closeDay = stake.closeDay;
        scrapeDay = stake.scrapeDay;
        stakedAmount = stake.stakedAmount;
        stakesShares = stake.stakesShares;
        rewardAmount = _checkRewardAmount(stake);
        penaltyAmount = _calculatePenaltyAmount(stake);
        isActive = stake.isActive;
        isMature = _isMatureStake(stake);
    }

    function _stakesShares(
        uint256 _stakedAmount,
        uint256 _lockDays,
        address _referrer,
        uint256 _sharePrice
    )
        private
        pure
        returns (uint256)
    {
        return _nonZeroAddress(_referrer)
            ? _sharesAmount(_stakedAmount, _lockDays, _sharePrice, 11E9)
            : _sharesAmount(_stakedAmount, _lockDays, _sharePrice, 10E9);
    }

    function _sharesAmount(
        uint256 _stakedAmount,
        uint256 _lockDays,
        uint256 _sharePrice,
        uint256 _extraBonus
    )
        private
        pure
        returns (uint256)
    {
        return _baseAmount(_stakedAmount, _sharePrice)
            .mul(_getBonus(_lockDays, _extraBonus))
            .div(10E9);
    }

    function _getBonus(
        uint256 _lockDays,
        uint256 _extraBonus
    )
        private
        pure
        returns (uint256)
    {
        return
            _regularBonus(_lockDays, DAILY_BONUS_A, MAX_BONUS_DAYS_A) +
            _regularBonus(
                _lockDays > MAX_BONUS_DAYS_A ?
                _lockDays - MAX_BONUS_DAYS_A : 0, DAILY_BONUS_B, MAX_BONUS_DAYS_B
            ) + _extraBonus;
    }

    function _regularBonus(
        uint256 _lockDays,
        uint256 _daily,
        uint256 _maxDays
    )
        private
        pure
        returns (uint256)
    {
        return (
            _lockDays > _maxDays
                ? _maxDays.mul(_daily)
                : _lockDays.mul(_daily)
            ).div(10E9);
    }

    function _baseAmount(
        uint256 _stakedAmount,
        uint256 _sharePrice
    )
        private
        pure
        returns (uint256)
    {
        return
            _stakedAmount
                .mul(PRECISION_RATE)
                .div(_sharePrice);
    }

    function _referrerShares(
        uint256 _stakedAmount,
        uint256 _lockDays,
        address _referrer
    )
        private
        view
        returns (uint256)
    {
        return
            _notCriticalMassReferrer(_referrer) ||
            _lockDays < MIN_REFERRAL_DAYS
                ? 0
                : _sharesAmount(
                    _stakedAmount,
                    _lockDays,
                    globals.sharePrice,
                    10E9
                );
    }

    function _checkRewardAmount(Stake memory _stake) private view returns (uint256) {
        return _stake.isActive ? _detectReward(_stake) : _stake.rewardAmount;
    }

    function _detectReward(Stake memory _stake) private view returns (uint256) {
        return _stakeNotStarted(_stake) ? 0 : _calculateRewardAmount(_stake);
    }

    function _storePenalty(
        uint64 _storeDay,
        uint256 _penalty
    )
        private
    {
        if (_penalty > 0) {
            totalPenalties[_storeDay] =
            totalPenalties[_storeDay].add(_penalty);
        }
    }

    function _calculatePenaltyAmount(
        Stake memory _stake
    )
        private
        view
        returns (uint256)
    {
        return _stakeNotStarted(_stake) || _isMatureStake(_stake) ? 0 : _getPenalties(_stake);
    }

    function _getPenalties(Stake memory _stake)
        private
        view
        returns (uint256)
    {
        return _stake.stakedAmount * (100 + (800 * (_daysLeft(_stake) - 1) / (_getLockDays(_stake)))) / 1000;
    }

    function _calculateRewardAmount(
        Stake memory _stake
    )
        private
        view
        returns (uint256)
    {
        return _loopRewardAmount(
            _stake.stakesShares,
            _startingDay(_stake),
            _calculationDay(_stake)
        );
    }

    function _loopRewardAmount(
        uint256 _stakeShares,
        uint256 _startDay,
        uint256 _finalDay
    )
        private
        view
        returns (uint256 _rewardAmount)
    {
        for (uint256 _day = _startDay; _day < _finalDay; _day++) {
            _rewardAmount += _stakeShares * PRECISION_RATE / snapshots[_day].inflationAmount;
        }
    }
}

File 11 of 12: Timing.sol
// SPDX-License-Identifier: --🦉--

pragma solidity =0.7.6;

import "./Declaration.sol";

abstract contract Timing is Declaration {

    function currentWiseDay() public view returns (uint64) {
        return _getNow() >= LAUNCH_TIME ? _currentWiseDay() : 0;
    }

    function _currentWiseDay() internal view returns (uint64) {
        return _wiseDayFromStamp(_getNow());
    }

    function _nextWiseDay() internal view returns (uint64) {
        return _currentWiseDay() + 1;
    }

    function _previousWiseDay() internal view returns (uint64) {
        return _currentWiseDay() - 1;
    }

    function _wiseDayFromStamp(uint256 _timestamp) internal view returns (uint64) {
        return uint64((_timestamp - LAUNCH_TIME) / SECONDS_IN_DAY);
    }

    function _getNow() internal view returns (uint256) {
        return block.timestamp;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"indexed":true,"internalType":"address","name":"stakerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"scrapeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"scrapeDay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakersPenalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referrerPenalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentWiseDay","type":"uint256"}],"name":"InterestScraped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"LiquidityGuardStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referrerShares","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"currentWiseDay","type":"uint256"}],"name":"NewGlobals","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSharePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldSharePrice","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"currentWiseDay","type":"uint64"}],"name":"NewSharePrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":false,"internalType":"bytes16","name":"referrerID","type":"bytes16"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"ReferralCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"indexed":true,"internalType":"address","name":"stakerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"referralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakesShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"closeDay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"name":"StakeEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"indexed":true,"internalType":"address","name":"stakerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"referralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakesShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startDay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockDays","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiEquivalent","type":"uint256"}],"name":"StakeStart","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":false,"internalType":"uint112","name":"reserveA","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserveB","type":"uint112"},{"indexed":false,"internalType":"uint32","name":"blockTimestampLast","type":"uint32"}],"name":"UniswapReserves","type":"event"},{"inputs":[],"name":"INFLATION_RATE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_GUARD","outputs":[{"internalType":"contract ILiquidityGuard","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_RATE","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_TRANSFORMER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_FACTORY","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_PAIR","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_ROUTER","outputs":[{"internalType":"contract IUniswapRouterV2","name":"","type":"address"}],"stateMutability":"view","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"bytes16","name":"_liquidityStakeID","type":"bytes16"}],"name":"checkLiquidityStakeByID","outputs":[{"internalType":"uint256","name":"startDay","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"closeDay","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"bytes16","name":"_stakeID","type":"bytes16"}],"name":"checkMatureStake","outputs":[{"internalType":"bool","name":"isMature","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"bytes16","name":"_referralID","type":"bytes16"}],"name":"checkReferralsByID","outputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"internalType":"uint256","name":"referrerShares","type":"uint256"},{"internalType":"uint256","name":"referralInterest","type":"uint256"},{"internalType":"bool","name":"isActiveReferral","type":"bool"},{"internalType":"bool","name":"isActiveStake","type":"bool"},{"internalType":"bool","name":"isMatureStake","type":"bool"},{"internalType":"bool","name":"isEndedStake","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"bytes16","name":"_stakeID","type":"bytes16"}],"name":"checkStakeByID","outputs":[{"internalType":"uint256","name":"startDay","type":"uint256"},{"internalType":"uint256","name":"lockDays","type":"uint256"},{"internalType":"uint256","name":"finalDay","type":"uint256"},{"internalType":"uint256","name":"closeDay","type":"uint256"},{"internalType":"uint256","name":"scrapeDay","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"stakesShares","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"penaltyAmount","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"isMature","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityTokens","type":"uint256"}],"name":"createLiquidityStake","outputs":[{"internalType":"bytes16","name":"liquidityStakeID","type":"bytes16"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakedAmount","type":"uint256"},{"internalType":"uint64","name":"_lockDays","type":"uint64"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"createStake","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes16","name":"referralID","type":"bytes16"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakedAmount","type":"uint256[]"},{"internalType":"uint64[]","name":"_lockDays","type":"uint64[]"},{"internalType":"address[]","name":"_referrer","type":"address[]"}],"name":"createStakeBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_lockDays","type":"uint64"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"createStakeWithETH","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes16","name":"referralID","type":"bytes16"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint64","name":"_lockDays","type":"uint64"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"createStakeWithToken","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes16","name":"referralID","type":"bytes16"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"criticalMass","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"activationDay","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentWiseDay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_liquidityStakeID","type":"bytes16"}],"name":"endLiquidityStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_stakeID","type":"bytes16"}],"name":"endStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"x","type":"address"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"bytes1","name":"z","type":"bytes1"}],"name":"generateID","outputs":[{"internalType":"bytes16","name":"b","type":"bytes16"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"giveStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"globals","outputs":[{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalShares","type":"uint256"},{"internalType":"uint256","name":"sharePrice","type":"uint256"},{"internalType":"uint256","name":"currentWiseDay","type":"uint256"},{"internalType":"uint256","name":"referralShares","type":"uint256"},{"internalType":"uint256","name":"liquidityShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLiquidityGuardActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestDaiEquivalent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"latestLiquidityStakeID","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"latestReferralID","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"latestStakeID","outputs":[{"internalType":"bytes16","name":"","type":"bytes16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityGuardTrigger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"liquidityStakeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes16","name":"","type":"bytes16"}],"name":"liquidityStakes","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint64","name":"startDay","type":"uint64"},{"internalType":"uint64","name":"closeDay","type":"uint64"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lsnapshots","outputs":[{"internalType":"uint256","name":"totalShares","type":"uint256"},{"internalType":"uint256","name":"inflationAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualDailySnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_updateDay","type":"uint64"}],"name":"manualDailySnapshotPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investorAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"referralSharesToEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"referralsPagination","outputs":[{"internalType":"bytes16[]","name":"_referrals","type":"bytes16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_referralID","type":"bytes16"},{"internalType":"uint256","name":"_scrapeDays","type":"uint256"}],"name":"referrerInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes16[]","name":"_referralIDs","type":"bytes16[]"},{"internalType":"uint256[]","name":"_scrapeDays","type":"uint256[]"}],"name":"referrerInterestBulk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes16","name":"","type":"bytes16"}],"name":"referrerLinks","outputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"bytes16","name":"stakeID","type":"bytes16"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"processedDays","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rsnapshots","outputs":[{"internalType":"uint256","name":"totalShares","type":"uint256"},{"internalType":"uint256","name":"inflationAmount","type":"uint256"},{"internalType":"uint256","name":"scheduledToEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"scheduledToEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes16","name":"_stakeID","type":"bytes16"},{"internalType":"uint64","name":"_scrapeDays","type":"uint64"}],"name":"scrapeInterest","outputs":[{"internalType":"uint256","name":"scrapeDay","type":"uint256"},{"internalType":"uint256","name":"scrapeAmount","type":"uint256"},{"internalType":"uint256","name":"remainingDays","type":"uint256"},{"internalType":"uint256","name":"stakersPenalty","type":"uint256"},{"internalType":"uint256","name":"referrerPenalty","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes16","name":"","type":"bytes16"}],"name":"scrapes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_immutableTransformer","type":"address"}],"name":"setLiquidityTransfomer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"snapshots","outputs":[{"internalType":"uint256","name":"totalShares","type":"uint256"},{"internalType":"uint256","name":"inflationAmount","type":"uint256"},{"internalType":"uint256","name":"scheduledToEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes16","name":"","type":"bytes16"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"stakesShares","type":"uint256"},{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint64","name":"startDay","type":"uint64"},{"internalType":"uint64","name":"lockDays","type":"uint64"},{"internalType":"uint64","name":"finalDay","type":"uint64"},{"internalType":"uint64","name":"closeDay","type":"uint64"},{"internalType":"uint256","name":"scrapeDay","type":"uint256"},{"internalType":"uint256","name":"daiEquivalent","type":"uint256"},{"internalType":"uint256","name":"referrerShares","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"stakesPagination","outputs":[{"internalType":"bytes16[]","name":"_stakes","type":"bytes16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalPenalties","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":[],"name":"transformerGateKeeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

67059b4bdc09420000600555600c80546201925863ffffffff199091161763ffffffff60201b1916660186a6000000001790556101006040523060a090815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260c052736b175474e89094c44da98b954eedeac495271d0f60e0526200007e90600e9060036200012d565b503480156200008c57600080fd5b50604080518082018252600a8152692bb4b9b2902a37b5b2b760b11b6020808301918252835180850190945260048452635749534560e01b908401528151919291620000db9160029162000197565b508051620000f190600390602084019062000197565b50506004805460ff191660121790555067016345785d8a0000600855635fa9d800608052601e80546001600160a01b0319163317905562000231565b82805482825590600052602060002090810192821562000185579160200282015b828111156200018557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200014e565b50620001939291506200021a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001cf576000855562000185565b82601f10620001ea57805160ff191683800117855562000185565b8280016001018555821562000185579182015b8281111562000185578251825591602001919060010190620001fd565b5b808211156200019357600081556001016200021b565b608051615e836200025160003980611b9852806155235250615e836000f3fe6080604052600436106103bb5760003560e01c806395d89b41116101f2578063c31245251161010d578063dd62ed3e116100a0578063e3073bfb1161006f578063e3073bfb146113aa578063e742806a146113d4578063e7881cda1461140d578063fc527bf51461144c576103c5565b8063dd62ed3e146111ee578063df0618d214611229578063df2d02b1146112a3578063e1d033e9146112eb576103c5565b8063d6565a2d116100dc578063d6565a2d14611149578063d826492014611173578063d8d44a2914611188578063db74559b146111bb576103c5565b8063c312452514611072578063c74c0fac146110ba578063ce8f9f00146110cf578063d1cf9098146110f9576103c5565b8063ae3d1de211610185578063be21ff7011610154578063be21ff7014610f52578063bf58f6d214610f7c578063c172628e14610fc5578063c23d656414611048576103c5565b8063ae3d1de214610ecb578063b381a81114610efe578063b543c4ba14610f13578063bba85e1f14610f28576103c5565b8063a4ed0550116101c1578063a4ed055014610d8e578063a50af89514610e2b578063a9059cbb14610e5f578063a91b19f214610e98576103c5565b806395d89b4114610cc257806399c2def414610cd75780639b57ab1214610d0b5780639e78fb4f14610d79576103c5565b806348e4ccab116102e257806370a08231116102755780638649102b116102445780638649102b14610bb357806387da627414610bfb57806389201d4e14610c105780638a26306014610cad576103c5565b806370a082311461095857806375c3fa4f1461098b578063763241d3146109be578063779e2e1814610b70576103c5565b8063601f37ac116102b1578063601f37ac146108ca57806360e4c651146108fd578063613fc9fd1461092e5780636ba631cf14610943576103c5565b806348e4ccab146107dc5780634dfc7a031461080d5780634f47b16d146108405780635b2023871461087a576103c5565b806320429fac1161035a57806333060d901161032957806333060d90146107035780633697e979146107365780633b58afe71461076457806342966c68146107b0576103c5565b806320429fac146105c357806323672d8a1461060657806323b872dd14610695578063313ce567146106d8576103c5565b8063095ea7b311610396578063095ea7b3146104a457806310748592146104dd57806318160ddd1461054d5780631c0b37e114610562576103c5565b80625ada7f146103ca57806302cbb266146103f157806306fdde031461041a576103c5565b366103c557600080fd5b600080fd5b3480156103d657600080fd5b506103df61157c565b60408051918252519081900360200190f35b3480156103fd57600080fd5b50610406611582565b604080519115158252519081900360200190f35b34801561042657600080fd5b5061042f611592565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610469578181015183820152602001610451565b50505050905090810190601f1680156104965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104b057600080fd5b50610406600480360360408110156104c757600080fd5b506001600160a01b038135169060200135611626565b3480156104e957600080fd5b506105206004803603604081101561050057600080fd5b5080356001600160a01b031690602001356001600160801b031916611644565b60408051958652602086019490945284840192909252606084015215156080830152519081900360a00190f35b34801561055957600080fd5b506103df6116f2565b6105976004803603604081101561057857600080fd5b5080356001600160401b031690602001356001600160a01b03166116f8565b604080516001600160801b03199485168152602081019390935292168183015290519081900360600190f35b3480156105cf57600080fd5b506103df600480360360408110156105e657600080fd5b5080356001600160a01b031690602001356001600160801b031916611947565b34801561061257600080fd5b506106456004803603606081101561062957600080fd5b506001600160a01b038135169060208101359060400135611964565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610681578181015183820152602001610669565b505050509050019250505060405180910390f35b3480156106a157600080fd5b50610406600480360360608110156106b857600080fd5b506001600160a01b03813581169160208101359091169060400135611ad1565b3480156106e457600080fd5b506106ed611b40565b6040805160ff9092168252519081900360200190f35b34801561070f57600080fd5b506103df6004803603602081101561072657600080fd5b50356001600160a01b0316611b49565b34801561074257600080fd5b5061074b611b5b565b6040805163ffffffff9092168252519081900360200190f35b34801561077057600080fd5b506107976004803603602081101561078757600080fd5b50356001600160a01b0316611b6e565b6040805192835260208301919091528051918290030190f35b3480156107bc57600080fd5b506107da600480360360208110156107d357600080fd5b5035611b87565b005b3480156107e857600080fd5b506107f1611b94565b604080516001600160401b039092168252519081900360200190f35b34801561081957600080fd5b506107da6004803603602081101561083057600080fd5b50356001600160a01b0316611bd9565b34801561084c57600080fd5b506107da6004803603604081101561086357600080fd5b506001600160801b03198135169060200135611c4a565b34801561088657600080fd5b506108ad6004803603602081101561089d57600080fd5b50356001600160a01b0316611c69565b604080516001600160801b03199092168252519081900360200190f35b3480156108d657600080fd5b506103df600480360360208110156108ed57600080fd5b50356001600160a01b0316611cc8565b34801561090957600080fd5b50610912611cda565b604080516001600160a01b039092168252519081900360200190f35b34801561093a57600080fd5b506107da611ce9565b34801561094f57600080fd5b50610912611cf6565b34801561096457600080fd5b506103df6004803603602081101561097b57600080fd5b50356001600160a01b0316611d0c565b34801561099757600080fd5b506108ad600480360360208110156109ae57600080fd5b50356001600160a01b0316611d27565b3480156109ca57600080fd5b506107da600480360360608110156109e157600080fd5b810190602081018135600160201b8111156109fb57600080fd5b820183602082011115610a0d57600080fd5b803590602001918460208302840111600160201b83111715610a2e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a7d57600080fd5b820183602082011115610a8f57600080fd5b803590602001918460208302840111600160201b83111715610ab057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610aff57600080fd5b820183602082011115610b1157600080fd5b803590602001918460208302840111600160201b83111715610b3257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611d79945050505050565b348015610b7c57600080fd5b5061040660048036036040811015610b9357600080fd5b5080356001600160a01b031690602001356001600160801b031916611dda565b348015610bbf57600080fd5b50610bdd60048036036020811015610bd657600080fd5b5035611ebe565b60408051938452602084019290925282820152519081900360600190f35b348015610c0757600080fd5b506107da611edf565b348015610c1c57600080fd5b50610c5360048036036040811015610c3357600080fd5b5080356001600160a01b031690602001356001600160801b03191661214d565b604080516001600160a01b0390991689526001600160801b031990971660208901528787019590955260608701939093529015156080860152151560a0850152151560c0840152151560e083015251908190036101000190f35b348015610cb957600080fd5b5061091261243f565b348015610cce57600080fd5b5061042f61244e565b348015610ce357600080fd5b506103df60048036036020811015610cfa57600080fd5b50356001600160801b0319166124af565b348015610d1757600080fd5b50610d4e60048036036040811015610d2e57600080fd5b5080356001600160801b03191690602001356001600160401b031661270c565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610d8557600080fd5b506107da612ba0565b348015610d9a57600080fd5b50610dd160048036036040811015610db157600080fd5b5080356001600160a01b031690602001356001600160801b031916612c6a565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501521515610120840152151561014083015251908190036101600190f35b348015610e3757600080fd5b506103df60048036036020811015610e4e57600080fd5b50356001600160801b031916612d96565b348015610e6b57600080fd5b5061040660048036036040811015610e8257600080fd5b506001600160a01b038135169060200135612f2b565b348015610ea457600080fd5b506107da60048036036020811015610ebb57600080fd5b50356001600160401b0316612f3f565b348015610ed757600080fd5b506108ad60048036036020811015610eee57600080fd5b50356001600160a01b0316612f99565b348015610f0a57600080fd5b5061074b612feb565b348015610f1f57600080fd5b50610912612ff7565b348015610f3457600080fd5b506103df60048036036020811015610f4b57600080fd5b503561300f565b348015610f5e57600080fd5b506103df60048036036020811015610f7557600080fd5b5035613021565b348015610f8857600080fd5b506108ad60048036036060811015610f9f57600080fd5b5080356001600160a01b031690602081013590604001356001600160f81b031916613033565b348015610fd157600080fd5b5061100860048036036040811015610fe857600080fd5b5080356001600160a01b031690602001356001600160801b03191661308e565b604080516001600160a01b0390961686526001600160801b0319909416602086015284840192909252606084015215156080830152519081900360a00190f35b34801561105457600080fd5b506103df6004803603602081101561106b57600080fd5b50356130da565b34801561107e57600080fd5b506110876130ec565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156110c657600080fd5b50610912613101565b3480156110db57600080fd5b506108ad600480360360208110156110f257600080fd5b5035613119565b34801561110557600080fd5b506105976004803603608081101561111c57600080fd5b506001600160a01b0381358116916020810135916001600160401b03604083013516916060013516613249565b34801561115557600080fd5b50610bdd6004803603602081101561116c57600080fd5b5035613534565b34801561117f57600080fd5b50610912613555565b34801561119457600080fd5b506107da600480360360208110156111ab57600080fd5b50356001600160a01b031661356d565b3480156111c757600080fd5b506103df600480360360208110156111de57600080fd5b50356001600160a01b03166135ad565b3480156111fa57600080fd5b506103df6004803603604081101561121157600080fd5b506001600160a01b03813581169160200135166135bf565b34801561123557600080fd5b5061126c6004803603604081101561124c57600080fd5b5080356001600160a01b031690602001356001600160801b0319166135ea565b6040805195865260208601949094526001600160401b03928316858501529116606084015215156080830152519081900360a00190f35b3480156112af57600080fd5b50610597600480360360608110156112c657600080fd5b5080359060208101356001600160401b031690604001356001600160a01b0316613637565b3480156112f757600080fd5b5061132e6004803603604081101561130e57600080fd5b5080356001600160a01b031690602001356001600160801b0319166139d2565b604080519c8d5260208d019b909b528b8b01999099526001600160401b0397881660608c015295871660808b015293861660a08a01529190941660c088015260e08701939093526101008601929092526101208501919091526001600160a01b0316610140840152151561016083015251908190036101800190f35b3480156113b657600080fd5b50610797600480360360208110156113cd57600080fd5b5035613a5e565b3480156113e057600080fd5b506107da600480360360408110156113f757600080fd5b506001600160a01b038135169060200135613a77565b34801561141957600080fd5b506106456004803603606081101561143057600080fd5b506001600160a01b038135169060208101359060400135613a98565b34801561145857600080fd5b506107da6004803603604081101561146f57600080fd5b810190602081018135600160201b81111561148957600080fd5b82018360208201111561149b57600080fd5b803590602001918460208302840111600160201b831117156114bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561150b57600080fd5b82018360208201111561151d57600080fd5b803590602001918460208302840111600160201b8311171561153e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613c02945050505050565b600d5481565b600c54600160e01b900460ff1681565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561161b5780601f106115f05761010080835404028352916020019161161b565b820191906000526020600020905b8154815290600101906020018083116115fe57829003601f168201915b505050505090505b90565b600061163a611633613c57565b8484613c5b565b5060015b92915050565b6001600160a01b03821660009081526016602090815260408083206001600160801b0319851684528252808320815160a08101835281548082526001830154948201949094526002909101546001600160401b03808216938301849052600160401b8204166060830152600160801b900460ff1615156080820152909290819081906116cf81613ce3565b6060820151608090920151969995985096506001600160401b0316949392505050565b60055490565b60408051600280825260608201835260009283928392839260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061174157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061176f57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab5346001853342611c20016040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611828578181015183820152602001611810565b50505050905001955050505050506000604051808303818588803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561188d57600080fd5b8101908080516040519392919084600160201b8211156118ac57600080fd5b9083019060208201858111156118c157600080fd5b82518660208202830111600160201b821117156118dd57600080fd5b82525081516020918201928201910280838360005b8381101561190a5781810151838201526020016118f2565b5050505090500160405250505090506119388160018151811061192957fe5b60200260200101518888613637565b94509450945050509250925092565b601360209081526000928352604080842090915290825290205481565b60606000808411801561198e57506001600160a01b0385166000908152600f602052604090205484105b6119b0576001600160a01b0385166000908152600f60205260409020546119cd565b6001600160a01b0385166000908152600f60205260409020548490035b9050600080841180156119df57508382115b6119ea5760006119ee565b8382035b905060008183036001600160401b0381118015611a0a57600080fd5b50604051908082528060200260200182016040528015611a34578160200160208202803683370190505b509350825b82811115611ac6576000611a56896000198401600160f81b613033565b6001600160a01b038a1660009081526014602090815260408083206001600160801b03198516845290915290206001015490915015611abc5780868481518110611a9c57fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901611a39565b505050509392505050565b6000611b2b84611adf613c57565b6001600160a01b0387166000908152600160205260408120611b2691879190611b06613c57565b6001600160a01b0316815260208101919091526040016000205490613d6b565b613c5b565b611b36848484613d80565b5060019392505050565b60045460ff1690565b600f6020526000908152604090205481565b600c54600160201b900463ffffffff1681565b6012602052600090815260409020805460019091015482565b611b913382613e52565b50565b60007f0000000000000000000000000000000000000000000000000000000000000000611bbf613ef6565b1015611bcc576000611bd4565b611bd4613efa565b905090565b601d546001600160a01b03163314611bf057600080fd5b6001600160a01b038116600090815260126020526040902069021e19e0c9bab24000009055611c1d613f0c565b6001600160a01b0390911660009081526012602052604090206001600160401b0391909116600190910155565b611c5a611c55613efa565b613f1e565b611c6533838361423f565b5050565b6001600160a01b03811660009081526010602052604081205415611cc0576001600160a01b038216600090815260106020526040902054611cbb908390611cb1906001613d6b565b600160f91b613033565b61163e565b600092915050565b60116020526000908152604090205481565b601d546001600160a01b031681565b611cf4611c55613efa565b565b600c54600160401b90046001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b03811660009081526011602052604081205415611cc0576001600160a01b038216600090815260116020526040902054611cbb908390611d6f906001613d6b565b600360f81b613033565b60005b8351811015611dd457611dc9848281518110611d9457fe5b6020026020010151848381518110611da857fe5b6020026020010151848481518110611dbc57fe5b6020026020010151613637565b505050600101611d7c565b50505050565b6001600160a01b0382811660009081526014602090815260408083206001600160801b03198616845282528083208151610180810183528154815260018201549381019390935260028101549183019190915260038101546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600481015460e08301526005810154610100830152600681015461012083015260070154928316610140820152600160a01b90920460ff16151561016083015290611eb6816145bd565b949350505050565b601b6020526000908152604090208054600182015460029092015490919083565b6000806000600c60089054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f3257600080fd5b505afa158015611f46573d6000803e3d6000fd5b505050506040513d6060811015611f5c57600080fd5b50805160208083015160409384015184516001600160701b03808616825283169381019390935263ffffffff811683860152935192965094509192507f17057eec9ed80c65db1c29e57a343df0e9f052cf0f5ec6e93bc084533ae9b8c99181900360600190a1600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600c60089054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561203057600080fd5b505afa158015612044573d6000803e3d6000fd5b505050506040513d602081101561205a57600080fd5b50516001600160a01b0316146120705782612072565b835b6001600160701b0316905060006120876116f2565b156120ad576120a86120976116f2565b6120a28460c861461e565b9061464c565b6120b0565b60005b90506028811080156120cc5750600c54600160e01b900460ff16155b156120d9576120d961466e565b603c811180156120f75750600c54600160e01b900460ff1615156001145b1561210457612104614683565b600c5460408051600160e01b90920460ff1615158252517fbbf65e071e5468fb599b01ba3b914ae6065cf10ad084e0efe2133f7eaa8979bd916020908290030190a15050505050565b6000806000806000806000806000601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b03191681526020019081526020016000206040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a900460801b6001600160801b0319166001600160801b031916815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060000151985080602001519750806080015194506000601460008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008a6001600160801b0319166001600160801b0319168152602001908152602001600020604051806101800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016007820160149054906101000a900460ff16151515158152505090508061012001519750612410816124028385614692565b61240b84614717565b614747565b9650806101600151945061242381614775565b925061242e816145bd565b935050509295985092959890939650565b601e546001600160a01b031681565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561161b5780601f106115f05761010080835404028352916020019161161b565b60006124bc611c55613efa565b6000806124c9338561478e565b6040805161018081018252835480825260018501546020830181905260028601549383019390935260038501546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600485015460e08301526005850154610100830152600685015461012083018190526007909501546001600160a01b038116610140840152600160a01b900460ff16151561016083015290955091935061258c929091906149d9565b6125a78260a001516001600160401b03168360000151614a36565b6125c38260a001516001600160401b0316836101200151614ae9565b6125e582610140015183610100015184606001516001600160401b0316614b9c565b6125f38260c0015182614c41565b61266081836020015111612608576000612610565b818360200151035b3360009081526013602090815260408083206001600160801b03198a16845290915290819020549085015161014086015160808701518751929093019290916001600160401b0390911690614c87565b8161014001516001600160a01b0316336001600160a01b0316856001600160801b0319167f8cc66e48ebd8c008b36e03ee2f7c3f60a313a34a5bf1f3cb988a7936cd47f0d48560200151866000015187610120015188604001518960c001518960405180878152602001868152602001858152602001848152602001836001600160401b03168152602001828152602001965050505050505060405180910390a4506040015192915050565b600080600080600061271f611c55613efa565b3360009081526014602090815260408083206001600160801b03198b168452909152902060070154600160a01b900460ff1661275a57600080fd5b3360009081526014602090815260408083206001600160801b03198b1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c0830152600483015460e0830152600583015461010083015260068301546101208301526007909201546001600160a01b038116610140830152600160a01b900460ff1615156101608201529087166128415761283c81614d90565b61285d565b61285d876001600160401b031661285783614dc6565b90614def565b95508060a001516001600160401b031686116128795785612882565b61288281614d90565b955061289b816000015161289583614dc6565b88614e01565b94506128a6816145bd565b612975576128b381614e47565b93506128c6858533600660020154614ea0565b81519093506128d59084613d6b565b815260a08101516128ef906001600160401b031684614a36565b6101208101511561293d5761290c85856000600660020154614ea0565b61012082015190925061291f9083613d6b565b61012082015260a081015161293d906001600160401b031683614ae9565b612949600084846149d9565b61297081602001518683610140015184608001516001600160401b03168560000151614c87565b6129f0565b3360009081526013602090815260408083206001600160801b03198c1684529091529020546129a49086614def565b3360009081526013602090815260408083206001600160801b03198d1684528252909120829055820151610140830151608084015184516129f09492916001600160401b031690614c87565b60e081018681523360008181526014602090815260408083206001600160801b03198e168452825291829020855181559085015160018201559084015160028201556060840151600382018054608087015160a088015160c089015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b93909116929092029190911790559151600483015561010083015160058301556101208301516006830155610140830151600790920180546101608501516001600160a01b03199091166001600160a01b039094169390931760ff60a01b1916600160a01b9315159390930292909217909155612b299086614edf565b336001600160801b031989167f7b5d0995432c9ea1c8033b358af591013d0deff8dec5f4ae49612eba8bfafc0c87898787612b62613efa565b6040805195865260208601949094528484019290925260608401526001600160401b03166080830152519081900360a00190a3509295509295909350565b604080516364e329cb60e11b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201523060248201529051735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163c9c653969160448083019260209291908290030181600087803b158015612c0d57600080fd5b505af1158015612c21573d6000803e3d6000fd5b505050506040513d6020811015612c3757600080fd5b5051600c80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6001600160a01b0382811660009081526014602090815260408083206001600160801b03198616845282528083208151610180810183528154808252600183015494820185905260028301549382019390935260038201546001600160401b0380821660608401819052600160401b8304821660808501819052600160801b8404831660a08601819052600160c01b90940490921660c08501819052600486015460e0860181905260058701546101008701526006870154610120870152600790960154998a16610140860152600160a01b90990460ff161515610160850152979096919590949092909190819081908190612d6581614f7b565b9450612d7081614f9a565b93508061016001519250612d83816145bd565b9150509295989b509295989b9093969950565b6000612da3611c55613efa565b3360009081526016602090815260408083206001600160801b031986168452825291829020825160a08101845281548152600182015492810192909252600201546001600160401b0380821693830193909352600160401b81049092166060820152600160801b90910460ff16151560808201819052612e2257600080fd5b60006080820152612e31613efa565b6001600160401b03166060820152612e4881613ce3565b60208201819052612e5a903390614edf565b600c548151612e7b91600160401b90046001600160a01b0316903390614fc1565b8051600b54612e8991613d6b565b600b553360009081526016602090815260408083206001600160801b0319969096168352948152908490208251815590820151600182018190559382015160029091018054606084015160809094015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b93909416929092029290921760ff60801b1916600160801b911515919091021790555090565b600061163a612f38613c57565b8484613d80565b6000816001600160401b0316118015612f705750612f5b613efa565b6001600160401b0316816001600160401b0316105b612f7957600080fd5b6009546001600160401b03821611612f9057600080fd5b611b9181613f1e565b6001600160a01b0381166000908152600f602052604081205415611cc0576001600160a01b0382166000908152600f6020526040902054611cbb908390612fe1906001613d6b565b600160f81b613033565b600c5463ffffffff1681565b739c306cad86550ec80d77668c0a8bee6eb34684b681565b60196020526000908152604090205481565b60186020526000908152604090205481565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152603482018590526001600160f81b0319841660548301528251603581840301815260559092019092528051910120600090611eb690611623565b6015602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401546001600160a01b039093169360809290921b9290919060ff1685565b60176020526000908152604090205481565b600654600754600854600954600a54600b5486565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6000613126611c55613efa565b600c54600160e01b900460ff16151560011461314157600080fd5b600c5461316090600160401b90046001600160a01b03163330856150db565b613168615ce5565b61317133615205565b915061317b613f0c565b6001600160401b0316604082015282815260016080820152600b546131a09084614def565b600b553360008181526016602090815260408083206001600160801b031987168452825291829020845181559084015160018201559083015160029091018054606085015160808601511515600160801b0260ff60801b196001600160401b03928316600160401b0267ffffffffffffffff60401b199390961667ffffffffffffffff19909416939093179190911693909317169190911790556132439061522e565b50919050565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516000918291829188916001600160a01b038316916323b872dd91606480830192602092919082900301818887803b1580156132a657600080fd5b505af11580156132ba573d6000803e3d6000fd5b505050506040513d60208110156132d057600080fd5b50506040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810189905290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b15801561333557600080fd5b505af1158015613349573d6000803e3d6000fd5b505050506040513d602081101561335f57600080fd5b506000905061336e893061524e565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398a6001853342611c20016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561340f5781810151838201526020016133f7565b505050509050019650505050505050600060405180830381600087803b15801561343857600080fd5b505af115801561344c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561347557600080fd5b8101908080516040519392919084600160201b82111561349457600080fd5b9083019060208201858111156134a957600080fd5b82518660208202830111600160201b821117156134c557600080fd5b82525081516020918201928201910280838360005b838110156134f25781810151838201526020016134da565b5050505090500160405250505090506135208160028151811061351157fe5b60200260200101518989613637565b9550955095505050505b9450945094915050565b601a6020526000908152604090208054600182015460029092015490919083565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b601e546001600160a01b0316331461358457600080fd5b601d80546001600160a01b039092166001600160a01b0319928316179055601e80549091169055565b60106020526000908152604090205481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60166020908152600092835260408084209091529082529020805460018201546002909201549091906001600160401b0380821691600160401b810490911690600160801b900460ff1685565b6000806000613647611c55613efa565b336001600160a01b03851614801590613664575061366484615314565b61366d57600080fd5b60016001600160401b038616108015906136925750613be26001600160401b03861611155b61369b57600080fd5b620f42408610156136ab57600080fd5b60008060006136bc338a8a8a61531f565b6001600160401b0316925092509250600083610120015111156137b3576136e1615ce5565b3381526001600160801b0319831660208201526001608082015261370488615413565b6001600160a01b0389811660009081526015602090815260408083206001600160801b0319868116855290835292819020865181546001600160a01b031916951694909417845590850151600184018054909316608091821c179092558401516002830155606084015160038301558301516004909101805460ff191691151591909117905594506137958861543c565b6137b18460a001516001600160401b031685610120015161545c565b505b3360008181526014602090815260408083206001600160801b031987168452825291829020865181559086015160018201559085015160028201556060850151600382018054608088015160a089015160c08a015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b939091169290920291909117905560e0850151600482015561010085015160058201556101208501516006820155610140850151600790910180546101608701516001600160a01b03199091166001600160a01b039093169290921760ff60a01b1916600160a01b921515929092029190911790556138e69061548b565b6138fe836020015184600001518561012001516154ab565b6139198360a001516001600160401b031684600001516154de565b866001600160a01b0316336001600160a01b0316836001600160801b0319167f6619c8f19b39bf3558af16516f9ca110fcac4a7ab6d846d1b02a17b11f703a338660200151876000015188610120015189606001518a608001518b610100015160405180878152602001868152602001858152602001846001600160401b03168152602001836001600160401b03168152602001828152602001965050505050505060405180910390a490945092505093509350939050565b6014602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007909701549596949593946001600160401b0380851695600160401b8604821695600160801b8104831695600160c01b909104909216939192906001600160a01b03811690600160a01b900460ff168c565b601c602052600090815260409020805460019091015482565b601d546001600160a01b03163314613a8e57600080fd5b611c658282614edf565b606060008084118015613ac257506001600160a01b03851660009081526010602052604090205484105b613ae4576001600160a01b038516600090815260106020526040902054613b01565b6001600160a01b0385166000908152601060205260409020548490035b905060008084118015613b1357508382115b613b1e576000613b22565b8382035b905060008183036001600160401b0381118015613b3e57600080fd5b50604051908082528060200260200182016040528015613b68578160200160208202803683370190505b509350825b82811115611ac6576000613b8a896000198401600160f91b613033565b6001600160a01b03808b1660009081526015602090815260408083206001600160801b031986168452909152902054919250613bc6911661550d565b15613bf85780868481518110613bd857fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901613b6d565b613c0d611c55613efa565b60005b8251811015613c5257613c4a33848381518110613c2957fe5b6020026020010151848481518110613c3d57fe5b602002602001015161423f565b600101613c10565b505050565b3390565b6001600160a01b038316613c6e57600080fd5b6001600160a01b038216613c8157600080fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008061016d61ffff168360400151016001600160401b0316905060008160066003015410613d125781613d16565b6009545b60408501519091506001600160401b03165b81811015613d63576000818152601c60205260409020600101548551670de0b6b3a76400000281613d5557fe5b049390930192600101613d28565b505050919050565b600082821115613d7a57600080fd5b50900390565b6001600160a01b038316613d9357600080fd5b6001600160a01b038216613da657600080fd5b6001600160a01b038316600090815260208190526040902054613dc99082613d6b565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613df89082614def565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b038216613e6557600080fd5b6001600160a01b038216600090815260208190526040902054613e889082613d6b565b6001600160a01b038316600090815260208190526040902055600554613eae9082613d6b565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b4290565b6000611bd4613f07613ef6565b61551b565b6000613f16613efa565b600101905090565b613f26611edf565b600654600954600091905b836001600160401b0316811015611dd45760001981016000908152601a602081815260408084206002015485855260178352818520549383529381902081516060810183528154815260019091015492810192909252919092019082018190526007549094508410613fa4576000613fab565b6007548490035b815261406a61405684613fbc6116f2565b60008681526019602090815260409182902054600c5483516330550a4b60e01b815263ffffffff909116600482015292519092739c306cad86550ec80d77668c0a8bee6eb34684b6926330550a4b92602480840193829003018186803b15801561402557600080fd5b505afa158015614039573d6000803e3d6000fd5b505050506040513d602081101561404f57600080fd5b505161554c565b82516120a290670de0b6b3a764000061461e565b60208083019182526000848152601a825260408082208551815593516001808601919091558186015160029586015560001987018352601b80855282842090950154878452601885528284205495855292829020825160608101845281548152910154938101939093529201918101829052600a549195509085106140f05760006140f7565b600a548590035b815261410d614056856141086116f2565b615569565b60208083019182526000858152601b8252604080822085518155935160018086019190915581860151600290950194909455601c83529081902081518083019092529092015490820152600b5481526141fc6140568661416b6116f2565b600c54604080516330550a4b60e01b8152600160201b90920463ffffffff16600483015251739c306cad86550ec80d77668c0a8bee6eb34684b6916330550a4b916024808301926020929190829003018186803b1580156141cb57600080fd5b505afa1580156141df573d6000803e3d6000fd5b505050506040513d60208110156141f557600080fd5b5051615578565b60208083019182526000868152601c90915260409020825181559051600190910155614226615589565b5050600980546001908101909155919091019050613f31565b6001600160a01b0380841660009081526015602090815260408083206001600160801b0319808816855290835292819020815160a08101835281549095168552600180820154608090811b90951693860193909352600281015491850191909152600381015460608501526004015460ff161515918301829052146142c357600080fd5b80516020808301516001600160a01b0380841660009081526014845260408082206001600160801b03198516835285528082208151610180810183528154815260018201549681019690965260028101549186019190915260038101546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b9091041660c0860152600481015460e08601526005810154610100860152600681015461012086015260070154918216610140850152600160a01b90910460ff1615156101608401529091906143a78286614692565b905060006143b483614717565b90506143bf83614775565b15614413576000871180156143dc57506143d98282615670565b87105b156144065760608601516143f09088614def565b60608701526143ff8288614def565b905061440e565b600060808701525b614451565b61442d8261441f613efa565b6001600160401b0316615670565b606087015190975061443f9088614def565b606087015261444e8288614def565b90505b600061445e848484614747565b60408801519091506144709082614def565b87604001818152505086601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b031916815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b03021916908360801c0217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506145598a82614edf565b604080516001600160801b03198b811682526020820184905282516001600160a01b03808f1694928a1693908b16927f5d13067bdc9e4d510839580df1e932220b31fb2bc7790b5bd35aae14f0303bed92918290030190a450505050505050505050565b6000808260c001516001600160401b0316116145f9576145db613efa565b6001600160401b03168260a001516001600160401b0316111561163e565b8160c001516001600160401b03168260a001516001600160401b031611159050919050565b60008261462d5750600061163e565b8282028284828161463a57fe5b041461464557600080fd5b9392505050565b600080821161465a57600080fd5b600082848161466557fe5b04949350505050565b600c805460ff60e01b1916600160e01b179055565b600c805460ff60e01b19169055565b6000614645826060015184606001516001600160401b0316601260008761014001516001600160a01b03166001600160a01b0316815260200190815260200160002060010154116146f05784606001516001600160401b0316612857565b6101408501516001600160a01b031660009081526012602052604090206001015490614def565b6000808260c001516001600160401b03161161473657611cbb82614d90565b5060c001516001600160401b031690565b6000614757846101400151615691565b61476b576147668484846156b0565b611eb6565b5060009392505050565b610160810151600090158061163e575061163e826145bd565b6001600160a01b03821660009081526014602090815260408083206001600160801b0319851684529091528120600701548190600160a01b900460ff166147d457600080fd5b6001600160a01b03841660009081526014602090815260408083206001600160801b0319871684529091529020915061480b613efa565b6003830180546001600160c01b0316600160c01b6001600160401b0393841681029190911791829055604080516101808101825286548152600187015460208201526002870154918101919091528284166060820152600160401b830484166080820152600160801b8304841660a0820152910490911660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526148d7906156ef565b60028301819055604080516101808101825284548152600185015460208201529081019190915260038301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff16151561016082015261498d90614f9a565b60078301805460ff60a01b1916905560018301549091506149c490859083106149b75760006149bf565b828460010154035b614edf565b6149d2848360020154614edf565b9250929050565b60065483106149e95760006149f0565b6006548390035b6006556007548210614a03576000614a0a565b6007548290035b6007558015614a2e57600a548110614a23576000614a2a565b600a548190035b600a555b613c52615710565b614a3f82615767565b15614a87576000828152601760205260409020548110614a60576000614a73565b6000828152601760205260409020548190035b600083815260176020526040902055611c65565b6000614a91615783565b6001600160401b03166000818152601a60205260409020600201549091508210614abc576000614ad2565b6000818152601a60205260409020600201548290035b6000918252601a6020526040909120600201555050565b614af282615767565b15614b3a576000828152601860205260409020548110614b13576000614b26565b6000828152601860205260409020548190035b600083815260186020526040902055611c65565b6000614b44615783565b6001600160401b03166000818152601b60205260409020600201549091508210614b6f576000614b85565b6000818152601b60205260409020600201548290035b6000918252601b6020526040909120600201555050565b614ba581615795565b158015614bb65750614bb68361550d565b15613c52576001600160a01b0383166000908152601260205260409020548210614be1576000614bfe565b6001600160a01b0383166000908152601260205260409020548290035b6001600160a01b038416600090815260126020526040902055614c20836157b1565b6001600160a01b038416600090815260126020526040902060010155505050565b8015611c65576001600160401b038216600090815260196020526040902054614c6a9082614def565b6001600160401b0383166000908152601960205260409020555050565b600081118015614ca757506041614c9c613efa565b6001600160401b0316115b15614d63576000614cbb86868486886157c9565b600854909150811115614d5d57600854614cdd906064906120a290606e61461e565b8110614cfd57600854614cf8906064906120a290606e61461e565b614cff565b805b90507fb52ab4a425c20017539fcd851fc4ddbb50d17546576353cd51a2d483d80a45b881600660020154614d31613efa565b6040805193845260208401929092526001600160401b031682820152519081900360600190a160088190555b50614d89565b6041614d6d613efa565b6001600160401b03161415614d8957670186cc6acd4b00006008555b5050505050565b60006006600301548260a001516001600160401b031611614dbe578160a001516001600160401b031661163e565b505060095490565b60008160e00151600014614dde578160e0015161163e565b50606001516001600160401b031690565b60008282018381101561464557600080fd5b6000825b82811015614e3f576000818152601a6020526040902060010154670de0b6b3a7640000860281614e3157fe5b049190910190600101614e05565b509392505050565b61016081015160009015614e7c57611cbb614e60613efa565b6001600160401b03168360a001516001600160401b0316615670565b61163e8260c001516001600160401b03168360a001516001600160401b0316615670565b6000614eab8361550d565b614ec557614ec08585846402540be400615826565b614ed6565b614ed685858464028fa6ae00615826565b95945050505050565b6001600160a01b038216614ef257600080fd5b600554614eff9082614def565b6005556001600160a01b038216600090815260208190526040902054614f259082614def565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000816101600151614f9157816040015161163e565b61163e82615848565b6000614fa582615860565b80614fb45750614fb4826145bd565b611cc057611cbb826158bf565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b6020831061503d5780518252601f19909201916020918201910161501e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461509f576040519150601f19603f3d011682016040523d82523d6000602084013e6150a4565b606091505b50915091508180156150d25750805115806150d257508080602001905160208110156150cf57600080fd5b50515b614d8957600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b6020831061515f5780518252601f199092019160209182019101615140565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146151c1576040519150601f19603f3d011682016040523d82523d6000602084013e6151c6565b606091505b50915091508180156151f45750805115806151f457508080602001905160208110156151f157600080fd5b50515b6151fd57600080fd5b505050505050565b6001600160a01b03811660009081526011602052604081205461163e908390600360f81b613033565b6001600160a01b0316600090815260116020526040902080546001019055565b60408051600380825260808201909252606091602082018380368337019050509050828160008151811061527e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106152c057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081816002815181106152ee57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b3b63ffffffff161590565b615327615d13565b6000806153348787613e52565b61533c613f0c565b9050615347876158f5565b6001600160401b0380871660808601819052838216606087015283880190911660a086015260016101608601526020850188905260085491935061538f918891908790614ea0565b835261539961591e565b506020830151600d546153b991670de0b6b3a7640000916120a29161461e565b6101008401526153c88461550d565b1561352a576001600160a01b03841661014084018190526101008401516153ef9190615b0d565b61540386866001600160401b031686615b75565b6101208401529450945094915050565b6001600160a01b03811660009081526010602052604081205461163e908390600160f91b613033565b6001600160a01b0316600090815260106020526040902080546001019055565b6000828152601860205260409020546154759082614def565b6000928352601860205260409092209190915550565b6001600160a01b03166000908152600f6020526040902080546001019055565b6006546154b89084614def565b6006556007546154c89083614def565b6007558015614a2e57600a54614a2a9082614def565b6000828152601760205260409020546154f79082614def565b6000928352601760205260409092209190915550565b6001600160a01b0316151590565b6000620151807f000000000000000000000000000000000000000000000000000000000000000083035b0492915050565b60008282858701612710028161555e57fe5b040195945050505050565b6315dd2ecd9101612710020490565b600081838501612710028161466557fe5b600c54600160e01b900460ff16151560011480156155b95750600c5462019258600160201b90910463ffffffff16105b1561560357600c805463ffffffff1967ffffffff00000000198216600160201b9283900463ffffffff90811660060181169093021790811690821660051901909116179055611cf4565b600c54600160e01b900460ff161580156156295750600c546201925863ffffffff909116105b15611cf457600c805467ffffffff000000001963ffffffff19821663ffffffff928316600601831617908116600160201b9182900483166005190190921602179055611cf4565b6000818311615688576156838284613d6b565b614645565b50600092915050565b6001600160a01b03166000908152601260205260409020600101541590565b6000825b82811015614e3f576000818152601b60205260409020600101548551670de0b6b3a764000002816156e157fe5b0491909101906001016156b4565b600061163e826000015161570284614dc6565b61570b85614d90565b614e01565b600954600754600654600854600a54604080519485526020850193909352838301919091526060830152517fea8ce1d041020595d75f4f48ba3378787b84e61d101465836fa54f1b338a4db59181900360800190a2565b6000615771613efa565b6001600160401b031690911015919050565b6000600161578f613efa565b03905090565b600061579f613efa565b6001600160401b031690911115919050565b60006157bc82615ba6565b611cc057611cbb82615bcd565b6000806157fb846157d98561550d565b6157e8576402540be4006157ef565b64028fa6ae005b64ffffffffff16615c22565b905061581b856120a26305f5e10061581585818d8d614def565b9061461e565b979650505050505050565b6000614ed66402540be4006120a261583e8786615c22565b6158158988615c6c565b600061585382615860565b611cc057611cbb826156ef565b6000808260c001516001600160401b03161161589b5761587e613efa565b6001600160401b031682606001516001600160401b03161161163e565b8160c001516001600160401b031682606001516001600160401b0316119050919050565b60006103e86158cd83615c84565b60016158d885614e47565b0361032002816158e457fe5b046064018360200151028161554557fe5b6001600160a01b0381166000908152600f602052604081205461163e908390600160f81b613033565b6040805163d06ca61f60e01b8152670de0b6b3a76400006004820181815260248301938452600e805460448501819052600095737a250d5630b4cf539739df2c5dacb4c659f2488d9563d06ca61f959492606490910190849080156159ac57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161598e575b5050935050505060006040518083038186803b1580156159cb57600080fd5b505afa925050508015615a8b57506040513d6000823e601f3d908101601f1916820160405260208110156159fe57600080fd5b8101908080516040519392919084600160201b821115615a1d57600080fd5b908301906020820185811115615a3257600080fd5b82518660208202830111600160201b82111715615a4e57600080fd5b82525081516020918201928201910280838360005b83811015615a7b578181015183820152602001615a63565b5050505090500160405250505060015b615ae757615a97615da9565b80615aa25750615aac565b5050600d54611623565b3d808015615ad6576040519150601f19603f3d011682016040523d82523d6000602084013e615adb565b606091505b50600d54915050611623565b80600281518110615af457fe5b6020026020010151600d81905550600d54915050611623565b6001600160a01b038216600090815260126020526040902054615b309082614def565b6001600160a01b038316600090815260126020526040902055615b52826157b1565b6001600160a01b0390921660009081526012602052604090206001019190915550565b6000615b8082615691565b80615b8c575061016d83105b61476b5761476684846006600201546402540be400615826565b6001600160a01b031660009081526012602052604090205469021e19e0c9bab24000001190565b6001600160a01b038116600090815260126020526040812060010154615c0357615bf5613efa565b6001600160401b031661163e565b506001600160a01b031660009081526012602052604090206001015490565b600081615c4f6107218511615c38576000615c3f565b6107201985015b660150b9a52b11286134c1615cba565b615c63856630aad4df397abe610721615cba565b01019392505050565b6000614645826120a285670de0b6b3a764000061461e565b6000600182608001516001600160401b031611615ca2576001615cab565b60018260800151035b6001600160401b031692915050565b6000611eb66402540be400838611615cdb57615cd6868661461e565b6120a2565b6120a2848661461e565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180610180016040528060008152602001600081526020016000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b60e01c90565b600060443d1015615db957611623565b600481823e6308c379a0615dcd8251615da3565b14615dd757611623565b6040513d600319016004823e80513d6001600160401b038160248401118184111715615e065750505050611623565b82840192508251915080821115615e205750505050611623565b503d83016020828401011115615e3857505050611623565b601f01601f191681016020016040529150509056fea264697066735822122077ab368710148891aff560da25363ab814108ed0459319cf37cd25027984ed7964736f6c63430007060033

Deployed Bytecode

0x6080604052600436106103bb5760003560e01c806395d89b41116101f2578063c31245251161010d578063dd62ed3e116100a0578063e3073bfb1161006f578063e3073bfb146113aa578063e742806a146113d4578063e7881cda1461140d578063fc527bf51461144c576103c5565b8063dd62ed3e146111ee578063df0618d214611229578063df2d02b1146112a3578063e1d033e9146112eb576103c5565b8063d6565a2d116100dc578063d6565a2d14611149578063d826492014611173578063d8d44a2914611188578063db74559b146111bb576103c5565b8063c312452514611072578063c74c0fac146110ba578063ce8f9f00146110cf578063d1cf9098146110f9576103c5565b8063ae3d1de211610185578063be21ff7011610154578063be21ff7014610f52578063bf58f6d214610f7c578063c172628e14610fc5578063c23d656414611048576103c5565b8063ae3d1de214610ecb578063b381a81114610efe578063b543c4ba14610f13578063bba85e1f14610f28576103c5565b8063a4ed0550116101c1578063a4ed055014610d8e578063a50af89514610e2b578063a9059cbb14610e5f578063a91b19f214610e98576103c5565b806395d89b4114610cc257806399c2def414610cd75780639b57ab1214610d0b5780639e78fb4f14610d79576103c5565b806348e4ccab116102e257806370a08231116102755780638649102b116102445780638649102b14610bb357806387da627414610bfb57806389201d4e14610c105780638a26306014610cad576103c5565b806370a082311461095857806375c3fa4f1461098b578063763241d3146109be578063779e2e1814610b70576103c5565b8063601f37ac116102b1578063601f37ac146108ca57806360e4c651146108fd578063613fc9fd1461092e5780636ba631cf14610943576103c5565b806348e4ccab146107dc5780634dfc7a031461080d5780634f47b16d146108405780635b2023871461087a576103c5565b806320429fac1161035a57806333060d901161032957806333060d90146107035780633697e979146107365780633b58afe71461076457806342966c68146107b0576103c5565b806320429fac146105c357806323672d8a1461060657806323b872dd14610695578063313ce567146106d8576103c5565b8063095ea7b311610396578063095ea7b3146104a457806310748592146104dd57806318160ddd1461054d5780631c0b37e114610562576103c5565b80625ada7f146103ca57806302cbb266146103f157806306fdde031461041a576103c5565b366103c557600080fd5b600080fd5b3480156103d657600080fd5b506103df61157c565b60408051918252519081900360200190f35b3480156103fd57600080fd5b50610406611582565b604080519115158252519081900360200190f35b34801561042657600080fd5b5061042f611592565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610469578181015183820152602001610451565b50505050905090810190601f1680156104965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104b057600080fd5b50610406600480360360408110156104c757600080fd5b506001600160a01b038135169060200135611626565b3480156104e957600080fd5b506105206004803603604081101561050057600080fd5b5080356001600160a01b031690602001356001600160801b031916611644565b60408051958652602086019490945284840192909252606084015215156080830152519081900360a00190f35b34801561055957600080fd5b506103df6116f2565b6105976004803603604081101561057857600080fd5b5080356001600160401b031690602001356001600160a01b03166116f8565b604080516001600160801b03199485168152602081019390935292168183015290519081900360600190f35b3480156105cf57600080fd5b506103df600480360360408110156105e657600080fd5b5080356001600160a01b031690602001356001600160801b031916611947565b34801561061257600080fd5b506106456004803603606081101561062957600080fd5b506001600160a01b038135169060208101359060400135611964565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610681578181015183820152602001610669565b505050509050019250505060405180910390f35b3480156106a157600080fd5b50610406600480360360608110156106b857600080fd5b506001600160a01b03813581169160208101359091169060400135611ad1565b3480156106e457600080fd5b506106ed611b40565b6040805160ff9092168252519081900360200190f35b34801561070f57600080fd5b506103df6004803603602081101561072657600080fd5b50356001600160a01b0316611b49565b34801561074257600080fd5b5061074b611b5b565b6040805163ffffffff9092168252519081900360200190f35b34801561077057600080fd5b506107976004803603602081101561078757600080fd5b50356001600160a01b0316611b6e565b6040805192835260208301919091528051918290030190f35b3480156107bc57600080fd5b506107da600480360360208110156107d357600080fd5b5035611b87565b005b3480156107e857600080fd5b506107f1611b94565b604080516001600160401b039092168252519081900360200190f35b34801561081957600080fd5b506107da6004803603602081101561083057600080fd5b50356001600160a01b0316611bd9565b34801561084c57600080fd5b506107da6004803603604081101561086357600080fd5b506001600160801b03198135169060200135611c4a565b34801561088657600080fd5b506108ad6004803603602081101561089d57600080fd5b50356001600160a01b0316611c69565b604080516001600160801b03199092168252519081900360200190f35b3480156108d657600080fd5b506103df600480360360208110156108ed57600080fd5b50356001600160a01b0316611cc8565b34801561090957600080fd5b50610912611cda565b604080516001600160a01b039092168252519081900360200190f35b34801561093a57600080fd5b506107da611ce9565b34801561094f57600080fd5b50610912611cf6565b34801561096457600080fd5b506103df6004803603602081101561097b57600080fd5b50356001600160a01b0316611d0c565b34801561099757600080fd5b506108ad600480360360208110156109ae57600080fd5b50356001600160a01b0316611d27565b3480156109ca57600080fd5b506107da600480360360608110156109e157600080fd5b810190602081018135600160201b8111156109fb57600080fd5b820183602082011115610a0d57600080fd5b803590602001918460208302840111600160201b83111715610a2e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a7d57600080fd5b820183602082011115610a8f57600080fd5b803590602001918460208302840111600160201b83111715610ab057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610aff57600080fd5b820183602082011115610b1157600080fd5b803590602001918460208302840111600160201b83111715610b3257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611d79945050505050565b348015610b7c57600080fd5b5061040660048036036040811015610b9357600080fd5b5080356001600160a01b031690602001356001600160801b031916611dda565b348015610bbf57600080fd5b50610bdd60048036036020811015610bd657600080fd5b5035611ebe565b60408051938452602084019290925282820152519081900360600190f35b348015610c0757600080fd5b506107da611edf565b348015610c1c57600080fd5b50610c5360048036036040811015610c3357600080fd5b5080356001600160a01b031690602001356001600160801b03191661214d565b604080516001600160a01b0390991689526001600160801b031990971660208901528787019590955260608701939093529015156080860152151560a0850152151560c0840152151560e083015251908190036101000190f35b348015610cb957600080fd5b5061091261243f565b348015610cce57600080fd5b5061042f61244e565b348015610ce357600080fd5b506103df60048036036020811015610cfa57600080fd5b50356001600160801b0319166124af565b348015610d1757600080fd5b50610d4e60048036036040811015610d2e57600080fd5b5080356001600160801b03191690602001356001600160401b031661270c565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610d8557600080fd5b506107da612ba0565b348015610d9a57600080fd5b50610dd160048036036040811015610db157600080fd5b5080356001600160a01b031690602001356001600160801b031916612c6a565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501521515610120840152151561014083015251908190036101600190f35b348015610e3757600080fd5b506103df60048036036020811015610e4e57600080fd5b50356001600160801b031916612d96565b348015610e6b57600080fd5b5061040660048036036040811015610e8257600080fd5b506001600160a01b038135169060200135612f2b565b348015610ea457600080fd5b506107da60048036036020811015610ebb57600080fd5b50356001600160401b0316612f3f565b348015610ed757600080fd5b506108ad60048036036020811015610eee57600080fd5b50356001600160a01b0316612f99565b348015610f0a57600080fd5b5061074b612feb565b348015610f1f57600080fd5b50610912612ff7565b348015610f3457600080fd5b506103df60048036036020811015610f4b57600080fd5b503561300f565b348015610f5e57600080fd5b506103df60048036036020811015610f7557600080fd5b5035613021565b348015610f8857600080fd5b506108ad60048036036060811015610f9f57600080fd5b5080356001600160a01b031690602081013590604001356001600160f81b031916613033565b348015610fd157600080fd5b5061100860048036036040811015610fe857600080fd5b5080356001600160a01b031690602001356001600160801b03191661308e565b604080516001600160a01b0390961686526001600160801b0319909416602086015284840192909252606084015215156080830152519081900360a00190f35b34801561105457600080fd5b506103df6004803603602081101561106b57600080fd5b50356130da565b34801561107e57600080fd5b506110876130ec565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156110c657600080fd5b50610912613101565b3480156110db57600080fd5b506108ad600480360360208110156110f257600080fd5b5035613119565b34801561110557600080fd5b506105976004803603608081101561111c57600080fd5b506001600160a01b0381358116916020810135916001600160401b03604083013516916060013516613249565b34801561115557600080fd5b50610bdd6004803603602081101561116c57600080fd5b5035613534565b34801561117f57600080fd5b50610912613555565b34801561119457600080fd5b506107da600480360360208110156111ab57600080fd5b50356001600160a01b031661356d565b3480156111c757600080fd5b506103df600480360360208110156111de57600080fd5b50356001600160a01b03166135ad565b3480156111fa57600080fd5b506103df6004803603604081101561121157600080fd5b506001600160a01b03813581169160200135166135bf565b34801561123557600080fd5b5061126c6004803603604081101561124c57600080fd5b5080356001600160a01b031690602001356001600160801b0319166135ea565b6040805195865260208601949094526001600160401b03928316858501529116606084015215156080830152519081900360a00190f35b3480156112af57600080fd5b50610597600480360360608110156112c657600080fd5b5080359060208101356001600160401b031690604001356001600160a01b0316613637565b3480156112f757600080fd5b5061132e6004803603604081101561130e57600080fd5b5080356001600160a01b031690602001356001600160801b0319166139d2565b604080519c8d5260208d019b909b528b8b01999099526001600160401b0397881660608c015295871660808b015293861660a08a01529190941660c088015260e08701939093526101008601929092526101208501919091526001600160a01b0316610140840152151561016083015251908190036101800190f35b3480156113b657600080fd5b50610797600480360360208110156113cd57600080fd5b5035613a5e565b3480156113e057600080fd5b506107da600480360360408110156113f757600080fd5b506001600160a01b038135169060200135613a77565b34801561141957600080fd5b506106456004803603606081101561143057600080fd5b506001600160a01b038135169060208101359060400135613a98565b34801561145857600080fd5b506107da6004803603604081101561146f57600080fd5b810190602081018135600160201b81111561148957600080fd5b82018360208201111561149b57600080fd5b803590602001918460208302840111600160201b831117156114bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561150b57600080fd5b82018360208201111561151d57600080fd5b803590602001918460208302840111600160201b8311171561153e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613c02945050505050565b600d5481565b600c54600160e01b900460ff1681565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561161b5780601f106115f05761010080835404028352916020019161161b565b820191906000526020600020905b8154815290600101906020018083116115fe57829003601f168201915b505050505090505b90565b600061163a611633613c57565b8484613c5b565b5060015b92915050565b6001600160a01b03821660009081526016602090815260408083206001600160801b0319851684528252808320815160a08101835281548082526001830154948201949094526002909101546001600160401b03808216938301849052600160401b8204166060830152600160801b900460ff1615156080820152909290819081906116cf81613ce3565b6060820151608090920151969995985096506001600160401b0316949392505050565b60055490565b60408051600280825260608201835260009283928392839260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061174157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061176f57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab5346001853342611c20016040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611828578181015183820152602001611810565b50505050905001955050505050506000604051808303818588803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561188d57600080fd5b8101908080516040519392919084600160201b8211156118ac57600080fd5b9083019060208201858111156118c157600080fd5b82518660208202830111600160201b821117156118dd57600080fd5b82525081516020918201928201910280838360005b8381101561190a5781810151838201526020016118f2565b5050505090500160405250505090506119388160018151811061192957fe5b60200260200101518888613637565b94509450945050509250925092565b601360209081526000928352604080842090915290825290205481565b60606000808411801561198e57506001600160a01b0385166000908152600f602052604090205484105b6119b0576001600160a01b0385166000908152600f60205260409020546119cd565b6001600160a01b0385166000908152600f60205260409020548490035b9050600080841180156119df57508382115b6119ea5760006119ee565b8382035b905060008183036001600160401b0381118015611a0a57600080fd5b50604051908082528060200260200182016040528015611a34578160200160208202803683370190505b509350825b82811115611ac6576000611a56896000198401600160f81b613033565b6001600160a01b038a1660009081526014602090815260408083206001600160801b03198516845290915290206001015490915015611abc5780868481518110611a9c57fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901611a39565b505050509392505050565b6000611b2b84611adf613c57565b6001600160a01b0387166000908152600160205260408120611b2691879190611b06613c57565b6001600160a01b0316815260208101919091526040016000205490613d6b565b613c5b565b611b36848484613d80565b5060019392505050565b60045460ff1690565b600f6020526000908152604090205481565b600c54600160201b900463ffffffff1681565b6012602052600090815260409020805460019091015482565b611b913382613e52565b50565b60007f000000000000000000000000000000000000000000000000000000005fa9d800611bbf613ef6565b1015611bcc576000611bd4565b611bd4613efa565b905090565b601d546001600160a01b03163314611bf057600080fd5b6001600160a01b038116600090815260126020526040902069021e19e0c9bab24000009055611c1d613f0c565b6001600160a01b0390911660009081526012602052604090206001600160401b0391909116600190910155565b611c5a611c55613efa565b613f1e565b611c6533838361423f565b5050565b6001600160a01b03811660009081526010602052604081205415611cc0576001600160a01b038216600090815260106020526040902054611cbb908390611cb1906001613d6b565b600160f91b613033565b61163e565b600092915050565b60116020526000908152604090205481565b601d546001600160a01b031681565b611cf4611c55613efa565b565b600c54600160401b90046001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b03811660009081526011602052604081205415611cc0576001600160a01b038216600090815260116020526040902054611cbb908390611d6f906001613d6b565b600360f81b613033565b60005b8351811015611dd457611dc9848281518110611d9457fe5b6020026020010151848381518110611da857fe5b6020026020010151848481518110611dbc57fe5b6020026020010151613637565b505050600101611d7c565b50505050565b6001600160a01b0382811660009081526014602090815260408083206001600160801b03198616845282528083208151610180810183528154815260018201549381019390935260028101549183019190915260038101546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600481015460e08301526005810154610100830152600681015461012083015260070154928316610140820152600160a01b90920460ff16151561016083015290611eb6816145bd565b949350505050565b601b6020526000908152604090208054600182015460029092015490919083565b6000806000600c60089054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f3257600080fd5b505afa158015611f46573d6000803e3d6000fd5b505050506040513d6060811015611f5c57600080fd5b50805160208083015160409384015184516001600160701b03808616825283169381019390935263ffffffff811683860152935192965094509192507f17057eec9ed80c65db1c29e57a343df0e9f052cf0f5ec6e93bc084533ae9b8c99181900360600190a1600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600c60089054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561203057600080fd5b505afa158015612044573d6000803e3d6000fd5b505050506040513d602081101561205a57600080fd5b50516001600160a01b0316146120705782612072565b835b6001600160701b0316905060006120876116f2565b156120ad576120a86120976116f2565b6120a28460c861461e565b9061464c565b6120b0565b60005b90506028811080156120cc5750600c54600160e01b900460ff16155b156120d9576120d961466e565b603c811180156120f75750600c54600160e01b900460ff1615156001145b1561210457612104614683565b600c5460408051600160e01b90920460ff1615158252517fbbf65e071e5468fb599b01ba3b914ae6065cf10ad084e0efe2133f7eaa8979bd916020908290030190a15050505050565b6000806000806000806000806000601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b03191681526020019081526020016000206040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a900460801b6001600160801b0319166001600160801b031916815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060000151985080602001519750806080015194506000601460008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008a6001600160801b0319166001600160801b0319168152602001908152602001600020604051806101800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016007820160149054906101000a900460ff16151515158152505090508061012001519750612410816124028385614692565b61240b84614717565b614747565b9650806101600151945061242381614775565b925061242e816145bd565b935050509295985092959890939650565b601e546001600160a01b031681565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561161b5780601f106115f05761010080835404028352916020019161161b565b60006124bc611c55613efa565b6000806124c9338561478e565b6040805161018081018252835480825260018501546020830181905260028601549383019390935260038501546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600485015460e08301526005850154610100830152600685015461012083018190526007909501546001600160a01b038116610140840152600160a01b900460ff16151561016083015290955091935061258c929091906149d9565b6125a78260a001516001600160401b03168360000151614a36565b6125c38260a001516001600160401b0316836101200151614ae9565b6125e582610140015183610100015184606001516001600160401b0316614b9c565b6125f38260c0015182614c41565b61266081836020015111612608576000612610565b818360200151035b3360009081526013602090815260408083206001600160801b03198a16845290915290819020549085015161014086015160808701518751929093019290916001600160401b0390911690614c87565b8161014001516001600160a01b0316336001600160a01b0316856001600160801b0319167f8cc66e48ebd8c008b36e03ee2f7c3f60a313a34a5bf1f3cb988a7936cd47f0d48560200151866000015187610120015188604001518960c001518960405180878152602001868152602001858152602001848152602001836001600160401b03168152602001828152602001965050505050505060405180910390a4506040015192915050565b600080600080600061271f611c55613efa565b3360009081526014602090815260408083206001600160801b03198b168452909152902060070154600160a01b900460ff1661275a57600080fd5b3360009081526014602090815260408083206001600160801b03198b1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c0830152600483015460e0830152600583015461010083015260068301546101208301526007909201546001600160a01b038116610140830152600160a01b900460ff1615156101608201529087166128415761283c81614d90565b61285d565b61285d876001600160401b031661285783614dc6565b90614def565b95508060a001516001600160401b031686116128795785612882565b61288281614d90565b955061289b816000015161289583614dc6565b88614e01565b94506128a6816145bd565b612975576128b381614e47565b93506128c6858533600660020154614ea0565b81519093506128d59084613d6b565b815260a08101516128ef906001600160401b031684614a36565b6101208101511561293d5761290c85856000600660020154614ea0565b61012082015190925061291f9083613d6b565b61012082015260a081015161293d906001600160401b031683614ae9565b612949600084846149d9565b61297081602001518683610140015184608001516001600160401b03168560000151614c87565b6129f0565b3360009081526013602090815260408083206001600160801b03198c1684529091529020546129a49086614def565b3360009081526013602090815260408083206001600160801b03198d1684528252909120829055820151610140830151608084015184516129f09492916001600160401b031690614c87565b60e081018681523360008181526014602090815260408083206001600160801b03198e168452825291829020855181559085015160018201559084015160028201556060840151600382018054608087015160a088015160c089015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b93909116929092029190911790559151600483015561010083015160058301556101208301516006830155610140830151600790920180546101608501516001600160a01b03199091166001600160a01b039094169390931760ff60a01b1916600160a01b9315159390930292909217909155612b299086614edf565b336001600160801b031989167f7b5d0995432c9ea1c8033b358af591013d0deff8dec5f4ae49612eba8bfafc0c87898787612b62613efa565b6040805195865260208601949094528484019290925260608401526001600160401b03166080830152519081900360a00190a3509295509295909350565b604080516364e329cb60e11b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201523060248201529051735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163c9c653969160448083019260209291908290030181600087803b158015612c0d57600080fd5b505af1158015612c21573d6000803e3d6000fd5b505050506040513d6020811015612c3757600080fd5b5051600c80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6001600160a01b0382811660009081526014602090815260408083206001600160801b03198616845282528083208151610180810183528154808252600183015494820185905260028301549382019390935260038201546001600160401b0380821660608401819052600160401b8304821660808501819052600160801b8404831660a08601819052600160c01b90940490921660c08501819052600486015460e0860181905260058701546101008701526006870154610120870152600790960154998a16610140860152600160a01b90990460ff161515610160850152979096919590949092909190819081908190612d6581614f7b565b9450612d7081614f9a565b93508061016001519250612d83816145bd565b9150509295989b509295989b9093969950565b6000612da3611c55613efa565b3360009081526016602090815260408083206001600160801b031986168452825291829020825160a08101845281548152600182015492810192909252600201546001600160401b0380821693830193909352600160401b81049092166060820152600160801b90910460ff16151560808201819052612e2257600080fd5b60006080820152612e31613efa565b6001600160401b03166060820152612e4881613ce3565b60208201819052612e5a903390614edf565b600c548151612e7b91600160401b90046001600160a01b0316903390614fc1565b8051600b54612e8991613d6b565b600b553360009081526016602090815260408083206001600160801b0319969096168352948152908490208251815590820151600182018190559382015160029091018054606084015160809094015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b93909416929092029290921760ff60801b1916600160801b911515919091021790555090565b600061163a612f38613c57565b8484613d80565b6000816001600160401b0316118015612f705750612f5b613efa565b6001600160401b0316816001600160401b0316105b612f7957600080fd5b6009546001600160401b03821611612f9057600080fd5b611b9181613f1e565b6001600160a01b0381166000908152600f602052604081205415611cc0576001600160a01b0382166000908152600f6020526040902054611cbb908390612fe1906001613d6b565b600160f81b613033565b600c5463ffffffff1681565b739c306cad86550ec80d77668c0a8bee6eb34684b681565b60196020526000908152604090205481565b60186020526000908152604090205481565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152603482018590526001600160f81b0319841660548301528251603581840301815260559092019092528051910120600090611eb690611623565b6015602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401546001600160a01b039093169360809290921b9290919060ff1685565b60176020526000908152604090205481565b600654600754600854600954600a54600b5486565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6000613126611c55613efa565b600c54600160e01b900460ff16151560011461314157600080fd5b600c5461316090600160401b90046001600160a01b03163330856150db565b613168615ce5565b61317133615205565b915061317b613f0c565b6001600160401b0316604082015282815260016080820152600b546131a09084614def565b600b553360008181526016602090815260408083206001600160801b031987168452825291829020845181559084015160018201559083015160029091018054606085015160808601511515600160801b0260ff60801b196001600160401b03928316600160401b0267ffffffffffffffff60401b199390961667ffffffffffffffff19909416939093179190911693909317169190911790556132439061522e565b50919050565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516000918291829188916001600160a01b038316916323b872dd91606480830192602092919082900301818887803b1580156132a657600080fd5b505af11580156132ba573d6000803e3d6000fd5b505050506040513d60208110156132d057600080fd5b50506040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810189905290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b15801561333557600080fd5b505af1158015613349573d6000803e3d6000fd5b505050506040513d602081101561335f57600080fd5b506000905061336e893061524e565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398a6001853342611c20016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561340f5781810151838201526020016133f7565b505050509050019650505050505050600060405180830381600087803b15801561343857600080fd5b505af115801561344c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561347557600080fd5b8101908080516040519392919084600160201b82111561349457600080fd5b9083019060208201858111156134a957600080fd5b82518660208202830111600160201b821117156134c557600080fd5b82525081516020918201928201910280838360005b838110156134f25781810151838201526020016134da565b5050505090500160405250505090506135208160028151811061351157fe5b60200260200101518989613637565b9550955095505050505b9450945094915050565b601a6020526000908152604090208054600182015460029092015490919083565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b601e546001600160a01b0316331461358457600080fd5b601d80546001600160a01b039092166001600160a01b0319928316179055601e80549091169055565b60106020526000908152604090205481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60166020908152600092835260408084209091529082529020805460018201546002909201549091906001600160401b0380821691600160401b810490911690600160801b900460ff1685565b6000806000613647611c55613efa565b336001600160a01b03851614801590613664575061366484615314565b61366d57600080fd5b60016001600160401b038616108015906136925750613be26001600160401b03861611155b61369b57600080fd5b620f42408610156136ab57600080fd5b60008060006136bc338a8a8a61531f565b6001600160401b0316925092509250600083610120015111156137b3576136e1615ce5565b3381526001600160801b0319831660208201526001608082015261370488615413565b6001600160a01b0389811660009081526015602090815260408083206001600160801b0319868116855290835292819020865181546001600160a01b031916951694909417845590850151600184018054909316608091821c179092558401516002830155606084015160038301558301516004909101805460ff191691151591909117905594506137958861543c565b6137b18460a001516001600160401b031685610120015161545c565b505b3360008181526014602090815260408083206001600160801b031987168452825291829020865181559086015160018201559085015160028201556060850151600382018054608088015160a089015160c08a015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b939091169290920291909117905560e0850151600482015561010085015160058201556101208501516006820155610140850151600790910180546101608701516001600160a01b03199091166001600160a01b039093169290921760ff60a01b1916600160a01b921515929092029190911790556138e69061548b565b6138fe836020015184600001518561012001516154ab565b6139198360a001516001600160401b031684600001516154de565b866001600160a01b0316336001600160a01b0316836001600160801b0319167f6619c8f19b39bf3558af16516f9ca110fcac4a7ab6d846d1b02a17b11f703a338660200151876000015188610120015189606001518a608001518b610100015160405180878152602001868152602001858152602001846001600160401b03168152602001836001600160401b03168152602001828152602001965050505050505060405180910390a490945092505093509350939050565b6014602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007909701549596949593946001600160401b0380851695600160401b8604821695600160801b8104831695600160c01b909104909216939192906001600160a01b03811690600160a01b900460ff168c565b601c602052600090815260409020805460019091015482565b601d546001600160a01b03163314613a8e57600080fd5b611c658282614edf565b606060008084118015613ac257506001600160a01b03851660009081526010602052604090205484105b613ae4576001600160a01b038516600090815260106020526040902054613b01565b6001600160a01b0385166000908152601060205260409020548490035b905060008084118015613b1357508382115b613b1e576000613b22565b8382035b905060008183036001600160401b0381118015613b3e57600080fd5b50604051908082528060200260200182016040528015613b68578160200160208202803683370190505b509350825b82811115611ac6576000613b8a896000198401600160f91b613033565b6001600160a01b03808b1660009081526015602090815260408083206001600160801b031986168452909152902054919250613bc6911661550d565b15613bf85780868481518110613bd857fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901613b6d565b613c0d611c55613efa565b60005b8251811015613c5257613c4a33848381518110613c2957fe5b6020026020010151848481518110613c3d57fe5b602002602001015161423f565b600101613c10565b505050565b3390565b6001600160a01b038316613c6e57600080fd5b6001600160a01b038216613c8157600080fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008061016d61ffff168360400151016001600160401b0316905060008160066003015410613d125781613d16565b6009545b60408501519091506001600160401b03165b81811015613d63576000818152601c60205260409020600101548551670de0b6b3a76400000281613d5557fe5b049390930192600101613d28565b505050919050565b600082821115613d7a57600080fd5b50900390565b6001600160a01b038316613d9357600080fd5b6001600160a01b038216613da657600080fd5b6001600160a01b038316600090815260208190526040902054613dc99082613d6b565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613df89082614def565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b038216613e6557600080fd5b6001600160a01b038216600090815260208190526040902054613e889082613d6b565b6001600160a01b038316600090815260208190526040902055600554613eae9082613d6b565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b4290565b6000611bd4613f07613ef6565b61551b565b6000613f16613efa565b600101905090565b613f26611edf565b600654600954600091905b836001600160401b0316811015611dd45760001981016000908152601a602081815260408084206002015485855260178352818520549383529381902081516060810183528154815260019091015492810192909252919092019082018190526007549094508410613fa4576000613fab565b6007548490035b815261406a61405684613fbc6116f2565b60008681526019602090815260409182902054600c5483516330550a4b60e01b815263ffffffff909116600482015292519092739c306cad86550ec80d77668c0a8bee6eb34684b6926330550a4b92602480840193829003018186803b15801561402557600080fd5b505afa158015614039573d6000803e3d6000fd5b505050506040513d602081101561404f57600080fd5b505161554c565b82516120a290670de0b6b3a764000061461e565b60208083019182526000848152601a825260408082208551815593516001808601919091558186015160029586015560001987018352601b80855282842090950154878452601885528284205495855292829020825160608101845281548152910154938101939093529201918101829052600a549195509085106140f05760006140f7565b600a548590035b815261410d614056856141086116f2565b615569565b60208083019182526000858152601b8252604080822085518155935160018086019190915581860151600290950194909455601c83529081902081518083019092529092015490820152600b5481526141fc6140568661416b6116f2565b600c54604080516330550a4b60e01b8152600160201b90920463ffffffff16600483015251739c306cad86550ec80d77668c0a8bee6eb34684b6916330550a4b916024808301926020929190829003018186803b1580156141cb57600080fd5b505afa1580156141df573d6000803e3d6000fd5b505050506040513d60208110156141f557600080fd5b5051615578565b60208083019182526000868152601c90915260409020825181559051600190910155614226615589565b5050600980546001908101909155919091019050613f31565b6001600160a01b0380841660009081526015602090815260408083206001600160801b0319808816855290835292819020815160a08101835281549095168552600180820154608090811b90951693860193909352600281015491850191909152600381015460608501526004015460ff161515918301829052146142c357600080fd5b80516020808301516001600160a01b0380841660009081526014845260408082206001600160801b03198516835285528082208151610180810183528154815260018201549681019690965260028101549186019190915260038101546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b9091041660c0860152600481015460e08601526005810154610100860152600681015461012086015260070154918216610140850152600160a01b90910460ff1615156101608401529091906143a78286614692565b905060006143b483614717565b90506143bf83614775565b15614413576000871180156143dc57506143d98282615670565b87105b156144065760608601516143f09088614def565b60608701526143ff8288614def565b905061440e565b600060808701525b614451565b61442d8261441f613efa565b6001600160401b0316615670565b606087015190975061443f9088614def565b606087015261444e8288614def565b90505b600061445e848484614747565b60408801519091506144709082614def565b87604001818152505086601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b031916815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b03021916908360801c0217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506145598a82614edf565b604080516001600160801b03198b811682526020820184905282516001600160a01b03808f1694928a1693908b16927f5d13067bdc9e4d510839580df1e932220b31fb2bc7790b5bd35aae14f0303bed92918290030190a450505050505050505050565b6000808260c001516001600160401b0316116145f9576145db613efa565b6001600160401b03168260a001516001600160401b0316111561163e565b8160c001516001600160401b03168260a001516001600160401b031611159050919050565b60008261462d5750600061163e565b8282028284828161463a57fe5b041461464557600080fd5b9392505050565b600080821161465a57600080fd5b600082848161466557fe5b04949350505050565b600c805460ff60e01b1916600160e01b179055565b600c805460ff60e01b19169055565b6000614645826060015184606001516001600160401b0316601260008761014001516001600160a01b03166001600160a01b0316815260200190815260200160002060010154116146f05784606001516001600160401b0316612857565b6101408501516001600160a01b031660009081526012602052604090206001015490614def565b6000808260c001516001600160401b03161161473657611cbb82614d90565b5060c001516001600160401b031690565b6000614757846101400151615691565b61476b576147668484846156b0565b611eb6565b5060009392505050565b610160810151600090158061163e575061163e826145bd565b6001600160a01b03821660009081526014602090815260408083206001600160801b0319851684529091528120600701548190600160a01b900460ff166147d457600080fd5b6001600160a01b03841660009081526014602090815260408083206001600160801b0319871684529091529020915061480b613efa565b6003830180546001600160c01b0316600160c01b6001600160401b0393841681029190911791829055604080516101808101825286548152600187015460208201526002870154918101919091528284166060820152600160401b830484166080820152600160801b8304841660a0820152910490911660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526148d7906156ef565b60028301819055604080516101808101825284548152600185015460208201529081019190915260038301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff16151561016082015261498d90614f9a565b60078301805460ff60a01b1916905560018301549091506149c490859083106149b75760006149bf565b828460010154035b614edf565b6149d2848360020154614edf565b9250929050565b60065483106149e95760006149f0565b6006548390035b6006556007548210614a03576000614a0a565b6007548290035b6007558015614a2e57600a548110614a23576000614a2a565b600a548190035b600a555b613c52615710565b614a3f82615767565b15614a87576000828152601760205260409020548110614a60576000614a73565b6000828152601760205260409020548190035b600083815260176020526040902055611c65565b6000614a91615783565b6001600160401b03166000818152601a60205260409020600201549091508210614abc576000614ad2565b6000818152601a60205260409020600201548290035b6000918252601a6020526040909120600201555050565b614af282615767565b15614b3a576000828152601860205260409020548110614b13576000614b26565b6000828152601860205260409020548190035b600083815260186020526040902055611c65565b6000614b44615783565b6001600160401b03166000818152601b60205260409020600201549091508210614b6f576000614b85565b6000818152601b60205260409020600201548290035b6000918252601b6020526040909120600201555050565b614ba581615795565b158015614bb65750614bb68361550d565b15613c52576001600160a01b0383166000908152601260205260409020548210614be1576000614bfe565b6001600160a01b0383166000908152601260205260409020548290035b6001600160a01b038416600090815260126020526040902055614c20836157b1565b6001600160a01b038416600090815260126020526040902060010155505050565b8015611c65576001600160401b038216600090815260196020526040902054614c6a9082614def565b6001600160401b0383166000908152601960205260409020555050565b600081118015614ca757506041614c9c613efa565b6001600160401b0316115b15614d63576000614cbb86868486886157c9565b600854909150811115614d5d57600854614cdd906064906120a290606e61461e565b8110614cfd57600854614cf8906064906120a290606e61461e565b614cff565b805b90507fb52ab4a425c20017539fcd851fc4ddbb50d17546576353cd51a2d483d80a45b881600660020154614d31613efa565b6040805193845260208401929092526001600160401b031682820152519081900360600190a160088190555b50614d89565b6041614d6d613efa565b6001600160401b03161415614d8957670186cc6acd4b00006008555b5050505050565b60006006600301548260a001516001600160401b031611614dbe578160a001516001600160401b031661163e565b505060095490565b60008160e00151600014614dde578160e0015161163e565b50606001516001600160401b031690565b60008282018381101561464557600080fd5b6000825b82811015614e3f576000818152601a6020526040902060010154670de0b6b3a7640000860281614e3157fe5b049190910190600101614e05565b509392505050565b61016081015160009015614e7c57611cbb614e60613efa565b6001600160401b03168360a001516001600160401b0316615670565b61163e8260c001516001600160401b03168360a001516001600160401b0316615670565b6000614eab8361550d565b614ec557614ec08585846402540be400615826565b614ed6565b614ed685858464028fa6ae00615826565b95945050505050565b6001600160a01b038216614ef257600080fd5b600554614eff9082614def565b6005556001600160a01b038216600090815260208190526040902054614f259082614def565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000816101600151614f9157816040015161163e565b61163e82615848565b6000614fa582615860565b80614fb45750614fb4826145bd565b611cc057611cbb826158bf565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b6020831061503d5780518252601f19909201916020918201910161501e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461509f576040519150601f19603f3d011682016040523d82523d6000602084013e6150a4565b606091505b50915091508180156150d25750805115806150d257508080602001905160208110156150cf57600080fd5b50515b614d8957600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b6020831061515f5780518252601f199092019160209182019101615140565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146151c1576040519150601f19603f3d011682016040523d82523d6000602084013e6151c6565b606091505b50915091508180156151f45750805115806151f457508080602001905160208110156151f157600080fd5b50515b6151fd57600080fd5b505050505050565b6001600160a01b03811660009081526011602052604081205461163e908390600360f81b613033565b6001600160a01b0316600090815260116020526040902080546001019055565b60408051600380825260808201909252606091602082018380368337019050509050828160008151811061527e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106152c057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081816002815181106152ee57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b3b63ffffffff161590565b615327615d13565b6000806153348787613e52565b61533c613f0c565b9050615347876158f5565b6001600160401b0380871660808601819052838216606087015283880190911660a086015260016101608601526020850188905260085491935061538f918891908790614ea0565b835261539961591e565b506020830151600d546153b991670de0b6b3a7640000916120a29161461e565b6101008401526153c88461550d565b1561352a576001600160a01b03841661014084018190526101008401516153ef9190615b0d565b61540386866001600160401b031686615b75565b6101208401529450945094915050565b6001600160a01b03811660009081526010602052604081205461163e908390600160f91b613033565b6001600160a01b0316600090815260106020526040902080546001019055565b6000828152601860205260409020546154759082614def565b6000928352601860205260409092209190915550565b6001600160a01b03166000908152600f6020526040902080546001019055565b6006546154b89084614def565b6006556007546154c89083614def565b6007558015614a2e57600a54614a2a9082614def565b6000828152601760205260409020546154f79082614def565b6000928352601760205260409092209190915550565b6001600160a01b0316151590565b6000620151807f000000000000000000000000000000000000000000000000000000005fa9d80083035b0492915050565b60008282858701612710028161555e57fe5b040195945050505050565b6315dd2ecd9101612710020490565b600081838501612710028161466557fe5b600c54600160e01b900460ff16151560011480156155b95750600c5462019258600160201b90910463ffffffff16105b1561560357600c805463ffffffff1967ffffffff00000000198216600160201b9283900463ffffffff90811660060181169093021790811690821660051901909116179055611cf4565b600c54600160e01b900460ff161580156156295750600c546201925863ffffffff909116105b15611cf457600c805467ffffffff000000001963ffffffff19821663ffffffff928316600601831617908116600160201b9182900483166005190190921602179055611cf4565b6000818311615688576156838284613d6b565b614645565b50600092915050565b6001600160a01b03166000908152601260205260409020600101541590565b6000825b82811015614e3f576000818152601b60205260409020600101548551670de0b6b3a764000002816156e157fe5b0491909101906001016156b4565b600061163e826000015161570284614dc6565b61570b85614d90565b614e01565b600954600754600654600854600a54604080519485526020850193909352838301919091526060830152517fea8ce1d041020595d75f4f48ba3378787b84e61d101465836fa54f1b338a4db59181900360800190a2565b6000615771613efa565b6001600160401b031690911015919050565b6000600161578f613efa565b03905090565b600061579f613efa565b6001600160401b031690911115919050565b60006157bc82615ba6565b611cc057611cbb82615bcd565b6000806157fb846157d98561550d565b6157e8576402540be4006157ef565b64028fa6ae005b64ffffffffff16615c22565b905061581b856120a26305f5e10061581585818d8d614def565b9061461e565b979650505050505050565b6000614ed66402540be4006120a261583e8786615c22565b6158158988615c6c565b600061585382615860565b611cc057611cbb826156ef565b6000808260c001516001600160401b03161161589b5761587e613efa565b6001600160401b031682606001516001600160401b03161161163e565b8160c001516001600160401b031682606001516001600160401b0316119050919050565b60006103e86158cd83615c84565b60016158d885614e47565b0361032002816158e457fe5b046064018360200151028161554557fe5b6001600160a01b0381166000908152600f602052604081205461163e908390600160f81b613033565b6040805163d06ca61f60e01b8152670de0b6b3a76400006004820181815260248301938452600e805460448501819052600095737a250d5630b4cf539739df2c5dacb4c659f2488d9563d06ca61f959492606490910190849080156159ac57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161598e575b5050935050505060006040518083038186803b1580156159cb57600080fd5b505afa925050508015615a8b57506040513d6000823e601f3d908101601f1916820160405260208110156159fe57600080fd5b8101908080516040519392919084600160201b821115615a1d57600080fd5b908301906020820185811115615a3257600080fd5b82518660208202830111600160201b82111715615a4e57600080fd5b82525081516020918201928201910280838360005b83811015615a7b578181015183820152602001615a63565b5050505090500160405250505060015b615ae757615a97615da9565b80615aa25750615aac565b5050600d54611623565b3d808015615ad6576040519150601f19603f3d011682016040523d82523d6000602084013e615adb565b606091505b50600d54915050611623565b80600281518110615af457fe5b6020026020010151600d81905550600d54915050611623565b6001600160a01b038216600090815260126020526040902054615b309082614def565b6001600160a01b038316600090815260126020526040902055615b52826157b1565b6001600160a01b0390921660009081526012602052604090206001019190915550565b6000615b8082615691565b80615b8c575061016d83105b61476b5761476684846006600201546402540be400615826565b6001600160a01b031660009081526012602052604090205469021e19e0c9bab24000001190565b6001600160a01b038116600090815260126020526040812060010154615c0357615bf5613efa565b6001600160401b031661163e565b506001600160a01b031660009081526012602052604090206001015490565b600081615c4f6107218511615c38576000615c3f565b6107201985015b660150b9a52b11286134c1615cba565b615c63856630aad4df397abe610721615cba565b01019392505050565b6000614645826120a285670de0b6b3a764000061461e565b6000600182608001516001600160401b031611615ca2576001615cab565b60018260800151035b6001600160401b031692915050565b6000611eb66402540be400838611615cdb57615cd6868661461e565b6120a2565b6120a2848661461e565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180610180016040528060008152602001600081526020016000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b60e01c90565b600060443d1015615db957611623565b600481823e6308c379a0615dcd8251615da3565b14615dd757611623565b6040513d600319016004823e80513d6001600160401b038160248401118184111715615e065750505050611623565b82840192508251915080821115615e205750505050611623565b503d83016020828401011115615e3857505050611623565b601f01601f191681016020016040529150509056fea264697066735822122077ab368710148891aff560da25363ab814108ed0459319cf37cd25027984ed7964736f6c63430007060033

Deployed Bytecode Sourcemap

101:4512:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;376:8;;;101:4512;;;;3503:34:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3460;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1375:83:1;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2811:252;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2811:252:1;;;;;;;;:::i;2687:627:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2687:627:5;;-1:-1:-1;;;;;2687:627:5;;;;;-1:-1:-1;;;;;;2687:627:5;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1852:91:1;;;;;;;;;;;;;:::i;2481:641:11:-;;;;;;;;;;;;;;;;-1:-1:-1;2481:641:11;;-1:-1:-1;;;;;2481:641:11;;;;;-1:-1:-1;;;;;2481:641:11;;:::i;:::-;;;;-1:-1:-1;;;;;;2481:641:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;4954:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4954:62:0;;-1:-1:-1;;;;;4954:62:0;;;;;-1:-1:-1;;;;;;4954:62:0;;:::i;1286:827:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1286:827:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3199:424:1;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3199:424:1;;;;;;;;;;;;;;;;;:::i;1691:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4725:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4725:45:0;-1:-1:-1;;;;;4725:45:0;;:::i;2428:37::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4895:52;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4895:52:0;-1:-1:-1;;;;;4895:52:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5315:113:1;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5315:113:1;;:::i;:::-;;147:129:10;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;147:129:10;;;;;;;;;;;;;;1828:336:11;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1828:336:11;-1:-1:-1;;;;;1828:336:11;;:::i;3093:265:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;3093:265:6;;;;;;;;:::i;3174:208:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3174:208:4;-1:-1:-1;;;;;3174:208:4;;:::i;:::-;;;;-1:-1:-1;;;;;;3174:208:4;;;;;;;;;;;;;;4832:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4832:54:0;-1:-1:-1;;;;;4832:54:0;;:::i;147:36:11:-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;147:36:11;;;;;;;;;;;;;;2188:111:8;;;;;;;;;;;;;:::i;3419:34:0:-;;;;;;;;;;;;;:::i;2029:110:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2029:110:1;-1:-1:-1;;;;;2029:110:1;;:::i;3390:218:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3390:218:4;-1:-1:-1;;;;;3390:218:4;;:::i;433:387:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;433:387:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;433:387:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;433:387:9;;;;;;;;-1:-1:-1;433:387:9;;-1:-1:-1;;;;;433:387:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;433:387:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;433:387:9;;;;;;;;-1:-1:-1;433:387:9;;-1:-1:-1;;;;;433:387:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;433:387:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;433:387:9;;-1:-1:-1;433:387:9;;-1:-1:-1;;;;;433:387:9:i;13315:264::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13315:264:9;;-1:-1:-1;;;;;13315:264:9;;;;;-1:-1:-1;;;;;;13315:264:9;;:::i;651:47:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;651:47:8;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:845;;;;;;;;;;;;;:::i;5557:1031:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5557:1031:6;;-1:-1:-1;;;;;5557:1031:6;;;;;-1:-1:-1;;;;;;5557:1031:6;;:::i;:::-;;;;-1:-1:-1;;;;;5557:1031:6;;;;;-1:-1:-1;;;;;;5557:1031:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;190:36:11;;;;;;;;;;;;;:::i;1530:87:1:-;;;;;;;;;;;;;:::i;5045:1668:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5045:1668:9;-1:-1:-1;;;;;;5045:1668:9;;:::i;7737:3088::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7737:3088:9;;-1:-1:-1;;;;;;7737:3088:9;;;;;-1:-1:-1;;;;;7737:3088:9;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3715:184:0;;;;;;;;;;;;;:::i;13587:1025:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13587:1025:9;;-1:-1:-1;;;;;13587:1025:9;;;;;-1:-1:-1;;;;;;13587:1025:9;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1487:1036:5;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1487:1036:5;-1:-1:-1;;;;;;1487:1036:5;;:::i;2147:258:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2147:258:1;;;;;;;;:::i;2484:446:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2484:446:8;-1:-1:-1;;;;;2484:446:8;;:::i;2975:191:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2975:191:4;-1:-1:-1;;;;;2975:191:4;;:::i;2331:37:0:-;;;;;;;;;;;;;:::i;3285:125::-;;;;;;;;;;;;;:::i;5372:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5372:49:0;;:::i;5311:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5311:54:0;;:::i;491:259:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;491:259:4;;-1:-1:-1;;;;;491:259:4;;;;;;;;;;-1:-1:-1;;;;;;491:259:4;;:::i;5089:73:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5089:73:0;;-1:-1:-1;;;;;5089:73:0;;;;;-1:-1:-1;;;;;;5089:73:0;;:::i;:::-;;;;-1:-1:-1;;;;;5089:73:0;;;;;-1:-1:-1;;;;;;5089:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5255:49;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5255:49:0;;:::i;422:22:3:-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3147:129:0;;;;;;;;;;;;;:::i;332:1009:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;332:1009:5;;:::i;3606:1004:11:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3606:1004:11;;;;;;;;;;-1:-1:-1;;;;;3606:1004:11;;;;;;;;;;;:::i;599:45:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;599:45:8;;:::i;3012:126:0:-;;;;;;;;;;;;;:::i;600:336:11:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;600:336:11;-1:-1:-1;;;;;600:336:11;;:::i;4777:48:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4777:48:0;-1:-1:-1;;;;;4777:48:0;;:::i;2537:191:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2537:191:1;;;;;;;;;;:::i;5169:77:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5169:77:0;;-1:-1:-1;;;;;5169:77:0;;;;;-1:-1:-1;;;;;;5169:77:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;5169:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1061:2195:9;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1061:2195:9;;;;;;;-1:-1:-1;;;;;1061:2195:9;;;;;-1:-1:-1;;;;;1061:2195:9;;:::i;5023:59:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5023:59:0;;-1:-1:-1;;;;;5023:59:0;;;;;-1:-1:-1;;;;;;5023:59:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5023:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5023:59:0;;;;;;;;;;;;;;;;;;;;705:47:8;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;705:47:8;;:::i;1285:322:11:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1285:322:11;;;;;;;;:::i;2121:846:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2121:846:4;;;;;;;;;;;;;:::i;3366:386:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3366:386:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3366:386:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3366:386:6;;;;;;;;-1:-1:-1;3366:386:6;;-1:-1:-1;;;;;3366:386:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3366:386:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3366:386:6;;-1:-1:-1;3366:386:6;;-1:-1:-1;;;;;3366:386:6:i;3503:34:0:-;;;;:::o;3460:::-;;;-1:-1:-1;;;3460:34:0;;;;;:::o;1375:83:1:-;1445:5;1438:12;;;;;;;-1:-1:-1;;1438:12:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1412:13;;1438:12;;1445:5;;1438:12;;1445:5;1438:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1375:83;;:::o;2811:252::-;2920:4;2942:89;2965:12;:10;:12::i;:::-;2992:7;3014:6;2942:8;:89::i;:::-;-1:-1:-1;3051:4:1;2811:252;;;;;:::o;2687:627:5:-;-1:-1:-1;;;;;3056:24:5;;2853:16;3056:24;;;:15;:24;;;;;;;;-1:-1:-1;;;;;;3056:43:5;;;;;;;;;3026:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3026:73:5;;;;;;;;;-1:-1:-1;;;3026:73:5;;;;;;;-1:-1:-1;;;3026:73:5;;;;;;;;;;;;2853:16;;;;;3205:29;3026:73;3205:22;:29::i;:::-;3256:14;;;;3292;;;;;2687:627;;;;-1:-1:-1;3190:44:5;-1:-1:-1;;;;;;3245:25:5;;3292:14;2687:627;-1:-1:-1;;;2687:627:5:o;1852:91:1:-;1923:12;;1852:91;:::o;2481:641:11:-;2702:16;;;2716:1;2702:16;;;;;;;;2624:7;;;;;;;;2702:16;;;;;;;;;;-1:-1:-1;2702:16:11;2678:40;;2961:42:0;2733:4:11;2738:1;2733:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;2733:14:11;;;-1:-1:-1;;;;;2733:14:11;;;;;2780:4;2762;2767:1;2762:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;2762:23:11;;;-1:-1:-1;;;;;2762:23:11;;;;;2798:24;3089:42:0;-1:-1:-1;;;;;2834:36:11;;2878:9;2903:1;2919:4;2938:10;2963:15;2981:7;2963:25;2834:165;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2834:165:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2834:165:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2834:165:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2834:165:11;;;;;;;;;;;;-1:-1:-1;2834:165:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2798:201;;3019:95;3045:7;3053:1;3045:10;;;;;;;;;;;;;;3070:9;3094;3019:11;:95::i;:::-;3012:102;;;;;;;;2481:641;;;;;:::o;4954:62:0:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;1286:827:4:-;1447:24;1489:13;1515:1;1505:7;:11;:57;;;;-1:-1:-1;;;;;;1533:19:4;;;;;;:10;:19;;;;;;:29;-1:-1:-1;1505:57:4;:124;;-1:-1:-1;;;;;1610:19:4;;;;;;:10;:19;;;;;;1505:124;;;-1:-1:-1;;;;;1578:19:4;;;;;;:10;:19;;;;;;:29;;;1505:124;1489:140;;1642:14;1669:1;1659:7;:11;:43;;;;;1695:7;1687:5;:15;1659:43;:78;;1736:1;1659:78;;;1726:7;1718:5;:15;1659:78;1642:95;;1750:9;1804:6;1796:5;:14;-1:-1:-1;;;;;1782:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1782:29:4;-1:-1:-1;1772:39:4;-1:-1:-1;1851:5:4;1824:282;1872:6;1858:11;:20;1824:282;;;1910:16;1929:42;1940:7;-1:-1:-1;;1949:15:4;;-1:-1:-1;;;1929:10:4;:42::i;:::-;-1:-1:-1;;;;;1990:15:4;;2031:1;1990:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;1990:25:4;;;;;;;;;:38;;;1910:61;;-1:-1:-1;1990:42:4;1986:109;;2066:8;2053:7;2061:1;2053:10;;;;;;;;-1:-1:-1;;;;;;2053:21:4;;;:10;;;;;;;;;;;:21;2076:3;;;;;1986:109;-1:-1:-1;;;1880:13:4;1824:282;;;;1286:827;;;;;;;;:::o;3199:424:1:-;3340:4;3362:132;3371:6;3392:12;:10;:12::i;:::-;-1:-1:-1;;;;;3406:19:1;;;;;;:11;:19;;;;;:77;;3462:6;;3406:19;3426:12;:10;:12::i;:::-;-1:-1:-1;;;;;3406:33:1;;;;;;;;;;;;-1:-1:-1;3406:33:1;;;:37;:77::i;:::-;3362:8;:132::i;:::-;3507:86;3531:6;3552:9;3576:6;3507:9;:86::i;:::-;-1:-1:-1;3611:4:1;3199:424;;;;;:::o;1691:83::-;1757:9;;;;1691:83;:::o;4725:45:0:-;;;;;;;;;;;;;:::o;2428:37::-;;;-1:-1:-1;;;2428:37:0;;;;;:::o;4895:52::-;;;;;;;;;;;;;;;;;;;:::o;5315:113:1:-;5395:25;5401:10;5413:6;5395:5;:25::i;:::-;5315:113;:::o;147:129:10:-;194:6;233:11;220:9;:7;:9::i;:::-;:24;;:48;;267:1;220:48;;;247:17;:15;:17::i;:::-;213:55;;147:129;:::o;1828:336:11:-;1953:21;;-1:-1:-1;;;;;1953:21:11;1939:10;:35;1917:110;;;;;;-1:-1:-1;;;;;2038:23:11;;;;;;:12;:23;;;;;2607:8:0;2038:53:11;;2142:14;:12;:14::i;:::-;-1:-1:-1;;;;;2102:23:11;;;;;;;:12;:23;;;;;-1:-1:-1;;;;;2102:54:11;;;;:37;;;;:54;1828:336::o;3093:265:6:-;799:38:8;819:17;:15;:17::i;:::-;799:19;:38::i;:::-;3245:105:6::1;3277:10;3302:11;3328;3245:17;:105::i;:::-;3093:265:::0;;:::o;3174:208:4:-;-1:-1:-1;;;;;3269:24:4;;3242:7;3269:24;;;:13;:24;;;;;;:29;:105;;-1:-1:-1;;;;;3336:24:4;;;;;;:13;:24;;;;;;3314:60;;3325:9;;3336:31;;3365:1;3336:28;:31::i;:::-;-1:-1:-1;;;3314:10:4;:60::i;:::-;3269:105;;;3309:1;3262:112;3174:208;-1:-1:-1;;3174:208:4:o;4832:54:0:-;;;;;;;;;;;;;:::o;147:36:11:-;;;-1:-1:-1;;;;;147:36:11;;:::o;2188:111:8:-;2253:38;2273:17;:15;:17::i;2253:38::-;2188:111::o;3419:34:0:-;;;-1:-1:-1;;;3419:34:0;;-1:-1:-1;;;;;3419:34:0;;:::o;2029:110:1:-;-1:-1:-1;;;;;2113:18:1;2086:7;2113:18;;;;;;;;;;;;2029:110::o;3390:218:4:-;-1:-1:-1;;;;;3489:28:4;;3462:7;3489:28;;;:19;:28;;;;;;:33;:111;;-1:-1:-1;;;;;3558:28:4;;;;;;:19;:28;;;;;;3538:62;;3549:7;;3558:35;;3591:1;3558:32;:35::i;:::-;-1:-1:-1;;;3538:10:4;:62::i;433:387:9:-;617:9;613:200;636:13;:20;632:1;:24;613:200;;;678:123;708:13;722:1;708:16;;;;;;;;;;;;;;743:9;753:1;743:12;;;;;;;;;;;;;;774:9;784:1;774:12;;;;;;;;;;;;;;678:11;:123::i;:::-;-1:-1:-1;;;658:3:9;;613:200;;;;433:387;;;:::o;13315:264::-;-1:-1:-1;;;;;13503:15:9;;;13451:13;13503:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;13503:25:9;;;;;;;;;13482:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13482:46:9;;;;;;;-1:-1:-1;;;13482:46:9;;;;;;;;-1:-1:-1;;;13482:46:9;;;;;;;;-1:-1:-1;;;13482:46:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13482:46:9;;;;;;;;;;;13451:13;13550:21;13482:46;13550:14;:21::i;:::-;13539:32;13315:264;-1:-1:-1;;;;13315:264:9:o;651:47:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1018:845::-;1086:16;1117;1148:25;1187:12;;;;;;;;;-1:-1:-1;;;;;1187:12:8;-1:-1:-1;;;;;1187:24:8;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1187:26:8;;;;;;;;;;;;1231:105;;-1:-1:-1;;;;;1231:105:8;;;;;;;;;;;;;;;;;;;;;;;1187:26;;-1:-1:-1;1187:26:8;-1:-1:-1;1187:26:8;;-1:-1:-1;1231:105:8;;;;;1187:26;1231:105;;;1349:17;2961:42:0;-1:-1:-1;;;;;1369:29:8;:12;;;;;;;;;-1:-1:-1;;;;;1369:12:8;-1:-1:-1;;;;;1369:19:8;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1369:21:8;-1:-1:-1;;;;;1369:29:8;;:77;;1438:8;1369:77;;;1414:8;1369:77;-1:-1:-1;;;;;1349:97:8;;;1459:13;1475;:11;:13::i;:::-;:18;:124;;1526:73;1585:13;:11;:13::i;:::-;1526:36;:9;1558:3;1526:31;:36::i;:::-;:58;;:73::i;:::-;1475:124;;;1509:1;1475:124;1459:140;;1624:2;1616:5;:10;:45;;;;-1:-1:-1;1630:22:8;;-1:-1:-1;;;1630:22:8;;;;:31;1616:45;1612:73;;;1663:22;:20;:22::i;:::-;1708:2;1700:5;:10;:44;;;;-1:-1:-1;1714:22:8;;-1:-1:-1;;;1714:22:8;;;;:30;;1740:4;1714:30;1700:44;1696:73;;;1746:23;:21;:23::i;:::-;1822:22;;1787:68;;;-1:-1:-1;;;1822:22:8;;;;;1787:68;;;;;;;;;;;;;;;1018:845;;;;;:::o;5557:1031:6:-;5714:14;5743:15;5773:22;5810:24;5849:21;5885:18;5918;5951:17;5996:24;6023:13;:24;6037:9;-1:-1:-1;;;;;6023:24:6;-1:-1:-1;;;;;6023:24:6;;;;;;;;;;;;:37;6048:11;-1:-1:-1;;;;;6023:37:6;;-1:-1:-1;;;;;6023:37:6;;;;;;;;;;;;;5996:64;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5996:64:6;-1:-1:-1;;;;;5996:64:6;-1:-1:-1;;;;;5996:64:6;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5996:64:6;;-1:-1:-1;;;;;5996:64:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6082:4;:11;;;6073:20;;6114:4;:12;;;6104:22;;6156:4;:13;;;6137:32;;6182:18;6203:6;:14;6210:6;-1:-1:-1;;;;;6203:14:6;-1:-1:-1;;;;;6203:14:6;;;;;;;;;;;;:23;6218:7;-1:-1:-1;;;;;6203:23:6;;-1:-1:-1;;;;;6203:23:6;;;;;;;;;;;;;6182:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;-1:-1:-1;;;;;6182:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;6254:5;:20;;;6237:37;;6306:139;6343:5;6363:31;6382:5;6389:4;6363:18;:31::i;:::-;6409:25;6428:5;6409:18;:25::i;:::-;6306:22;:139::i;:::-;6287:158;;6474:5;:14;;;6458:30;;6514:18;6526:5;6514:11;:18::i;:::-;6499:33;;6559:21;6574:5;6559:14;:21::i;:::-;6543:37;;5557:1031;;;;;;;;;;;;;:::o;190:36:11:-;;;-1:-1:-1;;;;;190:36:11;;:::o;1530:87:1:-;1602:7;1595:14;;;;;;;;-1:-1:-1;;1595:14:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1569:13;;1595:14;;1602:7;;1595:14;;1602:7;1595:14;;;;;;;;;;;;;;;;;;;;;;;;5045:1668:9;5158:7;799:38:8;819:17;:15;:17::i;799:38::-;5198:23:9::1;5236:21:::0;5282:68:::1;5306:10;5331:8;5282:9;:68::i;:::-;5183:167;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;5183:167:9;;::::1;::::0;;;;-1:-1:-1;;;5183:167:9;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;5183:167:9;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;5183:167:9;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;5183:167:9;::::1;::::0;;;;-1:-1:-1;;;5183:167:9;::::1;;;;;::::0;;;;;;-1:-1:-1;5183:167:9;;-1:-1:-1;5363:143:9::1;::::0;5183:167;;;5363:16:::1;:143::i;:::-;5519:105;5556:10;:19;;;-1:-1:-1::0;;;;;5519:105:9::1;5590:10;:23;;;5519:22;:105::i;:::-;5637:111;5678:10;:19;;;-1:-1:-1::0;;;;;5637:111:9::1;5712:10;:25;;;5637:26;:111::i;:::-;5761:137;5795:10;:19;;;5829:10;:24;;;5868:10;:19;;;-1:-1:-1::0;;;;;5761:137:9::1;:19;:137::i;:::-;5911:86;5939:10;:19;;;5973:13;5911;:86::i;:::-;6010:317;6068:13;6042:10;:23;;;:39;:98;;6139:1;6042:98;;;6123:13;6097:10;:23;;;:39;6042:98;6189:10;6181:19;::::0;;;:7:::1;:19;::::0;;;;;;;-1:-1:-1;;;;;;6181:29:9;::::1;::::0;;;;;;;;;;6155:23;;::::1;::::0;6225:19:::1;::::0;::::1;::::0;6259::::1;::::0;::::1;::::0;6293:23;;6155:55;;;::::1;::::0;6225:19;;-1:-1:-1;;;;;6010:317:9;;::::1;::::0;:17:::1;:317::i;:::-;6416:10;:19;;;-1:-1:-1::0;;;;;6345:317:9::1;6391:10;-1:-1:-1::0;;;;;6345:317:9::1;6368:8;-1:-1:-1::0;;;;;6345:317:9::1;;;6450:10;:23;;;6488:10;:23;;;6526:10;:25;;;6566:10;:23;;;6604:10;:19;;;6638:13;6345:317;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;6345:317:9::1;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;6682:23:9::1;;::::0;;5045:1668;-1:-1:-1;;5045:1668:9:o;7737:3088::-;7899:17;7931:20;7966:21;8002:22;8039:23;799:38:8;819:17;:15;:17::i;799:38::-;8119:10:9::1;8112:18;::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;8112:28:9;::::1;::::0;;;;;;;:37:::1;;::::0;-1:-1:-1;;;8112:37:9;::::1;;;8090:114;;;::::0;::::1;;8245:10;8217:18;8238::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;8238:28:9;::::1;::::0;;;;;;;;8217:49;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;8217:49:9;;::::1;::::0;;;;-1:-1:-1;;;8217:49:9;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8217:49:9;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8217:49:9;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;8217:49:9;::::1;::::0;;;;-1:-1:-1;;;8217:49:9;::::1;;;;;::::0;;;;;8291:15;::::1;:105;;8374:22;8390:5;8374:15;:22::i;:::-;8291:105;;;8322:36;8346:11;-1:-1:-1::0;;;;;8322:36:9::1;:19;8335:5;8322:12;:19::i;:::-;:23:::0;::::1;:36::i;:::-;8279:117;;8433:5;:14;;;-1:-1:-1::0;;;;;8421:26:9::1;:9;:26;:89;;8501:9;8421:89;;;8463:22;8479:5;8463:15;:22::i;:::-;8409:101;;8538:119;8570:5;:18;;;8603:19;8616:5;8603:12;:19::i;:::-;8637:9;8538:17;:119::i;:::-;8523:134;;8674:21;8689:5;8674:14;:21::i;:::-;8670:1746;;8739:16;8749:5;8739:9;:16::i;:::-;8723:32;;8789:157;8821:12;8852:13;8884:10;8913:7;:18;;;8789:13;:157::i;:::-;8997:18:::0;;8772:174;;-1:-1:-1;8997:38:9::1;::::0;8772:174;8997:22:::1;:38::i;:::-;8963:72:::0;;9093:14:::1;::::0;::::1;::::0;9052:103:::1;::::0;-1:-1:-1;;;;;9052:103:9::1;9126:14:::0;9052:22:::1;:103::i;:::-;9176:20;::::0;::::1;::::0;:24;9172:507:::1;;9241:179;9277:12;9312:13;9356:3;9383:7;:18;;;9241:13;:179::i;:::-;9481:20;::::0;::::1;::::0;9223:197;;-1:-1:-1;9481:41:9::1;::::0;9223:197;9481:24:::1;:41::i;:::-;9441:20;::::0;::::1;:81:::0;9592:14:::1;::::0;::::1;::::0;9543:120:::1;::::0;-1:-1:-1;;;;;9543:120:9::1;9629:15:::0;9543:26:::1;:120::i;:::-;9695:118;9730:1;9750:14;9783:15;9695:16;:118::i;:::-;9830:203;9866:5;:18;;;9903:12;9934:5;:14;;;9967:5;:14;;;-1:-1:-1::0;;;;;9830:203:9::1;10000:5;:18;;;9830:17;:203::i;:::-;8670:1746;;;10128:10;10120:19;::::0;;;:7:::1;:19;::::0;;;;;;;-1:-1:-1;;;;;;10120:29:9;::::1;::::0;;;;;;;;:47:::1;::::0;10154:12;10120:33:::1;:47::i;:::-;10083:10;10075:19;::::0;;;:7:::1;:19;::::0;;;;;;;-1:-1:-1;;;;;;10075:29:9;::::1;::::0;;;;;;;:92;;;10220:18;::::1;::::0;10305:14:::1;::::0;::::1;::::0;10338::::1;::::0;::::1;::::0;10371:18;;10184:220:::1;::::0;10075:92;10305:14;-1:-1:-1;;;;;10184:220:9::1;::::0;:17:::1;:220::i;:::-;10428:15;::::0;::::1;:27:::0;;;10473:10:::1;10466:18;::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;10466:28:9;::::1;::::0;;;;;;;;:36;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;10466:36:9;;::::1;-1:-1:-1::0;;;;;10466:36:9;;::::1;;-1:-1:-1::0;;;;10466:36:9::1;-1:-1:-1::0;;;10466:36:9;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;10466:36:9::1;-1:-1:-1::0;;;10466:36:9;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;10466:36:9::1;-1:-1:-1::0;;;10466:36:9;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;;10466:36:9;;::::1;-1:-1:-1::0;;;;;10466:36:9;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;10466:36:9::1;-1:-1:-1::0;;;10466:36:9;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;10515:68:::1;::::0;10560:12;10515:5:::1;:68::i;:::-;10654:10;-1:-1:-1::0;;;;;;10601:216:9;::::1;;10679:12:::0;10706:9;10730:14;10759:15;10789:17:::1;:15;:17::i;:::-;10601:216;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;10601:216:9::1;::::0;;;;;;;;;;;;::::1;848:1:8;7737:3088:9::0;;;;;;;;:::o;3715:184:0:-;3801:79;;;-1:-1:-1;;;3801:79:0;;2961:42;3801:79;;;;3860:4;3801:79;;;;;;3227:42;;3801:26;;:79;;;;;;;;;;;;;;-1:-1:-1;3227:42:0;3801:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3801:79:0;3757:12;:134;;-1:-1:-1;;;;;3757:134:0;;;-1:-1:-1;;;3757:134:0;-1:-1:-1;;;;;;3757:134:0;;;;;;;;;3715:184::o;13587:1025:9:-;-1:-1:-1;;;;;14122:15:9;;;13735:16;14122:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;14122:25:9;;;;;;;;;14101:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14101:46:9;;;;;;;;;-1:-1:-1;;;14101:46:9;;;;;;;;;;-1:-1:-1;;;14101:46:9;;;;;;;;;;-1:-1:-1;;;14101:46:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14101:46:9;;;;;;;;;;;;;;;;;;;;;;13735:16;;;;;;;14443:25;14101:46;14443:18;:25::i;:::-;14428:40;;14495:30;14519:5;14495:23;:30::i;:::-;14479:46;;14547:5;:14;;;14536:25;;14583:21;14598:5;14583:14;:21::i;:::-;14572:32;;13587:1025;;;;;;;;;;;;;;;:::o;1487:1036:5:-;1618:7;799:38:8;819:17;:15;:17::i;799:38::-;1707:10:5::1;1643:36;1691:27:::0;;;:15:::1;:27;::::0;;;;;;;-1:-1:-1;;;;;;1691:46:5;::::1;::::0;;;;;;;;1643:94;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;;::::0;-1:-1:-1;;;;;1643:94:5;;::::1;::::0;;;;;;;-1:-1:-1;;;1643:94:5;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;1643:94:5;;::::1;;;;;::::0;;;;;;1750:100:::1;;;::::0;::::1;;1889:5;1863:23;::::0;::::1;:31:::0;1931:17:::1;:15;:17::i;:::-;-1:-1:-1::0;;;;;1905:43:5::1;:23;::::0;::::1;:43:::0;1991:62:::1;1905:14:::0;1991:22:::1;:62::i;:::-;1961:27;::::0;::::1;:92:::0;;;2066:83:::1;::::0;2086:10:::1;::::0;2066:5:::1;:83::i;:::-;2197:12;::::0;2250:27;;2162:126:::1;::::0;-1:-1:-1;;;2197:12:5;::::1;-1:-1:-1::0;;;;;2197:12:5::1;::::0;2225:10:::1;::::0;2162:12:::1;:126::i;:::-;2364:27:::0;;2336:23;;:56:::1;::::0;:27:::1;:56::i;:::-;2301:23:::0;:91;2421:10:::1;2405:27;::::0;;;:15:::1;:27;::::0;;;;;;;-1:-1:-1;;;;;;2405:46:5;;;::::1;::::0;;;;;;;;;:63;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;2405:63:5;;::::1;-1:-1:-1::0;;;;;2405:63:5;;::::1;;-1:-1:-1::0;;;;2405:63:5::1;-1:-1:-1::0;;;2405:63:5;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;2405:63:5::1;-1:-1:-1::0;;;2405:63:5;::::1;;::::0;;;::::1;;::::0;;-1:-1:-1;2405:63:5;1487:1036::o;2147:258:1:-;2259:4;2281:92;2305:12;:10;:12::i;:::-;2332:9;2356:6;2281:9;:92::i;2484:446:8:-;2622:1;2609:10;-1:-1:-1;;;;;2609:14:8;;:61;;;;;2653:17;:15;:17::i;:::-;-1:-1:-1;;;;;2640:30:8;:10;-1:-1:-1;;;;;2640:30:8;;2609:61;2587:150;;;;;;2785:22;;-1:-1:-1;;;;;2772:35:8;;;2750:128;;;;;;2891:31;2911:10;2891:19;:31::i;2975:191:4:-;-1:-1:-1;;;;;3065:19:4;;3038:7;3065:19;;;:10;:19;;;;;;:24;:93;;-1:-1:-1;;;;;3125:19:4;;;;;;:10;:19;;;;;;3105:53;;3116:7;;3125:26;;3149:1;3125:23;:26::i;:::-;-1:-1:-1;;;3105:10:4;:53::i;2331:37:0:-;;;;;;:::o;3285:125::-;3361:42;3285:125;:::o;5372:49::-;;;;;;;;;;;;;:::o;5311:54::-;;;;;;;;;;;;;:::o;491:259:4:-;672:25;;;-1:-1:-1;;672:25:4;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;672:25:4;;;;;;;;;;;;;;;;;;;;;;640:76;;;;;564:9;;590:152;;:9;:152::i;5089:73:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5089:73:0;;;;;;;;;;;;;;;;:::o;5255:49::-;;;;;;;;;;;;;:::o;422:22:3:-;;;;;;;;;;;;;;:::o;3147:129:0:-;3227:42;3147:129;:::o;332:1009:5:-;465:24;799:38:8;819:17;:15;:17::i;799:38::-;529:22:5::1;::::0;-1:-1:-1;;;529:22:5;::::1;;;:30;;555:4;529:30;507:114;;;::::0;::::1;;673:12;::::0;634:147:::1;::::0;-1:-1:-1;;;673:12:5;::::1;-1:-1:-1::0;;;;;673:12:5::1;701:10;734:4;754:16:::0;634::::1;:147::i;:::-;794:39;;:::i;:::-;865:60;904:10;865:24;:60::i;:::-;846:79;;967:14;:12;:14::i;:::-;-1:-1:-1::0;;;;;938:43:5::1;:26;::::0;::::1;:43:::0;992:49;;;1081:4:::1;1052:26;::::0;::::1;:33:::0;1133:23;;:45:::1;::::0;1025:16;1133:27:::1;:45::i;:::-;1098:23:::0;:80;1207:10:::1;1191:27;::::0;;;:15:::1;:27;::::0;;;;;;;-1:-1:-1;;;;;;1191:45:5;::::1;::::0;;;;;;;;:65;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;-1:-1:-1::0;;;1191:65:5::1;-1:-1:-1::0;;;;;;;;;1191:65:5;;::::1;-1:-1:-1::0;;;1191:65:5::1;-1:-1:-1::0;;;;1191:65:5;;;::::1;-1:-1:-1::0;;1191:65:5;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;1269:64:::1;::::0;:28:::1;:64::i;:::-;848:1:8;332:1009:5::0;;;:::o;3606:1004:11:-;3934:109;;;-1:-1:-1;;;3934:109:11;;3967:10;3934:109;;;;4000:4;3934:109;;;;;;;;;;;;3797:7;;;;;;3897:13;;-1:-1:-1;;;;;3934:18:11;;;;;:109;;;;;;;;;;;;;;3797:7;3934:18;:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4056:89:11;;;-1:-1:-1;;;4056:89:11;;3089:42:0;4056:89:11;;;;;;;;;;;;-1:-1:-1;;;;;4056:13:11;;;;;:89;;;;;3934:109;;4056:89;;;;;;;-1:-1:-1;4056:13:11;:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4158:21:11;;-1:-1:-1;4182:79:11;4209:13;4245:4;4182:12;:79::i;:::-;4158:103;;4274:24;3089:42:0;-1:-1:-1;;;;;4310:39:11;;4364:12;4391:1;4407:4;4426:10;4451:15;4469:7;4451:25;4310:177;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4310:177:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4310:177:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4310:177:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4310:177:11;;;;;;;;;;;;-1:-1:-1;4310:177:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4274:213;;4507:95;4533:7;4541:1;4533:10;;;;;;;;;;;;;;4558:9;4582;4507:11;:95::i;:::-;4500:102;;;;;;;;;3606:1004;;;;;;;;;:::o;599:45:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3012:126:0:-;3089:42;3012:126;:::o;600:336:11:-;735:21;;-1:-1:-1;;;;;735:21:11;760:10;735:35;713:112;;;;;;836:21;:45;;-1:-1:-1;;;;;836:45:11;;;-1:-1:-1;;;;;;836:45:11;;;;;;892:21;:36;;;;;;;600:336::o;4777:48:0:-;;;;;;;;;;;;;:::o;2537:191:1:-;-1:-1:-1;;;;;2693:18:1;;;2661:7;2693:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2537:191::o;5169:77:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5169:77:0;;;;-1:-1:-1;;;5169:77:0;;;;;;-1:-1:-1;;;5169:77:0;;;;;:::o;1061:2195:9:-;1235:7;1244;1253:18;799:38:8;819:17;:15;:17::i;799:38::-;1311:10:9::1;-1:-1:-1::0;;;;;1311:23:9;::::1;;::::0;::::1;::::0;:62:::1;;;1351:22;1363:9;1351:11;:22::i;:::-;1289:136;;;::::0;::::1;;1812:1:0;-1:-1:-1::0;;;;;1460:26:9;::::1;;::::0;::::1;::::0;:69:::1;;-1:-1:-1::0;1891:5:0::1;-1:-1:-1::0;;;;;1503:26:9;::::1;;;1460:69;1438:148;;;::::0;::::1;;2114:7:0;1621:33:9::0;::::1;;1599:116;;;::::0;::::1;;1743:21;1779:15:::0;1809:17:::1;1851:61;1864:10;1876:13;1891:9;1902;1851:12;:61::i;:::-;-1:-1:-1::0;;;;;1728:184:9::1;;;;;;;1955:1;1929:8;:23;;;:27;1925:571;;;1975:32;;:::i;:::-;2046:10;2024:32:::0;;-1:-1:-1;;;;;;2071:30:9;::::1;:20;::::0;::::1;:30:::0;2140:4:::1;2116:21;::::0;::::1;:28:::0;2174:29:::1;2193:9:::0;2174:18:::1;:29::i;:::-;-1:-1:-1::0;;;;;2218:24:9;;::::1;;::::0;;;:13:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;;2218:36:9;;::::1;::::0;;;;;;;;;:51;;;;-1:-1:-1;;;;;;2218:51:9::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;-1:-1:-1;2218:51:9;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;2218:51:9::1;::::0;::::1;;::::0;;;::::1;::::0;;:36;-1:-1:-1;2286:65:9::1;2218:24:::0;2286:22:::1;:65::i;:::-;2368:116;2410:8;:17;;;-1:-1:-1::0;;;;;2368:116:9::1;2446:8;:23;;;2368;:116::i;:::-;1925:571;;2515:10;2508:18;::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;2508:27:9;::::1;::::0;;;;;;;;:38;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;2508:38:9;;::::1;-1:-1:-1::0;;;;;2508:38:9;;::::1;;-1:-1:-1::0;;;;2508:38:9::1;-1:-1:-1::0;;;2508:38:9;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;2508:38:9::1;-1:-1:-1::0;;;2508:38:9;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;2508:38:9::1;-1:-1:-1::0;;;2508:38:9;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;;2508:38:9;;::::1;-1:-1:-1::0;;;;;2508:38:9;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;2508:38:9::1;-1:-1:-1::0;;;2508:38:9;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;2559:55:::1;::::0;:19:::1;:55::i;:::-;2627:137;2658:8;:21;;;2694:8;:21;;;2730:8;:23;;;2627:16;:137::i;:::-;2777:98;2811:8;:17;;;-1:-1:-1::0;;;;;2777:98:9::1;2843:8;:21;;;2777:19;:98::i;:::-;2965:9;-1:-1:-1::0;;;;;2893:303:9::1;2940:10;-1:-1:-1::0;;;;;2893:303:9::1;2918:7;-1:-1:-1::0;;;;;2893:303:9::1;;;2989:8;:21;;;3025:8;:21;;;3061:8;:23;;;3099:8;:17;;;3131:8;:17;;;3163:8;:22;;;2893:303;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;2893:303:9::1;;;;;;-1:-1:-1::0;;;;;2893:303:9::1;;;;;;;;;;;;;;;;;;;;;;;;;3217:7:::0;;-1:-1:-1;3226:9:9;-1:-1:-1;;1061:2195:9;;;;;;;:::o;5023:59:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5023:59:0;;;;-1:-1:-1;;;5023:59:0;;;;;-1:-1:-1;;;5023:59:0;;;;;-1:-1:-1;;;5023:59:0;;;;;;;;;;-1:-1:-1;;;;;5023:59:0;;;-1:-1:-1;;;5023:59:0;;;;;:::o;705:47:8:-;;;;;;;;;;;;;;;;;;;:::o;1285:322:11:-;1443:21;;-1:-1:-1;;;;;1443:21:11;1429:10;:35;1407:110;;;;;;1530:69;1550:16;1581:7;1530:5;:69::i;2121:846:4:-;2287:27;2332:13;2358:1;2348:7;:11;:62;;;;-1:-1:-1;;;;;;2376:24:4;;;;;;:13;:24;;;;;;:34;-1:-1:-1;2348:62:4;:139;;-1:-1:-1;;;;;2463:24:4;;;;;;:13;:24;;;;;;2348:139;;;-1:-1:-1;;;;;2426:24:4;;;;;;:13;:24;;;;;;:34;;;2348:139;2332:155;;2500:14;2527:1;2517:7;:11;:43;;;;;2553:7;2545:5;:15;2517:43;:78;;2594:1;2517:78;;;2584:7;2576:5;:15;2517:78;2500:95;;2608:9;2665:6;2657:5;:14;-1:-1:-1;;;;;2643:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2643:29:4;-1:-1:-1;2630:42:4;-1:-1:-1;2708:5:4;2685:275;2725:6;2715:7;:16;2685:275;;;2759:12;2774:40;2785:9;-1:-1:-1;;2796:11:4;;-1:-1:-1;;;2774:10:4;:40::i;:::-;-1:-1:-1;;;;;2849:24:4;;;;;;;:13;:24;;;;;;;;-1:-1:-1;;;;;;2849:30:4;;;;;;;;;:37;2759:55;;-1:-1:-1;2833:54:4;;2849:37;2833:15;:54::i;:::-;2829:120;;;2924:4;2908:10;2919:1;2908:13;;;;;;;;-1:-1:-1;;;;;;2908:20:4;;;:13;;;;;;;;;;;:20;2930:3;;;;;2829:120;-1:-1:-1;;;2733:9:4;2685:275;;3366:386:6;799:38:8;819:17;:15;:17::i;799:38::-;3545:9:6::1;3541:204;3564:12;:19;3560:1;:23;3541:204;;;3605:128;3641:10;3670:12;3683:1;3670:15;;;;;;;;;;;;;;3704:11;3716:1;3704:14;;;;;;;;;;;;;;3605:17;:128::i;:::-;3585:3;;3541:204;;;;3366:386:::0;;:::o;161:106:1:-;249:10;161:106;:::o;6466:431::-;-1:-1:-1;;;;;6639:21:1;;6617:54;;;;;;-1:-1:-1;;;;;6706:23:1;;6684:56;;;;;;-1:-1:-1;;;;;6753:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;6807:82;;;;;;;;;;;;;;;;;6466:431;;;:::o;3451:619:5:-;3587:21;3626:25;2067:3:0;3654:44:5;;:15;:24;;;:44;-1:-1:-1;;;;;3626:72:5;;;3711:22;3774:17;3749:7;:22;;;:42;:100;;3832:17;3749:100;;;3807:22;;3749:100;3882:24;;;;3711:138;;-1:-1:-1;;;;;;3867:39:5;3862:201;3915:14;3908:4;:21;3862:201;;;4019:16;;;;:10;:16;;;;;:32;;;3971:28;;2560:4:0;3971:45:5;4019:32;3971:80;;;;;3954:97;;;;;3931:6;;3862:201;;;;3451:619;;;;;:::o;249:148:7:-;307:7;340:1;335;:6;;327:15;;;;;;-1:-1:-1;365:5:7;;;249:148::o;3944:540:1:-;-1:-1:-1;;;;;4121:22:1;;4099:55;;;;;;-1:-1:-1;;;;;4189:25:1;;4167:58;;;;;;-1:-1:-1;;;;;4267:17:1;;:9;:17;;;;;;;;;;;:29;;4289:6;4267:21;:29::i;:::-;-1:-1:-1;;;;;4238:17:1;;;:9;:17;;;;;;;;;;;:58;;;;4341:20;;;;;;;:32;;4366:6;4341:24;:32::i;:::-;-1:-1:-1;;;;;4309:20:1;;;:9;:20;;;;;;;;;;;;:64;;;;4391:85;;;;;;;4309:20;;4391:85;;;;;;;;;;;;;3944:540;;;:::o;5761:429::-;-1:-1:-1;;;;;5907:23:1;;5885:56;;;;;;-1:-1:-1;;;;;5984:18:1;;:9;:18;;;;;;;;;;;:30;;6007:6;5984:22;:30::i;:::-;-1:-1:-1;;;;;5954:18:1;;:9;:18;;;;;;;;;;:60;6051:12;;:24;;6068:6;6051:16;:24::i;:::-;6027:12;:48;6093:89;;;;;;;;6146:3;;-1:-1:-1;;;;;6093:89:1;;;;;;;;;;;;5761:429;;:::o;791:92:10:-;860:15;791:92;:::o;284:112::-;334:6;360:28;378:9;:7;:9::i;:::-;360:17;:28::i;404:102::-;451:6;477:17;:15;:17::i;:::-;497:1;477:21;470:28;;404:102;:::o;3084:3192:8:-;3181:23;:21;:23::i;:::-;3282:7;:19;3334:22;;3217:27;;3282:19;3314:2955;3365:10;-1:-1:-1;;;;;3358:17:8;:4;:17;3314:2955;;;-1:-1:-1;;3617:8:8;;3607:19;;;;:9;:19;;;;;;;;:34;;;3584:20;;;:14;:20;;;;;;3685:15;;;;;;;3658:42;;;;;;;;;;;3624:1;3658:42;;;;;;;;;;;3584:57;;;;3658:42;;;3715:45;;;3817:19;;3584:57;;-1:-1:-1;;;3817:106:8;;3922:1;3817:106;;;3878:19;;:41;;;3817:106;3777:146;;3968:418;4071:296;4114:16;4157:13;:11;:13::i;:::-;4197:20;;;;:14;:20;;;;;;;;;;4303:14;;4244:100;;-1:-1:-1;;;4244:100:8;;4303:14;;;;4244:100;;;;;;4197:20;;3361:42:0;;4244:28:8;;:100;;;;;;;;;;3361:42:0;4244:100:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4244:100:8;4071:16;:296::i;:::-;3968:20;;:58;;2560:4:0;3968:42:8;:58::i;:418::-;3940:24;;;;:446;;;4442:15;;;;:9;:15;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4709:8:8;;4698:20;;:10;:20;;;;;;:35;;;;4670:25;;;:19;:25;;;;;;4779:16;;;;;;;4750:45;;;;;;;;;;;;;;;;;;;;;4670:63;;4750:45;;;4810:46;;;4914:22;;4670:63;;-1:-1:-1;4750:45:8;4914:44;-1:-1:-1;4914:112:8;;5025:1;4914:112;;;4978:22;;:44;;;4914:112;4873:153;;5071:247;5175:124;5220:16;5263:13;:11;:13::i;:::-;5175:18;:124::i;5071:247::-;5043:25;;;;:275;;;5375:16;;;;:10;:16;;;;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;5613:10;:16;;;;;;5584:45;;;;;;;;;;;;;;;;5668:23;;5644:47;;5736:357;5822:252;5868:16;5911:13;:11;:13::i;:::-;6010:14;;5951:100;;;-1:-1:-1;;;5951:100:8;;-1:-1:-1;;;6010:14:8;;;;;;5951:100;;;;3361:42:0;;5951:28:8;;:100;;;;;;;;;;;;;;3361:42:0;5951:100:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5951:100:8;5822:19;:252::i;5736:357::-;5708:25;;;;:385;;;6151:16;;;;:10;:16;;;;;;:28;;;;;;;;;;;6196:22;:20;:22::i;:::-;-1:-1:-1;;6233:22:8;:24;;;;;;;;;3377:6;;;;;-1:-1:-1;3314:2955:8;;3760:1789:6;-1:-1:-1;;;;;3953:24:6;;;3917;3953;;;:13;:24;;;;;;;;-1:-1:-1;;;;;;3953:37:6;;;;;;;;;;;;3917:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4025:21;4003:54;;;;;;4087:11;;4127:12;;;;;-1:-1:-1;;;;;4173:14:6;;;4070;4173;;;:6;:14;;;;;;-1:-1:-1;;;;;;4173:23:6;;;;;;;;;4152:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4152:44:6;;;;;;;-1:-1:-1;;;4152:44:6;;;;;;;;-1:-1:-1;;;4152:44:6;;;;;;;;-1:-1:-1;;;4152:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4152:44:6;;;;;;;;;;;4127:12;;4152:44;4228:31;4152:44;4087:11;4228:18;:31::i;:::-;4209:50;;4270:16;4289:25;4308:5;4289:18;:25::i;:::-;4270:44;;4331:18;4343:5;4331:11;:18::i;:::-;4327:684;;;4405:1;4390:12;:16;:81;;;;;4442:29;4452:8;4462;4442:9;:29::i;:::-;4427:12;:44;4390:81;4368:388;;;4563:18;;;;:36;;4586:12;4563:22;:36::i;:::-;4525:18;;;:74;4648:26;:8;4661:12;4648;:26::i;:::-;4620:54;;4368:388;;;4735:5;4719:13;;;:21;4368:388;4327:684;;;4807:38;4817:8;4827:17;:15;:17::i;:::-;-1:-1:-1;;;;;4807:38:6;:9;:38::i;:::-;4896:18;;;;4792:53;;-1:-1:-1;4896:36:6;;4792:53;4896:22;:36::i;:::-;4862:18;;;:70;4973:26;:8;4986:12;4973;:26::i;:::-;4949:50;;4327:684;5023:24;5050:99;5087:5;5107:8;5130;5050:22;:99::i;:::-;5191:17;;;;5023:126;;-1:-1:-1;5191:39:6;;5023:126;5191:21;:39::i;:::-;5162:4;:17;;:68;;;;;5283:4;5243:13;:24;5257:9;-1:-1:-1;;;;;5243:24:6;-1:-1:-1;;;;;5243:24:6;;;;;;;;;;;;:37;5268:11;-1:-1:-1;;;;;5243:37:6;;-1:-1:-1;;;;;5243:37:6;;;;;;;;;;;;;:44;;;;;;;;;;;;;-1:-1:-1;;;;;5243:44:6;;;;;-1:-1:-1;;;;;5243:44:6;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5243:44:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5300:71;5320:9;5344:16;5300:5;:71::i;:::-;5389:152;;;-1:-1:-1;;;;;;5389:152:6;;;;;;;;;;;;;-1:-1:-1;;;;;5389:152:6;;;;;;;;;;;;;;;;;;;;;3760:1789;;;;;;;;;;:::o;4039:221:4:-;4107:4;4149:1;4131:6;:15;;;-1:-1:-1;;;;;4131:19:4;;:121;;4235:17;:15;:17::i;:::-;-1:-1:-1;;;;;4216:36:4;:6;:15;;;-1:-1:-1;;;;;4216:36:4;;;4131:121;;;4185:6;:15;;;-1:-1:-1;;;;;4166:34:4;:6;:15;;;-1:-1:-1;;;;;4166:34:4;;;4124:128;;4039:221;;;:::o;405:213:7:-;463:7;489:6;485:47;;-1:-1:-1;519:1:7;512:8;;485:47;556:5;;;560:1;556;:5;:1;580:5;;;;;:10;572:19;;;;;;609:1;405:213;-1:-1:-1;;;405:213:7:o;626:147::-;684:7;716:1;712;:5;704:14;;;;;;729:9;745:1;741;:5;;;;;;;626:147;-1:-1:-1;;;;626:147:7:o;1871:88:8:-;1922:22;:29;;-1:-1:-1;;;;1922:29:8;-1:-1:-1;;;1922:29:8;;;1871:88::o;1967:90::-;2019:22;:30;;-1:-1:-1;;;;2019:30:8;;;1967:90::o;7209:323:6:-;7308:7;7335:189;7504:5;:19;;;7396:6;:15;;;-1:-1:-1;;;;;7350:61:6;:12;:29;7363:6;:15;;;-1:-1:-1;;;;;7350:29:6;-1:-1:-1;;;;;7350:29:6;;;;;;;;;;;;:43;;;:61;:138;;7473:6;:15;;;-1:-1:-1;;;;;7350:138:6;;;;7440:15;;;;-1:-1:-1;;;;;7427:29:6;;;;;:12;:29;;;;;:43;;;7335:168;;:189::i;7540:244::-;7655:7;7718:1;7700:6;:15;;;-1:-1:-1;;;;;7700:19:6;;:76;;7753:23;7769:6;7753:15;:23::i;7700:76::-;-1:-1:-1;7735:15:6;;;-1:-1:-1;;;;;7700:76:6;;7540:244::o;6596:265::-;6710:25;6755:41;6780:6;:15;;;6755:24;:41::i;:::-;:98;;6803:50;6824:6;6832:9;6843;6803:20;:50::i;:::-;6755:98;;;-1:-1:-1;6799:1:6;;6596:265;-1:-1:-1;;;6596:265:6:o;4655:147:4:-;4744:15;;;;4720:4;;4744:24;;:50;;;4772:22;4787:6;4772:14;:22::i;6721:802:9:-;-1:-1:-1;;;;;6950:15:9;;6849:20;6950:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;6950:25:9;;;;;;;;;:34;;;6849:20;;-1:-1:-1;;;6950:34:9;;;;6928:111;;;;;;-1:-1:-1;;;;;7061:15:9;;;;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;7061:25:9;;;;;;;;;;-1:-1:-1;7115:17:9;:15;:17::i;:::-;7097:15;;;:35;;-1:-1:-1;;;;;7097:35:9;-1:-1:-1;;;;;;;;7097:35:9;;;;;;;;;;;;;7165:30;;;;;;;;;;;;-1:-1:-1;7165:30:9;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7165:30:9;;;;;;;;-1:-1:-1;;;7165:30:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7097:35;7165:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;7165:30:9;;;;;;-1:-1:-1;;;7165:30:9;;;;;;;;;;;;:22;:30::i;:::-;7143:19;;;:52;;;7217:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7217:31:9;;;;;;;-1:-1:-1;;;7217:31:9;;;;;;;;-1:-1:-1;;;7217:31:9;;;;;;;;-1:-1:-1;;;7217:31:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7217:31:9;;;;;;-1:-1:-1;;;7217:31:9;;;;;;;;;;;;:23;:31::i;:::-;7261:15;;;:23;;-1:-1:-1;;;;7261:23:9;;;;7339:19;;;7206:42;;-1:-1:-1;7297:133:9;;7317:7;;7339:30;-1:-1:-1;7339:80:9;;7418:1;7339:80;;;7407:8;7385:6;:19;;;:30;7339:80;7297:5;:133::i;:::-;7443:72;7463:7;7485:6;:19;;;7443:5;:72::i;:::-;6721:802;;;;;:::o;981:588:3:-;1158:7;:19;:29;-1:-1:-1;1158:74:3;;1231:1;1158:74;;;1199:7;:19;:29;;;1158:74;1127:7;:105;1276:19;;:29;-1:-1:-1;1276:74:3;;1349:1;1276:74;;;1317:19;;:29;;;1276:74;1245:19;:105;1367:12;;1363:173;;1436:22;;:33;-1:-1:-1;1436:86:3;;1521:1;1436:86;;;1485:22;;:33;;;1436:86;1398:22;:124;1363:173;1548:13;:11;:13::i;11048:550:9:-;11179:19;11188:9;11179:8;:19::i;:::-;11175:416;;;11258:25;;;;:14;:25;;;;;;:35;-1:-1:-1;11258:90:9;;11347:1;11258:90;;;11309:25;;;;:14;:25;;;;;;:35;;;11258:90;11217:25;;;;:14;:25;;;;;:131;11175:416;;;11385:12;11400:18;:16;:18::i;:::-;-1:-1:-1;;;;;11385:33:9;11479:15;;;;:9;:15;;;;;:30;;;11385:33;;-1:-1:-1;11479:40:9;-1:-1:-1;11479:100:9;;11578:1;11479:100;;;11535:15;;;;:9;:15;;;;;:30;;;:40;;;11479:100;11433:15;;;;:9;:15;;;;;;:30;;:146;11048:550;;:::o;412:572:6:-;547:19;556:9;547:8;:19::i;:::-;543:434;;;631:30;;;;:19;:30;;;;;;:40;-1:-1:-1;631:100:6;;730:1;631:100;;;687:30;;;;:19;:30;;;;;;:40;;;631:100;585:30;;;;:19;:30;;;;;:146;543:434;;;768:12;783:18;:16;:18::i;:::-;-1:-1:-1;;;;;768:33:6;863:16;;;;:10;:16;;;;;:31;;;768:33;;-1:-1:-1;863:41:6;-1:-1:-1;863:102:6;;964:1;863:102;;;920:16;;;;:10;:16;;;;;:31;;;:41;;;863:102;816:16;;;;:10;:16;;;;;;:31;;:149;412:572;;:::o;1535:560::-;1712:21;1723:9;1712:10;:21::i;:::-;:30;;;:73;;;1759:26;1775:9;1759:15;:26::i;:::-;1694:394;;;-1:-1:-1;;;;;1863:23:6;;;;;;:12;:23;;;;;:35;:52;-1:-1:-1;1863:124:6;;1986:1;1863:124;;;-1:-1:-1;;;;;1931:23:6;;;;;;:12;:23;;;;;:35;:52;;;1863:124;-1:-1:-1;;;;;1812:23:6;;;;;;:12;:23;;;;;:175;2042:34;1825:9;2042:23;:34::i;:::-;-1:-1:-1;;;;;2002:23:6;;;;;;:12;:23;;;;;:37;;:74;1535:560;;;:::o;17342:249:9:-;17463:12;;17459:125;;-1:-1:-1;;;;;17533:25:9;;;;;;:14;:25;;;;;;:39;;17563:8;17533:29;:39::i;:::-;-1:-1:-1;;;;;17492:25:9;;;;;;:14;:25;;;;;:80;17342:249;;:::o;11606:1133::-;11843:1;11828:12;:16;:51;;;;-1:-1:-1;1850:2:0;11848:17:9;:15;:17::i;:::-;-1:-1:-1;;;;;11848:31:9;;11828:51;11824:804;;;11898:21;11922:183;11958:13;11990;12022:12;12053:9;12081;11922:17;:183::i;:::-;12142:18;;11898:207;;-1:-1:-1;12126:34:9;;12122:472;;;12236:18;;:36;;12268:3;;12236:27;;12259:3;12236:22;:27::i;:36::-;12220:13;:52;:128;;12312:18;;:36;;12344:3;;12312:27;;12335:3;12312:22;:27::i;:36::-;12220:128;;;12296:13;12220:128;12183:165;;12374:149;12410:13;12446:7;:18;;;12487:17;:15;:17::i;:::-;12374:149;;;;;;;;;;;;;-1:-1:-1;;;;;12374:149:9;;;;;;;;;;;;;;12544:18;:34;;;12122:472;12610:7;;;11824:804;1850:2:0;12644:17:9;:15;:17::i;:::-;-1:-1:-1;;;;;12644:32:9;;12640:92;;;12714:6;12693:18;:27;12640:92;11606:1133;;;;;:::o;5235:187:4:-;5304:7;5349;:22;;;5331:6;:15;;;-1:-1:-1;;;;;5331:40:4;;:83;;5399:6;:15;;;-1:-1:-1;;;;;5331:83:4;;;;-1:-1:-1;;5374:22:4;;;5235:187::o;5430:159::-;5496:7;5523:6;:16;;;5543:1;5523:21;:58;;5565:6;:16;;;5523:58;;;-1:-1:-1;5547:15:4;;;-1:-1:-1;;;;;5523:58:4;;5430:159::o;93:148:7:-;151:7;183:5;;;207:6;;;;199:15;;;;;18379:380:9;18549:21;18608:9;18588:164;18626:9;18619:4;:16;18588:164;;;18709:15;;;;:9;:15;;;;;:31;;;2560:4:0;18677:29:9;;18709:31;18677:63;;;;;18660:80;;;;;18637:6;;18588:164;;;;18379:380;;;;;:::o;4810:242:4:-;4900:15;;;;4873:7;;4900:24;:144;;4999:45;5009:17;:15;:17::i;:::-;-1:-1:-1;;;;;4999:45:4;5028:6;:15;;;-1:-1:-1;;;;;4999:45:4;:9;:45::i;4900:144::-;4940:43;4950:6;:15;;;-1:-1:-1;;;;;4940:43:4;4967:6;:15;;;-1:-1:-1;;;;;4940:43:4;:9;:43::i;14620:411:9:-;14817:7;14849:26;14865:9;14849:15;:26::i;:::-;:174;;14965:58;14979:13;14994:9;15005:11;15018:4;14965:13;:58::i;:::-;14849:174;;;14891:58;14905:13;14920:9;14931:11;14944:4;14891:13;:58::i;:::-;14842:181;14620:411;-1:-1:-1;;;;;14620:411:9:o;4758:429:1:-;-1:-1:-1;;;;;4904:23:1;;4882:56;;;;;;4975:12;;:24;;4992:6;4975:16;:24::i;:::-;4951:12;:48;-1:-1:-1;;;;;5042:18:1;;:9;:18;;;;;;;;;;;:30;;5065:6;5042:22;:30::i;:::-;-1:-1:-1;;;;;5012:18:1;;:9;:18;;;;;;;;;;;:60;;;;5090:89;;;;;;;5012:18;;:9;;5090:89;;;;;;;;;;4758:429;;:::o;16997:167:9:-;17068:7;17095:6;:15;;;:61;;17137:6;:19;;;17095:61;;;17113:21;17127:6;17113:13;:21::i;17599:237::-;17718:7;17750:24;17767:6;17750:16;:24::i;:::-;:50;;;;17778:22;17793:6;17778:14;:22::i;:::-;17750:78;;17807:21;17821:6;17807:13;:21::i;6466:466:4:-;6659:111;;;-1:-1:-1;;;;;6659:111:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6659:111:4;-1:-1:-1;;;6659:111:4;;;6634:147;;;;6599:12;;;;6634:10;;;;6659:111;6634:147;;;6659:111;6634:147;;6659:111;6634:147;;;;;;;;;;-1:-1:-1;;6634:147:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6598:183;;;;6816:7;:57;;;;-1:-1:-1;6828:11:4;;:16;;:44;;;6859:4;6848:24;;;;;;;;;;;;;;;-1:-1:-1;6848:24:4;6828:44;6794:130;;;;;6940:517;7157:134;;;-1:-1:-1;;;;;7157:134:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7157:134:4;-1:-1:-1;;;7157:134:4;;;7132:170;;;;7097:12;;;;7132:10;;;;7157:134;7132:170;;;7157:134;7132:170;;7157:134;7132:170;;;;;;;;;;-1:-1:-1;;7132:170:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7096:206;;;;7337:7;:57;;;;-1:-1:-1;7349:11:4;;:16;;:44;;;7380:4;7369:24;;;;;;;;;;;;;;;-1:-1:-1;7369:24:4;7349:44;7315:134;;;;;;6940:517;;;;;;:::o;1097:181::-;-1:-1:-1;;;;;1235:28:4;;1171:24;1235:28;;;:19;:28;;;;;;1215:55;;1226:7;;-1:-1:-1;;;1215:10:4;:55::i;3885:146::-;-1:-1:-1;;;;;3991:28:4;;;;;:19;:28;;;;;;;4022:1;3991:32;3960:63;;3885:146::o;6149:309::-;6339:16;;;6353:1;6339:16;;;;;;;;;6291:22;;6339:16;;;6291:22;;6339:16;;;;;-1:-1:-1;6339:16:4;6331:24;;6377:13;6366:5;6372:1;6366:8;;;;;;;;;;;;;:24;-1:-1:-1;;;;;6366:24:4;;;-1:-1:-1;;;;;6366:24:4;;;;;2961:42:0;6401:5:4;6407:1;6401:8;;;;;;;;;;;;;:15;-1:-1:-1;;;;;6401:15:4;;;-1:-1:-1;;;;;6401:15:4;;;;;6438:12;6427:5;6433:1;6427:8;;;;;;;;;;;;;:23;-1:-1:-1;;;;;6427:23:4;;;-1:-1:-1;;;;;6427:23:4;;;;;6149:309;;;;:::o;172:195::-;302:18;349:9;;;;172:195::o;3421:1416:9:-;3612:22;;:::i;:::-;3649:16;3680;3724:66;3744:7;3766:13;3724:5;:66::i;:::-;3815:14;:12;:14::i;:::-;3803:26;;3851:24;3867:7;3851:15;:24::i;:::-;-1:-1:-1;;;;;3888:30:9;;;:18;;;:30;;;3929;;;:18;;;:30;3991:21;;;3970:42;;;:18;;;:42;4044:4;4023:18;;;:25;-1:-1:-1;4061:22:9;;:38;;;4239:18;;3840:35;;-1:-1:-1;4135:133:9;;4086:13;;3888:30;4215:9;;4135:13;:133::i;:::-;4110:158;;4281:22;:20;:22::i;:::-;-1:-1:-1;4380:22:9;;;;4342:19;;:95;;1703:15:0;;4342:61:9;;:37;:61::i;:95::-;4316:23;;;:121;4454:26;4470:9;4454:15;:26::i;:::-;4450:380;;;-1:-1:-1;;;;;4499:30:9;;:18;;;:30;;;4618:23;;;;4546:110;;4499:30;4546:16;:110::i;:::-;4700:118;4734:13;4766:9;-1:-1:-1;;;;;4700:118:9;4794:9;4700:15;:118::i;:::-;4673:24;;;:145;3421:1416;;;;;;;;:::o;920:169:4:-;-1:-1:-1;;;;;1050:24:4;;990:18;1050:24;;;:13;:24;;;;;;1028:53;;1039:9;;-1:-1:-1;;;1028:10:4;:53::i;3743:134::-;-1:-1:-1;;;;;3841:24:4;;;;;:13;:24;;;;;;;3868:1;3841:28;3814:55;;3743:134::o;183:221:6:-;353:30;;;;:19;:30;;;;;;:43;;388:7;353:34;:43::i;:::-;311:30;;;;:19;:30;;;;;;:85;;;;-1:-1:-1;183:221:6:o;3616:119:4:-;-1:-1:-1;;;;;3704:19:4;;;;;:10;:19;;;;;;;3726:1;3704:23;3682:45;;3616:119::o;521:452:3:-;698:7;:19;:32;;722:7;698:23;:32::i;:::-;667:7;:63;774:19;;:32;;798:7;774:23;:32::i;:::-;743:19;:63;823:12;;819:121;;892:22;;:36;;919:8;892:26;:36::i;10833:207:9:-;10994:25;;;;:14;:25;;;;;;:38;;11024:7;10994:29;:38::i;:::-;10957:25;;;;:14;:25;;;;;;:75;;;;-1:-1:-1;10833:207:9:o;5839:122:4:-;-1:-1:-1;;;;;5929:24:4;;;;5839:122::o;628:155:10:-;698:6;1760:13:0;745:11:10;732:24;;731:43;;;628:155;-1:-1:-1;;628:155:10:o;7051:250:8:-;7193:7;7278:15;7260;7236:12;7221;:27;7252:5;7220:37;:55;;;;;;:73;;7051:250;-1:-1:-1;;;;;7051:250:8:o;7309:183::-;2161:9:0;7431:27:8;;7462:5;7430:37;:54;;7309:183::o;7500:210::-;7620:7;7687:15;7663:12;7648;:27;7679:5;7647:37;:55;;;;6457:586;6526:22;;-1:-1:-1;;;6526:22:8;;;;:31;;6553:4;6526:31;:83;;;;-1:-1:-1;6574:14:8;;2263:6:0;-1:-1:-1;;;6574:14:8;;;:35;:14;:35;6526:83;6508:259;;;6666:14;;;-1:-1:-1;;;;6649:35:8;;-1:-1:-1;;;6666:14:8;;;;;;;;6683:1;6666:18;6649:35;;;;;;6699;;;6716:14;;;-1:-1:-1;;6716:18:8;6699:35;;;;;;6749:7;;6508:259;6795:22;;-1:-1:-1;;;6795:22:8;;;;:31;;;:83;;-1:-1:-1;6843:14:8;;2263:6:0;6843:35:8;:14;;;:35;6795:83;6777:259;;;6935:14;;;-1:-1:-1;;;;6918:35:8;;6935:14;;;;6952:1;6935:18;6918:35;;;6968;;;-1:-1:-1;;;6985:14:8;;;;;;-1:-1:-1;;6985:18:8;6968:35;;;;;;;7018:7;;5060:167:4;5140:7;5180:8;5167:10;:21;:52;;5195:24;:8;5208:10;5195:12;:24::i;:::-;5167:52;;;-1:-1:-1;5191:1:4;;5060:167;-1:-1:-1;;5060:167:4:o;4268:150::-;-1:-1:-1;;;;;4368:23:4;4344:4;4368:23;;;:12;:23;;;;;:37;;;:42;;4268:150::o;6869:332:6:-;6980:25;7038:9;7018:176;7056:9;7049:4;:16;7018:176;;;7150:16;;;;:10;:16;;;;;:32;;;7111:19;;2560:4:0;7111:36:6;7150:32;7111:71;;;;;7090:92;;;;;7067:6;;7018:176;;18078:293:9;18196:7;18228:135;18260:6;:19;;;18294:20;18307:6;18294:12;:20::i;:::-;18329:23;18345:6;18329:15;:23::i;:::-;18228:17;:135::i;1577:265:3:-;1801:22;;1663:19;;1801:7;1697:19;1731:18;;1764:22;;1638:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1577:265::o;5719:112:4:-;5774:4;5806:17;:15;:17::i;:::-;-1:-1:-1;;;;;5798:25:4;;;;;;5719:112;-1:-1:-1;5719:112:4:o;514:106:10:-;565:6;611:1;591:17;:15;:17::i;:::-;:21;584:28;;514:106;:::o;5597:114:4:-;5654:4;5686:17;:15;:17::i;:::-;-1:-1:-1;;;;;5678:25:4;;;;;;5597:114;-1:-1:-1;5597:114:4:o;2103:220:6:-;2220:7;2252:31;2273:9;2252:20;:31::i;:::-;:63;;2290:25;2305:9;2290:14;:25::i;12747:560:9:-;12981:7;13008:20;13031:86;13055:9;13066:26;13082:9;13066:15;:26::i;:::-;:40;;13102:4;13066:40;;;13095:4;13066:40;13031:86;;:9;:86::i;:::-;13008:109;-1:-1:-1;13150:149:9;13286:12;13150:113;13259:3;13150:86;13008:109;13150:86;:13;13186;13150:35;:50::i;:::-;:72;;:86::i;:149::-;13130:169;12747:560;-1:-1:-1;;;;;;;12747:560:9:o;15039:355::-;15238:7;15270:116;15381:4;15270:92;15328:33;15338:9;15349:11;15328:9;:33::i;:::-;15270:39;15282:13;15297:11;15270;:39::i;17172:162::-;17238:7;17265:24;17282:6;17265:16;:24::i;:::-;:61;;17296:30;17319:6;17296:22;:30::i;4426:221:4:-;4496:4;4538:1;4520:6;:15;;;-1:-1:-1;;;;;4520:19:4;;:119;;4622:17;:15;:17::i;:::-;-1:-1:-1;;;;;4604:35:4;:6;:15;;;-1:-1:-1;;;;;4604:35:4;;4520:119;;;4573:6;:15;;;-1:-1:-1;;;;;4555:33:4;:6;:15;;;-1:-1:-1;;;;;4555:33:4;;4513:126;;4426:221;;;:::o;17844:226:9:-;17937:7;18058:4;18032:20;18045:6;18032:12;:20::i;:::-;18026:1;18006:17;18016:6;18006:9;:17::i;:::-;:21;17999:3;:29;:54;;;;;;17992:3;:62;17969:6;:19;;;:86;:93;;;;758:154:4;-1:-1:-1;;;;;878:19:4;;823:15;878:19;;;:10;:19;;;;;;858:46;;869:7;;-1:-1:-1;;;858:10:4;:46::i;2614:471:6:-;2711:75;;;-1:-1:-1;;;2711:75:6;;1703:15:0;2711:75:6;;;;;;;;;;;;2770:5;2711:75;;;;;;;;2682:7;;3089:42:0;;2711:28:6;;1703:15:0;2711:75:6;;;;;;2770:5;;2711:75;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2711:75:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2711:75:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2711:75:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2711:75:6;;;;;;;;;;;;-1:-1:-1;2711:75:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2707:371;;;;:::i;:::-;;;;;;;;-1:-1:-1;;2972:19:6;;2965:26;;2707:371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3047:19;;3040:26;;;;;2707:371;2859:7;2867:1;2859:10;;;;;;;;;;;;;;2837:19;:32;;;;2891:19;;2884:26;;;;;1204:323;-1:-1:-1;;;;;1379:23:6;;;;;;:12;:23;;;;;:35;:55;;1419:14;1379:39;:55::i;:::-;-1:-1:-1;;;;;1332:23:6;;;;;;:12;:23;;;;;:102;1485:34;1345:9;1485:23;:34::i;:::-;-1:-1:-1;;;;;1445:23:6;;;;;;;:12;:23;;;;;:37;;:74;;;;-1:-1:-1;1204:323:6:o;16477:512:9:-;16646:7;16691:35;16716:9;16691:24;:35::i;:::-;:81;;;-1:-1:-1;2067:3:0;16743:29:9;;16691:81;:290;;16813:168;16849:13;16885:9;16917:7;:18;;;16958:4;16813:13;:168::i;992:204:6:-;-1:-1:-1;;;;;1135:23:6;1106:4;1135:23;;;:12;:23;;;;;:35;2607:8:0;-1:-1:-1;;992:204:6:o;2331:275::-;-1:-1:-1;;;;;2484:23:6;;2439:7;2484:23;;;:12;:23;;;;;:37;;;:114;;2581:17;:15;:17::i;:::-;-1:-1:-1;;;;;2484:114:6;;;;-1:-1:-1;;;;;;2541:23:6;;;;;:12;:23;;;;;:37;;;;2331:275::o;15402:433:9:-;15535:7;15816:11;15653:160;1950:4:0;15685:28:9;;:80;;15764:1;15685:80;;;-1:-1:-1;;15733:28:9;;15685:80;2764:15:0;2007:5;15653:13:9;:160::i;:::-;15580:57;15594:9;2671:17:0;1950:4;15580:13:9;:57::i;:::-;:233;:247;;15402:433;-1:-1:-1;;;15402:433:9:o;16191:278::-;16330:7;16375:86;16449:11;16375:51;:13;2560:4:0;16375:35:9;:51::i;5969:172:4:-;6035:7;6093:1;6075:6;:15;;;-1:-1:-1;;;;;6075:19:4;;:58;;6132:1;6075:58;;;6128:1;6110:6;:15;;;:19;6075:58;-1:-1:-1;;;;;6055:78:4;;5969:172;-1:-1:-1;;5969:172:4:o;15843:340:9:-;16002:7;16034:141;16170:4;16061:8;16049:9;:20;:101;;16129:21;:9;16143:6;16129:13;:21::i;:::-;16049:101;;;16089:20;:8;16102:6;16089:12;:20::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:88:12:-;89:3;85:15;;71:31::o;107:764::-;;188:4;170:16;167:26;164:2;;;196:5;;164:2;237:1;232:3;227;212:27;299:10;261:36;292:3;286:10;261:36;:::i;:::-;258:52;248:2;;314:5;;248:2;348;342:9;388:16;-1:-1:-1;;384:29:12;381:1;342:9;360:54;443:4;437:11;467:16;-1:-1:-1;;;;;573:2:12;566:4;558:6;554:17;551:25;546:2;538:6;535:14;532:45;529:2;;;580:5;;;;;;529:2;617:6;611:4;607:17;596:28;;653:3;647:10;633:24;;680:2;672:6;669:14;666:2;;;686:5;;;;;;666:2;;747:16;741:4;737:27;730:4;721:6;716:3;712:16;708:27;705:60;702:2;;;768:5;;;;;702:2;833;812:15;-1:-1:-1;;808:29:12;799:39;;840:4;795:50;791:2;784:62;803:3;-1:-1:-1;;154:717:12;:::o

Swarm Source

ipfs://77ab368710148891aff560da25363ab814108ed0459319cf37cd25027984ed79
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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