ETH Price: $2,621.28 (+1.29%)

Token

Wise Token (WISE)
 

Overview

Max Total Supply

0.404 WISE

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
WiseToken

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

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

pragma solidity =0.7.5;

import "./LiquidityToken.sol";

contract WiseToken is LiquidityToken {

    address public LIQUIDITY_TRANSFORMER;
    address public transformerGateKeeper;
    address payable public savingAddress;

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

    /**
     * @notice donations are welcomed
     * @dev goes to developers address
     */
    receive() external payable {
        savingAddress.transfer(msg.value);
    }

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

    /**
     * @notice allows to save any stuck ERC20 from contract
     * @dev if someone sends tokens into contract accidentally
     * @param _tokenAddress any ERC20 token address
     */
    function saveTokens(
        address _tokenAddress,
        uint256 _tokenAmount
    )
        external
    {
        safeTransfer(
            _tokenAddress,
            savingAddress,
            _tokenAmount
        );
    }
}

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

pragma solidity =0.7.5;

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 transfer(
        address to,
        uint256 value
    ) external returns (bool);

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

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

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

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 Mainnet
    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 => 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.5;

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)
    {
        _transfer(
            sender,
            recipient,
            amount
        );
        _approve(sender,
            _msgSender(), _allowances[sender][_msgSender()].sub(
                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),
            'ERC20: transfer from the zero address'
        );

        require(
            recipient != address(0x0),
            'ERC20: transfer to the zero address'
        );

        _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),
            'ERC20: mint to the zero address'
        );

        _totalSupply =
        _totalSupply.add(amount);

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

        emit Transfer(
            address(0x0),
            account,
            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),
            'ERC20: burn from the zero address'
        );

        _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.5;

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,
        bytes32 stakeID
    );

    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.5;

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

    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.5;

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 activeStakesCount(
        address _staker
    )
        external
        view
        returns (
            uint256 activeCount
        )
    {
        for (uint256 _stakeIndex = 0; _stakeIndex <= stakeCount[_staker]; _stakeIndex++) {
            bytes16 _stakeID = generateID(_staker, _stakeIndex - 1, 0x01);
            if (stakes[_staker][_stakeID].isActive) {
                activeCount++;
            }
        }
    }

    function activeReferralCount(
        address _referrer
    )
        external
        view
        returns (
            uint256 activeCount
        )
    {
        for (uint256 _rIndex = 0; _rIndex <= referralCount[_referrer]; _rIndex++) {
            bytes16 _rID = generateID(_referrer, _rIndex - 1, 0x02);
            if (referrerLinks[_referrer][_rID].isActive) {
                activeCount++;
            }
        }
    }

    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.5;

import "./StakingToken.sol";

abstract contract LiquidityToken is StakingToken {

    /**
     * @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)
    {
        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;

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

        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 + MAX_BONUS_DAYS_A;

        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.5;

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.5;

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.5;

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 = UNISWAP_PAIR.balanceOf(
                address(this)
            );

            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.5;

import "./ReferralToken.sol";

abstract contract StakingToken is ReferralToken {

    using SafeMath for uint256;

    /**
     * @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.
     */
    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,
            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
        );

        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) {
                globals.sharePrice =
                    newSharePrice < globals.sharePrice.mul(110).div(100) ?
                    newSharePrice : globals.sharePrice.mul(110).div(100);
            }

            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.5;

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":"bytes32","name":"stakeID","type":"bytes32"}],"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":"_referrer","type":"address"}],"name":"activeReferralCount","outputs":[{"internalType":"uint256","name":"activeCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"activeStakesCount","outputs":[{"internalType":"uint256","name":"activeCount","type":"uint256"}],"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":"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":"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"}],"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":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"saveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"savingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":"_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"}]

67059b4bdc09420000600555600b80546201925863ffffffff199091161763ffffffff60201b1916660186a6000000001790556101006040523060a090815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260c052736b175474e89094c44da98b954eedeac495271d0f60e0526200007e90600d9060036200013e565b503480156200008c57600080fd5b50604080518082018252600a8152692bb4b9b2902a37b5b2b760b11b6020808301918252835180850190945260048452635749534560e01b908401528151919291620000db91600291620001a8565b508051620000f1906003906020840190620001a8565b50506004805460ff191660121790555067016345785d8a0000600855635fa9d800608052601c80546001600160a01b031990811633908117909255601d8054909116909117905562000242565b82805482825590600052602060002090810192821562000196579160200282015b828111156200019657825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200015f565b50620001a49291506200022b565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001e0576000855562000196565b82601f10620001fb57805160ff191683800117855562000196565b8280016001018555821562000196579182015b82811115620001965782518255916020019190600101906200020e565b5b80821115620001a457600081556001016200022c565b608051615ef46200026260003980611a3f528061541a5250615ef46000f3fe6080604052600436106103c65760003560e01c80639e78fb4f116101f2578063c74c0fac1161010d578063df0618d2116100a0578063e742806a1161006f578063e742806a14611245578063e7881cda1461127e578063fad99ddc146112bd578063fc527bf5146112f057610407565b8063df0618d21461109a578063df2d02b114611114578063e1d033e91461115c578063e3073bfb1461121b57610407565b8063d8264920116100dc578063d826492014610fe4578063d8d44a2914610ff9578063db74559b1461102c578063dd62ed3e1461105f57610407565b8063c74c0fac14610f2b578063ce8f9f0014610f40578063d1cf909814610f6a578063d6565a2d14610fba57610407565b8063b429c8d311610185578063bf58f6d211610154578063bf58f6d214610e20578063c172628e14610e69578063c23d656414610eec578063c312452514610f1657610407565b8063b429c8d314610da2578063b543c4ba14610db7578063bba85e1f14610dcc578063be21ff7014610df657610407565b8063a91b19f2116101c1578063a91b19f214610cf4578063ae3d1de214610d27578063b0cb69f114610d5a578063b381a81114610d8d57610407565b80639e78fb4f14610bd5578063a4ed055014610bea578063a50af89514610c87578063a9059cbb14610cbb57610407565b80634f47b16d116102e2578063779e2e18116102755780638a263060116102445780638a26306014610b0957806395d89b4114610b1e57806399c2def414610b335780639b57ab1214610b6757610407565b8063779e2e18146109cc5780638649102b14610a0f57806387da627414610a5757806389201d4e14610a6c57610407565b8063613fc9fd116102b1578063613fc9fd1461093c5780636ba631cf1461095157806370a082311461096657806375c3fa4f1461099957610407565b80634f47b16d1461084e5780635b20238714610888578063601f37ac146108d857806360e4c6511461090b57610407565b806323672d8a1161035a5780633697e979116103295780633697e979146107705780633b58afe71461079e57806348e4ccab146107ea5780634dfc7a031461081b57610407565b806323672d8a1461064057806323b872dd146106cf578063313ce5671461071257806333060d901461073d57610407565b80631074859211610396578063107485921461051f578063127565e41461058f57806318160ddd146105ca5780631c0b37e1146105df57610407565b80625ada7f1461040c57806302cbb2661461043357806306fdde031461045c578063095ea7b3146104e657610407565b3661040757601d546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610404573d6000803e3d6000fd5b50005b600080fd5b34801561041857600080fd5b50610421611420565b60408051918252519081900360200190f35b34801561043f57600080fd5b50610448611426565b604080519115158252519081900360200190f35b34801561046857600080fd5b50610471611436565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104ab578181015183820152602001610493565b50505050905090810190601f1680156104d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104f257600080fd5b506104486004803603604081101561050957600080fd5b506001600160a01b0381351690602001356114ca565b34801561052b57600080fd5b506105626004803603604081101561054257600080fd5b5080356001600160a01b031690602001356001600160801b0319166114e8565b60408051958652602086019490945284840192909252606084015215156080830152519081900360a00190f35b34801561059b57600080fd5b506105c8600480360360408110156105b257600080fd5b506001600160a01b0381351690602001356115a6565b005b3480156105d657600080fd5b506104216115c2565b610614600480360360408110156105f557600080fd5b5080356001600160401b031690602001356001600160a01b03166115c8565b604080516001600160801b03199485168152602081019390935292168183015290519081900360600190f35b34801561064c57600080fd5b5061067f6004803603606081101561066357600080fd5b506001600160a01b038135169060208101359060400135611818565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106bb5781810151838201526020016106a3565b505050509050019250505060405180910390f35b3480156106db57600080fd5b50610448600480360360608110156106f257600080fd5b506001600160a01b03813581169160208101359091169060400135611985565b34801561071e57600080fd5b506107276119f4565b6040805160ff9092168252519081900360200190f35b34801561074957600080fd5b506104216004803603602081101561076057600080fd5b50356001600160a01b03166119fd565b34801561077c57600080fd5b50610785611a0f565b6040805163ffffffff9092168252519081900360200190f35b3480156107aa57600080fd5b506107d1600480360360208110156107c157600080fd5b50356001600160a01b0316611a22565b6040805192835260208301919091528051918290030190f35b3480156107f657600080fd5b506107ff611a3b565b604080516001600160401b039092168252519081900360200190f35b34801561082757600080fd5b506105c86004803603602081101561083e57600080fd5b50356001600160a01b0316611a80565b34801561085a57600080fd5b506105c86004803603604081101561087157600080fd5b506001600160801b03198135169060200135611af1565b34801561089457600080fd5b506108bb600480360360208110156108ab57600080fd5b50356001600160a01b0316611b0c565b604080516001600160801b03199092168252519081900360200190f35b3480156108e457600080fd5b50610421600480360360208110156108fb57600080fd5b50356001600160a01b0316611b6b565b34801561091757600080fd5b50610920611b7d565b604080516001600160a01b039092168252519081900360200190f35b34801561094857600080fd5b506105c8611b8c565b34801561095d57600080fd5b50610920611b99565b34801561097257600080fd5b506104216004803603602081101561098957600080fd5b50356001600160a01b0316611baf565b3480156109a557600080fd5b506108bb600480360360208110156109bc57600080fd5b50356001600160a01b0316611bca565b3480156109d857600080fd5b50610448600480360360408110156109ef57600080fd5b5080356001600160a01b031690602001356001600160801b031916611c1c565b348015610a1b57600080fd5b50610a3960048036036020811015610a3257600080fd5b5035611d0d565b60408051938452602084019290925282820152519081900360600190f35b348015610a6357600080fd5b506105c8611d2e565b348015610a7857600080fd5b50610aaf60048036036040811015610a8f57600080fd5b5080356001600160a01b031690602001356001600160801b031916611f9c565b604080516001600160a01b0390991689526001600160801b031990971660208901528787019590955260608701939093529015156080860152151560a0850152151560c0840152151560e083015251908190036101000190f35b348015610b1557600080fd5b5061092061215d565b348015610b2a57600080fd5b5061047161216c565b348015610b3f57600080fd5b5061042160048036036020811015610b5657600080fd5b50356001600160801b0319166121cd565b348015610b7357600080fd5b50610baa60048036036040811015610b8a57600080fd5b5080356001600160801b03191690602001356001600160401b0316612404565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610be157600080fd5b506105c8612821565b348015610bf657600080fd5b50610c2d60048036036040811015610c0d57600080fd5b5080356001600160a01b031690602001356001600160801b0319166128eb565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501521515610120840152151561014083015251908190036101600190f35b348015610c9357600080fd5b5061042160048036036020811015610caa57600080fd5b50356001600160801b031916612b2d565b348015610cc757600080fd5b5061044860048036036040811015610cde57600080fd5b506001600160a01b038135169060200135612cba565b348015610d0057600080fd5b506105c860048036036020811015610d1757600080fd5b50356001600160401b0316612cce565b348015610d3357600080fd5b506108bb60048036036020811015610d4a57600080fd5b50356001600160a01b0316612d2b565b348015610d6657600080fd5b5061042160048036036020811015610d7d57600080fd5b50356001600160a01b0316612d7d565b348015610d9957600080fd5b50610785612e0e565b348015610dae57600080fd5b50610920612e1a565b348015610dc357600080fd5b50610920612e29565b348015610dd857600080fd5b5061042160048036036020811015610def57600080fd5b5035612e41565b348015610e0257600080fd5b5061042160048036036020811015610e1957600080fd5b5035612e53565b348015610e2c57600080fd5b506108bb60048036036060811015610e4357600080fd5b5080356001600160a01b031690602081013590604001356001600160f81b031916612e65565b348015610e7557600080fd5b50610eac60048036036040811015610e8c57600080fd5b5080356001600160a01b031690602001356001600160801b031916612ec0565b604080516001600160a01b0390961686526001600160801b0319909416602086015284840192909252606084015215156080830152519081900360a00190f35b348015610ef857600080fd5b5061042160048036036020811015610f0f57600080fd5b5035612f0c565b348015610f2257600080fd5b50610baa612f1e565b348015610f3757600080fd5b50610920612f30565b348015610f4c57600080fd5b506108bb60048036036020811015610f6357600080fd5b5035612f48565b348015610f7657600080fd5b5061061460048036036080811015610f8d57600080fd5b506001600160a01b0381358116916020810135916001600160401b03604083013516916060013516613041565b348015610fc657600080fd5b50610a3960048036036020811015610fdd57600080fd5b503561332c565b348015610ff057600080fd5b5061092061334d565b34801561100557600080fd5b506105c86004803603602081101561101c57600080fd5b50356001600160a01b0316613365565b34801561103857600080fd5b506104216004803603602081101561104f57600080fd5b50356001600160a01b03166133a5565b34801561106b57600080fd5b506104216004803603604081101561108257600080fd5b506001600160a01b03813581169160200135166133b7565b3480156110a657600080fd5b506110dd600480360360408110156110bd57600080fd5b5080356001600160a01b031690602001356001600160801b0319166133e2565b6040805195865260208601949094526001600160401b03928316858501529116606084015215156080830152519081900360a00190f35b34801561112057600080fd5b506106146004803603606081101561113757600080fd5b5080359060208101356001600160401b031690604001356001600160a01b031661342f565b34801561116857600080fd5b5061119f6004803603604081101561117f57600080fd5b5080356001600160a01b031690602001356001600160801b0319166137d0565b604080519c8d5260208d019b909b528b8b01999099526001600160401b0397881660608c015295871660808b015293861660a08a01529190941660c088015260e08701939093526101008601929092526101208501919091526001600160a01b0316610140840152151561016083015251908190036101800190f35b34801561122757600080fd5b506107d16004803603602081101561123e57600080fd5b503561385c565b34801561125157600080fd5b506105c86004803603604081101561126857600080fd5b506001600160a01b038135169060200135613875565b34801561128a57600080fd5b5061067f600480360360608110156112a157600080fd5b506001600160a01b038135169060208101359060400135613896565b3480156112c957600080fd5b50610421600480360360208110156112e057600080fd5b50356001600160a01b0316613a00565b3480156112fc57600080fd5b506105c86004803603604081101561131357600080fd5b810190602081018135600160201b81111561132d57600080fd5b82018360208201111561133f57600080fd5b803590602001918460208302840111600160201b8311171561136057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156113af57600080fd5b8201836020820111156113c157600080fd5b803590602001918460208302840111600160201b831117156113e257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613a84945050505050565b600c5481565b600b54600160e01b900460ff1681565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156114bf5780601f10611494576101008083540402835291602001916114bf565b820191906000526020600020905b8154815290600101906020018083116114a257829003601f168201915b505050505090505b90565b60006114de6114d7613ad9565b8484613add565b5060015b92915050565b60008060008060006114f8615cb2565b506001600160a01b03871660009081526014602090815260408083206001600160801b03198a168452825291829020825160a08101845281548082526001830154938201939093526002909101546001600160401b03808216948301859052600160401b8204166060830152600160801b900460ff1615156080820152919650945061158381613b65565b6060820151608090920151969995985096506001600160401b0316949392505050565b601d546115be9083906001600160a01b031683613bed565b5050565b60055490565b6040805160028082526060808301845260009384938493909160208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061161257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061164057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab5346001853342611c20016040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156116f95781810151838201526020016116e1565b50505050905001955050505050506000604051808303818588803b15801561172057600080fd5b505af1158015611734573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561175e57600080fd5b8101908080516040519392919084600160201b82111561177d57600080fd5b90830190602082018581111561179257600080fd5b82518660208202830111600160201b821117156117ae57600080fd5b82525081516020918201928201910280838360005b838110156117db5781810151838201526020016117c3565b505050509050016040525050509050611809816001815181106117fa57fe5b6020026020010151888861342f565b94509450945050509250925092565b60606000808411801561184257506001600160a01b0385166000908152600e602052604090205484105b611864576001600160a01b0385166000908152600e6020526040902054611881565b6001600160a01b0385166000908152600e60205260409020548490035b90506000808411801561189357508382115b61189e5760006118a2565b8382035b905060008183036001600160401b03811180156118be57600080fd5b506040519080825280602002602001820160405280156118e8578160200160208202803683370190505b509350825b8281111561197a57600061190a896000198401600160f81b612e65565b6001600160a01b038a1660009081526012602090815260408083206001600160801b03198516845290915290206001015490915015611970578086848151811061195057fe5b6001600160801b0319909216602092830291909101909101526001909201915b50600019016118ed565b505050509392505050565b6000611992848484613d0f565b6119ea8461199e613ad9565b6001600160a01b03871660009081526001602052604081206119e5918791906119c5613ad9565b6001600160a01b0316815260208101919091526040016000205490613e45565b613add565b5060019392505050565b60045460ff1690565b600e6020526000908152604090205481565b600b54600160201b900463ffffffff1681565b6011602052600090815260409020805460019091015482565b60007f0000000000000000000000000000000000000000000000000000000000000000611a66613e5a565b1015611a73576000611a7b565b611a7b613e5e565b905090565b601b546001600160a01b03163314611a9757600080fd5b6001600160a01b038116600090815260116020526040902069021e19e0c9bab24000009055611ac4613e70565b6001600160a01b0390911660009081526011602052604090206001600160401b0391909116600190910155565b611b01611afc613e5e565b613e82565b6115be338383614251565b6001600160a01b0381166000908152600f602052604081205415611b63576001600160a01b0382166000908152600f6020526040902054611b5e908390611b54906001613e45565b600160f91b612e65565b6114e2565b600092915050565b60106020526000908152604090205481565b601b546001600160a01b031681565b611b97611afc613e5e565b565b600b54600160401b90046001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b03811660009081526010602052604081205415611b63576001600160a01b038216600090815260106020526040902054611b5e908390611c12906001613e45565b600360f81b612e65565b6000611c26615ce0565b506001600160a01b0383811660009081526012602090815260408083206001600160801b0319871684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600482015460e082015260058201546101008201526006820154610120820152600790910154918216610140820152600160a01b90910460ff161515610160820152611d05816145e0565b949350505050565b60196020526000908152604090208054600182015460029092015490919083565b6000806000600b60089054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d8157600080fd5b505afa158015611d95573d6000803e3d6000fd5b505050506040513d6060811015611dab57600080fd5b50805160208083015160409384015184516001600160701b03808616825283169381019390935263ffffffff811683860152935192965094509192507f17057eec9ed80c65db1c29e57a343df0e9f052cf0f5ec6e93bc084533ae9b8c99181900360600190a1600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600b60089054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7f57600080fd5b505afa158015611e93573d6000803e3d6000fd5b505050506040513d6020811015611ea957600080fd5b50516001600160a01b031614611ebf5782611ec1565b835b6001600160701b031690506000611ed66115c2565b15611efc57611ef7611ee66115c2565b611ef18460c8614641565b9061466f565b611eff565b60005b9050602881108015611f1b5750600b54600160e01b900460ff16155b15611f2857611f28614691565b603c81118015611f465750600b54600160e01b900460ff1615156001145b15611f5357611f536146a6565b600b5460408051600160e01b90920460ff1615158252517fbbf65e071e5468fb599b01ba3b914ae6065cf10ad084e0efe2133f7eaa8979bd916020908290030190a15050505050565b600080600080600080600080611fb0615cb2565b506001600160a01b03808b1660009081526013602090815260408083206001600160801b0319808f16855290835292819020815160a08101835281549095168086526001820154608090811b909516938601849052600282015492860192909252600381015460608601526004015460ff1615159284018390529a5098509450612038615ce0565b506001600160a01b0389811660009081526012602090815260408083206001600160801b03198d1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600482015460e0820152600582015461010082015260068201546101208201819052600790920154928316610140820152600160a01b90920460ff161515610160830152975061212e8161212081856146b5565b6121298461473a565b61476a565b9650806101600151945061214181614798565b925061214c816145e0565b935050509295985092959890939650565b601c546001600160a01b031681565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114bf5780601f10611494576101008083540402835291602001916114bf565b60006121da611afc613e5e565b6121e2615ce0565b60006121ee33856147b1565b6040805161018081018252835480825260018501546020830181905260028601549383019390935260038501546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600485015460e08301526005850154610100830152600685015461012083018190526007909501546001600160a01b038116610140840152600160a01b900460ff1615156101608301529095509193506122b1929091906149fc565b6122cc8260a001516001600160401b03168360000151614a59565b6122e88260a001516001600160401b0316836101200151614b0c565b61230a82610140015183610100015184606001516001600160401b0316614bbf565b6123188260c0015182614c64565b6123588183602001511161232d576000612335565b818360200151035b836040015184610140015185608001516001600160401b03168660000151614caa565b8161014001516001600160a01b0316336001600160a01b0316856001600160801b0319167f8cc66e48ebd8c008b36e03ee2f7c3f60a313a34a5bf1f3cb988a7936cd47f0d48560200151866000015187610120015188604001518960c001518960405180878152602001868152602001858152602001848152602001836001600160401b03168152602001828152602001965050505050505060405180910390a4506040015192915050565b6000806000806000612417611afc613e5e565b3360009081526012602090815260408083206001600160801b03198b168452909152902060070154600160a01b900460ff1661245257600080fd5b61245a615ce0565b503360009081526012602090815260408083206001600160801b03198b1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c0830152600483015460e0830152600583015461010083015260068301546101208301526007909201546001600160a01b038116610140830152600160a01b900460ff1615156101608201529087166125425761253d81614d58565b61255e565b61255e876001600160401b031661255883614d8e565b90614db7565b95508060a001516001600160401b0316861161257a5785612583565b61258381614d58565b955061259c816000015161259683614d8e565b88614dc9565b94506125a7816145e0565b61264a576125b481614e0f565b93506125c7858533600660020154614e68565b81519093506125d69084613e45565b815260a08101516125f0906001600160401b031684614a59565b6101208101511561263e5761260d85856000600660020154614e68565b6101208201519092506126209083613e45565b61012082015260a081015161263e906001600160401b031683614b0c565b61264a600084846149fc565b61267181602001518683610140015184608001516001600160401b03168560000151614caa565b60e081018681523360008181526012602090815260408083206001600160801b03198e168452825291829020855181559085015160018201559084015160028201556060840151600382018054608087015160a088015160c089015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b93909116929092029190911790559151600483015561010083015160058301556101208301516006830155610140830151600790920180546101608501516001600160a01b03199091166001600160a01b039094169390931760ff60a01b1916600160a01b93151593909302929092179091556127aa9086614ea7565b336001600160801b031989167f7b5d0995432c9ea1c8033b358af591013d0deff8dec5f4ae49612eba8bfafc0c878987876127e3613e5e565b6040805195865260208601949094528484019290925260608401526001600160401b03166080830152519081900360a00190a3509295509295909350565b604080516364e329cb60e11b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201523060248201529051735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163c9c653969160448083019260209291908290030181600087803b15801561288e57600080fd5b505af11580156128a2573d6000803e3d6000fd5b505050506040513d60208110156128b857600080fd5b5051600b80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6000806000806000806000806000806000612904615ce0565b601260008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160801b0319166001600160801b0319168152602001908152602001600020604051806101800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016007820160149054906101000a900460ff161515151581525050905080606001516001600160401b03169b5080608001516001600160401b03169a508060a001516001600160401b031699508060c001516001600160401b031698508060e0015197508060200151965080600001519550612afc81614f8b565b9450612b0781614faa565b93508061016001519250612b1a816145e0565b9150509295989b509295989b9093969950565b6000612b3a611afc613e5e565b612b42615cb2565b503360009081526014602090815260408083206001600160801b031986168452825291829020825160a08101845281548152600182015492810192909252600201546001600160401b0380821693830193909352600160401b81049092166060820152600160801b90910460ff16151560808201819052612bc257600080fd5b60006080820152612bd1613e5e565b6001600160401b03166060820152612be881613b65565b60208201819052612bfa903390614ea7565b600b548151612c1b91600160401b90046001600160a01b0316903390613bed565b3360009081526014602090815260408083206001600160801b0319969096168352948152908490208251815590820151600182018190559382015160029091018054606084015160809094015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b93909416929092029290921760ff60801b1916600160801b911515919091021790555090565b60006114de612cc7613ad9565b8484613d0f565b6000816001600160401b0316118015612cff5750612cea613e5e565b6001600160401b0316816001600160401b0316105b612d0857600080fd5b6009546001600160401b03821611612d1f57600080fd5b612d2881613e82565b50565b6001600160a01b0381166000908152600e602052604081205415611b63576001600160a01b0382166000908152600e6020526040902054611b5e908390612d73906001613e45565b600160f81b612e65565b6000805b6001600160a01b0383166000908152600e60205260409020548111612e08576000612db5846000198401600160f81b612e65565b6001600160a01b03851660009081526012602090815260408083206001600160801b031985168452909152902060070154909150600160a01b900460ff1615612dff576001909201915b50600101612d81565b50919050565b600b5463ffffffff1681565b601d546001600160a01b031681565b739c306cad86550ec80d77668c0a8bee6eb34684b681565b60176020526000908152604090205481565b60166020526000908152604090205481565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152603482018590526001600160f81b0319841660548301528251603581840301815260559092019092528051910120600090611d05906114c7565b6013602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401546001600160a01b039093169360809290921b9290919060ff1685565b60156020526000908152604090205481565b600654600754600854600954600a5485565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6000612f55611afc613e5e565b600b54612f7490600160401b90046001600160a01b0316333085614fd1565b612f7c615cb2565b612f85336150fc565b9150612f8f613e70565b6001600160401b039081166040808401918252858452600160808501818152336000818152601460209081528582206001600160801b03198b1683528152949020875181559387015192840192909255925160029092018054606087015194511515600160801b0260ff60801b19958716600160401b0267ffffffffffffffff60401b199590971667ffffffffffffffff199092169190911793909316949094179290921617909155612e0890615125565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516000918291829188916001600160a01b038316916323b872dd91606480830192602092919082900301818887803b15801561309e57600080fd5b505af11580156130b2573d6000803e3d6000fd5b505050506040513d60208110156130c857600080fd5b50506040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810189905290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b15801561312d57600080fd5b505af1158015613141573d6000803e3d6000fd5b505050506040513d602081101561315757600080fd5b50606090506131668930615145565b90506060737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398a6001853342611c20016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156132075781810151838201526020016131ef565b505050509050019650505050505050600060405180830381600087803b15801561323057600080fd5b505af1158015613244573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561326d57600080fd5b8101908080516040519392919084600160201b82111561328c57600080fd5b9083019060208201858111156132a157600080fd5b82518660208202830111600160201b821117156132bd57600080fd5b82525081516020918201928201910280838360005b838110156132ea5781810151838201526020016132d2565b5050505090500160405250505090506133188160028151811061330957fe5b6020026020010151898961342f565b9550955095505050505b9450945094915050565b60186020526000908152604090208054600182015460029092015490919083565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b601c546001600160a01b0316331461337c57600080fd5b601b80546001600160a01b039092166001600160a01b0319928316179055601c80549091169055565b600f6020526000908152604090205481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60146020908152600092835260408084209091529082529020805460018201546002909201549091906001600160401b0380821691600160401b810490911690600160801b900460ff1685565b600080600061343f611afc613e5e565b336001600160a01b0385161480159061345c575061345c8461520b565b61346557600080fd5b60016001600160401b0386161080159061348a5750613be26001600160401b03861611155b61349357600080fd5b620f42408610156134a357600080fd5b6134ab615ce0565b6000806134ba338a8a8a615216565b6001600160401b0316925092509250600083610120015111156135b1576134df615cb2565b3381526001600160801b031983166020820152600160808201526135028861530a565b6001600160a01b0389811660009081526013602090815260408083206001600160801b0319868116855290835292819020865181546001600160a01b031916951694909417845590850151600184018054909316608091821c179092558401516002830155606084015160038301558301516004909101805460ff1916911515919091179055945061359388615333565b6135af8460a001516001600160401b0316856101200151615353565b505b3360008181526012602090815260408083206001600160801b031987168452825291829020865181559086015160018201559085015160028201556060850151600382018054608088015160a089015160c08a015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b939091169290920291909117905560e0850151600482015561010085015160058201556101208501516006820155610140850151600790910180546101608701516001600160a01b03199091166001600160a01b039093169290921760ff60a01b1916600160a01b921515929092029190911790556136e490615382565b6136fc836020015184600001518561012001516153a2565b6137178360a001516001600160401b031684600001516153d5565b866001600160a01b0316336001600160a01b0316836001600160801b0319167f6619c8f19b39bf3558af16516f9ca110fcac4a7ab6d846d1b02a17b11f703a338660200151876000015188610120015189606001518a608001518b610100015160405180878152602001868152602001858152602001846001600160401b03168152602001836001600160401b03168152602001828152602001965050505050505060405180910390a490945092505093509350939050565b6012602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007909701549596949593946001600160401b0380851695600160401b8604821695600160801b8104831695600160c01b909104909216939192906001600160a01b03811690600160a01b900460ff168c565b601a602052600090815260409020805460019091015482565b601b546001600160a01b0316331461388c57600080fd5b6115be8282614ea7565b6060600080841180156138c057506001600160a01b0385166000908152600f602052604090205484105b6138e2576001600160a01b0385166000908152600f60205260409020546138ff565b6001600160a01b0385166000908152600f60205260409020548490035b90506000808411801561391157508382115b61391c576000613920565b8382035b905060008183036001600160401b038111801561393c57600080fd5b50604051908082528060200260200182016040528015613966578160200160208202803683370190505b509350825b8281111561197a576000613988896000198401600160f91b612e65565b6001600160a01b03808b1660009081526013602090815260408083206001600160801b0319861684529091529020549192506139c49116615404565b156139f657808684815181106139d657fe5b6001600160801b0319909216602092830291909101909101526001909201915b506000190161396b565b6000805b6001600160a01b0383166000908152600f60205260409020548111612e08576000613a38846000198401600160f91b612e65565b6001600160a01b03851660009081526013602090815260408083206001600160801b03198516845290915290206004015490915060ff1615613a7b576001909201915b50600101613a04565b613a8f611afc613e5e565b60005b8251811015613ad457613acc33848381518110613aab57fe5b6020026020010151848481518110613abf57fe5b6020026020010151614251565b600101613a92565b505050565b3390565b6001600160a01b038316613af057600080fd5b6001600160a01b038216613b0357600080fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008061072161ffff168360400151016001600160401b0316905060008160066003015410613b945781613b98565b6009545b60408501519091506001600160401b03165b81811015613be5576000818152601a60205260409020600101548551670de0b6b3a76400000281613bd757fe5b049390930192600101613baa565b505050919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310613c6a5780518252601f199092019160209182019101613c4b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ccc576040519150601f19603f3d011682016040523d82523d6000602084013e613cd1565b606091505b5091509150818015613cff575080511580613cff5750808060200190516020811015613cfc57600080fd5b50515b613d0857600080fd5b5050505050565b6001600160a01b038316613d545760405162461bcd60e51b8152600401808060200182810382526025815260200180615e9a6025913960400191505060405180910390fd5b6001600160a01b038216613d995760405162461bcd60e51b8152600401808060200182810382526023815260200180615e566023913960400191505060405180910390fd5b6001600160a01b038316600090815260208190526040902054613dbc9082613e45565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613deb9082614db7565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115613e5457600080fd5b50900390565b4290565b6000611a7b613e6b613e5a565b615412565b6000613e7a613e5e565b600101905090565b613e8a611d2e565b600654600954600091905b836001600160401b031681101561424b576000198101600090815260186020908152604080832060020154848452601590925290912054019250613ed7615d70565b50600081815260186020908152604091829020825160608101845281548152600190910154918101919091529081018490526007548410613f19576000613f20565b6007548490035b8152613fdf613fcb84613f316115c2565b60008681526017602090815260409182902054600b5483516330550a4b60e01b815263ffffffff909116600482015292519092739c306cad86550ec80d77668c0a8bee6eb34684b6926330550a4b92602480840193829003018186803b158015613f9a57600080fd5b505afa158015613fae573d6000803e3d6000fd5b505050506040513d6020811015613fc457600080fd5b5051615443565b8251611ef190670de0b6b3a7640000614641565b6020808301918252600084815260188252604080822085518155935160018501558085015160029485015560001986018252601983528082209093015485825260169092529190912054019350614034615d70565b5060008281526019602090815260409182902082516060810184528154815260019091015491810191909152908101859052600a54851061407657600061407d565b600a548590035b8152614093613fcb8561408e6115c2565b615460565b60208083019182526000858152601990915260409081902083518155915160018301558201516002909101556140c7615d91565b506000838152601a6020908152604091829020825180840184528154815260019091015481830152600b5483516370a0823160e01b815230600482015293519193600160401b9091046001600160a01b0316926370a0823192602480840193829003018186803b15801561413a57600080fd5b505afa15801561414e573d6000803e3d6000fd5b505050506040513d602081101561416457600080fd5b50518152614208613fcb866141776115c2565b600b54604080516330550a4b60e01b8152600160201b90920463ffffffff16600483015251739c306cad86550ec80d77668c0a8bee6eb34684b6916330550a4b916024808301926020929190829003018186803b1580156141d757600080fd5b505afa1580156141eb573d6000803e3d6000fd5b505050506040513d602081101561420157600080fd5b505161546f565b60208083019182526000868152601a90915260409020825181559051600190910155614232615480565b5050600980546001908101909155919091019050613e95565b50505050565b614259615cb2565b506001600160a01b0380841660009081526013602090815260408083206001600160801b0319808816855290835292819020815160a08101835281549095168552600180820154608090811b90951693860193909352600281015491850191909152600381015460608501526004015460ff161515918301829052146142de57600080fd5b805160208201516142ed615ce0565b506001600160a01b0382811660009081526012602090815260408083206001600160801b03198616845282528083208151610180810183528154815260018201549381019390935260028101549183019190915260038101546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600481015460e08301526005810154610100830152600681015461012083015260070154928316610140820152600160a01b90920460ff1615156101608301526143ca82866146b5565b905060006143d78361473a565b90506143e283614798565b15614436576000871180156143ff57506143fc8282615567565b87105b156144295760608601516144139088614db7565b60608701526144228288614db7565b9050614431565b600060808701525b614474565b61445082614442613e5e565b6001600160401b0316615567565b60608701519097506144629088614db7565b60608701526144718288614db7565b90505b600061448184848461476a565b60408801519091506144939082614db7565b87604001818152505086601360008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b031916815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b03021916908360801c0217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555090505061457c8a82614ea7565b604080516001600160801b03198b811682526020820184905282516001600160a01b03808f1694928a1693908b16927f5d13067bdc9e4d510839580df1e932220b31fb2bc7790b5bd35aae14f0303bed92918290030190a450505050505050505050565b6000808260c001516001600160401b03161161461c576145fe613e5e565b6001600160401b03168260a001516001600160401b031611156114e2565b8160c001516001600160401b03168260a001516001600160401b031611159050919050565b600082614650575060006114e2565b8282028284828161465d57fe5b041461466857600080fd5b9392505050565b600080821161467d57600080fd5b600082848161468857fe5b04949350505050565b600b805460ff60e01b1916600160e01b179055565b600b805460ff60e01b19169055565b6000614668826060015184606001516001600160401b0316601160008761014001516001600160a01b03166001600160a01b0316815260200190815260200160002060010154116147135784606001516001600160401b0316612558565b6101408501516001600160a01b031660009081526011602052604090206001015490614db7565b6000808260c001516001600160401b03161161475957611b5e82614d58565b5060c001516001600160401b031690565b600061477a846101400151615588565b61478e576147898484846155a7565b611d05565b5060009392505050565b61016081015160009015806114e257506114e2826145e0565b6001600160a01b03821660009081526012602090815260408083206001600160801b0319851684529091528120600701548190600160a01b900460ff166147f757600080fd5b6001600160a01b03841660009081526012602090815260408083206001600160801b0319871684529091529020915061482e613e5e565b6003830180546001600160c01b0316600160c01b6001600160401b0393841681029190911791829055604080516101808101825286548152600187015460208201526002870154918101919091528284166060820152600160401b830484166080820152600160801b8304841660a0820152910490911660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526148fa906155e6565b60028301819055604080516101808101825284548152600185015460208201529081019190915260038301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526149b090614faa565b60078301805460ff60a01b1916905560018301549091506149e790859083106149da5760006149e2565b828460010154035b614ea7565b6149f5848360020154614ea7565b9250929050565b6006548310614a0c576000614a13565b6006548390035b6006556007548210614a26576000614a2d565b6007548290035b6007558015614a5157600a548110614a46576000614a4d565b600a548190035b600a555b613ad4615607565b614a628261565e565b15614aaa576000828152601560205260409020548110614a83576000614a96565b6000828152601560205260409020548190035b6000838152601560205260409020556115be565b6000614ab461567a565b6001600160401b03166000818152601860205260409020600201549091508210614adf576000614af5565b6000818152601860205260409020600201548290035b600091825260186020526040909120600201555050565b614b158261565e565b15614b5d576000828152601660205260409020548110614b36576000614b49565b6000828152601660205260409020548190035b6000838152601660205260409020556115be565b6000614b6761567a565b6001600160401b03166000818152601960205260409020600201549091508210614b92576000614ba8565b6000818152601960205260409020600201548290035b600091825260196020526040909120600201555050565b614bc88161568c565b158015614bd95750614bd983615404565b15613ad4576001600160a01b0383166000908152601160205260409020548210614c04576000614c21565b6001600160a01b0383166000908152601160205260409020548290035b6001600160a01b038416600090815260116020526040902055614c43836156a8565b6001600160a01b038416600090815260116020526040902060010155505050565b80156115be576001600160401b038216600090815260176020526040902054614c8d9082614db7565b6001600160401b0383166000908152601760205260409020555050565b600081118015614cca57506041614cbf613e5e565b6001600160401b0316115b15614d2c576000614cde86868486886156c0565b600854909150811115614d2657600854614d0090606490611ef190606e614641565b8110614d2057600854614d1b90606490611ef190606e614641565b614d22565b805b6008555b50613d08565b6041614d36613e5e565b6001600160401b03161415613d0857670186cc6acd4b00006008555050505050565b60006006600301548260a001516001600160401b031611614d86578160a001516001600160401b03166114e2565b505060095490565b60008160e00151600014614da6578160e001516114e2565b50606001516001600160401b031690565b60008282018381101561466857600080fd5b6000825b82811015614e0757600081815260186020526040902060010154670de0b6b3a7640000860281614df957fe5b049190910190600101614dcd565b509392505050565b61016081015160009015614e4457611b5e614e28613e5e565b6001600160401b03168360a001516001600160401b0316615567565b6114e28260c001516001600160401b03168360a001516001600160401b0316615567565b6000614e7383615404565b614e8d57614e888585846402540be40061571d565b614e9e565b614e9e85858464028fa6ae0061571d565b95945050505050565b6001600160a01b038216614f02576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554614f0f9082614db7565b6005556001600160a01b038216600090815260208190526040902054614f359082614db7565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000816101600151614fa15781604001516114e2565b6114e28261573f565b6000614fb582615757565b80614fc45750614fc4826145e0565b611b6357611b5e826157b6565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106150565780518252601f199092019160209182019101615037565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146150b8576040519150601f19603f3d011682016040523d82523d6000602084013e6150bd565b606091505b50915091508180156150eb5750805115806150eb57508080602001905160208110156150e857600080fd5b50515b6150f457600080fd5b505050505050565b6001600160a01b0381166000908152601060205260408120546114e2908390600360f81b612e65565b6001600160a01b0316600090815260106020526040902080546001019055565b60408051600380825260808201909252606091602082018380368337019050509050828160008151811061517557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106151b757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081816002815181106151e557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b3b63ffffffff161590565b61521e615ce0565b60008061522b87876157ec565b615233613e70565b905061523e876158c2565b6001600160401b0380871660808601819052838216606087015283880190911660a0860152600161016086015260208501889052600854919350615286918891908790614e68565b83526152906158eb565b506020830151600c546152b091670de0b6b3a764000091611ef191614641565b6101008401526152bf84615404565b15613322576001600160a01b03841661014084018190526101008401516152e69190615ada565b6152fa86866001600160401b031686615b42565b6101208401529450945094915050565b6001600160a01b0381166000908152600f60205260408120546114e2908390600160f91b612e65565b6001600160a01b03166000908152600f6020526040902080546001019055565b60008281526016602052604090205461536c9082614db7565b6000928352601660205260409092209190915550565b6001600160a01b03166000908152600e6020526040902080546001019055565b6006546153af9084614db7565b6006556007546153bf9083614db7565b6007558015614a5157600a54614a4d9082614db7565b6000828152601560205260409020546153ee9082614db7565b6000928352601560205260409092209190915550565b6001600160a01b0316151590565b6000620151807f000000000000000000000000000000000000000000000000000000000000000083035b0492915050565b60008282858701612710028161545557fe5b040195945050505050565b6315dd2ecd9101612710020490565b600081838501612710028161468857fe5b600b54600160e01b900460ff16151560011480156154b05750600b5462019258600160201b90910463ffffffff16105b156154fa57600b805463ffffffff1967ffffffff00000000198216600160201b9283900463ffffffff90811660060181169093021790811690821660051901909116179055611b97565b600b54600160e01b900460ff161580156155205750600b546201925863ffffffff909116105b15611b9757600b805467ffffffff000000001963ffffffff19821663ffffffff928316600601831617908116600160201b9182900483166005190190921602179055611b97565b600081831161557f5761557a8284613e45565b614668565b50600092915050565b6001600160a01b03166000908152601160205260409020600101541590565b6000825b82811015614e07576000818152601960205260409020600101548551670de0b6b3a764000002816155d857fe5b0491909101906001016155ab565b60006114e282600001516155f984614d8e565b61560285614d58565b614dc9565b600954600754600654600854600a54604080519485526020850193909352838301919091526060830152517fea8ce1d041020595d75f4f48ba3378787b84e61d101465836fa54f1b338a4db59181900360800190a2565b6000615668613e5e565b6001600160401b031690911015919050565b60006001615686613e5e565b03905090565b6000615696613e5e565b6001600160401b031690911115919050565b60006156b382615b73565b611b6357611b5e82615b9a565b6000806156f2846156d085615404565b6156df576402540be4006156e6565b64028fa6ae005b64ffffffffff16615bef565b905061571285611ef16305f5e10061570c85818d8d614db7565b90614641565b979650505050505050565b6000614e9e6402540be400611ef16157358786615bef565b61570c8988615c39565b600061574a82615757565b611b6357611b5e826155e6565b6000808260c001516001600160401b03161161579257615775613e5e565b6001600160401b031682606001516001600160401b0316116114e2565b8160c001516001600160401b031682606001516001600160401b0316119050919050565b60006103e86157c483615c51565b60016157cf85614e0f565b0361032002816157db57fe5b046064018360200151028161543c57fe5b6001600160a01b0382166158315760405162461bcd60e51b8152600401808060200182810382526021815260200180615e796021913960400191505060405180910390fd5b6001600160a01b0382166000908152602081905260409020546158549082613e45565b6001600160a01b03831660009081526020819052604090205560055461587a9082613e45565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b0381166000908152600e60205260408120546114e2908390600160f81b612e65565b6040805163d06ca61f60e01b8152670de0b6b3a76400006004820181815260248301938452600d805460448501819052600095737a250d5630b4cf539739df2c5dacb4c659f2488d9563d06ca61f9594926064909101908490801561597957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161595b575b5050935050505060006040518083038186803b15801561599857600080fd5b505afa925050508015615a5857506040513d6000823e601f3d908101601f1916820160405260208110156159cb57600080fd5b8101908080516040519392919084600160201b8211156159ea57600080fd5b9083019060208201858111156159ff57600080fd5b82518660208202830111600160201b82111715615a1b57600080fd5b82525081516020918201928201910280838360005b83811015615a48578181015183820152602001615a30565b5050505090500160405250505060015b615ab457615a64615db1565b80615a6f5750615a79565b5050600c546114c7565b3d808015615aa3576040519150601f19603f3d011682016040523d82523d6000602084013e615aa8565b606091505b50600c549150506114c7565b80600281518110615ac157fe5b6020026020010151600c81905550600c549150506114c7565b6001600160a01b038216600090815260116020526040902054615afd9082614db7565b6001600160a01b038316600090815260116020526040902055615b1f826156a8565b6001600160a01b0390921660009081526011602052604090206001019190915550565b6000615b4d82615588565b80615b59575061016d83105b61478e5761478984846006600201546402540be40061571d565b6001600160a01b031660009081526011602052604090205469021e19e0c9bab24000001190565b6001600160a01b038116600090815260116020526040812060010154615bd057615bc2613e5e565b6001600160401b03166114e2565b506001600160a01b031660009081526011602052604090206001015490565b600081615c1c6107218511615c05576000615c0c565b6107201985015b660150b9a52b11286134c1615c87565b615c30856630aad4df397abe610721615c87565b01019392505050565b600061466882611ef185670de0b6b3a7640000614641565b6000600182608001516001600160401b031611615c6f576001615c78565b60018260800151035b6001600160401b031692915050565b6000611d056402540be400838611615ca857615ca38686614641565b611ef1565b611ef18486614641565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180610180016040528060008152602001600081526020016000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b60405180606001604052806000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b60e01c90565b600060443d1015615dc1576114c7565b600481823e6308c379a0615dd58251615dab565b14615ddf576114c7565b6040513d600319016004823e80513d6001600160401b038160248401118184111715615e0e57505050506114c7565b82840192508251915080821115615e2857505050506114c7565b503d83016020828401011115615e40575050506114c7565b601f01601f191681016020016040529150509056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373a26469706673582212204aa899dc8e12f409e25fd25517776a96df8b7355aeff60acb53b551cc3ab286d64736f6c63430007050033

Deployed Bytecode

0x6080604052600436106103c65760003560e01c80639e78fb4f116101f2578063c74c0fac1161010d578063df0618d2116100a0578063e742806a1161006f578063e742806a14611245578063e7881cda1461127e578063fad99ddc146112bd578063fc527bf5146112f057610407565b8063df0618d21461109a578063df2d02b114611114578063e1d033e91461115c578063e3073bfb1461121b57610407565b8063d8264920116100dc578063d826492014610fe4578063d8d44a2914610ff9578063db74559b1461102c578063dd62ed3e1461105f57610407565b8063c74c0fac14610f2b578063ce8f9f0014610f40578063d1cf909814610f6a578063d6565a2d14610fba57610407565b8063b429c8d311610185578063bf58f6d211610154578063bf58f6d214610e20578063c172628e14610e69578063c23d656414610eec578063c312452514610f1657610407565b8063b429c8d314610da2578063b543c4ba14610db7578063bba85e1f14610dcc578063be21ff7014610df657610407565b8063a91b19f2116101c1578063a91b19f214610cf4578063ae3d1de214610d27578063b0cb69f114610d5a578063b381a81114610d8d57610407565b80639e78fb4f14610bd5578063a4ed055014610bea578063a50af89514610c87578063a9059cbb14610cbb57610407565b80634f47b16d116102e2578063779e2e18116102755780638a263060116102445780638a26306014610b0957806395d89b4114610b1e57806399c2def414610b335780639b57ab1214610b6757610407565b8063779e2e18146109cc5780638649102b14610a0f57806387da627414610a5757806389201d4e14610a6c57610407565b8063613fc9fd116102b1578063613fc9fd1461093c5780636ba631cf1461095157806370a082311461096657806375c3fa4f1461099957610407565b80634f47b16d1461084e5780635b20238714610888578063601f37ac146108d857806360e4c6511461090b57610407565b806323672d8a1161035a5780633697e979116103295780633697e979146107705780633b58afe71461079e57806348e4ccab146107ea5780634dfc7a031461081b57610407565b806323672d8a1461064057806323b872dd146106cf578063313ce5671461071257806333060d901461073d57610407565b80631074859211610396578063107485921461051f578063127565e41461058f57806318160ddd146105ca5780631c0b37e1146105df57610407565b80625ada7f1461040c57806302cbb2661461043357806306fdde031461045c578063095ea7b3146104e657610407565b3661040757601d546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015610404573d6000803e3d6000fd5b50005b600080fd5b34801561041857600080fd5b50610421611420565b60408051918252519081900360200190f35b34801561043f57600080fd5b50610448611426565b604080519115158252519081900360200190f35b34801561046857600080fd5b50610471611436565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104ab578181015183820152602001610493565b50505050905090810190601f1680156104d85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104f257600080fd5b506104486004803603604081101561050957600080fd5b506001600160a01b0381351690602001356114ca565b34801561052b57600080fd5b506105626004803603604081101561054257600080fd5b5080356001600160a01b031690602001356001600160801b0319166114e8565b60408051958652602086019490945284840192909252606084015215156080830152519081900360a00190f35b34801561059b57600080fd5b506105c8600480360360408110156105b257600080fd5b506001600160a01b0381351690602001356115a6565b005b3480156105d657600080fd5b506104216115c2565b610614600480360360408110156105f557600080fd5b5080356001600160401b031690602001356001600160a01b03166115c8565b604080516001600160801b03199485168152602081019390935292168183015290519081900360600190f35b34801561064c57600080fd5b5061067f6004803603606081101561066357600080fd5b506001600160a01b038135169060208101359060400135611818565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106bb5781810151838201526020016106a3565b505050509050019250505060405180910390f35b3480156106db57600080fd5b50610448600480360360608110156106f257600080fd5b506001600160a01b03813581169160208101359091169060400135611985565b34801561071e57600080fd5b506107276119f4565b6040805160ff9092168252519081900360200190f35b34801561074957600080fd5b506104216004803603602081101561076057600080fd5b50356001600160a01b03166119fd565b34801561077c57600080fd5b50610785611a0f565b6040805163ffffffff9092168252519081900360200190f35b3480156107aa57600080fd5b506107d1600480360360208110156107c157600080fd5b50356001600160a01b0316611a22565b6040805192835260208301919091528051918290030190f35b3480156107f657600080fd5b506107ff611a3b565b604080516001600160401b039092168252519081900360200190f35b34801561082757600080fd5b506105c86004803603602081101561083e57600080fd5b50356001600160a01b0316611a80565b34801561085a57600080fd5b506105c86004803603604081101561087157600080fd5b506001600160801b03198135169060200135611af1565b34801561089457600080fd5b506108bb600480360360208110156108ab57600080fd5b50356001600160a01b0316611b0c565b604080516001600160801b03199092168252519081900360200190f35b3480156108e457600080fd5b50610421600480360360208110156108fb57600080fd5b50356001600160a01b0316611b6b565b34801561091757600080fd5b50610920611b7d565b604080516001600160a01b039092168252519081900360200190f35b34801561094857600080fd5b506105c8611b8c565b34801561095d57600080fd5b50610920611b99565b34801561097257600080fd5b506104216004803603602081101561098957600080fd5b50356001600160a01b0316611baf565b3480156109a557600080fd5b506108bb600480360360208110156109bc57600080fd5b50356001600160a01b0316611bca565b3480156109d857600080fd5b50610448600480360360408110156109ef57600080fd5b5080356001600160a01b031690602001356001600160801b031916611c1c565b348015610a1b57600080fd5b50610a3960048036036020811015610a3257600080fd5b5035611d0d565b60408051938452602084019290925282820152519081900360600190f35b348015610a6357600080fd5b506105c8611d2e565b348015610a7857600080fd5b50610aaf60048036036040811015610a8f57600080fd5b5080356001600160a01b031690602001356001600160801b031916611f9c565b604080516001600160a01b0390991689526001600160801b031990971660208901528787019590955260608701939093529015156080860152151560a0850152151560c0840152151560e083015251908190036101000190f35b348015610b1557600080fd5b5061092061215d565b348015610b2a57600080fd5b5061047161216c565b348015610b3f57600080fd5b5061042160048036036020811015610b5657600080fd5b50356001600160801b0319166121cd565b348015610b7357600080fd5b50610baa60048036036040811015610b8a57600080fd5b5080356001600160801b03191690602001356001600160401b0316612404565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610be157600080fd5b506105c8612821565b348015610bf657600080fd5b50610c2d60048036036040811015610c0d57600080fd5b5080356001600160a01b031690602001356001600160801b0319166128eb565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501521515610120840152151561014083015251908190036101600190f35b348015610c9357600080fd5b5061042160048036036020811015610caa57600080fd5b50356001600160801b031916612b2d565b348015610cc757600080fd5b5061044860048036036040811015610cde57600080fd5b506001600160a01b038135169060200135612cba565b348015610d0057600080fd5b506105c860048036036020811015610d1757600080fd5b50356001600160401b0316612cce565b348015610d3357600080fd5b506108bb60048036036020811015610d4a57600080fd5b50356001600160a01b0316612d2b565b348015610d6657600080fd5b5061042160048036036020811015610d7d57600080fd5b50356001600160a01b0316612d7d565b348015610d9957600080fd5b50610785612e0e565b348015610dae57600080fd5b50610920612e1a565b348015610dc357600080fd5b50610920612e29565b348015610dd857600080fd5b5061042160048036036020811015610def57600080fd5b5035612e41565b348015610e0257600080fd5b5061042160048036036020811015610e1957600080fd5b5035612e53565b348015610e2c57600080fd5b506108bb60048036036060811015610e4357600080fd5b5080356001600160a01b031690602081013590604001356001600160f81b031916612e65565b348015610e7557600080fd5b50610eac60048036036040811015610e8c57600080fd5b5080356001600160a01b031690602001356001600160801b031916612ec0565b604080516001600160a01b0390961686526001600160801b0319909416602086015284840192909252606084015215156080830152519081900360a00190f35b348015610ef857600080fd5b5061042160048036036020811015610f0f57600080fd5b5035612f0c565b348015610f2257600080fd5b50610baa612f1e565b348015610f3757600080fd5b50610920612f30565b348015610f4c57600080fd5b506108bb60048036036020811015610f6357600080fd5b5035612f48565b348015610f7657600080fd5b5061061460048036036080811015610f8d57600080fd5b506001600160a01b0381358116916020810135916001600160401b03604083013516916060013516613041565b348015610fc657600080fd5b50610a3960048036036020811015610fdd57600080fd5b503561332c565b348015610ff057600080fd5b5061092061334d565b34801561100557600080fd5b506105c86004803603602081101561101c57600080fd5b50356001600160a01b0316613365565b34801561103857600080fd5b506104216004803603602081101561104f57600080fd5b50356001600160a01b03166133a5565b34801561106b57600080fd5b506104216004803603604081101561108257600080fd5b506001600160a01b03813581169160200135166133b7565b3480156110a657600080fd5b506110dd600480360360408110156110bd57600080fd5b5080356001600160a01b031690602001356001600160801b0319166133e2565b6040805195865260208601949094526001600160401b03928316858501529116606084015215156080830152519081900360a00190f35b34801561112057600080fd5b506106146004803603606081101561113757600080fd5b5080359060208101356001600160401b031690604001356001600160a01b031661342f565b34801561116857600080fd5b5061119f6004803603604081101561117f57600080fd5b5080356001600160a01b031690602001356001600160801b0319166137d0565b604080519c8d5260208d019b909b528b8b01999099526001600160401b0397881660608c015295871660808b015293861660a08a01529190941660c088015260e08701939093526101008601929092526101208501919091526001600160a01b0316610140840152151561016083015251908190036101800190f35b34801561122757600080fd5b506107d16004803603602081101561123e57600080fd5b503561385c565b34801561125157600080fd5b506105c86004803603604081101561126857600080fd5b506001600160a01b038135169060200135613875565b34801561128a57600080fd5b5061067f600480360360608110156112a157600080fd5b506001600160a01b038135169060208101359060400135613896565b3480156112c957600080fd5b50610421600480360360208110156112e057600080fd5b50356001600160a01b0316613a00565b3480156112fc57600080fd5b506105c86004803603604081101561131357600080fd5b810190602081018135600160201b81111561132d57600080fd5b82018360208201111561133f57600080fd5b803590602001918460208302840111600160201b8311171561136057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156113af57600080fd5b8201836020820111156113c157600080fd5b803590602001918460208302840111600160201b831117156113e257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613a84945050505050565b600c5481565b600b54600160e01b900460ff1681565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156114bf5780601f10611494576101008083540402835291602001916114bf565b820191906000526020600020905b8154815290600101906020018083116114a257829003601f168201915b505050505090505b90565b60006114de6114d7613ad9565b8484613add565b5060015b92915050565b60008060008060006114f8615cb2565b506001600160a01b03871660009081526014602090815260408083206001600160801b03198a168452825291829020825160a08101845281548082526001830154938201939093526002909101546001600160401b03808216948301859052600160401b8204166060830152600160801b900460ff1615156080820152919650945061158381613b65565b6060820151608090920151969995985096506001600160401b0316949392505050565b601d546115be9083906001600160a01b031683613bed565b5050565b60055490565b6040805160028082526060808301845260009384938493909160208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061161257fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061164057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506060737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab5346001853342611c20016040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156116f95781810151838201526020016116e1565b50505050905001955050505050506000604051808303818588803b15801561172057600080fd5b505af1158015611734573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561175e57600080fd5b8101908080516040519392919084600160201b82111561177d57600080fd5b90830190602082018581111561179257600080fd5b82518660208202830111600160201b821117156117ae57600080fd5b82525081516020918201928201910280838360005b838110156117db5781810151838201526020016117c3565b505050509050016040525050509050611809816001815181106117fa57fe5b6020026020010151888861342f565b94509450945050509250925092565b60606000808411801561184257506001600160a01b0385166000908152600e602052604090205484105b611864576001600160a01b0385166000908152600e6020526040902054611881565b6001600160a01b0385166000908152600e60205260409020548490035b90506000808411801561189357508382115b61189e5760006118a2565b8382035b905060008183036001600160401b03811180156118be57600080fd5b506040519080825280602002602001820160405280156118e8578160200160208202803683370190505b509350825b8281111561197a57600061190a896000198401600160f81b612e65565b6001600160a01b038a1660009081526012602090815260408083206001600160801b03198516845290915290206001015490915015611970578086848151811061195057fe5b6001600160801b0319909216602092830291909101909101526001909201915b50600019016118ed565b505050509392505050565b6000611992848484613d0f565b6119ea8461199e613ad9565b6001600160a01b03871660009081526001602052604081206119e5918791906119c5613ad9565b6001600160a01b0316815260208101919091526040016000205490613e45565b613add565b5060019392505050565b60045460ff1690565b600e6020526000908152604090205481565b600b54600160201b900463ffffffff1681565b6011602052600090815260409020805460019091015482565b60007f000000000000000000000000000000000000000000000000000000005fa9d800611a66613e5a565b1015611a73576000611a7b565b611a7b613e5e565b905090565b601b546001600160a01b03163314611a9757600080fd5b6001600160a01b038116600090815260116020526040902069021e19e0c9bab24000009055611ac4613e70565b6001600160a01b0390911660009081526011602052604090206001600160401b0391909116600190910155565b611b01611afc613e5e565b613e82565b6115be338383614251565b6001600160a01b0381166000908152600f602052604081205415611b63576001600160a01b0382166000908152600f6020526040902054611b5e908390611b54906001613e45565b600160f91b612e65565b6114e2565b600092915050565b60106020526000908152604090205481565b601b546001600160a01b031681565b611b97611afc613e5e565b565b600b54600160401b90046001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b03811660009081526010602052604081205415611b63576001600160a01b038216600090815260106020526040902054611b5e908390611c12906001613e45565b600360f81b612e65565b6000611c26615ce0565b506001600160a01b0383811660009081526012602090815260408083206001600160801b0319871684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600482015460e082015260058201546101008201526006820154610120820152600790910154918216610140820152600160a01b90910460ff161515610160820152611d05816145e0565b949350505050565b60196020526000908152604090208054600182015460029092015490919083565b6000806000600b60089054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611d8157600080fd5b505afa158015611d95573d6000803e3d6000fd5b505050506040513d6060811015611dab57600080fd5b50805160208083015160409384015184516001600160701b03808616825283169381019390935263ffffffff811683860152935192965094509192507f17057eec9ed80c65db1c29e57a343df0e9f052cf0f5ec6e93bc084533ae9b8c99181900360600190a1600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600b60089054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7f57600080fd5b505afa158015611e93573d6000803e3d6000fd5b505050506040513d6020811015611ea957600080fd5b50516001600160a01b031614611ebf5782611ec1565b835b6001600160701b031690506000611ed66115c2565b15611efc57611ef7611ee66115c2565b611ef18460c8614641565b9061466f565b611eff565b60005b9050602881108015611f1b5750600b54600160e01b900460ff16155b15611f2857611f28614691565b603c81118015611f465750600b54600160e01b900460ff1615156001145b15611f5357611f536146a6565b600b5460408051600160e01b90920460ff1615158252517fbbf65e071e5468fb599b01ba3b914ae6065cf10ad084e0efe2133f7eaa8979bd916020908290030190a15050505050565b600080600080600080600080611fb0615cb2565b506001600160a01b03808b1660009081526013602090815260408083206001600160801b0319808f16855290835292819020815160a08101835281549095168086526001820154608090811b909516938601849052600282015492860192909252600381015460608601526004015460ff1615159284018390529a5098509450612038615ce0565b506001600160a01b0389811660009081526012602090815260408083206001600160801b03198d1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600482015460e0820152600582015461010082015260068201546101208201819052600790920154928316610140820152600160a01b90920460ff161515610160830152975061212e8161212081856146b5565b6121298461473a565b61476a565b9650806101600151945061214181614798565b925061214c816145e0565b935050509295985092959890939650565b601c546001600160a01b031681565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156114bf5780601f10611494576101008083540402835291602001916114bf565b60006121da611afc613e5e565b6121e2615ce0565b60006121ee33856147b1565b6040805161018081018252835480825260018501546020830181905260028601549383019390935260038501546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600485015460e08301526005850154610100830152600685015461012083018190526007909501546001600160a01b038116610140840152600160a01b900460ff1615156101608301529095509193506122b1929091906149fc565b6122cc8260a001516001600160401b03168360000151614a59565b6122e88260a001516001600160401b0316836101200151614b0c565b61230a82610140015183610100015184606001516001600160401b0316614bbf565b6123188260c0015182614c64565b6123588183602001511161232d576000612335565b818360200151035b836040015184610140015185608001516001600160401b03168660000151614caa565b8161014001516001600160a01b0316336001600160a01b0316856001600160801b0319167f8cc66e48ebd8c008b36e03ee2f7c3f60a313a34a5bf1f3cb988a7936cd47f0d48560200151866000015187610120015188604001518960c001518960405180878152602001868152602001858152602001848152602001836001600160401b03168152602001828152602001965050505050505060405180910390a4506040015192915050565b6000806000806000612417611afc613e5e565b3360009081526012602090815260408083206001600160801b03198b168452909152902060070154600160a01b900460ff1661245257600080fd5b61245a615ce0565b503360009081526012602090815260408083206001600160801b03198b1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c0830152600483015460e0830152600583015461010083015260068301546101208301526007909201546001600160a01b038116610140830152600160a01b900460ff1615156101608201529087166125425761253d81614d58565b61255e565b61255e876001600160401b031661255883614d8e565b90614db7565b95508060a001516001600160401b0316861161257a5785612583565b61258381614d58565b955061259c816000015161259683614d8e565b88614dc9565b94506125a7816145e0565b61264a576125b481614e0f565b93506125c7858533600660020154614e68565b81519093506125d69084613e45565b815260a08101516125f0906001600160401b031684614a59565b6101208101511561263e5761260d85856000600660020154614e68565b6101208201519092506126209083613e45565b61012082015260a081015161263e906001600160401b031683614b0c565b61264a600084846149fc565b61267181602001518683610140015184608001516001600160401b03168560000151614caa565b60e081018681523360008181526012602090815260408083206001600160801b03198e168452825291829020855181559085015160018201559084015160028201556060840151600382018054608087015160a088015160c089015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b93909116929092029190911790559151600483015561010083015160058301556101208301516006830155610140830151600790920180546101608501516001600160a01b03199091166001600160a01b039094169390931760ff60a01b1916600160a01b93151593909302929092179091556127aa9086614ea7565b336001600160801b031989167f7b5d0995432c9ea1c8033b358af591013d0deff8dec5f4ae49612eba8bfafc0c878987876127e3613e5e565b6040805195865260208601949094528484019290925260608401526001600160401b03166080830152519081900360a00190a3509295509295909350565b604080516364e329cb60e11b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201523060248201529051735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163c9c653969160448083019260209291908290030181600087803b15801561288e57600080fd5b505af11580156128a2573d6000803e3d6000fd5b505050506040513d60208110156128b857600080fd5b5051600b80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6000806000806000806000806000806000612904615ce0565b601260008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160801b0319166001600160801b0319168152602001908152602001600020604051806101800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016007820160149054906101000a900460ff161515151581525050905080606001516001600160401b03169b5080608001516001600160401b03169a508060a001516001600160401b031699508060c001516001600160401b031698508060e0015197508060200151965080600001519550612afc81614f8b565b9450612b0781614faa565b93508061016001519250612b1a816145e0565b9150509295989b509295989b9093969950565b6000612b3a611afc613e5e565b612b42615cb2565b503360009081526014602090815260408083206001600160801b031986168452825291829020825160a08101845281548152600182015492810192909252600201546001600160401b0380821693830193909352600160401b81049092166060820152600160801b90910460ff16151560808201819052612bc257600080fd5b60006080820152612bd1613e5e565b6001600160401b03166060820152612be881613b65565b60208201819052612bfa903390614ea7565b600b548151612c1b91600160401b90046001600160a01b0316903390613bed565b3360009081526014602090815260408083206001600160801b0319969096168352948152908490208251815590820151600182018190559382015160029091018054606084015160809094015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b93909416929092029290921760ff60801b1916600160801b911515919091021790555090565b60006114de612cc7613ad9565b8484613d0f565b6000816001600160401b0316118015612cff5750612cea613e5e565b6001600160401b0316816001600160401b0316105b612d0857600080fd5b6009546001600160401b03821611612d1f57600080fd5b612d2881613e82565b50565b6001600160a01b0381166000908152600e602052604081205415611b63576001600160a01b0382166000908152600e6020526040902054611b5e908390612d73906001613e45565b600160f81b612e65565b6000805b6001600160a01b0383166000908152600e60205260409020548111612e08576000612db5846000198401600160f81b612e65565b6001600160a01b03851660009081526012602090815260408083206001600160801b031985168452909152902060070154909150600160a01b900460ff1615612dff576001909201915b50600101612d81565b50919050565b600b5463ffffffff1681565b601d546001600160a01b031681565b739c306cad86550ec80d77668c0a8bee6eb34684b681565b60176020526000908152604090205481565b60166020526000908152604090205481565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152603482018590526001600160f81b0319841660548301528251603581840301815260559092019092528051910120600090611d05906114c7565b6013602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401546001600160a01b039093169360809290921b9290919060ff1685565b60156020526000908152604090205481565b600654600754600854600954600a5485565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6000612f55611afc613e5e565b600b54612f7490600160401b90046001600160a01b0316333085614fd1565b612f7c615cb2565b612f85336150fc565b9150612f8f613e70565b6001600160401b039081166040808401918252858452600160808501818152336000818152601460209081528582206001600160801b03198b1683528152949020875181559387015192840192909255925160029092018054606087015194511515600160801b0260ff60801b19958716600160401b0267ffffffffffffffff60401b199590971667ffffffffffffffff199092169190911793909316949094179290921617909155612e0890615125565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516000918291829188916001600160a01b038316916323b872dd91606480830192602092919082900301818887803b15801561309e57600080fd5b505af11580156130b2573d6000803e3d6000fd5b505050506040513d60208110156130c857600080fd5b50506040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810189905290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b15801561312d57600080fd5b505af1158015613141573d6000803e3d6000fd5b505050506040513d602081101561315757600080fd5b50606090506131668930615145565b90506060737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398a6001853342611c20016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156132075781810151838201526020016131ef565b505050509050019650505050505050600060405180830381600087803b15801561323057600080fd5b505af1158015613244573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561326d57600080fd5b8101908080516040519392919084600160201b82111561328c57600080fd5b9083019060208201858111156132a157600080fd5b82518660208202830111600160201b821117156132bd57600080fd5b82525081516020918201928201910280838360005b838110156132ea5781810151838201526020016132d2565b5050505090500160405250505090506133188160028151811061330957fe5b6020026020010151898961342f565b9550955095505050505b9450945094915050565b60186020526000908152604090208054600182015460029092015490919083565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b601c546001600160a01b0316331461337c57600080fd5b601b80546001600160a01b039092166001600160a01b0319928316179055601c80549091169055565b600f6020526000908152604090205481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60146020908152600092835260408084209091529082529020805460018201546002909201549091906001600160401b0380821691600160401b810490911690600160801b900460ff1685565b600080600061343f611afc613e5e565b336001600160a01b0385161480159061345c575061345c8461520b565b61346557600080fd5b60016001600160401b0386161080159061348a5750613be26001600160401b03861611155b61349357600080fd5b620f42408610156134a357600080fd5b6134ab615ce0565b6000806134ba338a8a8a615216565b6001600160401b0316925092509250600083610120015111156135b1576134df615cb2565b3381526001600160801b031983166020820152600160808201526135028861530a565b6001600160a01b0389811660009081526013602090815260408083206001600160801b0319868116855290835292819020865181546001600160a01b031916951694909417845590850151600184018054909316608091821c179092558401516002830155606084015160038301558301516004909101805460ff1916911515919091179055945061359388615333565b6135af8460a001516001600160401b0316856101200151615353565b505b3360008181526012602090815260408083206001600160801b031987168452825291829020865181559086015160018201559085015160028201556060850151600382018054608088015160a089015160c08a015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b939091169290920291909117905560e0850151600482015561010085015160058201556101208501516006820155610140850151600790910180546101608701516001600160a01b03199091166001600160a01b039093169290921760ff60a01b1916600160a01b921515929092029190911790556136e490615382565b6136fc836020015184600001518561012001516153a2565b6137178360a001516001600160401b031684600001516153d5565b866001600160a01b0316336001600160a01b0316836001600160801b0319167f6619c8f19b39bf3558af16516f9ca110fcac4a7ab6d846d1b02a17b11f703a338660200151876000015188610120015189606001518a608001518b610100015160405180878152602001868152602001858152602001846001600160401b03168152602001836001600160401b03168152602001828152602001965050505050505060405180910390a490945092505093509350939050565b6012602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007909701549596949593946001600160401b0380851695600160401b8604821695600160801b8104831695600160c01b909104909216939192906001600160a01b03811690600160a01b900460ff168c565b601a602052600090815260409020805460019091015482565b601b546001600160a01b0316331461388c57600080fd5b6115be8282614ea7565b6060600080841180156138c057506001600160a01b0385166000908152600f602052604090205484105b6138e2576001600160a01b0385166000908152600f60205260409020546138ff565b6001600160a01b0385166000908152600f60205260409020548490035b90506000808411801561391157508382115b61391c576000613920565b8382035b905060008183036001600160401b038111801561393c57600080fd5b50604051908082528060200260200182016040528015613966578160200160208202803683370190505b509350825b8281111561197a576000613988896000198401600160f91b612e65565b6001600160a01b03808b1660009081526013602090815260408083206001600160801b0319861684529091529020549192506139c49116615404565b156139f657808684815181106139d657fe5b6001600160801b0319909216602092830291909101909101526001909201915b506000190161396b565b6000805b6001600160a01b0383166000908152600f60205260409020548111612e08576000613a38846000198401600160f91b612e65565b6001600160a01b03851660009081526013602090815260408083206001600160801b03198516845290915290206004015490915060ff1615613a7b576001909201915b50600101613a04565b613a8f611afc613e5e565b60005b8251811015613ad457613acc33848381518110613aab57fe5b6020026020010151848481518110613abf57fe5b6020026020010151614251565b600101613a92565b505050565b3390565b6001600160a01b038316613af057600080fd5b6001600160a01b038216613b0357600080fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008061072161ffff168360400151016001600160401b0316905060008160066003015410613b945781613b98565b6009545b60408501519091506001600160401b03165b81811015613be5576000818152601a60205260409020600101548551670de0b6b3a76400000281613bd757fe5b049390930192600101613baa565b505050919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310613c6a5780518252601f199092019160209182019101613c4b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ccc576040519150601f19603f3d011682016040523d82523d6000602084013e613cd1565b606091505b5091509150818015613cff575080511580613cff5750808060200190516020811015613cfc57600080fd5b50515b613d0857600080fd5b5050505050565b6001600160a01b038316613d545760405162461bcd60e51b8152600401808060200182810382526025815260200180615e9a6025913960400191505060405180910390fd5b6001600160a01b038216613d995760405162461bcd60e51b8152600401808060200182810382526023815260200180615e566023913960400191505060405180910390fd5b6001600160a01b038316600090815260208190526040902054613dbc9082613e45565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613deb9082614db7565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115613e5457600080fd5b50900390565b4290565b6000611a7b613e6b613e5a565b615412565b6000613e7a613e5e565b600101905090565b613e8a611d2e565b600654600954600091905b836001600160401b031681101561424b576000198101600090815260186020908152604080832060020154848452601590925290912054019250613ed7615d70565b50600081815260186020908152604091829020825160608101845281548152600190910154918101919091529081018490526007548410613f19576000613f20565b6007548490035b8152613fdf613fcb84613f316115c2565b60008681526017602090815260409182902054600b5483516330550a4b60e01b815263ffffffff909116600482015292519092739c306cad86550ec80d77668c0a8bee6eb34684b6926330550a4b92602480840193829003018186803b158015613f9a57600080fd5b505afa158015613fae573d6000803e3d6000fd5b505050506040513d6020811015613fc457600080fd5b5051615443565b8251611ef190670de0b6b3a7640000614641565b6020808301918252600084815260188252604080822085518155935160018501558085015160029485015560001986018252601983528082209093015485825260169092529190912054019350614034615d70565b5060008281526019602090815260409182902082516060810184528154815260019091015491810191909152908101859052600a54851061407657600061407d565b600a548590035b8152614093613fcb8561408e6115c2565b615460565b60208083019182526000858152601990915260409081902083518155915160018301558201516002909101556140c7615d91565b506000838152601a6020908152604091829020825180840184528154815260019091015481830152600b5483516370a0823160e01b815230600482015293519193600160401b9091046001600160a01b0316926370a0823192602480840193829003018186803b15801561413a57600080fd5b505afa15801561414e573d6000803e3d6000fd5b505050506040513d602081101561416457600080fd5b50518152614208613fcb866141776115c2565b600b54604080516330550a4b60e01b8152600160201b90920463ffffffff16600483015251739c306cad86550ec80d77668c0a8bee6eb34684b6916330550a4b916024808301926020929190829003018186803b1580156141d757600080fd5b505afa1580156141eb573d6000803e3d6000fd5b505050506040513d602081101561420157600080fd5b505161546f565b60208083019182526000868152601a90915260409020825181559051600190910155614232615480565b5050600980546001908101909155919091019050613e95565b50505050565b614259615cb2565b506001600160a01b0380841660009081526013602090815260408083206001600160801b0319808816855290835292819020815160a08101835281549095168552600180820154608090811b90951693860193909352600281015491850191909152600381015460608501526004015460ff161515918301829052146142de57600080fd5b805160208201516142ed615ce0565b506001600160a01b0382811660009081526012602090815260408083206001600160801b03198616845282528083208151610180810183528154815260018201549381019390935260028101549183019190915260038101546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600481015460e08301526005810154610100830152600681015461012083015260070154928316610140820152600160a01b90920460ff1615156101608301526143ca82866146b5565b905060006143d78361473a565b90506143e283614798565b15614436576000871180156143ff57506143fc8282615567565b87105b156144295760608601516144139088614db7565b60608701526144228288614db7565b9050614431565b600060808701525b614474565b61445082614442613e5e565b6001600160401b0316615567565b60608701519097506144629088614db7565b60608701526144718288614db7565b90505b600061448184848461476a565b60408801519091506144939082614db7565b87604001818152505086601360008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b031916815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b03021916908360801c0217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555090505061457c8a82614ea7565b604080516001600160801b03198b811682526020820184905282516001600160a01b03808f1694928a1693908b16927f5d13067bdc9e4d510839580df1e932220b31fb2bc7790b5bd35aae14f0303bed92918290030190a450505050505050505050565b6000808260c001516001600160401b03161161461c576145fe613e5e565b6001600160401b03168260a001516001600160401b031611156114e2565b8160c001516001600160401b03168260a001516001600160401b031611159050919050565b600082614650575060006114e2565b8282028284828161465d57fe5b041461466857600080fd5b9392505050565b600080821161467d57600080fd5b600082848161468857fe5b04949350505050565b600b805460ff60e01b1916600160e01b179055565b600b805460ff60e01b19169055565b6000614668826060015184606001516001600160401b0316601160008761014001516001600160a01b03166001600160a01b0316815260200190815260200160002060010154116147135784606001516001600160401b0316612558565b6101408501516001600160a01b031660009081526011602052604090206001015490614db7565b6000808260c001516001600160401b03161161475957611b5e82614d58565b5060c001516001600160401b031690565b600061477a846101400151615588565b61478e576147898484846155a7565b611d05565b5060009392505050565b61016081015160009015806114e257506114e2826145e0565b6001600160a01b03821660009081526012602090815260408083206001600160801b0319851684529091528120600701548190600160a01b900460ff166147f757600080fd5b6001600160a01b03841660009081526012602090815260408083206001600160801b0319871684529091529020915061482e613e5e565b6003830180546001600160c01b0316600160c01b6001600160401b0393841681029190911791829055604080516101808101825286548152600187015460208201526002870154918101919091528284166060820152600160401b830484166080820152600160801b8304841660a0820152910490911660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526148fa906155e6565b60028301819055604080516101808101825284548152600185015460208201529081019190915260038301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526149b090614faa565b60078301805460ff60a01b1916905560018301549091506149e790859083106149da5760006149e2565b828460010154035b614ea7565b6149f5848360020154614ea7565b9250929050565b6006548310614a0c576000614a13565b6006548390035b6006556007548210614a26576000614a2d565b6007548290035b6007558015614a5157600a548110614a46576000614a4d565b600a548190035b600a555b613ad4615607565b614a628261565e565b15614aaa576000828152601560205260409020548110614a83576000614a96565b6000828152601560205260409020548190035b6000838152601560205260409020556115be565b6000614ab461567a565b6001600160401b03166000818152601860205260409020600201549091508210614adf576000614af5565b6000818152601860205260409020600201548290035b600091825260186020526040909120600201555050565b614b158261565e565b15614b5d576000828152601660205260409020548110614b36576000614b49565b6000828152601660205260409020548190035b6000838152601660205260409020556115be565b6000614b6761567a565b6001600160401b03166000818152601960205260409020600201549091508210614b92576000614ba8565b6000818152601960205260409020600201548290035b600091825260196020526040909120600201555050565b614bc88161568c565b158015614bd95750614bd983615404565b15613ad4576001600160a01b0383166000908152601160205260409020548210614c04576000614c21565b6001600160a01b0383166000908152601160205260409020548290035b6001600160a01b038416600090815260116020526040902055614c43836156a8565b6001600160a01b038416600090815260116020526040902060010155505050565b80156115be576001600160401b038216600090815260176020526040902054614c8d9082614db7565b6001600160401b0383166000908152601760205260409020555050565b600081118015614cca57506041614cbf613e5e565b6001600160401b0316115b15614d2c576000614cde86868486886156c0565b600854909150811115614d2657600854614d0090606490611ef190606e614641565b8110614d2057600854614d1b90606490611ef190606e614641565b614d22565b805b6008555b50613d08565b6041614d36613e5e565b6001600160401b03161415613d0857670186cc6acd4b00006008555050505050565b60006006600301548260a001516001600160401b031611614d86578160a001516001600160401b03166114e2565b505060095490565b60008160e00151600014614da6578160e001516114e2565b50606001516001600160401b031690565b60008282018381101561466857600080fd5b6000825b82811015614e0757600081815260186020526040902060010154670de0b6b3a7640000860281614df957fe5b049190910190600101614dcd565b509392505050565b61016081015160009015614e4457611b5e614e28613e5e565b6001600160401b03168360a001516001600160401b0316615567565b6114e28260c001516001600160401b03168360a001516001600160401b0316615567565b6000614e7383615404565b614e8d57614e888585846402540be40061571d565b614e9e565b614e9e85858464028fa6ae0061571d565b95945050505050565b6001600160a01b038216614f02576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554614f0f9082614db7565b6005556001600160a01b038216600090815260208190526040902054614f359082614db7565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000816101600151614fa15781604001516114e2565b6114e28261573f565b6000614fb582615757565b80614fc45750614fc4826145e0565b611b6357611b5e826157b6565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106150565780518252601f199092019160209182019101615037565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146150b8576040519150601f19603f3d011682016040523d82523d6000602084013e6150bd565b606091505b50915091508180156150eb5750805115806150eb57508080602001905160208110156150e857600080fd5b50515b6150f457600080fd5b505050505050565b6001600160a01b0381166000908152601060205260408120546114e2908390600360f81b612e65565b6001600160a01b0316600090815260106020526040902080546001019055565b60408051600380825260808201909252606091602082018380368337019050509050828160008151811061517557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106151b757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081816002815181106151e557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b3b63ffffffff161590565b61521e615ce0565b60008061522b87876157ec565b615233613e70565b905061523e876158c2565b6001600160401b0380871660808601819052838216606087015283880190911660a0860152600161016086015260208501889052600854919350615286918891908790614e68565b83526152906158eb565b506020830151600c546152b091670de0b6b3a764000091611ef191614641565b6101008401526152bf84615404565b15613322576001600160a01b03841661014084018190526101008401516152e69190615ada565b6152fa86866001600160401b031686615b42565b6101208401529450945094915050565b6001600160a01b0381166000908152600f60205260408120546114e2908390600160f91b612e65565b6001600160a01b03166000908152600f6020526040902080546001019055565b60008281526016602052604090205461536c9082614db7565b6000928352601660205260409092209190915550565b6001600160a01b03166000908152600e6020526040902080546001019055565b6006546153af9084614db7565b6006556007546153bf9083614db7565b6007558015614a5157600a54614a4d9082614db7565b6000828152601560205260409020546153ee9082614db7565b6000928352601560205260409092209190915550565b6001600160a01b0316151590565b6000620151807f000000000000000000000000000000000000000000000000000000005fa9d80083035b0492915050565b60008282858701612710028161545557fe5b040195945050505050565b6315dd2ecd9101612710020490565b600081838501612710028161468857fe5b600b54600160e01b900460ff16151560011480156154b05750600b5462019258600160201b90910463ffffffff16105b156154fa57600b805463ffffffff1967ffffffff00000000198216600160201b9283900463ffffffff90811660060181169093021790811690821660051901909116179055611b97565b600b54600160e01b900460ff161580156155205750600b546201925863ffffffff909116105b15611b9757600b805467ffffffff000000001963ffffffff19821663ffffffff928316600601831617908116600160201b9182900483166005190190921602179055611b97565b600081831161557f5761557a8284613e45565b614668565b50600092915050565b6001600160a01b03166000908152601160205260409020600101541590565b6000825b82811015614e07576000818152601960205260409020600101548551670de0b6b3a764000002816155d857fe5b0491909101906001016155ab565b60006114e282600001516155f984614d8e565b61560285614d58565b614dc9565b600954600754600654600854600a54604080519485526020850193909352838301919091526060830152517fea8ce1d041020595d75f4f48ba3378787b84e61d101465836fa54f1b338a4db59181900360800190a2565b6000615668613e5e565b6001600160401b031690911015919050565b60006001615686613e5e565b03905090565b6000615696613e5e565b6001600160401b031690911115919050565b60006156b382615b73565b611b6357611b5e82615b9a565b6000806156f2846156d085615404565b6156df576402540be4006156e6565b64028fa6ae005b64ffffffffff16615bef565b905061571285611ef16305f5e10061570c85818d8d614db7565b90614641565b979650505050505050565b6000614e9e6402540be400611ef16157358786615bef565b61570c8988615c39565b600061574a82615757565b611b6357611b5e826155e6565b6000808260c001516001600160401b03161161579257615775613e5e565b6001600160401b031682606001516001600160401b0316116114e2565b8160c001516001600160401b031682606001516001600160401b0316119050919050565b60006103e86157c483615c51565b60016157cf85614e0f565b0361032002816157db57fe5b046064018360200151028161543c57fe5b6001600160a01b0382166158315760405162461bcd60e51b8152600401808060200182810382526021815260200180615e796021913960400191505060405180910390fd5b6001600160a01b0382166000908152602081905260409020546158549082613e45565b6001600160a01b03831660009081526020819052604090205560055461587a9082613e45565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b0381166000908152600e60205260408120546114e2908390600160f81b612e65565b6040805163d06ca61f60e01b8152670de0b6b3a76400006004820181815260248301938452600d805460448501819052600095737a250d5630b4cf539739df2c5dacb4c659f2488d9563d06ca61f9594926064909101908490801561597957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161595b575b5050935050505060006040518083038186803b15801561599857600080fd5b505afa925050508015615a5857506040513d6000823e601f3d908101601f1916820160405260208110156159cb57600080fd5b8101908080516040519392919084600160201b8211156159ea57600080fd5b9083019060208201858111156159ff57600080fd5b82518660208202830111600160201b82111715615a1b57600080fd5b82525081516020918201928201910280838360005b83811015615a48578181015183820152602001615a30565b5050505090500160405250505060015b615ab457615a64615db1565b80615a6f5750615a79565b5050600c546114c7565b3d808015615aa3576040519150601f19603f3d011682016040523d82523d6000602084013e615aa8565b606091505b50600c549150506114c7565b80600281518110615ac157fe5b6020026020010151600c81905550600c549150506114c7565b6001600160a01b038216600090815260116020526040902054615afd9082614db7565b6001600160a01b038316600090815260116020526040902055615b1f826156a8565b6001600160a01b0390921660009081526011602052604090206001019190915550565b6000615b4d82615588565b80615b59575061016d83105b61478e5761478984846006600201546402540be40061571d565b6001600160a01b031660009081526011602052604090205469021e19e0c9bab24000001190565b6001600160a01b038116600090815260116020526040812060010154615bd057615bc2613e5e565b6001600160401b03166114e2565b506001600160a01b031660009081526011602052604090206001015490565b600081615c1c6107218511615c05576000615c0c565b6107201985015b660150b9a52b11286134c1615c87565b615c30856630aad4df397abe610721615c87565b01019392505050565b600061466882611ef185670de0b6b3a7640000614641565b6000600182608001516001600160401b031611615c6f576001615c78565b60018260800151035b6001600160401b031692915050565b6000611d056402540be400838611615ca857615ca38686614641565b611ef1565b611ef18486614641565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180610180016040528060008152602001600081526020016000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b60405180606001604052806000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b60e01c90565b600060443d1015615dc1576114c7565b600481823e6308c379a0615dd58251615dab565b14615ddf576114c7565b6040513d600319016004823e80513d6001600160401b038160248401118184111715615e0e57505050506114c7565b82840192508251915080821115615e2857505050506114c7565b503d83016020828401011115615e40575050506114c7565b601f01601f191681016020016040529150509056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373a26469706673582212204aa899dc8e12f409e25fd25517776a96df8b7355aeff60acb53b551cc3ab286d64736f6c63430007050033

Deployed Bytecode Sourcemap

101:5156:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;553:13;;:33;;-1:-1:-1;;;;;553:13:11;;;;576:9;553:33;;;;;:13;:33;:13;:33;576:9;553:13;:33;;;;;;;;;;;;;;;;;;;;;101:5156;;;;;3891:34:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3848;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1375:83:1;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2811:252;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2811:252:1;;;;;;;;:::i;2331:627:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2331:627:5;;-1:-1:-1;;;;;2331:627:5;;;;;-1:-1:-1;;;;;;2331:627:5;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5016:238:11;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5016:238:11;;;;;;;;:::i;:::-;;1852:91:1;;;;;;;;;;;;;:::i;2683:641:11:-;;;;;;;;;;;;;;;;-1:-1:-1;2683:641:11;;-1:-1:-1;;;;;2683:641:11;;;;;-1:-1:-1;;;;;2683:641:11;;:::i;:::-;;;;-1:-1:-1;;;;;;2683:641:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;2196:827:4;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2196:827:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3199:422:1;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3199:422:1;;;;;;;;;;;;;;;;;:::i;1691:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5113:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5113:45:0;-1:-1:-1;;;;;5113:45:0;;:::i;2810:37::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5283:52;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5283:52:0;-1:-1:-1;;;;;5283:52:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;147:129:10;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;147:129:10;;;;;;;;;;;;;;2030:336:11;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2030:336:11;-1:-1:-1;;;;;2030:336:11;;:::i;3093:265:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;3093:265:6;;;;;;;;:::i;4084:208:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4084:208:4;-1:-1:-1;;;;;4084:208:4;;:::i;:::-;;;;-1:-1:-1;;;;;;4084:208:4;;;;;;;;;;;;;;5220:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5220:54:0;-1:-1:-1;;;;;5220:54:0;;:::i;147:36:11:-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;147:36:11;;;;;;;;;;;;;;2188:111:8;;;;;;;;;;;;;:::i;3807:34:0:-;;;;;;;;;;;;;:::i;2029:110:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2029:110:1;-1:-1:-1;;;;;2029:110:1;;:::i;4300:218:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4300:218:4;-1:-1:-1;;;;;4300:218:4;;:::i;11972:264:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11972:264:9;;-1:-1:-1;;;;;11972:264:9;;;;;-1:-1:-1;;;;;;11972: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;4360:1636:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4360:1636:9;-1:-1:-1;;;;;;4360:1636:9;;:::i;7020:2689::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7020:2689:9;;-1:-1:-1;;;;;;7020:2689:9;;;;;-1:-1:-1;;;;;7020:2689:9;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4103:184:0;;;;;;;;;;;;;:::i;12244:1025:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12244:1025:9;;-1:-1:-1;;;;;12244:1025:9;;;;;-1:-1:-1;;;;;;12244:1025:9;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1235:932:5;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1235:932:5;-1:-1:-1;;;;;;1235:932: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;3885:191:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3885:191:4;-1:-1:-1;;;;;3885:191:4;;:::i;1286:449::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1286:449:4;-1:-1:-1;;;;;1286:449:4;;:::i;2713:37:0:-;;;;;;;;;;;;;:::i;233:36:11:-;;;;;;;;;;;;;:::i;3673:125:0:-;;;;;;;;;;;;;:::i;5691:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5691:49:0;;:::i;5630:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5630: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;5408:73:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5408:73:0;;-1:-1:-1;;;;;5408:73:0;;;;;-1:-1:-1;;;;;;5408:73:0;;:::i;:::-;;;;-1:-1:-1;;;;;5408:73:0;;;;;-1:-1:-1;;;;;;5408:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5574:49;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5574:49:0;;:::i;388:22:3:-;;;;;;;;;;;;;:::i;3535:129:0:-;;;;;;;;;;;;;:::i;300:789:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;300:789:5;;:::i;3808:1004:11:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3808:1004:11;;;;;;;;;;-1:-1:-1;;;;;3808:1004:11;;;;;;;;;;;:::i;599:45:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;599:45:8;;:::i;3400:126:0:-;;;;;;;;;;;;;:::i;802:336:11:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;802:336:11;-1:-1:-1;;;;;802:336:11;;:::i;5165:48:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5165:48:0;-1:-1:-1;;;;;5165:48:0;;:::i;2537:191:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2537:191:1;;;;;;;;;;:::i;5488:77:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5488:77:0;;-1:-1:-1;;;;;5488:77:0;;;;;-1:-1:-1;;;;;;5488:77:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;5488:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;376:2195:9;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;376:2195:9;;;;;;;-1:-1:-1;;;;;376:2195:9;;;;;-1:-1:-1;;;;;376:2195:9;;:::i;5342:59:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5342:59:0;;-1:-1:-1;;;;;5342:59:0;;;;;-1:-1:-1;;;;;;5342:59:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5342:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5342:59:0;;;;;;;;;;;;;;;;;;;;705:47:8;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;705:47:8;;:::i;1487:322:11:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1487:322:11;;;;;;;;:::i;3031:846:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3031:846:4;;;;;;;;;;;;;:::i;1743:445::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1743:445:4;-1:-1:-1;;;;;1743:445: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;3891:34:0:-;;;;:::o;3848:::-;;;-1:-1:-1;;;3848: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;2331:627:5:-;2497:16;2528:20;2563;2598:16;2629:13;2670:27;;:::i;:::-;-1:-1:-1;;;;;;2700:24:5;;;;;;:15;:24;;;;;;;;-1:-1:-1;;;;;;2700:43:5;;;;;;;;;;2670:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2670:73:5;;;;;;;;;-1:-1:-1;;;2670:73:5;;;;;;;-1:-1:-1;;;2670:73:5;;;;;;;;;;;;-1:-1:-1;2670:73:5;-1:-1:-1;2849:29:5;2670:73;2849:22;:29::i;:::-;2900:14;;;;2936;;;;;2331:627;;;;-1:-1:-1;2834:44:5;-1:-1:-1;;;;;;2889:25:5;;2936:14;2331:627;-1:-1:-1;;;2331:627:5:o;5016:238:11:-;5195:13;;5140:106;;5167:13;;-1:-1:-1;;;;;5195:13:11;5223:12;5140;:106::i;:::-;5016:238;;:::o;1852:91:1:-;1923:12;;1852:91;:::o;2683:641:11:-;2904:16;;;2918:1;2904:16;;;2880:21;2904:16;;;;;2826:7;;;;;;2904:16;;;;;;;;;;;;-1:-1:-1;2904:16:11;2880:40;;3349:42:0;2935:4:11;2940:1;2935:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;2935:14:11;;;-1:-1:-1;;;;;2935:14:11;;;;;2982:4;2964;2969:1;2964:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;2964:23:11;;;-1:-1:-1;;;;;2964:23:11;;;;;3000:24;3477:42:0;-1:-1:-1;;;;;3036:36:11;;3080:9;3105:1;3121:4;3140:10;3165:15;3183:7;3165:25;3036:165;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3036:165:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3036:165:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3036:165:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3036:165:11;;;;;;;;;;;;-1:-1:-1;3036:165:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3000:201;;3221:95;3247:7;3255:1;3247:10;;;;;;;;;;;;;;3272:9;3296;3221:11;:95::i;:::-;3214:102;;;;;;;;2683:641;;;;;:::o;2196:827:4:-;2357:24;2399:13;2425:1;2415:7;:11;:57;;;;-1:-1:-1;;;;;;2443:19:4;;;;;;:10;:19;;;;;;:29;-1:-1:-1;2415:57:4;:124;;-1:-1:-1;;;;;2520:19:4;;;;;;:10;:19;;;;;;2415:124;;;-1:-1:-1;;;;;2488:19:4;;;;;;:10;:19;;;;;;:29;;;2415:124;2399:140;;2552:14;2579:1;2569:7;:11;:43;;;;;2605:7;2597:5;:15;2569:43;:78;;2646:1;2569:78;;;2636:7;2628:5;:15;2569:78;2552:95;;2660:9;2714:6;2706:5;:14;-1:-1:-1;;;;;2692:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2692:29:4;-1:-1:-1;2682:39:4;-1:-1:-1;2761:5:4;2734:282;2782:6;2768:11;:20;2734:282;;;2820:16;2839:42;2850:7;-1:-1:-1;;2859:15:4;;-1:-1:-1;;;2839:10:4;:42::i;:::-;-1:-1:-1;;;;;2900:15:4;;2941:1;2900:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;2900:25:4;;;;;;;;;:38;;;2820:61;;-1:-1:-1;2900:42:4;2896:109;;2976:8;2963:7;2971:1;2963:10;;;;;;;;-1:-1:-1;;;;;;2963:21:4;;;:10;;;;;;;;;;;:21;2986:3;;;;;2896:109;-1:-1:-1;;;2790:13:4;2734:282;;;;2196:827;;;;;;;;:::o;3199:422:1:-;3340:4;3362:86;3386:6;3407:9;3431:6;3362:9;:86::i;:::-;3459:132;3468:6;3489:12;:10;:12::i;:::-;-1:-1:-1;;;;;3503:19:1;;;;;;:11;:19;;;;;:77;;3559:6;;3503:19;3523:12;:10;:12::i;:::-;-1:-1:-1;;;;;3503:33:1;;;;;;;;;;;;-1:-1:-1;3503:33:1;;;:37;:77::i;:::-;3459:8;:132::i;:::-;-1:-1:-1;3609:4:1;3199:422;;;;;:::o;1691:83::-;1757:9;;;;1691:83;:::o;5113:45:0:-;;;;;;;;;;;;;:::o;2810:37::-;;;-1:-1:-1;;;2810:37:0;;;;;:::o;5283:52::-;;;;;;;;;;;;;;;;;;;:::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;2030:336:11:-;2155:21;;-1:-1:-1;;;;;2155:21:11;2141:10;:35;2119:110;;;;;;-1:-1:-1;;;;;2240:23:11;;;;;;:12;:23;;;;;2989:8:0;2240:53:11;;2344:14;:12;:14::i;:::-;-1:-1:-1;;;;;2304:23:11;;;;;;;:12;:23;;;;;-1:-1:-1;;;;;2304:54:11;;;;:37;;;;:54;2030: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;4084:208:4:-:0;-1:-1:-1;;;;;4179:24:4;;4152:7;4179:24;;;:13;:24;;;;;;:29;:105;;-1:-1:-1;;;;;4246:24:4;;;;;;:13;:24;;;;;;4224:60;;4235:9;;4246:31;;4275:1;4246:28;:31::i;:::-;-1:-1:-1;;;4224:10:4;:60::i;:::-;4179:105;;;4219:1;4172:112;4084:208;-1:-1:-1;;4084:208:4:o;5220: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;3807:34:0:-;;;-1:-1:-1;;;3807:34:0;;-1:-1:-1;;;;;3807:34:0;;:::o;2029:110:1:-;-1:-1:-1;;;;;2113:18:1;2086:7;2113:18;;;;;;;;;;;;2029:110::o;4300:218:4:-;-1:-1:-1;;;;;4399:28:4;;4372:7;4399:28;;;:19;:28;;;;;;:33;:111;;-1:-1:-1;;;;;4468:28:4;;;;;;:19;:28;;;;;;4448:62;;4459:7;;4468:35;;4501:1;4468:32;:35::i;:::-;-1:-1:-1;;;4448:10:4;:62::i;11972:264:9:-;12108:13;12139:18;;:::i;:::-;-1:-1:-1;;;;;;12160:15:9;;;;;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;12160:25:9;;;;;;;;;;12139:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12139:46:9;;;;;;;-1:-1:-1;;;12139:46:9;;;;;;;;-1:-1:-1;;;12139:46:9;;;;;;;;-1:-1:-1;;;12139:46:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12139:46:9;;;;;;;;;;;12207:21;12139:46;12207:14;:21::i;:::-;12196:32;11972:264;-1:-1:-1;;;;11972: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;3349: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;;:::i;:::-;-1:-1:-1;;;;;;6023:24:6;;;;;;;:13;:24;;;;;;;;-1:-1:-1;;;;;;6023:37:6;;;;;;;;;;;;5996:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5996:64:6;-1:-1:-1;5996:64:6;-1:-1:-1;6182:18:6;;:::i;:::-;-1:-1:-1;;;;;;6203:14:6;;;;;;;:6;:14;;;;;;;;-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;6306:139:6;6182:44;6363:31;6182:44;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;;;;;;;;;;;;;;;;;;;;;;;;4360:1636:9;4473:7;799:38:8;819:17;:15;:17::i;799:38::-;4513:23:9::1;;:::i;:::-;4551:21;4597:68;4621:10;4646:8;4597:9;:68::i;:::-;4498: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;;;;;4498:167:9;;::::1;::::0;;;;-1:-1:-1;;;4498:167:9;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;4498:167:9;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;4498: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;;;;;4498:167:9;::::1;::::0;;;;-1:-1:-1;;;4498:167:9;::::1;;;;;::::0;;;;;;-1:-1:-1;4498:167:9;;-1:-1:-1;4678:143:9::1;::::0;4498:167;;;4678:16:::1;:143::i;:::-;4834:105;4871:10;:19;;;-1:-1:-1::0;;;;;4834:105:9::1;4905:10;:23;;;4834:22;:105::i;:::-;4952:111;4993:10;:19;;;-1:-1:-1::0;;;;;4952:111:9::1;5027:10;:25;;;4952:26;:111::i;:::-;5076:137;5110:10;:19;;;5144:10;:24;;;5183:10;:19;;;-1:-1:-1::0;;;;;5076:137:9::1;:19;:137::i;:::-;5226:86;5254:10;:19;;;5288:13;5226;:86::i;:::-;5325:285;5383:13;5357:10;:23;;;:39;:98;;5454:1;5357:98;;;5438:13;5412:10;:23;;;:39;5357:98;5470:10;:23;;;5508:10;:19;;;5542:10;:19;;;-1:-1:-1::0;;;;;5325:285:9::1;5576:10;:23;;;5325:17;:285::i;:::-;5699:10;:19;;;-1:-1:-1::0;;;;;5628:317:9::1;5674:10;-1:-1:-1::0;;;;;5628:317:9::1;5651:8;-1:-1:-1::0;;;;;5628:317:9::1;;;5733:10;:23;;;5771:10;:23;;;5809:10;:25;;;5849:10;:23;;;5887:10;:19;;;5921:13;5628:317;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;5628:317:9::1;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;5965:23:9::1;;::::0;;4360:1636;-1:-1:-1;;4360:1636:9:o;7020:2689::-;7182:17;7214:20;7249:21;7285:22;7322:23;799:38:8;819:17;:15;:17::i;799:38::-;7402:10:9::1;7395:18;::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;7395:28:9;::::1;::::0;;;;;;;:37:::1;;::::0;-1:-1:-1;;;7395:37:9;::::1;;;7373:114;;;::::0;::::1;;7500:18;;:::i;:::-;-1:-1:-1::0;7528:10:9::1;7521:18;::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;7521:28:9;::::1;::::0;;;;;;;;7500:49;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;7500:49:9;;::::1;::::0;;;;-1:-1:-1;;;7500:49:9;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7500:49:9;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7500: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;;;;;7500:49:9;::::1;::::0;;;;-1:-1:-1;;;7500:49:9;::::1;;;;;::::0;;;;;7574:15;::::1;:105;;7657:22;7673:5;7657:15;:22::i;:::-;7574:105;;;7605:36;7629:11;-1:-1:-1::0;;;;;7605:36:9::1;:19;7618:5;7605:12;:19::i;:::-;:23:::0;::::1;:36::i;:::-;7562:117;;7716:5;:14;;;-1:-1:-1::0;;;;;7704:26:9::1;:9;:26;:89;;7784:9;7704:89;;;7746:22;7762:5;7746:15;:22::i;:::-;7692:101;;7821:119;7853:5;:18;;;7886:19;7899:5;7886:12;:19::i;:::-;7920:9;7821:17;:119::i;:::-;7806:134;;7957:21;7972:5;7957:14;:21::i;:::-;7953:1155;;8022:16;8032:5;8022:9;:16::i;:::-;8006:32;;8072:157;8104:12;8135:13;8167:10;8196:7;:18;;;8072:13;:157::i;:::-;8280:18:::0;;8055:174;;-1:-1:-1;8280:38:9::1;::::0;8055:174;8280:22:::1;:38::i;:::-;8246:72:::0;;8376:14:::1;::::0;::::1;::::0;8335:103:::1;::::0;-1:-1:-1;;;;;8335:103:9::1;8409:14:::0;8335:22:::1;:103::i;:::-;8459:20;::::0;::::1;::::0;:24;8455:507:::1;;8524:179;8560:12;8595:13;8639:3;8666:7;:18;;;8524:13;:179::i;:::-;8764:20;::::0;::::1;::::0;8506:197;;-1:-1:-1;8764:41:9::1;::::0;8506:197;8764:24:::1;:41::i;:::-;8724:20;::::0;::::1;:81:::0;8875:14:::1;::::0;::::1;::::0;8826:120:::1;::::0;-1:-1:-1;;;;;8826:120:9::1;8912:15:::0;8826:26:::1;:120::i;:::-;8978:118;9013:1;9033:14;9066:15;8978:16;:118::i;:::-;9120:179;9152:5;:18;;;9185:12;9212:5;:14;;;9241:5;:14;;;-1:-1:-1::0;;;;;9120:179:9::1;9270:5;:18;;;9120:17;:179::i;:::-;9312:15;::::0;::::1;:27:::0;;;9357:10:::1;9350:18;::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;9350: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;;9350:36:9;;::::1;-1:-1:-1::0;;;;;9350:36:9;;::::1;;-1:-1:-1::0;;;;9350:36:9::1;-1:-1:-1::0;;;9350:36:9;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;9350:36:9::1;-1:-1:-1::0;;;9350:36:9;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;9350:36:9::1;-1:-1:-1::0;;;9350: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;;;;;;9350:36:9;;::::1;-1:-1:-1::0;;;;;9350:36:9;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;9350:36:9::1;-1:-1:-1::0;;;9350:36:9;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;9399:68:::1;::::0;9444:12;9399:5:::1;:68::i;:::-;9538:10;-1:-1:-1::0;;;;;;9485:216:9;::::1;;9563:12:::0;9590:9;9614:14;9643:15;9673:17:::1;:15;:17::i;:::-;9485:216;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;9485:216:9::1;::::0;;;;;;;;;;;;::::1;848:1:8;7020:2689:9::0;;;;;;;;:::o;4103:184:0:-;4189:79;;;-1:-1:-1;;;4189:79:0;;3349:42;4189:79;;;;4248:4;4189:79;;;;;;3615:42;;4189:26;;:79;;;;;;;;;;;;;;-1:-1:-1;3615:42:0;4189:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4189:79:0;4145:12;:134;;-1:-1:-1;;;;;4145:134:0;;;-1:-1:-1;;;4145:134:0;-1:-1:-1;;;;;;4145:134:0;;;;;;;;;4103:184::o;12244:1025:9:-;12392:16;12423;12454;12485;12516:17;12548:20;12583;12618;12653:21;12689:13;12717;12758:18;;:::i;:::-;12779:6;:15;12786:7;-1:-1:-1;;;;;12779:15:9;-1:-1:-1;;;;;12779:15:9;;;;;;;;;;;;:25;12795:8;-1:-1:-1;;;;;12779:25:9;;-1:-1:-1;;;;;12779:25:9;;;;;;;;;;;;;12758:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;-1:-1:-1;;;;;12758:46:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;12826:5;:14;;;-1:-1:-1;;;;;12815:25:9;;;12862:5;:14;;;-1:-1:-1;;;;;12851:25:9;;;12898:5;:14;;;-1:-1:-1;;;;;12887:25:9;;;12934:5;:14;;;-1:-1:-1;;;;;12923:25:9;;;12971:5;:15;;;12959:27;;13012:5;:18;;;12997:33;;13056:5;:18;;;13041:33;;13100:25;13119:5;13100:18;:25::i;:::-;13085:40;;13152:30;13176:5;13152:23;:30::i;:::-;13136:46;;13204:5;:14;;;13193:25;;13240:21;13255:5;13240:14;:21::i;:::-;13229:32;;12244:1025;;;;;;;;;;;;;;;:::o;1235:932:5:-;1366:7;799:38:8;819:17;:15;:17::i;799:38::-;1391:36:5::1;;:::i;:::-;-1:-1:-1::0;1455:10:5::1;1439:27;::::0;;;:15:::1;:27;::::0;;;;;;;-1:-1:-1;;;;;;1439:46:5;::::1;::::0;;;;;;;;1391:94;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;;::::0;-1:-1:-1;;;;;1391:94:5;;::::1;::::0;;;;;;;-1:-1:-1;;;1391:94:5;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;1391:94:5;;::::1;;;;;::::0;;;;;;1498:100:::1;;;::::0;::::1;;1637:5;1611:23;::::0;::::1;:31:::0;1679:17:::1;:15;:17::i;:::-;-1:-1:-1::0;;;;;1653:43:5::1;:23;::::0;::::1;:43:::0;1739:62:::1;1653:14:::0;1739:22:::1;:62::i;:::-;1709:27;::::0;::::1;:92:::0;;;1814:83:::1;::::0;1834:10:::1;::::0;1814:5:::1;:83::i;:::-;1945:12;::::0;1998:27;;1910:126:::1;::::0;-1:-1:-1;;;1945:12:5;::::1;-1:-1:-1::0;;;;;1945:12:5::1;::::0;1973:10:::1;::::0;1910:12:::1;:126::i;:::-;2065:10;2049:27;::::0;;;:15:::1;:27;::::0;;;;;;;-1:-1:-1;;;;;;2049: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;;2049:63:5;;::::1;-1:-1:-1::0;;;;;2049:63:5;;::::1;;-1:-1:-1::0;;;;2049:63:5::1;-1:-1:-1::0;;;2049:63:5;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;2049:63:5::1;-1:-1:-1::0;;;2049:63:5;::::1;;::::0;;;::::1;;::::0;;-1:-1:-1;2049:63:5;1235:932::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;:::-;2484:446;:::o;3885:191:4:-;-1:-1:-1;;;;;3975:19:4;;3948:7;3975:19;;;:10;:19;;;;;;:24;:93;;-1:-1:-1;;;;;4035:19:4;;;;;;:10;:19;;;;;;4015:53;;4026:7;;4035:26;;4059:1;4035:23;:26::i;:::-;-1:-1:-1;;;4015:10:4;:53::i;1286:449::-;1410:19;;1457:271;-1:-1:-1;;;;;1502:19:4;;;;;;:10;:19;;;;;;1487:34;;1457:271;;1553:16;1572:42;1583:7;-1:-1:-1;;1592:15:4;;-1:-1:-1;;;1572:10:4;:42::i;:::-;-1:-1:-1;;;;;1633:15:4;;;;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;1633:25:4;;;;;;;;;:34;;;:25;;-1:-1:-1;;;;1633:34:4;;;;1629:88;;;1688:13;;;;;1629:88;-1:-1:-1;1523:13:4;;1457:271;;;;1286:449;;;:::o;2713:37:0:-;;;;;;:::o;233:36:11:-;;;-1:-1:-1;;;;;233:36:11;;:::o;3673:125:0:-;3749:42;3673:125;:::o;5691:49::-;;;;;;;;;;;;;:::o;5630: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;5408:73:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5408:73:0;;;;;;;;;;;;;;;;:::o;5574:49::-;;;;;;;;;;;;;:::o;388:22:3:-;;;;;;;;;;;;:::o;3535:129:0:-;3615:42;3535:129;:::o;300:789:5:-;433:24;799:38:8;819:17;:15;:17::i;799:38::-;514:12:5::1;::::0;475:147:::1;::::0;-1:-1:-1;;;514:12:5;::::1;-1:-1:-1::0;;;;;514:12:5::1;542:10;575:4;595:16:::0;475::::1;:147::i;:::-;635:39;;:::i;:::-;706:60;745:10;706:24;:60::i;:::-;687:79;;808:14;:12;:14::i;:::-;-1:-1:-1::0;;;;;779:43:5;;::::1;:26;::::0;;::::1;:43:::0;;;833:49;;;922:4:::1;893:26;::::0;::::1;:33:::0;;;955:10:::1;833:30;939:27:::0;;;:15:::1;:27;::::0;;;;;;-1:-1:-1;;;;;;939:45:5;::::1;::::0;;;;;;;:65;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;-1:-1:-1::0;;;939:65:5::1;-1:-1:-1::0;;;;939:65:5;;::::1;-1:-1:-1::0;;;939:65:5::1;-1:-1:-1::0;;;;939:65:5;;;::::1;-1:-1:-1::0;;939:65:5;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;1017:64:::1;::::0;:28:::1;:64::i;3808:1004:11:-:0;4136:109;;;-1:-1:-1;;;4136:109:11;;4169:10;4136:109;;;;4202:4;4136:109;;;;;;;;;;;;3999:7;;;;;;4099:13;;-1:-1:-1;;;;;4136:18:11;;;;;:109;;;;;;;;;;;;;;3999:7;4136:18;:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4258:89:11;;;-1:-1:-1;;;4258:89:11;;3477:42:0;4258:89:11;;;;;;;;;;;;-1:-1:-1;;;;;4258:13:11;;;;;:89;;;;;4136:109;;4258:89;;;;;;;-1:-1:-1;4258:13:11;:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4360:21:11;;-1:-1:-1;4384:79:11;4411:13;4447:4;4384:12;:79::i;:::-;4360:103;;4476:24;3477:42:0;-1:-1:-1;;;;;4512:39:11;;4566:12;4593:1;4609:4;4628:10;4653:15;4671:7;4653:25;4512:177;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4512:177:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4512:177:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4512:177:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4512:177:11;;;;;;;;;;;;-1:-1:-1;4512:177:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4476:213;;4709:95;4735:7;4743:1;4735:10;;;;;;;;;;;;;;4760:9;4784;4709:11;:95::i;:::-;4702:102;;;;;;;;;3808:1004;;;;;;;;;:::o;599:45:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3400:126:0:-;3477:42;3400:126;:::o;802:336:11:-;937:21;;-1:-1:-1;;;;;937:21:11;962:10;937:35;915:112;;;;;;1038:21;:45;;-1:-1:-1;;;;;1038:45:11;;;-1:-1:-1;;;;;;1038:45:11;;;;;;1094:21;:36;;;;;;;802:336::o;5165:48:0:-;;;;;;;;;;;;;:::o;2537:191:1:-;-1:-1:-1;;;;;2693:18:1;;;2661:7;2693:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2537:191::o;5488:77:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5488:77:0;;;;-1:-1:-1;;;5488:77:0;;;;;;-1:-1:-1;;;5488:77:0;;;;;:::o;376:2195:9:-;550:7;559;568:18;799:38:8;819:17;:15;:17::i;799:38::-;626:10:9::1;-1:-1:-1::0;;;;;626:23:9;::::1;;::::0;::::1;::::0;:62:::1;;;666:22;678:9;666:11;:22::i;:::-;604:136;;;::::0;::::1;;2194:1:0;-1:-1:-1::0;;;;;775:26:9;::::1;;::::0;::::1;::::0;:69:::1;;-1:-1:-1::0;2273:5:0::1;-1:-1:-1::0;;;;;818:26:9;::::1;;;775:69;753:148;;;::::0;::::1;;2496:7:0;936:33:9::0;::::1;;914:116;;;::::0;::::1;;1058:21;;:::i;:::-;1094:15;1124:17:::0;1166:61:::1;1179:10;1191:13;1206:9;1217;1166:12;:61::i;:::-;-1:-1:-1::0;;;;;1043:184:9::1;;;;;;;1270:1;1244:8;:23;;;:27;1240:571;;;1290:32;;:::i;:::-;1361:10;1339:32:::0;;-1:-1:-1;;;;;;1386:30:9;::::1;:20;::::0;::::1;:30:::0;1455:4:::1;1431:21;::::0;::::1;:28:::0;1489:29:::1;1508:9:::0;1489:18:::1;:29::i;:::-;-1:-1:-1::0;;;;;1533:24:9;;::::1;;::::0;;;:13:::1;:24;::::0;;;;;;;-1:-1:-1;;;;;;1533:36:9;;::::1;::::0;;;;;;;;;:51;;;;-1:-1:-1;;;;;;1533:51:9::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;-1:-1:-1;1533: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;;1533:51:9::1;::::0;::::1;;::::0;;;::::1;::::0;;:36;-1:-1:-1;1601:65:9::1;1533:24:::0;1601:22:::1;:65::i;:::-;1683:116;1725:8;:17;;;-1:-1:-1::0;;;;;1683:116:9::1;1761:8;:23;;;1683;:116::i;:::-;1240:571;;1830:10;1823:18;::::0;;;:6:::1;:18;::::0;;;;;;;-1:-1:-1;;;;;;1823: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;;1823:38:9;;::::1;-1:-1:-1::0;;;;;1823:38:9;;::::1;;-1:-1:-1::0;;;;1823:38:9::1;-1:-1:-1::0;;;1823:38:9;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;1823:38:9::1;-1:-1:-1::0;;;1823:38:9;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;1823:38:9::1;-1:-1:-1::0;;;1823: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;;;;;;1823:38:9;;::::1;-1:-1:-1::0;;;;;1823:38:9;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;1823:38:9::1;-1:-1:-1::0;;;1823:38:9;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;1874:55:::1;::::0;:19:::1;:55::i;:::-;1942:137;1973:8;:21;;;2009:8;:21;;;2045:8;:23;;;1942:16;:137::i;:::-;2092:98;2126:8;:17;;;-1:-1:-1::0;;;;;2092:98:9::1;2158:8;:21;;;2092:19;:98::i;:::-;2280:9;-1:-1:-1::0;;;;;2208:303:9::1;2255:10;-1:-1:-1::0;;;;;2208:303:9::1;2233:7;-1:-1:-1::0;;;;;2208:303:9::1;;;2304:8;:21;;;2340:8;:21;;;2376:8;:23;;;2414:8;:17;;;2446:8;:17;;;2478:8;:22;;;2208:303;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;2208:303:9::1;;;;;;-1:-1:-1::0;;;;;2208:303:9::1;;;;;;;;;;;;;;;;;;;;;;;;;2532:7:::0;;-1:-1:-1;2541:9:9;-1:-1:-1;;376:2195:9;;;;;;;:::o;5342:59:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5342:59:0;;;;-1:-1:-1;;;5342:59:0;;;;;-1:-1:-1;;;5342:59:0;;;;;-1:-1:-1;;;5342:59:0;;;;;;;;;;-1:-1:-1;;;;;5342:59:0;;;-1:-1:-1;;;5342:59:0;;;;;:::o;705:47:8:-;;;;;;;;;;;;;;;;;;;:::o;1487:322:11:-;1645:21;;-1:-1:-1;;;;;1645:21:11;1631:10;:35;1609:110;;;;;;1732:69;1752:16;1783:7;1732:5;:69::i;3031:846:4:-;3197:27;3242:13;3268:1;3258:7;:11;:62;;;;-1:-1:-1;;;;;;3286:24:4;;;;;;:13;:24;;;;;;:34;-1:-1:-1;3258:62:4;:139;;-1:-1:-1;;;;;3373:24:4;;;;;;:13;:24;;;;;;3258:139;;;-1:-1:-1;;;;;3336:24:4;;;;;;:13;:24;;;;;;:34;;;3258:139;3242:155;;3410:14;3437:1;3427:7;:11;:43;;;;;3463:7;3455:5;:15;3427:43;:78;;3504:1;3427:78;;;3494:7;3486:5;:15;3427:78;3410:95;;3518:9;3575:6;3567:5;:14;-1:-1:-1;;;;;3553:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3553:29:4;-1:-1:-1;3540:42:4;-1:-1:-1;3618:5:4;3595:275;3635:6;3625:7;:16;3595:275;;;3669:12;3684:40;3695:9;-1:-1:-1;;3706:11:4;;-1:-1:-1;;;3684:10:4;:40::i;:::-;-1:-1:-1;;;;;3759:24:4;;;;;;;:13;:24;;;;;;;;-1:-1:-1;;;;;;3759:30:4;;;;;;;;;:37;3669:55;;-1:-1:-1;3743:54:4;;3759:37;3743:15;:54::i;:::-;3739:120;;;3834:4;3818:10;3829:1;3818:13;;;;;;;;-1:-1:-1;;;;;;3818:20:4;;;:13;;;;;;;;;;;:20;3840:3;;;;;3739:120;-1:-1:-1;;;3643:9:4;3595:275;;1743:445;1871:19;;1918:263;-1:-1:-1;;;;;1955:24:4;;;;;;:13;:24;;;;;;1944:35;;1918:263;;2007:12;2022:40;2033:9;-1:-1:-1;;2044:11:4;;-1:-1:-1;;;2022:10:4;:40::i;:::-;-1:-1:-1;;;;;2081:24:4;;;;;;:13;:24;;;;;;;;-1:-1:-1;;;;;;2081:30:4;;;;;;;;;:39;;;2007:55;;-1:-1:-1;2081:39:4;;2077:93;;;2141:13;;;;;2077:93;-1:-1:-1;1981:9:4;;1918:263;;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;6427:431::-;-1:-1:-1;;;;;6600:21:1;;6578:54;;;;;;-1:-1:-1;;;;;6667:23:1;;6645:56;;;;;;-1:-1:-1;;;;;6714:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;6768:82;;;;;;;;;;;;;;;;;6427:431;;;:::o;3095:618:5:-;3231:21;3270:25;2332:4:0;3298:43:5;;:15;:24;;;:43;-1:-1:-1;;;;;3270:71:5;;;3354:22;3417:17;3392:7;:22;;;:42;:100;;3475:17;3392:100;;;3450:22;;3392:100;3525:24;;;;3354:138;;-1:-1:-1;;;;;;3510:39:5;3505:201;3558:14;3551:4;:21;3505:201;;;3662:16;;;;:10;:16;;;;;:32;;;3614:28;;2942:4:0;3614:45:5;3662:32;3614:80;;;;;3597:97;;;;;3574:6;;3505:201;;;;3095:618;;;;;:::o;7376:466:4:-;7569:111;;;-1:-1:-1;;;;;7569:111:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7569:111:4;-1:-1:-1;;;7569:111:4;;;7544:147;;;;7509:12;;7523:17;;7544:10;;;;7569:111;7544:147;;;7569:111;7544:147;;7569:111;7544:147;;;;;;;;;;-1:-1:-1;;7544:147:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7508:183;;;;7726:7;:57;;;;-1:-1:-1;7738:11:4;;:16;;:44;;;7769:4;7758:24;;;;;;;;;;;;;;;-1:-1:-1;7758:24:4;7738:44;7704:130;;;;;;7376:466;;;;;:::o;3942:646:1:-;-1:-1:-1;;;;;4119:22:1;;4097:109;;;;-1:-1:-1;;;4097:109:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4241:25:1;;4219:110;;;;-1:-1:-1;;;4219:110:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4371:17:1;;:9;:17;;;;;;;;;;;:29;;4393:6;4371:21;:29::i;:::-;-1:-1:-1;;;;;4342:17:1;;;:9;:17;;;;;;;;;;;:58;;;;4445:20;;;;;;;:32;;4470:6;4445:24;:32::i;:::-;-1:-1:-1;;;;;4413:20:1;;;:9;:20;;;;;;;;;;;;:64;;;;4495:85;;;;;;;4413:20;;4495:85;;;;;;;;;;;;;3942:646;;;:::o;249:148:7:-;307:7;340:1;335;:6;;327:15;;;;;;-1:-1:-1;365:5:7;;;249:148::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:3240:8:-;3181:23;:21;:23::i;:::-;3282:7;:19;3334:22;;3217:27;;3282:19;3314:3003;3365:10;-1:-1:-1;;;;;3358:17:8;:4;:17;3314:3003;;;-1:-1:-1;;3617:8:8;;3607:19;;;;:9;:19;;;;;;;;:34;;;3584:20;;;:14;:20;;;;;;;:57;;-1:-1:-1;3658:24:8;;:::i;:::-;-1:-1:-1;3685:15:8;;;;:9;:15;;;;;;;;;3658:42;;;;;;;;;;;;;;;;;;;;;;;;;;3715:45;;;3817:19;;:41;-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;;3749:42:0;;4244:28:8;;:100;;;;;;;;;;3749:42:0;4244:100:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4244:100:8;4071:16;:296::i;:::-;3968:20;;:58;;2942: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;;;;;;;;:63;;-1:-1:-1;4750:26:8;;:::i;:::-;-1:-1:-1;4779:16:8;;;;:10;:16;;;;;;;;;4750:45;;;;;;;;;;;;;;;;;;;;;;;;;;4810:46;;;4914:22;;: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;;;;;;;;;;;;;;;;;;5584:26;;:::i;:::-;-1:-1:-1;5613:16:8;;;;:10;:16;;;;;;;;;5584:45;;;;;;;;;;;;;;;;;;;;5670:12;;:69;;-1:-1:-1;;;5670:69:8;;5719:4;5670:69;;;;;;5584:45;;-1:-1:-1;;;5670:12:8;;;-1:-1:-1;;;;;5670:12:8;;:22;;:69;;;;;;;;;;:12;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5670:69:8;5646:93;;5784:357;5870:252;5916:16;5959:13;:11;:13::i;:::-;6058:14;;5999:100;;;-1:-1:-1;;;5999:100:8;;-1:-1:-1;;;6058:14:8;;;;;;5999:100;;;;3749:42:0;;5999:28:8;;:100;;;;;;;;;;;;;;3749:42:0;5999:100:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5999:100:8;5870:19;:252::i;5784:357::-;5756:25;;;;:385;;;6199:16;;;;:10;:16;;;;;;:28;;;;;;;;;;;6244:22;:20;:22::i;:::-;-1:-1:-1;;6281:22:8;:24;;;;;;;;;3377:6;;;;;-1:-1:-1;3314:3003:8;;;;3084:3240;;;:::o;3760:1789:6:-;3917:24;;:::i;:::-;-1:-1:-1;;;;;;3953:24:6;;;;;;;:13;:24;;;;;;;;-1:-1:-1;;;;;;3953:37:6;;;;;;;;;;;;3917:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4025:21;4003:54;;;;;;4087:11;;4127:12;;;;4152:18;;:::i;:::-;-1:-1:-1;;;;;;4173:14:6;;;;;;;: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;;;;;;;;;;;4228:31;4152:44;4254:4;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;4949:221:4:-;5017:4;5059:1;5041:6;:15;;;-1:-1:-1;;;;;5041:19:4;;:121;;5145:17;:15;:17::i;:::-;-1:-1:-1;;;;;5126:36:4;:6;:15;;;-1:-1:-1;;;;;5126:36:4;;;5041:121;;;5095:6;:15;;;-1:-1:-1;;;;;5076:34:4;:6;:15;;;-1:-1:-1;;;;;5076:34:4;;;5034:128;;4949: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;5565:147:4:-;5654:15;;;;5630:4;;5654:24;;:50;;;5682:22;5697:6;5682:14;:22::i;6004:802:9:-;-1:-1:-1;;;;;6233:15:9;;6132:20;6233:15;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;6233:25:9;;;;;;;;;:34;;;6132:20;;-1:-1:-1;;;6233:34:9;;;;6211:111;;;;;;-1:-1:-1;;;;;6344:15:9;;;;;;:6;:15;;;;;;;;-1:-1:-1;;;;;;6344:25:9;;;;;;;;;;-1:-1:-1;6398:17:9;:15;:17::i;:::-;6380:15;;;:35;;-1:-1:-1;;;;;6380:35:9;-1:-1:-1;;;;;;;;6380:35:9;;;;;;;;;;;;;6448:30;;;;;;;;;;;;-1:-1:-1;6448:30:9;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6448:30:9;;;;;;;;-1:-1:-1;;;6448:30:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6380:35;6448:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;6448:30:9;;;;;;-1:-1:-1;;;6448:30:9;;;;;;;;;;;;:22;:30::i;:::-;6426:19;;;:52;;;6500:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6500:31:9;;;;;;;-1:-1:-1;;;6500:31:9;;;;;;;;-1:-1:-1;;;6500:31:9;;;;;;;;-1:-1:-1;;;6500:31:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6500:31:9;;;;;;-1:-1:-1;;;6500:31:9;;;;;;;;;;;;:23;:31::i;:::-;6544:15;;;:23;;-1:-1:-1;;;;6544:23:9;;;;6622:19;;;6489:42;;-1:-1:-1;6580:133:9;;6600:7;;6622:30;-1:-1:-1;6622:80:9;;6701:1;6622:80;;;6690:8;6668:6;:19;;;:30;6622:80;6580:5;:133::i;:::-;6726:72;6746:7;6768:6;:19;;;6726:5;:72::i;:::-;6004:802;;;;;:::o;947:588:3:-;1124:7;:19;:29;-1:-1:-1;1124:74:3;;1197:1;1124:74;;;1165:7;:19;:29;;;1124:74;1093:7;:105;1242:19;;:29;-1:-1:-1;1242:74:3;;1315:1;1242:74;;;1283:19;;:29;;;1242:74;1211:19;:105;1333:12;;1329:173;;1402:22;;:33;-1:-1:-1;1402:86:3;;1487:1;1402:86;;;1451:22;;:33;;;1402:86;1364:22;:124;1329:173;1514:13;:11;:13::i;9932:550:9:-;10063:19;10072:9;10063:8;:19::i;:::-;10059:416;;;10142:25;;;;:14;:25;;;;;;:35;-1:-1:-1;10142:90:9;;10231:1;10142:90;;;10193:25;;;;:14;:25;;;;;;:35;;;10142:90;10101:25;;;;:14;:25;;;;;:131;10059:416;;;10269:12;10284:18;:16;:18::i;:::-;-1:-1:-1;;;;;10269:33:9;10363:15;;;;:9;:15;;;;;:30;;;10269:33;;-1:-1:-1;10363:40:9;-1:-1:-1;10363:100:9;;10462:1;10363:100;;;10419:15;;;;:9;:15;;;;;:30;;;:40;;;10363:100;10317:15;;;;:9;:15;;;;;;:30;;:146;9932: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;15999:249:9:-;16120:12;;16116:125;;-1:-1:-1;;;;;16190:25:9;;;;;;:14;:25;;;;;;:39;;16220:8;16190:29;:39::i;:::-;-1:-1:-1;;;;;16149:25:9;;;;;;:14;:25;;;;;:80;15999:249;;:::o;10490:906::-;10727:1;10712:12;:16;:51;;;;-1:-1:-1;2232:2:0;10732:17:9;:15;:17::i;:::-;-1:-1:-1;;;;;10732:31:9;;10712:51;10708:577;;;10782:21;10806:183;10842:13;10874;10906:12;10937:9;10965;10806:17;:183::i;:::-;11026:18;;10782:207;;-1:-1:-1;11010:34:9;;11006:245;;;11123:18;;:36;;11155:3;;11123:27;;11146:3;11123:22;:27::i;:36::-;11107:13;:52;:128;;11199:18;;:36;;11231:3;;11199:27;;11222:3;11199:22;:27::i;:36::-;11107:128;;;11183:13;11107:128;11065:18;:170;11006:245;11267:7;;;10708:577;2232:2:0;11301:17:9;:15;:17::i;:::-;-1:-1:-1;;;;;11301:32:9;;11297:92;;;11371:6;11350:18;:27;10490:906;;;;;:::o;6145:187:4:-;6214:7;6259;:22;;;6241:6;:15;;;-1:-1:-1;;;;;6241:40:4;;:83;;6309:6;:15;;;-1:-1:-1;;;;;6241:83:4;;;;-1:-1:-1;;6284:22:4;;;6145:187::o;6340:159::-;6406:7;6433:6;:16;;;6453:1;6433:21;:58;;6475:6;:16;;;6433:58;;;-1:-1:-1;6457:15:4;;;-1:-1:-1;;;;;6433:58:4;;6340:159::o;93:148:7:-;151:7;183:5;;;207:6;;;;199:15;;;;;17037:380:9;17207:21;17266:9;17246:164;17284:9;17277:4;:16;17246:164;;;17367:15;;;;:9;:15;;;;;:31;;;2942:4:0;17335:29:9;;17367:31;17335:63;;;;;17318:80;;;;;17295:6;;17246:164;;;;17037:380;;;;;:::o;5720:242:4:-;5810:15;;;;5783:7;;5810:24;:144;;5909:45;5919:17;:15;:17::i;:::-;-1:-1:-1;;;;;5909:45:4;5938:6;:15;;;-1:-1:-1;;;;;5909:45:4;:9;:45::i;5810:144::-;5850:43;5860:6;:15;;;-1:-1:-1;;;;;5850:43:4;5877:6;:15;;;-1:-1:-1;;;;;5850:43:4;:9;:43::i;13277:411:9:-;13474:7;13506:26;13522:9;13506:15;:26::i;:::-;:174;;13622:58;13636:13;13651:9;13662:11;13675:4;13622:13;:58::i;:::-;13506:174;;;13548:58;13562:13;13577:9;13588:11;13601:4;13548:13;:58::i;:::-;13499:181;13277:411;-1:-1:-1;;;;;13277:411:9:o;4862:477:1:-;-1:-1:-1;;;;;5008:23:1;;4986:104;;;;;-1:-1:-1;;;4986:104:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;5127:12;;:24;;5144:6;5127:16;:24::i;:::-;5103:12;:48;-1:-1:-1;;;;;5194:18:1;;:9;:18;;;;;;;;;;;:30;;5217:6;5194:22;:30::i;:::-;-1:-1:-1;;;;;5164:18:1;;:9;:18;;;;;;;;;;;:60;;;;5242:89;;;;;;;5164:18;;:9;;5242:89;;;;;;;;;;4862:477;;:::o;15654:167:9:-;15725:7;15752:6;:15;;;:61;;15794:6;:19;;;15752:61;;;15770:21;15784:6;15770:13;:21::i;16256:237::-;16375:7;16407:24;16424:6;16407:16;:24::i;:::-;:50;;;;16435:22;16450:6;16435:14;:22::i;:::-;16407:78;;16464:21;16478:6;16464:13;:21::i;7850:517:4:-;8067:134;;;-1:-1:-1;;;;;8067:134:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8067:134:4;-1:-1:-1;;;8067:134:4;;;8042:170;;;;8007:12;;8021:17;;8042:10;;;;8067:134;8042:170;;;8067:134;8042:170;;8067:134;8042:170;;;;;;;;;;-1:-1:-1;;8042:170:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8006:206;;;;8247:7;:57;;;;-1:-1:-1;8259:11:4;;:16;;:44;;;8290:4;8279:24;;;;;;;;;;;;;;;-1:-1:-1;8279:24:4;8259:44;8225:134;;;;;;7850: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;4795:146::-;-1:-1:-1;;;;;4901:28:4;;;;;:19;:28;;;;;;;4932:1;4901:32;4870:63;;4795:146::o;7059:309::-;7249:16;;;7263:1;7249:16;;;;;;;;;7201:22;;7249:16;;;7201:22;;7249:16;;;;;-1:-1:-1;7249:16:4;7241:24;;7287:13;7276:5;7282:1;7276:8;;;;;;;;;;;;;:24;-1:-1:-1;;;;;7276:24:4;;;-1:-1:-1;;;;;7276:24:4;;;;;3349:42:0;7311:5:4;7317:1;7311:8;;;;;;;;;;;;;:15;-1:-1:-1;;;;;7311:15:4;;;-1:-1:-1;;;;;7311:15:4;;;;;7348:12;7337:5;7343:1;7337:8;;;;;;;;;;;;;:23;-1:-1:-1;;;;;7337:23:4;;;-1:-1:-1;;;;;7337:23:4;;;;;7059:309;;;;:::o;172:195::-;302:18;349:9;;;;172:195::o;2736:1416:9:-;2927:22;;:::i;:::-;2964:16;2995;3039:66;3059:7;3081:13;3039:5;:66::i;:::-;3130:14;:12;:14::i;:::-;3118:26;;3166:24;3182:7;3166:15;:24::i;:::-;-1:-1:-1;;;;;3203:30:9;;;:18;;;:30;;;3244;;;:18;;;:30;3306:21;;;3285:42;;;:18;;;:42;3359:4;3338:18;;;:25;-1:-1:-1;3376:22:9;;:38;;;3554:18;;3155:35;;-1:-1:-1;3450:133:9;;3401:13;;3203:30;3530:9;;3450:13;:133::i;:::-;3425:158;;3596:22;:20;:22::i;:::-;-1:-1:-1;3695:22:9;;;;3657:19;;:95;;2085:15:0;;3657:61:9;;:37;:61::i;:95::-;3631:23;;;:121;3769:26;3785:9;3769:15;:26::i;:::-;3765:380;;;-1:-1:-1;;;;;3814:30:9;;:18;;;:30;;;3933:23;;;;3861:110;;3814:30;3861:16;:110::i;:::-;4015:118;4049:13;4081:9;-1:-1:-1;;;;;4015:118:9;4109:9;4015:15;:118::i;:::-;3988:24;;;:145;2736: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;4653:134::-;-1:-1:-1;;;;;4751:24:4;;;;;:13;:24;;;;;;;4778:1;4751:28;4724:55;;4653: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;4526:119:4:-;-1:-1:-1;;;;;4614:19:4;;;;;:10;:19;;;;;;;4636:1;4614:23;4592:45;;4526:119::o;487:452:3:-;664:7;:19;:32;;688:7;664:23;:32::i;:::-;633:7;:63;740:19;;:32;;764:7;740:23;:32::i;:::-;709:19;:63;789:12;;785:121;;858:22;;:36;;885:8;858:26;:36::i;9717:207:9:-;9878:25;;;;:14;:25;;;;;;:38;;9908:7;9878:29;:38::i;:::-;9841:25;;;;:14;:25;;;;;;:75;;;;-1:-1:-1;9717:207:9:o;6749:122:4:-;-1:-1:-1;;;;;6839:24:4;;;;6749:122::o;628:155:10:-;698:6;2142:13:0;745:11:10;732:24;;731:43;;;628:155;-1:-1:-1;;628:155:10:o;7099:250:8:-;7241:7;7326:15;7308;7284:12;7269;:27;7300:5;7268:37;:55;;;;;;:73;;7099:250;-1:-1:-1;;;;;7099:250:8:o;7357:183::-;2543:9:0;7479:27:8;;7510:5;7478:37;:54;;7357:183::o;7548:210::-;7668:7;7735:15;7711:12;7696;:27;7727:5;7695:37;:55;;;;6505:586;6574:22;;-1:-1:-1;;;6574:22:8;;;;:31;;6601:4;6574:31;:83;;;;-1:-1:-1;6622:14:8;;2645:6:0;-1:-1:-1;;;6622:14:8;;;:35;:14;:35;6574:83;6556:259;;;6714:14;;;-1:-1:-1;;;;6697:35:8;;-1:-1:-1;;;6714:14:8;;;;;;;;6731:1;6714:18;6697:35;;;;;;6747;;;6764:14;;;-1:-1:-1;;6764:18:8;6747:35;;;;;;6797:7;;6556:259;6843:22;;-1:-1:-1;;;6843:22:8;;;;:31;;;:83;;-1:-1:-1;6891:14:8;;2645:6:0;6891:35:8;:14;;;:35;6843:83;6825:259;;;6983:14;;;-1:-1:-1;;;;6966:35:8;;6983:14;;;;7000:1;6983:18;6966:35;;;7016;;;-1:-1:-1;;;7033:14:8;;;;;;-1:-1:-1;;7033:18:8;7016:35;;;;;;;7066:7;;5970:167:4;6050:7;6090:8;6077:10;:21;:52;;6105:24;:8;6118:10;6105:12;:24::i;:::-;6077:52;;;-1:-1:-1;6101:1:4;;5970:167;-1:-1:-1;;5970:167:4:o;5178:150::-;-1:-1:-1;;;;;5278:23:4;5254:4;5278:23;;;:12;:23;;;;;:37;;;:42;;5178: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;;2942:4:0;7111:36:6;7150:32;7111:71;;;;;7090:92;;;;;7067:6;;7018:176;;16735:294:9;16853:7;16885:136;16917:6;:19;;;16951:20;16964:6;16951:12;:20::i;:::-;16987:23;17003:6;16987:15;:23::i;:::-;16885:17;:136::i;1543:265:3:-;1767:22;;1629:19;;1767:7;1663:19;1697:18;;1730:22;;1604:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1543:265::o;6629:112:4:-;6684:4;6716:17;:15;:17::i;:::-;-1:-1:-1;;;;;6708:25:4;;;;;;6629:112;-1:-1:-1;6629:112:4:o;514:106:10:-;565:6;611:1;591:17;:15;:17::i;:::-;:21;584:28;;514:106;:::o;6507:114:4:-;6564:4;6596:17;:15;:17::i;:::-;-1:-1:-1;;;;;6588:25:4;;;;;;6507:114;-1:-1:-1;6507: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;11404:560:9:-;11638:7;11665:20;11688:86;11712:9;11723:26;11739:9;11723:15;:26::i;:::-;:40;;11759:4;11723:40;;;11752:4;11723:40;11688:86;;:9;:86::i;:::-;11665:109;-1:-1:-1;11807:149:9;11943:12;11807:113;11916:3;11807:86;11665:109;11807:86;:13;11843;11807:35;:50::i;:::-;:72;;:86::i;:149::-;11787:169;11404:560;-1:-1:-1;;;;;;;11404:560:9:o;13696:355::-;13895:7;13927:116;14038:4;13927:92;13985:33;13995:9;14006:11;13985:9;:33::i;:::-;13927:39;13939:13;13954:11;13927;:39::i;15829:162::-;15895:7;15922:24;15939:6;15922:16;:24::i;:::-;:61;;15953:30;15976:6;15953:22;:30::i;5336:221:4:-;5406:4;5448:1;5430:6;:15;;;-1:-1:-1;;;;;5430:19:4;;:119;;5532:17;:15;:17::i;:::-;-1:-1:-1;;;;;5514:35:4;:6;:15;;;-1:-1:-1;;;;;5514:35:4;;5430:119;;;5483:6;:15;;;-1:-1:-1;;;;;5465:33:4;:6;:15;;;-1:-1:-1;;;;;5465:33:4;;5423:126;;5336:221;;;:::o;16501:226:9:-;16594:7;16715:4;16689:20;16702:6;16689:12;:20::i;:::-;16683:1;16663:17;16673:6;16663:9;:17::i;:::-;:21;16656:3;:29;:54;;;;;;16649:3;:62;16626:6;:19;;;:86;:93;;;;5672:479:1;-1:-1:-1;;;;;5818:23:1;;5796:106;;;;-1:-1:-1;;;5796:106:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5945:18:1;;:9;:18;;;;;;;;;;;:30;;5968:6;5945:22;:30::i;:::-;-1:-1:-1;;;;;5915:18:1;;:9;:18;;;;;;;;;;:60;6012:12;;:24;;6029:6;6012:16;:24::i;:::-;5988:12;:48;6054:89;;;;;;;;6107:3;;-1:-1:-1;;;;;6054:89:1;;;;;;;;;;;;5672:479;;:::o;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;;2085:15:0;2711:75:6;;;;;;;;;;;;2770:5;2711:75;;;;;;;;2682:7;;3477:42:0;;2711:28:6;;2085: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;15134:512:9:-;15303:7;15348:35;15373:9;15348:24;:35::i;:::-;:81;;;-1:-1:-1;2449:3:0;15400:29:9;;15348:81;:290;;15470:168;15506:13;15542:9;15574:7;:18;;;15615:4;15470:13;:168::i;992:204:6:-;-1:-1:-1;;;;;1135:23:6;1106:4;1135:23;;;:12;:23;;;;;:35;2989: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;14059:433:9:-;14192:7;14473:11;14310:160;2332:4:0;14342:28:9;;:80;;14421:1;14342:80;;;-1:-1:-1;;14390:28:9;;14342:80;3152:15:0;2389:5;14310:13:9;:160::i;:::-;14237:57;14251:9;3059:17:0;2332:4;14237:13:9;:57::i;:::-;:233;:247;;14059:433;-1:-1:-1;;;14059:433:9:o;14848:278::-;14987:7;15032:86;15106:11;15032:51;:13;2942:4:0;15032:35:9;:51::i;6879:172:4:-;6945:7;7003:1;6985:6;:15;;;-1:-1:-1;;;;;6985:19:4;;:58;;7042:1;6985:58;;;7038:1;7020:6;:15;;;:19;6985:58;-1:-1:-1;;;;;6965:78:4;;6879:172;-1:-1:-1;;6879:172:4:o;14500:340:9:-;14659:7;14691:141;14827:4;14718:8;14706:9;:20;:101;;14786:21;:9;14800:6;14786:13;:21::i;:::-;14706:101;;;14746:20;:8;14759:6;14746:12;:20::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::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://4aa899dc8e12f409e25fd25517776a96df8b7355aeff60acb53b551cc3ab286d
Loading...
Loading
Loading...
Loading
[ 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.