ETH Price: $3,374.21 (-1.22%)
Gas: 10 Gwei

Contract

0x66a0f676479Cee1d7373f3DC2e2952778BfF5bd6
 

More Info

Private Name Tags

TokenTracker

Wise Token (WISE) (@$0.2255)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x2475c264bb156038beec3b6f712b383862c27fd46eff4fcae308e9307f1d5403 Transfer(pending)2024-06-26 17:11:272 hrs ago1719421887IN
Wise: WISE Token
0 ETH(Pending)(Pending)
0x13dd58425a9cc0778a9210cca3e0dafb88f578b6b3e32fa522ad82d8346d8d5b Transfer From(pending)2024-06-26 1:41:0617 hrs ago1719366066IN
Wise: WISE Token
0 ETH(Pending)(Pending)
0x570ce65f8db94596b375916615f6101ea3ee81fdc76f9ba448bf71ea0b08589a End Stake(pending)2024-06-23 15:50:553 days ago1719157855IN
Wise: WISE Token
0 ETH(Pending)(Pending)
0x83c5900093f94737f7e9603d0cf02a63a32354098137a9f9269fdafc8c7cc74e Create Stake(pending)2024-06-23 3:05:023 days ago1719111902IN
Wise: WISE Token
0 ETH(Pending)(Pending)
0x78d9d2197a7601a8f897b277bb6a0e9c294c2bb10fc0090090bfa98107204ab6 End Stake(pending)2024-06-23 1:40:103 days ago1719106810IN
Wise: WISE Token
0 ETH(Pending)(Pending)
End Stake201770802024-06-26 16:32:592 hrs ago1719419579IN
Wise: WISE Token
0 ETH0.005369319.810753
Referrer Interes...201758752024-06-26 12:30:357 hrs ago1719405035IN
Wise: WISE Token
0 ETH0.001676555.60297844
Referrer Interes...201757032024-06-26 11:55:597 hrs ago1719402959IN
Wise: WISE Token
0 ETH0.000734396.17438367
Referrer Interes...201756672024-06-26 11:48:477 hrs ago1719402527IN
Wise: WISE Token
0 ETH0.003443573.63223858
Approve201747552024-06-26 8:45:5910 hrs ago1719391559IN
Wise: WISE Token
0 ETH0.000257895.54972009
Transfer201747022024-06-26 8:35:2310 hrs ago1719390923IN
Wise: WISE Token
0 ETH0.000183023.90609047
Approve201739112024-06-26 5:55:5913 hrs ago1719381359IN
Wise: WISE Token
0 ETH0.000079641.71165015
Scrape Interest201739062024-06-26 5:54:5913 hrs ago1719381299IN
Wise: WISE Token
0 ETH0.00203182.61068365
Scrape Interest201739022024-06-26 5:54:1113 hrs ago1719381251IN
Wise: WISE Token
0 ETH0.002314442.41605383
Approve201710692024-06-25 20:25:3523 hrs ago1719347135IN
Wise: WISE Token
0 ETH0.000332647.20096664
Approve201706962024-06-25 19:10:1124 hrs ago1719342611IN
Wise: WISE Token
0 ETH0.000380578.17907437
End Stake201706602024-06-25 19:02:5924 hrs ago1719342179IN
Wise: WISE Token
0 ETH0.007595417.8472669
Referrer Interes...201657602024-06-25 2:37:3540 hrs ago1719283055IN
Wise: WISE Token
0 ETH0.00124633.53575621
Approve201657232024-06-25 2:29:5941 hrs ago1719282599IN
Wise: WISE Token
0 ETH0.000275055.91133595
End Stake201657092024-06-25 2:27:1141 hrs ago1719282431IN
Wise: WISE Token
0 ETH0.004046394.18056374
Approve201655102024-06-25 1:47:1141 hrs ago1719280031IN
Wise: WISE Token
0 ETH0.000174793.75660826
End Stake201654762024-06-25 1:40:2341 hrs ago1719279623IN
Wise: WISE Token
0 ETH0.007920333.0206238
End Stake201654692024-06-25 1:38:5941 hrs ago1719279539IN
Wise: WISE Token
0 ETH0.006680543.39618368
Approve201653962024-06-25 1:24:1142 hrs ago1719278651IN
Wise: WISE Token
0 ETH0.000267225.78027569
Approve201646852024-06-24 23:01:1144 hrs ago1719270071IN
Wise: WISE Token
0 ETH0.00016193.50485973
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
193015302024-02-25 2:10:47122 days ago1708827047
Wise: WISE Token
0.5 ETH
192803902024-02-22 3:09:11125 days ago1708571351
Wise: WISE Token
2.2 ETH
190144822024-01-15 19:50:47162 days ago1705348247
Wise: WISE Token
4 ETH
173228152023-05-23 15:27:47400 days ago1684855667
Wise: WISE Token
0.01 ETH
173228152023-05-23 15:27:47400 days ago1684855667
Wise: WISE Token
0.01 ETH
172830032023-05-18 0:52:59405 days ago1684371179
Wise: WISE Token
1.76 ETH
172587252023-05-14 14:35:47409 days ago1684074947
Wise: WISE Token
0.01 ETH
172587252023-05-14 14:35:47409 days ago1684074947
Wise: WISE Token
0.01 ETH
172587032023-05-14 14:31:11409 days ago1684074671
Wise: WISE Token
0.01 ETH
172587032023-05-14 14:31:11409 days ago1684074671
Wise: WISE Token
0.01 ETH
172374512023-05-11 13:36:59412 days ago1683812219
Wise: WISE Token
0.01 ETH
172374512023-05-11 13:36:59412 days ago1683812219
Wise: WISE Token
0.01 ETH
172163032023-05-08 14:15:35415 days ago1683555335
Wise: WISE Token
0.01 ETH
172163032023-05-08 14:15:35415 days ago1683555335
Wise: WISE Token
0.01 ETH
172091602023-05-07 14:08:47416 days ago1683468527
Wise: WISE Token
0.01 ETH
172091602023-05-07 14:08:47416 days ago1683468527
Wise: WISE Token
0.01 ETH
171876202023-05-04 13:32:47419 days ago1683207167
Wise: WISE Token
0.01 ETH
171876202023-05-04 13:32:47419 days ago1683207167
Wise: WISE Token
0.01 ETH
171876102023-05-04 13:30:23419 days ago1683207023
Wise: WISE Token
0.01 ETH
171876102023-05-04 13:30:23419 days ago1683207023
Wise: WISE Token
0.01 ETH
171290442023-04-26 7:53:47427 days ago1682495627
Wise: WISE Token
2 ETH
170240662023-04-11 9:48:23442 days ago1681206503
Wise: WISE Token
0.14 ETH
169113192023-03-26 11:31:23458 days ago1679830283
Wise: WISE Token
0.1 ETH
167383832023-03-02 4:01:59482 days ago1677729719
Wise: WISE Token
0.1 ETH
165343962023-02-01 13:55:11511 days ago1675259711
Wise: WISE Token
0.67 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WiseToken

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

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

pragma solidity =0.7.6;

import "./LiquidityToken.sol";

contract WiseToken is LiquidityToken {

    address public LIQUIDITY_TRANSFORMER;
    address public transformerGateKeeper;

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

    receive() external payable {
        revert();
    }

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

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

        _mint(
            _investorAddress,
            _amount
        );
    }

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

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

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

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

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

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

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

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

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

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

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

pragma solidity =0.7.6;

import "./Global.sol";

interface IUniswapV2Factory {

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

interface IUniswapRouterV2 {

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

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

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

interface IUniswapV2Pair {

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

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

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

interface ERC20TokenI {

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

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

abstract contract Declaration is Global {

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

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

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

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

    uint64 constant PRECISION_RATE = 1E18;

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

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

    uint256 immutable LAUNCH_TIME;

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

    IUniswapRouterV2 public constant UNISWAP_ROUTER = IUniswapRouterV2(
        0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
    );

    IUniswapV2Factory public constant UNISWAP_FACTORY = IUniswapV2Factory(
        0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
    );

    ILiquidityGuard public constant LIQUIDITY_GUARD = ILiquidityGuard(
        0x9C306CaD86550EC80D77668c0A8bEE6eB34684B6
    );

    IUniswapV2Pair public UNISWAP_PAIR;
    bool public isLiquidityGuardActive;

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

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

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

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

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

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

    struct CriticalMass {
        uint256 totalAmount;
        uint256 activationDay;
    }

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

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

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

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

pragma solidity =0.7.6;

contract Context {

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

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

contract ERC20 is Context {

    using SafeMath for uint256;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

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

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

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

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

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

        emit Transfer(
            sender,
            recipient,
            amount
        );
    }

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

        _totalSupply =
        _totalSupply.add(amount);

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

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

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

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

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

        _totalSupply =
        _totalSupply.sub(amount);

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

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

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

        _allowances[owner][spender] = amount;

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

import "./SafeMath.sol";

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

pragma solidity =0.7.6;

contract Events {

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

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

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

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

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

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

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

    event LiquidityGuardStatus(
        bool isActive
    );
}

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

pragma solidity =0.7.6;

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

abstract contract Global is ERC20, Events {

    using SafeMath for uint256;

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

    Globals public globals;

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

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

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

        if (_rshares > 0) {

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

        _logGlobals();
    }

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

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

        if (_rshares > 0) {

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

        }

        _logGlobals();
    }

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

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

pragma solidity =0.7.6;

import "./Timing.sol";

abstract contract Helper is Timing {

    using SafeMath for uint256;

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

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

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

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

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

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

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

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

        uint256 i;

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

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

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

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

        uint256 i;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity =0.7.6;

import "./StakingToken.sol";

abstract contract LiquidityToken is StakingToken {

    using SafeMath for uint;

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

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

        LiquidityStake memory newLiquidityStake;

        liquidityStakeID = generateLiquidityStakeID(
            msg.sender
        );

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

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

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

        _increaseLiquidityStakeCount(
            msg.sender
        );
    }

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

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

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

        liquidityStake.rewardAmount = _calculateRewardAmount(
            liquidityStake
        );

        _mint(
            msg.sender,
            liquidityStake.rewardAmount
        );

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

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

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

        return liquidityStake.rewardAmount;
    }

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

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

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

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

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

pragma solidity =0.7.6;

import "./Snapshot.sol";

abstract contract ReferralToken is Snapshot {

    using SafeMath for uint256;

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

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

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

        } else {

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

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

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

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

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

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

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

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

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

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

        require(
            link.isActive == true
        );

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

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

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

        if (_stakeEnded(stake)) {

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

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

                finalDay =
                startDay.add(_processDays);

            } else {

                link.isActive = false;
            }

        } else {

            _processDays = _daysDiff(startDay, _currentWiseDay());

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

            finalDay =
            startDay.add(_processDays);
        }

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

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

        referrerLinks[_referrer][_referralID] = link;

        _mint(
            _referrer,
            referralInterest
        );

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

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

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

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

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

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

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

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

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

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

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

pragma solidity =0.7.6;

library SafeMath {

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

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {

        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);
        return c;
    }

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

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

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

pragma solidity =0.7.6;

import "./Helper.sol";

abstract contract Snapshot is Helper {

    using SafeMath for uint;

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

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

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

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

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

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

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

        emit UniswapReserves(
            reserveA,
            reserveB,
            blockTimestampLast
        );

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

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

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

        emit LiquidityGuardStatus(
            isLiquidityGuardActive
        );
    }

    function enableLiquidityGuard() private {
        isLiquidityGuardActive = true;
    }

    function disableLiquidityGuard() private {
        isLiquidityGuardActive = false;
    }

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

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

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

        _dailySnapshotPoint(_updateDay);
    }

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

        uint256 scheduledToEndToday;
        uint256 totalStakedToday = globals.totalStaked;

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

pragma solidity =0.7.6;

import "./ReferralToken.sol";

abstract contract StakingToken is ReferralToken {

    using SafeMath for uint256;

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

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

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

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

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

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

        if (newStake.referrerShares > 0) {

            ReferrerLink memory referrerLink;

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

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

            _increaseReferralCount(
                _referrer
            );

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

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

        _increaseStakeCount(
            msg.sender
        );

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

        _addScheduledShares(
            newStake.finalDay,
            newStake.stakesShares
        );

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

        return (stakeID, _startDay, referralID);
    }

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

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

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

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

        _updateDaiEquivalent();

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

        if (_nonZeroAddress(_referrer)) {

            _newStake.referrer = _referrer;

            _addCriticalMass(
                _newStake.referrer,
                _newStake.daiEquivalent
            );

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

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

        _endStake(
            msg.sender,
            _stakeID
        );

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

        _removeScheduledShares(
            endedStake.finalDay,
            endedStake.stakesShares
        );

        _removeReferrerSharesToEnd(
            endedStake.finalDay,
            endedStake.referrerShares
        );

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

        _storePenalty(
            endedStake.closeDay,
            penaltyAmount
        );

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

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

        return endedStake.rewardAmount;
    }

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

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

        _stake.isActive = false;

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

        _mint(
            _staker,
            _stake.rewardAmount
        );
    }

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

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

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

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

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

        if (_isMatureStake(stake) == false) {

            remainingDays = _daysLeft(stake);

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

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

            _removeScheduledShares(
                stake.finalDay,
                stakersPenalty
            );

            if (stake.referrerShares > 0) {

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

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

                _removeReferrerSharesToEnd(
                    stake.finalDay,
                    referrerPenalty
                );
            }

            _decreaseGlobals(
                0,
                stakersPenalty,
                referrerPenalty
            );

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

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

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

        _mint(
            msg.sender,
            scrapeAmount
        );

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

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

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

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

        } else {

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

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

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

            if (newSharePrice > globals.sharePrice) {

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

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

                globals.sharePrice = newSharePrice;
            }

            return;
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity =0.7.6;

import "./Declaration.sol";

abstract contract Timing is Declaration {

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

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

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

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

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

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

Contract Security Audit

Contract ABI

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

67059b4bdc09420000600555600c80546201925863ffffffff199091161763ffffffff60201b1916660186a6000000001790556101006040523060a090815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260c052736b175474e89094c44da98b954eedeac495271d0f60e0526200007e90600e9060036200012d565b503480156200008c57600080fd5b50604080518082018252600a8152692bb4b9b2902a37b5b2b760b11b6020808301918252835180850190945260048452635749534560e01b908401528151919291620000db9160029162000197565b508051620000f190600390602084019062000197565b50506004805460ff191660121790555067016345785d8a0000600855635fa9d800608052601e80546001600160a01b0319163317905562000231565b82805482825590600052602060002090810192821562000185579160200282015b828111156200018557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200014e565b50620001939291506200021a565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001cf576000855562000185565b82601f10620001ea57805160ff191683800117855562000185565b8280016001018555821562000185579182015b8281111562000185578251825591602001919060010190620001fd565b5b808211156200019357600081556001016200021b565b608051615e836200025160003980611b9852806155235250615e836000f3fe6080604052600436106103bb5760003560e01c806395d89b41116101f2578063c31245251161010d578063dd62ed3e116100a0578063e3073bfb1161006f578063e3073bfb146113aa578063e742806a146113d4578063e7881cda1461140d578063fc527bf51461144c576103c5565b8063dd62ed3e146111ee578063df0618d214611229578063df2d02b1146112a3578063e1d033e9146112eb576103c5565b8063d6565a2d116100dc578063d6565a2d14611149578063d826492014611173578063d8d44a2914611188578063db74559b146111bb576103c5565b8063c312452514611072578063c74c0fac146110ba578063ce8f9f00146110cf578063d1cf9098146110f9576103c5565b8063ae3d1de211610185578063be21ff7011610154578063be21ff7014610f52578063bf58f6d214610f7c578063c172628e14610fc5578063c23d656414611048576103c5565b8063ae3d1de214610ecb578063b381a81114610efe578063b543c4ba14610f13578063bba85e1f14610f28576103c5565b8063a4ed0550116101c1578063a4ed055014610d8e578063a50af89514610e2b578063a9059cbb14610e5f578063a91b19f214610e98576103c5565b806395d89b4114610cc257806399c2def414610cd75780639b57ab1214610d0b5780639e78fb4f14610d79576103c5565b806348e4ccab116102e257806370a08231116102755780638649102b116102445780638649102b14610bb357806387da627414610bfb57806389201d4e14610c105780638a26306014610cad576103c5565b806370a082311461095857806375c3fa4f1461098b578063763241d3146109be578063779e2e1814610b70576103c5565b8063601f37ac116102b1578063601f37ac146108ca57806360e4c651146108fd578063613fc9fd1461092e5780636ba631cf14610943576103c5565b806348e4ccab146107dc5780634dfc7a031461080d5780634f47b16d146108405780635b2023871461087a576103c5565b806320429fac1161035a57806333060d901161032957806333060d90146107035780633697e979146107365780633b58afe71461076457806342966c68146107b0576103c5565b806320429fac146105c357806323672d8a1461060657806323b872dd14610695578063313ce567146106d8576103c5565b8063095ea7b311610396578063095ea7b3146104a457806310748592146104dd57806318160ddd1461054d5780631c0b37e114610562576103c5565b80625ada7f146103ca57806302cbb266146103f157806306fdde031461041a576103c5565b366103c557600080fd5b600080fd5b3480156103d657600080fd5b506103df61157c565b60408051918252519081900360200190f35b3480156103fd57600080fd5b50610406611582565b604080519115158252519081900360200190f35b34801561042657600080fd5b5061042f611592565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610469578181015183820152602001610451565b50505050905090810190601f1680156104965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104b057600080fd5b50610406600480360360408110156104c757600080fd5b506001600160a01b038135169060200135611626565b3480156104e957600080fd5b506105206004803603604081101561050057600080fd5b5080356001600160a01b031690602001356001600160801b031916611644565b60408051958652602086019490945284840192909252606084015215156080830152519081900360a00190f35b34801561055957600080fd5b506103df6116f2565b6105976004803603604081101561057857600080fd5b5080356001600160401b031690602001356001600160a01b03166116f8565b604080516001600160801b03199485168152602081019390935292168183015290519081900360600190f35b3480156105cf57600080fd5b506103df600480360360408110156105e657600080fd5b5080356001600160a01b031690602001356001600160801b031916611947565b34801561061257600080fd5b506106456004803603606081101561062957600080fd5b506001600160a01b038135169060208101359060400135611964565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610681578181015183820152602001610669565b505050509050019250505060405180910390f35b3480156106a157600080fd5b50610406600480360360608110156106b857600080fd5b506001600160a01b03813581169160208101359091169060400135611ad1565b3480156106e457600080fd5b506106ed611b40565b6040805160ff9092168252519081900360200190f35b34801561070f57600080fd5b506103df6004803603602081101561072657600080fd5b50356001600160a01b0316611b49565b34801561074257600080fd5b5061074b611b5b565b6040805163ffffffff9092168252519081900360200190f35b34801561077057600080fd5b506107976004803603602081101561078757600080fd5b50356001600160a01b0316611b6e565b6040805192835260208301919091528051918290030190f35b3480156107bc57600080fd5b506107da600480360360208110156107d357600080fd5b5035611b87565b005b3480156107e857600080fd5b506107f1611b94565b604080516001600160401b039092168252519081900360200190f35b34801561081957600080fd5b506107da6004803603602081101561083057600080fd5b50356001600160a01b0316611bd9565b34801561084c57600080fd5b506107da6004803603604081101561086357600080fd5b506001600160801b03198135169060200135611c4a565b34801561088657600080fd5b506108ad6004803603602081101561089d57600080fd5b50356001600160a01b0316611c69565b604080516001600160801b03199092168252519081900360200190f35b3480156108d657600080fd5b506103df600480360360208110156108ed57600080fd5b50356001600160a01b0316611cc8565b34801561090957600080fd5b50610912611cda565b604080516001600160a01b039092168252519081900360200190f35b34801561093a57600080fd5b506107da611ce9565b34801561094f57600080fd5b50610912611cf6565b34801561096457600080fd5b506103df6004803603602081101561097b57600080fd5b50356001600160a01b0316611d0c565b34801561099757600080fd5b506108ad600480360360208110156109ae57600080fd5b50356001600160a01b0316611d27565b3480156109ca57600080fd5b506107da600480360360608110156109e157600080fd5b810190602081018135600160201b8111156109fb57600080fd5b820183602082011115610a0d57600080fd5b803590602001918460208302840111600160201b83111715610a2e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a7d57600080fd5b820183602082011115610a8f57600080fd5b803590602001918460208302840111600160201b83111715610ab057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610aff57600080fd5b820183602082011115610b1157600080fd5b803590602001918460208302840111600160201b83111715610b3257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611d79945050505050565b348015610b7c57600080fd5b5061040660048036036040811015610b9357600080fd5b5080356001600160a01b031690602001356001600160801b031916611dda565b348015610bbf57600080fd5b50610bdd60048036036020811015610bd657600080fd5b5035611ebe565b60408051938452602084019290925282820152519081900360600190f35b348015610c0757600080fd5b506107da611edf565b348015610c1c57600080fd5b50610c5360048036036040811015610c3357600080fd5b5080356001600160a01b031690602001356001600160801b03191661214d565b604080516001600160a01b0390991689526001600160801b031990971660208901528787019590955260608701939093529015156080860152151560a0850152151560c0840152151560e083015251908190036101000190f35b348015610cb957600080fd5b5061091261243f565b348015610cce57600080fd5b5061042f61244e565b348015610ce357600080fd5b506103df60048036036020811015610cfa57600080fd5b50356001600160801b0319166124af565b348015610d1757600080fd5b50610d4e60048036036040811015610d2e57600080fd5b5080356001600160801b03191690602001356001600160401b031661270c565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610d8557600080fd5b506107da612ba0565b348015610d9a57600080fd5b50610dd160048036036040811015610db157600080fd5b5080356001600160a01b031690602001356001600160801b031916612c6a565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501521515610120840152151561014083015251908190036101600190f35b348015610e3757600080fd5b506103df60048036036020811015610e4e57600080fd5b50356001600160801b031916612d96565b348015610e6b57600080fd5b5061040660048036036040811015610e8257600080fd5b506001600160a01b038135169060200135612f2b565b348015610ea457600080fd5b506107da60048036036020811015610ebb57600080fd5b50356001600160401b0316612f3f565b348015610ed757600080fd5b506108ad60048036036020811015610eee57600080fd5b50356001600160a01b0316612f99565b348015610f0a57600080fd5b5061074b612feb565b348015610f1f57600080fd5b50610912612ff7565b348015610f3457600080fd5b506103df60048036036020811015610f4b57600080fd5b503561300f565b348015610f5e57600080fd5b506103df60048036036020811015610f7557600080fd5b5035613021565b348015610f8857600080fd5b506108ad60048036036060811015610f9f57600080fd5b5080356001600160a01b031690602081013590604001356001600160f81b031916613033565b348015610fd157600080fd5b5061100860048036036040811015610fe857600080fd5b5080356001600160a01b031690602001356001600160801b03191661308e565b604080516001600160a01b0390961686526001600160801b0319909416602086015284840192909252606084015215156080830152519081900360a00190f35b34801561105457600080fd5b506103df6004803603602081101561106b57600080fd5b50356130da565b34801561107e57600080fd5b506110876130ec565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156110c657600080fd5b50610912613101565b3480156110db57600080fd5b506108ad600480360360208110156110f257600080fd5b5035613119565b34801561110557600080fd5b506105976004803603608081101561111c57600080fd5b506001600160a01b0381358116916020810135916001600160401b03604083013516916060013516613249565b34801561115557600080fd5b50610bdd6004803603602081101561116c57600080fd5b5035613534565b34801561117f57600080fd5b50610912613555565b34801561119457600080fd5b506107da600480360360208110156111ab57600080fd5b50356001600160a01b031661356d565b3480156111c757600080fd5b506103df600480360360208110156111de57600080fd5b50356001600160a01b03166135ad565b3480156111fa57600080fd5b506103df6004803603604081101561121157600080fd5b506001600160a01b03813581169160200135166135bf565b34801561123557600080fd5b5061126c6004803603604081101561124c57600080fd5b5080356001600160a01b031690602001356001600160801b0319166135ea565b6040805195865260208601949094526001600160401b03928316858501529116606084015215156080830152519081900360a00190f35b3480156112af57600080fd5b50610597600480360360608110156112c657600080fd5b5080359060208101356001600160401b031690604001356001600160a01b0316613637565b3480156112f757600080fd5b5061132e6004803603604081101561130e57600080fd5b5080356001600160a01b031690602001356001600160801b0319166139d2565b604080519c8d5260208d019b909b528b8b01999099526001600160401b0397881660608c015295871660808b015293861660a08a01529190941660c088015260e08701939093526101008601929092526101208501919091526001600160a01b0316610140840152151561016083015251908190036101800190f35b3480156113b657600080fd5b50610797600480360360208110156113cd57600080fd5b5035613a5e565b3480156113e057600080fd5b506107da600480360360408110156113f757600080fd5b506001600160a01b038135169060200135613a77565b34801561141957600080fd5b506106456004803603606081101561143057600080fd5b506001600160a01b038135169060208101359060400135613a98565b34801561145857600080fd5b506107da6004803603604081101561146f57600080fd5b810190602081018135600160201b81111561148957600080fd5b82018360208201111561149b57600080fd5b803590602001918460208302840111600160201b831117156114bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561150b57600080fd5b82018360208201111561151d57600080fd5b803590602001918460208302840111600160201b8311171561153e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613c02945050505050565b600d5481565b600c54600160e01b900460ff1681565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561161b5780601f106115f05761010080835404028352916020019161161b565b820191906000526020600020905b8154815290600101906020018083116115fe57829003601f168201915b505050505090505b90565b600061163a611633613c57565b8484613c5b565b5060015b92915050565b6001600160a01b03821660009081526016602090815260408083206001600160801b0319851684528252808320815160a08101835281548082526001830154948201949094526002909101546001600160401b03808216938301849052600160401b8204166060830152600160801b900460ff1615156080820152909290819081906116cf81613ce3565b6060820151608090920151969995985096506001600160401b0316949392505050565b60055490565b60408051600280825260608201835260009283928392839260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061174157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061176f57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab5346001853342611c20016040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611828578181015183820152602001611810565b50505050905001955050505050506000604051808303818588803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561188d57600080fd5b8101908080516040519392919084600160201b8211156118ac57600080fd5b9083019060208201858111156118c157600080fd5b82518660208202830111600160201b821117156118dd57600080fd5b82525081516020918201928201910280838360005b8381101561190a5781810151838201526020016118f2565b5050505090500160405250505090506119388160018151811061192957fe5b60200260200101518888613637565b94509450945050509250925092565b601360209081526000928352604080842090915290825290205481565b60606000808411801561198e57506001600160a01b0385166000908152600f602052604090205484105b6119b0576001600160a01b0385166000908152600f60205260409020546119cd565b6001600160a01b0385166000908152600f60205260409020548490035b9050600080841180156119df57508382115b6119ea5760006119ee565b8382035b905060008183036001600160401b0381118015611a0a57600080fd5b50604051908082528060200260200182016040528015611a34578160200160208202803683370190505b509350825b82811115611ac6576000611a56896000198401600160f81b613033565b6001600160a01b038a1660009081526014602090815260408083206001600160801b03198516845290915290206001015490915015611abc5780868481518110611a9c57fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901611a39565b505050509392505050565b6000611b2b84611adf613c57565b6001600160a01b0387166000908152600160205260408120611b2691879190611b06613c57565b6001600160a01b0316815260208101919091526040016000205490613d6b565b613c5b565b611b36848484613d80565b5060019392505050565b60045460ff1690565b600f6020526000908152604090205481565b600c54600160201b900463ffffffff1681565b6012602052600090815260409020805460019091015482565b611b913382613e52565b50565b60007f0000000000000000000000000000000000000000000000000000000000000000611bbf613ef6565b1015611bcc576000611bd4565b611bd4613efa565b905090565b601d546001600160a01b03163314611bf057600080fd5b6001600160a01b038116600090815260126020526040902069021e19e0c9bab24000009055611c1d613f0c565b6001600160a01b0390911660009081526012602052604090206001600160401b0391909116600190910155565b611c5a611c55613efa565b613f1e565b611c6533838361423f565b5050565b6001600160a01b03811660009081526010602052604081205415611cc0576001600160a01b038216600090815260106020526040902054611cbb908390611cb1906001613d6b565b600160f91b613033565b61163e565b600092915050565b60116020526000908152604090205481565b601d546001600160a01b031681565b611cf4611c55613efa565b565b600c54600160401b90046001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b03811660009081526011602052604081205415611cc0576001600160a01b038216600090815260116020526040902054611cbb908390611d6f906001613d6b565b600360f81b613033565b60005b8351811015611dd457611dc9848281518110611d9457fe5b6020026020010151848381518110611da857fe5b6020026020010151848481518110611dbc57fe5b6020026020010151613637565b505050600101611d7c565b50505050565b6001600160a01b0382811660009081526014602090815260408083206001600160801b03198616845282528083208151610180810183528154815260018201549381019390935260028101549183019190915260038101546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600481015460e08301526005810154610100830152600681015461012083015260070154928316610140820152600160a01b90920460ff16151561016083015290611eb6816145bd565b949350505050565b601b6020526000908152604090208054600182015460029092015490919083565b6000806000600c60089054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f3257600080fd5b505afa158015611f46573d6000803e3d6000fd5b505050506040513d6060811015611f5c57600080fd5b50805160208083015160409384015184516001600160701b03808616825283169381019390935263ffffffff811683860152935192965094509192507f17057eec9ed80c65db1c29e57a343df0e9f052cf0f5ec6e93bc084533ae9b8c99181900360600190a1600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600c60089054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561203057600080fd5b505afa158015612044573d6000803e3d6000fd5b505050506040513d602081101561205a57600080fd5b50516001600160a01b0316146120705782612072565b835b6001600160701b0316905060006120876116f2565b156120ad576120a86120976116f2565b6120a28460c861461e565b9061464c565b6120b0565b60005b90506028811080156120cc5750600c54600160e01b900460ff16155b156120d9576120d961466e565b603c811180156120f75750600c54600160e01b900460ff1615156001145b1561210457612104614683565b600c5460408051600160e01b90920460ff1615158252517fbbf65e071e5468fb599b01ba3b914ae6065cf10ad084e0efe2133f7eaa8979bd916020908290030190a15050505050565b6000806000806000806000806000601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b03191681526020019081526020016000206040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a900460801b6001600160801b0319166001600160801b031916815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060000151985080602001519750806080015194506000601460008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008a6001600160801b0319166001600160801b0319168152602001908152602001600020604051806101800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016007820160149054906101000a900460ff16151515158152505090508061012001519750612410816124028385614692565b61240b84614717565b614747565b9650806101600151945061242381614775565b925061242e816145bd565b935050509295985092959890939650565b601e546001600160a01b031681565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561161b5780601f106115f05761010080835404028352916020019161161b565b60006124bc611c55613efa565b6000806124c9338561478e565b6040805161018081018252835480825260018501546020830181905260028601549383019390935260038501546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600485015460e08301526005850154610100830152600685015461012083018190526007909501546001600160a01b038116610140840152600160a01b900460ff16151561016083015290955091935061258c929091906149d9565b6125a78260a001516001600160401b03168360000151614a36565b6125c38260a001516001600160401b0316836101200151614ae9565b6125e582610140015183610100015184606001516001600160401b0316614b9c565b6125f38260c0015182614c41565b61266081836020015111612608576000612610565b818360200151035b3360009081526013602090815260408083206001600160801b03198a16845290915290819020549085015161014086015160808701518751929093019290916001600160401b0390911690614c87565b8161014001516001600160a01b0316336001600160a01b0316856001600160801b0319167f8cc66e48ebd8c008b36e03ee2f7c3f60a313a34a5bf1f3cb988a7936cd47f0d48560200151866000015187610120015188604001518960c001518960405180878152602001868152602001858152602001848152602001836001600160401b03168152602001828152602001965050505050505060405180910390a4506040015192915050565b600080600080600061271f611c55613efa565b3360009081526014602090815260408083206001600160801b03198b168452909152902060070154600160a01b900460ff1661275a57600080fd5b3360009081526014602090815260408083206001600160801b03198b1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c0830152600483015460e0830152600583015461010083015260068301546101208301526007909201546001600160a01b038116610140830152600160a01b900460ff1615156101608201529087166128415761283c81614d90565b61285d565b61285d876001600160401b031661285783614dc6565b90614def565b95508060a001516001600160401b031686116128795785612882565b61288281614d90565b955061289b816000015161289583614dc6565b88614e01565b94506128a6816145bd565b612975576128b381614e47565b93506128c6858533600660020154614ea0565b81519093506128d59084613d6b565b815260a08101516128ef906001600160401b031684614a36565b6101208101511561293d5761290c85856000600660020154614ea0565b61012082015190925061291f9083613d6b565b61012082015260a081015161293d906001600160401b031683614ae9565b612949600084846149d9565b61297081602001518683610140015184608001516001600160401b03168560000151614c87565b6129f0565b3360009081526013602090815260408083206001600160801b03198c1684529091529020546129a49086614def565b3360009081526013602090815260408083206001600160801b03198d1684528252909120829055820151610140830151608084015184516129f09492916001600160401b031690614c87565b60e081018681523360008181526014602090815260408083206001600160801b03198e168452825291829020855181559085015160018201559084015160028201556060840151600382018054608087015160a088015160c089015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b93909116929092029190911790559151600483015561010083015160058301556101208301516006830155610140830151600790920180546101608501516001600160a01b03199091166001600160a01b039094169390931760ff60a01b1916600160a01b9315159390930292909217909155612b299086614edf565b336001600160801b031989167f7b5d0995432c9ea1c8033b358af591013d0deff8dec5f4ae49612eba8bfafc0c87898787612b62613efa565b6040805195865260208601949094528484019290925260608401526001600160401b03166080830152519081900360a00190a3509295509295909350565b604080516364e329cb60e11b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201523060248201529051735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163c9c653969160448083019260209291908290030181600087803b158015612c0d57600080fd5b505af1158015612c21573d6000803e3d6000fd5b505050506040513d6020811015612c3757600080fd5b5051600c80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6001600160a01b0382811660009081526014602090815260408083206001600160801b03198616845282528083208151610180810183528154808252600183015494820185905260028301549382019390935260038201546001600160401b0380821660608401819052600160401b8304821660808501819052600160801b8404831660a08601819052600160c01b90940490921660c08501819052600486015460e0860181905260058701546101008701526006870154610120870152600790960154998a16610140860152600160a01b90990460ff161515610160850152979096919590949092909190819081908190612d6581614f7b565b9450612d7081614f9a565b93508061016001519250612d83816145bd565b9150509295989b509295989b9093969950565b6000612da3611c55613efa565b3360009081526016602090815260408083206001600160801b031986168452825291829020825160a08101845281548152600182015492810192909252600201546001600160401b0380821693830193909352600160401b81049092166060820152600160801b90910460ff16151560808201819052612e2257600080fd5b60006080820152612e31613efa565b6001600160401b03166060820152612e4881613ce3565b60208201819052612e5a903390614edf565b600c548151612e7b91600160401b90046001600160a01b0316903390614fc1565b8051600b54612e8991613d6b565b600b553360009081526016602090815260408083206001600160801b0319969096168352948152908490208251815590820151600182018190559382015160029091018054606084015160809094015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b93909416929092029290921760ff60801b1916600160801b911515919091021790555090565b600061163a612f38613c57565b8484613d80565b6000816001600160401b0316118015612f705750612f5b613efa565b6001600160401b0316816001600160401b0316105b612f7957600080fd5b6009546001600160401b03821611612f9057600080fd5b611b9181613f1e565b6001600160a01b0381166000908152600f602052604081205415611cc0576001600160a01b0382166000908152600f6020526040902054611cbb908390612fe1906001613d6b565b600160f81b613033565b600c5463ffffffff1681565b739c306cad86550ec80d77668c0a8bee6eb34684b681565b60196020526000908152604090205481565b60186020526000908152604090205481565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152603482018590526001600160f81b0319841660548301528251603581840301815260559092019092528051910120600090611eb690611623565b6015602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401546001600160a01b039093169360809290921b9290919060ff1685565b60176020526000908152604090205481565b600654600754600854600954600a54600b5486565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6000613126611c55613efa565b600c54600160e01b900460ff16151560011461314157600080fd5b600c5461316090600160401b90046001600160a01b03163330856150db565b613168615ce5565b61317133615205565b915061317b613f0c565b6001600160401b0316604082015282815260016080820152600b546131a09084614def565b600b553360008181526016602090815260408083206001600160801b031987168452825291829020845181559084015160018201559083015160029091018054606085015160808601511515600160801b0260ff60801b196001600160401b03928316600160401b0267ffffffffffffffff60401b199390961667ffffffffffffffff19909416939093179190911693909317169190911790556132439061522e565b50919050565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516000918291829188916001600160a01b038316916323b872dd91606480830192602092919082900301818887803b1580156132a657600080fd5b505af11580156132ba573d6000803e3d6000fd5b505050506040513d60208110156132d057600080fd5b50506040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810189905290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b15801561333557600080fd5b505af1158015613349573d6000803e3d6000fd5b505050506040513d602081101561335f57600080fd5b506000905061336e893061524e565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398a6001853342611c20016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561340f5781810151838201526020016133f7565b505050509050019650505050505050600060405180830381600087803b15801561343857600080fd5b505af115801561344c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561347557600080fd5b8101908080516040519392919084600160201b82111561349457600080fd5b9083019060208201858111156134a957600080fd5b82518660208202830111600160201b821117156134c557600080fd5b82525081516020918201928201910280838360005b838110156134f25781810151838201526020016134da565b5050505090500160405250505090506135208160028151811061351157fe5b60200260200101518989613637565b9550955095505050505b9450945094915050565b601a6020526000908152604090208054600182015460029092015490919083565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b601e546001600160a01b0316331461358457600080fd5b601d80546001600160a01b039092166001600160a01b0319928316179055601e80549091169055565b60106020526000908152604090205481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60166020908152600092835260408084209091529082529020805460018201546002909201549091906001600160401b0380821691600160401b810490911690600160801b900460ff1685565b6000806000613647611c55613efa565b336001600160a01b03851614801590613664575061366484615314565b61366d57600080fd5b60016001600160401b038616108015906136925750613be26001600160401b03861611155b61369b57600080fd5b620f42408610156136ab57600080fd5b60008060006136bc338a8a8a61531f565b6001600160401b0316925092509250600083610120015111156137b3576136e1615ce5565b3381526001600160801b0319831660208201526001608082015261370488615413565b6001600160a01b0389811660009081526015602090815260408083206001600160801b0319868116855290835292819020865181546001600160a01b031916951694909417845590850151600184018054909316608091821c179092558401516002830155606084015160038301558301516004909101805460ff191691151591909117905594506137958861543c565b6137b18460a001516001600160401b031685610120015161545c565b505b3360008181526014602090815260408083206001600160801b031987168452825291829020865181559086015160018201559085015160028201556060850151600382018054608088015160a089015160c08a015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b939091169290920291909117905560e0850151600482015561010085015160058201556101208501516006820155610140850151600790910180546101608701516001600160a01b03199091166001600160a01b039093169290921760ff60a01b1916600160a01b921515929092029190911790556138e69061548b565b6138fe836020015184600001518561012001516154ab565b6139198360a001516001600160401b031684600001516154de565b866001600160a01b0316336001600160a01b0316836001600160801b0319167f6619c8f19b39bf3558af16516f9ca110fcac4a7ab6d846d1b02a17b11f703a338660200151876000015188610120015189606001518a608001518b610100015160405180878152602001868152602001858152602001846001600160401b03168152602001836001600160401b03168152602001828152602001965050505050505060405180910390a490945092505093509350939050565b6014602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007909701549596949593946001600160401b0380851695600160401b8604821695600160801b8104831695600160c01b909104909216939192906001600160a01b03811690600160a01b900460ff168c565b601c602052600090815260409020805460019091015482565b601d546001600160a01b03163314613a8e57600080fd5b611c658282614edf565b606060008084118015613ac257506001600160a01b03851660009081526010602052604090205484105b613ae4576001600160a01b038516600090815260106020526040902054613b01565b6001600160a01b0385166000908152601060205260409020548490035b905060008084118015613b1357508382115b613b1e576000613b22565b8382035b905060008183036001600160401b0381118015613b3e57600080fd5b50604051908082528060200260200182016040528015613b68578160200160208202803683370190505b509350825b82811115611ac6576000613b8a896000198401600160f91b613033565b6001600160a01b03808b1660009081526015602090815260408083206001600160801b031986168452909152902054919250613bc6911661550d565b15613bf85780868481518110613bd857fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901613b6d565b613c0d611c55613efa565b60005b8251811015613c5257613c4a33848381518110613c2957fe5b6020026020010151848481518110613c3d57fe5b602002602001015161423f565b600101613c10565b505050565b3390565b6001600160a01b038316613c6e57600080fd5b6001600160a01b038216613c8157600080fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008061016d61ffff168360400151016001600160401b0316905060008160066003015410613d125781613d16565b6009545b60408501519091506001600160401b03165b81811015613d63576000818152601c60205260409020600101548551670de0b6b3a76400000281613d5557fe5b049390930192600101613d28565b505050919050565b600082821115613d7a57600080fd5b50900390565b6001600160a01b038316613d9357600080fd5b6001600160a01b038216613da657600080fd5b6001600160a01b038316600090815260208190526040902054613dc99082613d6b565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613df89082614def565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b038216613e6557600080fd5b6001600160a01b038216600090815260208190526040902054613e889082613d6b565b6001600160a01b038316600090815260208190526040902055600554613eae9082613d6b565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b4290565b6000611bd4613f07613ef6565b61551b565b6000613f16613efa565b600101905090565b613f26611edf565b600654600954600091905b836001600160401b0316811015611dd45760001981016000908152601a602081815260408084206002015485855260178352818520549383529381902081516060810183528154815260019091015492810192909252919092019082018190526007549094508410613fa4576000613fab565b6007548490035b815261406a61405684613fbc6116f2565b60008681526019602090815260409182902054600c5483516330550a4b60e01b815263ffffffff909116600482015292519092739c306cad86550ec80d77668c0a8bee6eb34684b6926330550a4b92602480840193829003018186803b15801561402557600080fd5b505afa158015614039573d6000803e3d6000fd5b505050506040513d602081101561404f57600080fd5b505161554c565b82516120a290670de0b6b3a764000061461e565b60208083019182526000848152601a825260408082208551815593516001808601919091558186015160029586015560001987018352601b80855282842090950154878452601885528284205495855292829020825160608101845281548152910154938101939093529201918101829052600a549195509085106140f05760006140f7565b600a548590035b815261410d614056856141086116f2565b615569565b60208083019182526000858152601b8252604080822085518155935160018086019190915581860151600290950194909455601c83529081902081518083019092529092015490820152600b5481526141fc6140568661416b6116f2565b600c54604080516330550a4b60e01b8152600160201b90920463ffffffff16600483015251739c306cad86550ec80d77668c0a8bee6eb34684b6916330550a4b916024808301926020929190829003018186803b1580156141cb57600080fd5b505afa1580156141df573d6000803e3d6000fd5b505050506040513d60208110156141f557600080fd5b5051615578565b60208083019182526000868152601c90915260409020825181559051600190910155614226615589565b5050600980546001908101909155919091019050613f31565b6001600160a01b0380841660009081526015602090815260408083206001600160801b0319808816855290835292819020815160a08101835281549095168552600180820154608090811b90951693860193909352600281015491850191909152600381015460608501526004015460ff161515918301829052146142c357600080fd5b80516020808301516001600160a01b0380841660009081526014845260408082206001600160801b03198516835285528082208151610180810183528154815260018201549681019690965260028101549186019190915260038101546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b9091041660c0860152600481015460e08601526005810154610100860152600681015461012086015260070154918216610140850152600160a01b90910460ff1615156101608401529091906143a78286614692565b905060006143b483614717565b90506143bf83614775565b15614413576000871180156143dc57506143d98282615670565b87105b156144065760608601516143f09088614def565b60608701526143ff8288614def565b905061440e565b600060808701525b614451565b61442d8261441f613efa565b6001600160401b0316615670565b606087015190975061443f9088614def565b606087015261444e8288614def565b90505b600061445e848484614747565b60408801519091506144709082614def565b87604001818152505086601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b031916815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b03021916908360801c0217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506145598a82614edf565b604080516001600160801b03198b811682526020820184905282516001600160a01b03808f1694928a1693908b16927f5d13067bdc9e4d510839580df1e932220b31fb2bc7790b5bd35aae14f0303bed92918290030190a450505050505050505050565b6000808260c001516001600160401b0316116145f9576145db613efa565b6001600160401b03168260a001516001600160401b0316111561163e565b8160c001516001600160401b03168260a001516001600160401b031611159050919050565b60008261462d5750600061163e565b8282028284828161463a57fe5b041461464557600080fd5b9392505050565b600080821161465a57600080fd5b600082848161466557fe5b04949350505050565b600c805460ff60e01b1916600160e01b179055565b600c805460ff60e01b19169055565b6000614645826060015184606001516001600160401b0316601260008761014001516001600160a01b03166001600160a01b0316815260200190815260200160002060010154116146f05784606001516001600160401b0316612857565b6101408501516001600160a01b031660009081526012602052604090206001015490614def565b6000808260c001516001600160401b03161161473657611cbb82614d90565b5060c001516001600160401b031690565b6000614757846101400151615691565b61476b576147668484846156b0565b611eb6565b5060009392505050565b610160810151600090158061163e575061163e826145bd565b6001600160a01b03821660009081526014602090815260408083206001600160801b0319851684529091528120600701548190600160a01b900460ff166147d457600080fd5b6001600160a01b03841660009081526014602090815260408083206001600160801b0319871684529091529020915061480b613efa565b6003830180546001600160c01b0316600160c01b6001600160401b0393841681029190911791829055604080516101808101825286548152600187015460208201526002870154918101919091528284166060820152600160401b830484166080820152600160801b8304841660a0820152910490911660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526148d7906156ef565b60028301819055604080516101808101825284548152600185015460208201529081019190915260038301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff16151561016082015261498d90614f9a565b60078301805460ff60a01b1916905560018301549091506149c490859083106149b75760006149bf565b828460010154035b614edf565b6149d2848360020154614edf565b9250929050565b60065483106149e95760006149f0565b6006548390035b6006556007548210614a03576000614a0a565b6007548290035b6007558015614a2e57600a548110614a23576000614a2a565b600a548190035b600a555b613c52615710565b614a3f82615767565b15614a87576000828152601760205260409020548110614a60576000614a73565b6000828152601760205260409020548190035b600083815260176020526040902055611c65565b6000614a91615783565b6001600160401b03166000818152601a60205260409020600201549091508210614abc576000614ad2565b6000818152601a60205260409020600201548290035b6000918252601a6020526040909120600201555050565b614af282615767565b15614b3a576000828152601860205260409020548110614b13576000614b26565b6000828152601860205260409020548190035b600083815260186020526040902055611c65565b6000614b44615783565b6001600160401b03166000818152601b60205260409020600201549091508210614b6f576000614b85565b6000818152601b60205260409020600201548290035b6000918252601b6020526040909120600201555050565b614ba581615795565b158015614bb65750614bb68361550d565b15613c52576001600160a01b0383166000908152601260205260409020548210614be1576000614bfe565b6001600160a01b0383166000908152601260205260409020548290035b6001600160a01b038416600090815260126020526040902055614c20836157b1565b6001600160a01b038416600090815260126020526040902060010155505050565b8015611c65576001600160401b038216600090815260196020526040902054614c6a9082614def565b6001600160401b0383166000908152601960205260409020555050565b600081118015614ca757506041614c9c613efa565b6001600160401b0316115b15614d63576000614cbb86868486886157c9565b600854909150811115614d5d57600854614cdd906064906120a290606e61461e565b8110614cfd57600854614cf8906064906120a290606e61461e565b614cff565b805b90507fb52ab4a425c20017539fcd851fc4ddbb50d17546576353cd51a2d483d80a45b881600660020154614d31613efa565b6040805193845260208401929092526001600160401b031682820152519081900360600190a160088190555b50614d89565b6041614d6d613efa565b6001600160401b03161415614d8957670186cc6acd4b00006008555b5050505050565b60006006600301548260a001516001600160401b031611614dbe578160a001516001600160401b031661163e565b505060095490565b60008160e00151600014614dde578160e0015161163e565b50606001516001600160401b031690565b60008282018381101561464557600080fd5b6000825b82811015614e3f576000818152601a6020526040902060010154670de0b6b3a7640000860281614e3157fe5b049190910190600101614e05565b509392505050565b61016081015160009015614e7c57611cbb614e60613efa565b6001600160401b03168360a001516001600160401b0316615670565b61163e8260c001516001600160401b03168360a001516001600160401b0316615670565b6000614eab8361550d565b614ec557614ec08585846402540be400615826565b614ed6565b614ed685858464028fa6ae00615826565b95945050505050565b6001600160a01b038216614ef257600080fd5b600554614eff9082614def565b6005556001600160a01b038216600090815260208190526040902054614f259082614def565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000816101600151614f9157816040015161163e565b61163e82615848565b6000614fa582615860565b80614fb45750614fb4826145bd565b611cc057611cbb826158bf565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b6020831061503d5780518252601f19909201916020918201910161501e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461509f576040519150601f19603f3d011682016040523d82523d6000602084013e6150a4565b606091505b50915091508180156150d25750805115806150d257508080602001905160208110156150cf57600080fd5b50515b614d8957600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b6020831061515f5780518252601f199092019160209182019101615140565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146151c1576040519150601f19603f3d011682016040523d82523d6000602084013e6151c6565b606091505b50915091508180156151f45750805115806151f457508080602001905160208110156151f157600080fd5b50515b6151fd57600080fd5b505050505050565b6001600160a01b03811660009081526011602052604081205461163e908390600360f81b613033565b6001600160a01b0316600090815260116020526040902080546001019055565b60408051600380825260808201909252606091602082018380368337019050509050828160008151811061527e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106152c057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081816002815181106152ee57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b3b63ffffffff161590565b615327615d13565b6000806153348787613e52565b61533c613f0c565b9050615347876158f5565b6001600160401b0380871660808601819052838216606087015283880190911660a086015260016101608601526020850188905260085491935061538f918891908790614ea0565b835261539961591e565b506020830151600d546153b991670de0b6b3a7640000916120a29161461e565b6101008401526153c88461550d565b1561352a576001600160a01b03841661014084018190526101008401516153ef9190615b0d565b61540386866001600160401b031686615b75565b6101208401529450945094915050565b6001600160a01b03811660009081526010602052604081205461163e908390600160f91b613033565b6001600160a01b0316600090815260106020526040902080546001019055565b6000828152601860205260409020546154759082614def565b6000928352601860205260409092209190915550565b6001600160a01b03166000908152600f6020526040902080546001019055565b6006546154b89084614def565b6006556007546154c89083614def565b6007558015614a2e57600a54614a2a9082614def565b6000828152601760205260409020546154f79082614def565b6000928352601760205260409092209190915550565b6001600160a01b0316151590565b6000620151807f000000000000000000000000000000000000000000000000000000000000000083035b0492915050565b60008282858701612710028161555e57fe5b040195945050505050565b6315dd2ecd9101612710020490565b600081838501612710028161466557fe5b600c54600160e01b900460ff16151560011480156155b95750600c5462019258600160201b90910463ffffffff16105b1561560357600c805463ffffffff1967ffffffff00000000198216600160201b9283900463ffffffff90811660060181169093021790811690821660051901909116179055611cf4565b600c54600160e01b900460ff161580156156295750600c546201925863ffffffff909116105b15611cf457600c805467ffffffff000000001963ffffffff19821663ffffffff928316600601831617908116600160201b9182900483166005190190921602179055611cf4565b6000818311615688576156838284613d6b565b614645565b50600092915050565b6001600160a01b03166000908152601260205260409020600101541590565b6000825b82811015614e3f576000818152601b60205260409020600101548551670de0b6b3a764000002816156e157fe5b0491909101906001016156b4565b600061163e826000015161570284614dc6565b61570b85614d90565b614e01565b600954600754600654600854600a54604080519485526020850193909352838301919091526060830152517fea8ce1d041020595d75f4f48ba3378787b84e61d101465836fa54f1b338a4db59181900360800190a2565b6000615771613efa565b6001600160401b031690911015919050565b6000600161578f613efa565b03905090565b600061579f613efa565b6001600160401b031690911115919050565b60006157bc82615ba6565b611cc057611cbb82615bcd565b6000806157fb846157d98561550d565b6157e8576402540be4006157ef565b64028fa6ae005b64ffffffffff16615c22565b905061581b856120a26305f5e10061581585818d8d614def565b9061461e565b979650505050505050565b6000614ed66402540be4006120a261583e8786615c22565b6158158988615c6c565b600061585382615860565b611cc057611cbb826156ef565b6000808260c001516001600160401b03161161589b5761587e613efa565b6001600160401b031682606001516001600160401b03161161163e565b8160c001516001600160401b031682606001516001600160401b0316119050919050565b60006103e86158cd83615c84565b60016158d885614e47565b0361032002816158e457fe5b046064018360200151028161554557fe5b6001600160a01b0381166000908152600f602052604081205461163e908390600160f81b613033565b6040805163d06ca61f60e01b8152670de0b6b3a76400006004820181815260248301938452600e805460448501819052600095737a250d5630b4cf539739df2c5dacb4c659f2488d9563d06ca61f959492606490910190849080156159ac57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161598e575b5050935050505060006040518083038186803b1580156159cb57600080fd5b505afa925050508015615a8b57506040513d6000823e601f3d908101601f1916820160405260208110156159fe57600080fd5b8101908080516040519392919084600160201b821115615a1d57600080fd5b908301906020820185811115615a3257600080fd5b82518660208202830111600160201b82111715615a4e57600080fd5b82525081516020918201928201910280838360005b83811015615a7b578181015183820152602001615a63565b5050505090500160405250505060015b615ae757615a97615da9565b80615aa25750615aac565b5050600d54611623565b3d808015615ad6576040519150601f19603f3d011682016040523d82523d6000602084013e615adb565b606091505b50600d54915050611623565b80600281518110615af457fe5b6020026020010151600d81905550600d54915050611623565b6001600160a01b038216600090815260126020526040902054615b309082614def565b6001600160a01b038316600090815260126020526040902055615b52826157b1565b6001600160a01b0390921660009081526012602052604090206001019190915550565b6000615b8082615691565b80615b8c575061016d83105b61476b5761476684846006600201546402540be400615826565b6001600160a01b031660009081526012602052604090205469021e19e0c9bab24000001190565b6001600160a01b038116600090815260126020526040812060010154615c0357615bf5613efa565b6001600160401b031661163e565b506001600160a01b031660009081526012602052604090206001015490565b600081615c4f6107218511615c38576000615c3f565b6107201985015b660150b9a52b11286134c1615cba565b615c63856630aad4df397abe610721615cba565b01019392505050565b6000614645826120a285670de0b6b3a764000061461e565b6000600182608001516001600160401b031611615ca2576001615cab565b60018260800151035b6001600160401b031692915050565b6000611eb66402540be400838611615cdb57615cd6868661461e565b6120a2565b6120a2848661461e565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180610180016040528060008152602001600081526020016000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b60e01c90565b600060443d1015615db957611623565b600481823e6308c379a0615dcd8251615da3565b14615dd757611623565b6040513d600319016004823e80513d6001600160401b038160248401118184111715615e065750505050611623565b82840192508251915080821115615e205750505050611623565b503d83016020828401011115615e3857505050611623565b601f01601f191681016020016040529150509056fea264697066735822122077ab368710148891aff560da25363ab814108ed0459319cf37cd25027984ed7964736f6c63430007060033

Deployed Bytecode

0x6080604052600436106103bb5760003560e01c806395d89b41116101f2578063c31245251161010d578063dd62ed3e116100a0578063e3073bfb1161006f578063e3073bfb146113aa578063e742806a146113d4578063e7881cda1461140d578063fc527bf51461144c576103c5565b8063dd62ed3e146111ee578063df0618d214611229578063df2d02b1146112a3578063e1d033e9146112eb576103c5565b8063d6565a2d116100dc578063d6565a2d14611149578063d826492014611173578063d8d44a2914611188578063db74559b146111bb576103c5565b8063c312452514611072578063c74c0fac146110ba578063ce8f9f00146110cf578063d1cf9098146110f9576103c5565b8063ae3d1de211610185578063be21ff7011610154578063be21ff7014610f52578063bf58f6d214610f7c578063c172628e14610fc5578063c23d656414611048576103c5565b8063ae3d1de214610ecb578063b381a81114610efe578063b543c4ba14610f13578063bba85e1f14610f28576103c5565b8063a4ed0550116101c1578063a4ed055014610d8e578063a50af89514610e2b578063a9059cbb14610e5f578063a91b19f214610e98576103c5565b806395d89b4114610cc257806399c2def414610cd75780639b57ab1214610d0b5780639e78fb4f14610d79576103c5565b806348e4ccab116102e257806370a08231116102755780638649102b116102445780638649102b14610bb357806387da627414610bfb57806389201d4e14610c105780638a26306014610cad576103c5565b806370a082311461095857806375c3fa4f1461098b578063763241d3146109be578063779e2e1814610b70576103c5565b8063601f37ac116102b1578063601f37ac146108ca57806360e4c651146108fd578063613fc9fd1461092e5780636ba631cf14610943576103c5565b806348e4ccab146107dc5780634dfc7a031461080d5780634f47b16d146108405780635b2023871461087a576103c5565b806320429fac1161035a57806333060d901161032957806333060d90146107035780633697e979146107365780633b58afe71461076457806342966c68146107b0576103c5565b806320429fac146105c357806323672d8a1461060657806323b872dd14610695578063313ce567146106d8576103c5565b8063095ea7b311610396578063095ea7b3146104a457806310748592146104dd57806318160ddd1461054d5780631c0b37e114610562576103c5565b80625ada7f146103ca57806302cbb266146103f157806306fdde031461041a576103c5565b366103c557600080fd5b600080fd5b3480156103d657600080fd5b506103df61157c565b60408051918252519081900360200190f35b3480156103fd57600080fd5b50610406611582565b604080519115158252519081900360200190f35b34801561042657600080fd5b5061042f611592565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610469578181015183820152602001610451565b50505050905090810190601f1680156104965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104b057600080fd5b50610406600480360360408110156104c757600080fd5b506001600160a01b038135169060200135611626565b3480156104e957600080fd5b506105206004803603604081101561050057600080fd5b5080356001600160a01b031690602001356001600160801b031916611644565b60408051958652602086019490945284840192909252606084015215156080830152519081900360a00190f35b34801561055957600080fd5b506103df6116f2565b6105976004803603604081101561057857600080fd5b5080356001600160401b031690602001356001600160a01b03166116f8565b604080516001600160801b03199485168152602081019390935292168183015290519081900360600190f35b3480156105cf57600080fd5b506103df600480360360408110156105e657600080fd5b5080356001600160a01b031690602001356001600160801b031916611947565b34801561061257600080fd5b506106456004803603606081101561062957600080fd5b506001600160a01b038135169060208101359060400135611964565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610681578181015183820152602001610669565b505050509050019250505060405180910390f35b3480156106a157600080fd5b50610406600480360360608110156106b857600080fd5b506001600160a01b03813581169160208101359091169060400135611ad1565b3480156106e457600080fd5b506106ed611b40565b6040805160ff9092168252519081900360200190f35b34801561070f57600080fd5b506103df6004803603602081101561072657600080fd5b50356001600160a01b0316611b49565b34801561074257600080fd5b5061074b611b5b565b6040805163ffffffff9092168252519081900360200190f35b34801561077057600080fd5b506107976004803603602081101561078757600080fd5b50356001600160a01b0316611b6e565b6040805192835260208301919091528051918290030190f35b3480156107bc57600080fd5b506107da600480360360208110156107d357600080fd5b5035611b87565b005b3480156107e857600080fd5b506107f1611b94565b604080516001600160401b039092168252519081900360200190f35b34801561081957600080fd5b506107da6004803603602081101561083057600080fd5b50356001600160a01b0316611bd9565b34801561084c57600080fd5b506107da6004803603604081101561086357600080fd5b506001600160801b03198135169060200135611c4a565b34801561088657600080fd5b506108ad6004803603602081101561089d57600080fd5b50356001600160a01b0316611c69565b604080516001600160801b03199092168252519081900360200190f35b3480156108d657600080fd5b506103df600480360360208110156108ed57600080fd5b50356001600160a01b0316611cc8565b34801561090957600080fd5b50610912611cda565b604080516001600160a01b039092168252519081900360200190f35b34801561093a57600080fd5b506107da611ce9565b34801561094f57600080fd5b50610912611cf6565b34801561096457600080fd5b506103df6004803603602081101561097b57600080fd5b50356001600160a01b0316611d0c565b34801561099757600080fd5b506108ad600480360360208110156109ae57600080fd5b50356001600160a01b0316611d27565b3480156109ca57600080fd5b506107da600480360360608110156109e157600080fd5b810190602081018135600160201b8111156109fb57600080fd5b820183602082011115610a0d57600080fd5b803590602001918460208302840111600160201b83111715610a2e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a7d57600080fd5b820183602082011115610a8f57600080fd5b803590602001918460208302840111600160201b83111715610ab057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610aff57600080fd5b820183602082011115610b1157600080fd5b803590602001918460208302840111600160201b83111715610b3257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611d79945050505050565b348015610b7c57600080fd5b5061040660048036036040811015610b9357600080fd5b5080356001600160a01b031690602001356001600160801b031916611dda565b348015610bbf57600080fd5b50610bdd60048036036020811015610bd657600080fd5b5035611ebe565b60408051938452602084019290925282820152519081900360600190f35b348015610c0757600080fd5b506107da611edf565b348015610c1c57600080fd5b50610c5360048036036040811015610c3357600080fd5b5080356001600160a01b031690602001356001600160801b03191661214d565b604080516001600160a01b0390991689526001600160801b031990971660208901528787019590955260608701939093529015156080860152151560a0850152151560c0840152151560e083015251908190036101000190f35b348015610cb957600080fd5b5061091261243f565b348015610cce57600080fd5b5061042f61244e565b348015610ce357600080fd5b506103df60048036036020811015610cfa57600080fd5b50356001600160801b0319166124af565b348015610d1757600080fd5b50610d4e60048036036040811015610d2e57600080fd5b5080356001600160801b03191690602001356001600160401b031661270c565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610d8557600080fd5b506107da612ba0565b348015610d9a57600080fd5b50610dd160048036036040811015610db157600080fd5b5080356001600160a01b031690602001356001600160801b031916612c6a565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e08601526101008501521515610120840152151561014083015251908190036101600190f35b348015610e3757600080fd5b506103df60048036036020811015610e4e57600080fd5b50356001600160801b031916612d96565b348015610e6b57600080fd5b5061040660048036036040811015610e8257600080fd5b506001600160a01b038135169060200135612f2b565b348015610ea457600080fd5b506107da60048036036020811015610ebb57600080fd5b50356001600160401b0316612f3f565b348015610ed757600080fd5b506108ad60048036036020811015610eee57600080fd5b50356001600160a01b0316612f99565b348015610f0a57600080fd5b5061074b612feb565b348015610f1f57600080fd5b50610912612ff7565b348015610f3457600080fd5b506103df60048036036020811015610f4b57600080fd5b503561300f565b348015610f5e57600080fd5b506103df60048036036020811015610f7557600080fd5b5035613021565b348015610f8857600080fd5b506108ad60048036036060811015610f9f57600080fd5b5080356001600160a01b031690602081013590604001356001600160f81b031916613033565b348015610fd157600080fd5b5061100860048036036040811015610fe857600080fd5b5080356001600160a01b031690602001356001600160801b03191661308e565b604080516001600160a01b0390961686526001600160801b0319909416602086015284840192909252606084015215156080830152519081900360a00190f35b34801561105457600080fd5b506103df6004803603602081101561106b57600080fd5b50356130da565b34801561107e57600080fd5b506110876130ec565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156110c657600080fd5b50610912613101565b3480156110db57600080fd5b506108ad600480360360208110156110f257600080fd5b5035613119565b34801561110557600080fd5b506105976004803603608081101561111c57600080fd5b506001600160a01b0381358116916020810135916001600160401b03604083013516916060013516613249565b34801561115557600080fd5b50610bdd6004803603602081101561116c57600080fd5b5035613534565b34801561117f57600080fd5b50610912613555565b34801561119457600080fd5b506107da600480360360208110156111ab57600080fd5b50356001600160a01b031661356d565b3480156111c757600080fd5b506103df600480360360208110156111de57600080fd5b50356001600160a01b03166135ad565b3480156111fa57600080fd5b506103df6004803603604081101561121157600080fd5b506001600160a01b03813581169160200135166135bf565b34801561123557600080fd5b5061126c6004803603604081101561124c57600080fd5b5080356001600160a01b031690602001356001600160801b0319166135ea565b6040805195865260208601949094526001600160401b03928316858501529116606084015215156080830152519081900360a00190f35b3480156112af57600080fd5b50610597600480360360608110156112c657600080fd5b5080359060208101356001600160401b031690604001356001600160a01b0316613637565b3480156112f757600080fd5b5061132e6004803603604081101561130e57600080fd5b5080356001600160a01b031690602001356001600160801b0319166139d2565b604080519c8d5260208d019b909b528b8b01999099526001600160401b0397881660608c015295871660808b015293861660a08a01529190941660c088015260e08701939093526101008601929092526101208501919091526001600160a01b0316610140840152151561016083015251908190036101800190f35b3480156113b657600080fd5b50610797600480360360208110156113cd57600080fd5b5035613a5e565b3480156113e057600080fd5b506107da600480360360408110156113f757600080fd5b506001600160a01b038135169060200135613a77565b34801561141957600080fd5b506106456004803603606081101561143057600080fd5b506001600160a01b038135169060208101359060400135613a98565b34801561145857600080fd5b506107da6004803603604081101561146f57600080fd5b810190602081018135600160201b81111561148957600080fd5b82018360208201111561149b57600080fd5b803590602001918460208302840111600160201b831117156114bc57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561150b57600080fd5b82018360208201111561151d57600080fd5b803590602001918460208302840111600160201b8311171561153e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613c02945050505050565b600d5481565b600c54600160e01b900460ff1681565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561161b5780601f106115f05761010080835404028352916020019161161b565b820191906000526020600020905b8154815290600101906020018083116115fe57829003601f168201915b505050505090505b90565b600061163a611633613c57565b8484613c5b565b5060015b92915050565b6001600160a01b03821660009081526016602090815260408083206001600160801b0319851684528252808320815160a08101835281548082526001830154948201949094526002909101546001600160401b03808216938301849052600160401b8204166060830152600160801b900460ff1615156080820152909290819081906116cf81613ce3565b6060820151608090920151969995985096506001600160401b0316949392505050565b60055490565b60408051600280825260608201835260009283928392839260208301908036833701905050905073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160008151811061174157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061176f57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316637ff36ab5346001853342611c20016040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611828578181015183820152602001611810565b50505050905001955050505050506000604051808303818588803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561188d57600080fd5b8101908080516040519392919084600160201b8211156118ac57600080fd5b9083019060208201858111156118c157600080fd5b82518660208202830111600160201b821117156118dd57600080fd5b82525081516020918201928201910280838360005b8381101561190a5781810151838201526020016118f2565b5050505090500160405250505090506119388160018151811061192957fe5b60200260200101518888613637565b94509450945050509250925092565b601360209081526000928352604080842090915290825290205481565b60606000808411801561198e57506001600160a01b0385166000908152600f602052604090205484105b6119b0576001600160a01b0385166000908152600f60205260409020546119cd565b6001600160a01b0385166000908152600f60205260409020548490035b9050600080841180156119df57508382115b6119ea5760006119ee565b8382035b905060008183036001600160401b0381118015611a0a57600080fd5b50604051908082528060200260200182016040528015611a34578160200160208202803683370190505b509350825b82811115611ac6576000611a56896000198401600160f81b613033565b6001600160a01b038a1660009081526014602090815260408083206001600160801b03198516845290915290206001015490915015611abc5780868481518110611a9c57fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901611a39565b505050509392505050565b6000611b2b84611adf613c57565b6001600160a01b0387166000908152600160205260408120611b2691879190611b06613c57565b6001600160a01b0316815260208101919091526040016000205490613d6b565b613c5b565b611b36848484613d80565b5060019392505050565b60045460ff1690565b600f6020526000908152604090205481565b600c54600160201b900463ffffffff1681565b6012602052600090815260409020805460019091015482565b611b913382613e52565b50565b60007f000000000000000000000000000000000000000000000000000000005fa9d800611bbf613ef6565b1015611bcc576000611bd4565b611bd4613efa565b905090565b601d546001600160a01b03163314611bf057600080fd5b6001600160a01b038116600090815260126020526040902069021e19e0c9bab24000009055611c1d613f0c565b6001600160a01b0390911660009081526012602052604090206001600160401b0391909116600190910155565b611c5a611c55613efa565b613f1e565b611c6533838361423f565b5050565b6001600160a01b03811660009081526010602052604081205415611cc0576001600160a01b038216600090815260106020526040902054611cbb908390611cb1906001613d6b565b600160f91b613033565b61163e565b600092915050565b60116020526000908152604090205481565b601d546001600160a01b031681565b611cf4611c55613efa565b565b600c54600160401b90046001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b03811660009081526011602052604081205415611cc0576001600160a01b038216600090815260116020526040902054611cbb908390611d6f906001613d6b565b600360f81b613033565b60005b8351811015611dd457611dc9848281518110611d9457fe5b6020026020010151848381518110611da857fe5b6020026020010151848481518110611dbc57fe5b6020026020010151613637565b505050600101611d7c565b50505050565b6001600160a01b0382811660009081526014602090815260408083206001600160801b03198616845282528083208151610180810183528154815260018201549381019390935260028101549183019190915260038101546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600481015460e08301526005810154610100830152600681015461012083015260070154928316610140820152600160a01b90920460ff16151561016083015290611eb6816145bd565b949350505050565b601b6020526000908152604090208054600182015460029092015490919083565b6000806000600c60089054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611f3257600080fd5b505afa158015611f46573d6000803e3d6000fd5b505050506040513d6060811015611f5c57600080fd5b50805160208083015160409384015184516001600160701b03808616825283169381019390935263ffffffff811683860152935192965094509192507f17057eec9ed80c65db1c29e57a343df0e9f052cf0f5ec6e93bc084533ae9b8c99181900360600190a1600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600c60089054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561203057600080fd5b505afa158015612044573d6000803e3d6000fd5b505050506040513d602081101561205a57600080fd5b50516001600160a01b0316146120705782612072565b835b6001600160701b0316905060006120876116f2565b156120ad576120a86120976116f2565b6120a28460c861461e565b9061464c565b6120b0565b60005b90506028811080156120cc5750600c54600160e01b900460ff16155b156120d9576120d961466e565b603c811180156120f75750600c54600160e01b900460ff1615156001145b1561210457612104614683565b600c5460408051600160e01b90920460ff1615158252517fbbf65e071e5468fb599b01ba3b914ae6065cf10ad084e0efe2133f7eaa8979bd916020908290030190a15050505050565b6000806000806000806000806000601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b03191681526020019081526020016000206040518060a00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a900460801b6001600160801b0319166001600160801b031916815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060000151985080602001519750806080015194506000601460008b6001600160a01b03166001600160a01b0316815260200190815260200160002060008a6001600160801b0319166001600160801b0319168152602001908152602001600020604051806101800160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160109054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016003820160189054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016007820160149054906101000a900460ff16151515158152505090508061012001519750612410816124028385614692565b61240b84614717565b614747565b9650806101600151945061242381614775565b925061242e816145bd565b935050509295985092959890939650565b601e546001600160a01b031681565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561161b5780601f106115f05761010080835404028352916020019161161b565b60006124bc611c55613efa565b6000806124c9338561478e565b6040805161018081018252835480825260018501546020830181905260028601549383019390935260038501546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0830152600485015460e08301526005850154610100830152600685015461012083018190526007909501546001600160a01b038116610140840152600160a01b900460ff16151561016083015290955091935061258c929091906149d9565b6125a78260a001516001600160401b03168360000151614a36565b6125c38260a001516001600160401b0316836101200151614ae9565b6125e582610140015183610100015184606001516001600160401b0316614b9c565b6125f38260c0015182614c41565b61266081836020015111612608576000612610565b818360200151035b3360009081526013602090815260408083206001600160801b03198a16845290915290819020549085015161014086015160808701518751929093019290916001600160401b0390911690614c87565b8161014001516001600160a01b0316336001600160a01b0316856001600160801b0319167f8cc66e48ebd8c008b36e03ee2f7c3f60a313a34a5bf1f3cb988a7936cd47f0d48560200151866000015187610120015188604001518960c001518960405180878152602001868152602001858152602001848152602001836001600160401b03168152602001828152602001965050505050505060405180910390a4506040015192915050565b600080600080600061271f611c55613efa565b3360009081526014602090815260408083206001600160801b03198b168452909152902060070154600160a01b900460ff1661275a57600080fd5b3360009081526014602090815260408083206001600160801b03198b1684528252918290208251610180810184528154815260018201549281019290925260028101549282019290925260038201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c0830152600483015460e0830152600583015461010083015260068301546101208301526007909201546001600160a01b038116610140830152600160a01b900460ff1615156101608201529087166128415761283c81614d90565b61285d565b61285d876001600160401b031661285783614dc6565b90614def565b95508060a001516001600160401b031686116128795785612882565b61288281614d90565b955061289b816000015161289583614dc6565b88614e01565b94506128a6816145bd565b612975576128b381614e47565b93506128c6858533600660020154614ea0565b81519093506128d59084613d6b565b815260a08101516128ef906001600160401b031684614a36565b6101208101511561293d5761290c85856000600660020154614ea0565b61012082015190925061291f9083613d6b565b61012082015260a081015161293d906001600160401b031683614ae9565b612949600084846149d9565b61297081602001518683610140015184608001516001600160401b03168560000151614c87565b6129f0565b3360009081526013602090815260408083206001600160801b03198c1684529091529020546129a49086614def565b3360009081526013602090815260408083206001600160801b03198d1684528252909120829055820151610140830151608084015184516129f09492916001600160401b031690614c87565b60e081018681523360008181526014602090815260408083206001600160801b03198e168452825291829020855181559085015160018201559084015160028201556060840151600382018054608087015160a088015160c089015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b93909116929092029190911790559151600483015561010083015160058301556101208301516006830155610140830151600790920180546101608501516001600160a01b03199091166001600160a01b039094169390931760ff60a01b1916600160a01b9315159390930292909217909155612b299086614edf565b336001600160801b031989167f7b5d0995432c9ea1c8033b358af591013d0deff8dec5f4ae49612eba8bfafc0c87898787612b62613efa565b6040805195865260208601949094528484019290925260608401526001600160401b03166080830152519081900360a00190a3509295509295909350565b604080516364e329cb60e11b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260048201523060248201529051735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9163c9c653969160448083019260209291908290030181600087803b158015612c0d57600080fd5b505af1158015612c21573d6000803e3d6000fd5b505050506040513d6020811015612c3757600080fd5b5051600c80546001600160a01b03909216600160401b0268010000000000000000600160e01b0319909216919091179055565b6001600160a01b0382811660009081526014602090815260408083206001600160801b03198616845282528083208151610180810183528154808252600183015494820185905260028301549382019390935260038201546001600160401b0380821660608401819052600160401b8304821660808501819052600160801b8404831660a08601819052600160c01b90940490921660c08501819052600486015460e0860181905260058701546101008701526006870154610120870152600790960154998a16610140860152600160a01b90990460ff161515610160850152979096919590949092909190819081908190612d6581614f7b565b9450612d7081614f9a565b93508061016001519250612d83816145bd565b9150509295989b509295989b9093969950565b6000612da3611c55613efa565b3360009081526016602090815260408083206001600160801b031986168452825291829020825160a08101845281548152600182015492810192909252600201546001600160401b0380821693830193909352600160401b81049092166060820152600160801b90910460ff16151560808201819052612e2257600080fd5b60006080820152612e31613efa565b6001600160401b03166060820152612e4881613ce3565b60208201819052612e5a903390614edf565b600c548151612e7b91600160401b90046001600160a01b0316903390614fc1565b8051600b54612e8991613d6b565b600b553360009081526016602090815260408083206001600160801b0319969096168352948152908490208251815590820151600182018190559382015160029091018054606084015160809094015167ffffffffffffffff199091166001600160401b039384161767ffffffffffffffff60401b1916600160401b93909416929092029290921760ff60801b1916600160801b911515919091021790555090565b600061163a612f38613c57565b8484613d80565b6000816001600160401b0316118015612f705750612f5b613efa565b6001600160401b0316816001600160401b0316105b612f7957600080fd5b6009546001600160401b03821611612f9057600080fd5b611b9181613f1e565b6001600160a01b0381166000908152600f602052604081205415611cc0576001600160a01b0382166000908152600f6020526040902054611cbb908390612fe1906001613d6b565b600160f81b613033565b600c5463ffffffff1681565b739c306cad86550ec80d77668c0a8bee6eb34684b681565b60196020526000908152604090205481565b60186020526000908152604090205481565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152603482018590526001600160f81b0319841660548301528251603581840301815260559092019092528051910120600090611eb690611623565b6015602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401546001600160a01b039093169360809290921b9290919060ff1685565b60176020526000908152604090205481565b600654600754600854600954600a54600b5486565b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6000613126611c55613efa565b600c54600160e01b900460ff16151560011461314157600080fd5b600c5461316090600160401b90046001600160a01b03163330856150db565b613168615ce5565b61317133615205565b915061317b613f0c565b6001600160401b0316604082015282815260016080820152600b546131a09084614def565b600b553360008181526016602090815260408083206001600160801b031987168452825291829020845181559084015160018201559083015160029091018054606085015160808601511515600160801b0260ff60801b196001600160401b03928316600160401b0267ffffffffffffffff60401b199390961667ffffffffffffffff19909416939093179190911693909317169190911790556132439061522e565b50919050565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516000918291829188916001600160a01b038316916323b872dd91606480830192602092919082900301818887803b1580156132a657600080fd5b505af11580156132ba573d6000803e3d6000fd5b505050506040513d60208110156132d057600080fd5b50506040805163095ea7b360e01b8152737a250d5630b4cf539739df2c5dacb4c659f2488d60048201526024810189905290516001600160a01b0383169163095ea7b39160448083019260209291908290030181600087803b15801561333557600080fd5b505af1158015613349573d6000803e3d6000fd5b505050506040513d602081101561335f57600080fd5b506000905061336e893061524e565b90506000737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03166338ed17398a6001853342611c20016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561340f5781810151838201526020016133f7565b505050509050019650505050505050600060405180830381600087803b15801561343857600080fd5b505af115801561344c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561347557600080fd5b8101908080516040519392919084600160201b82111561349457600080fd5b9083019060208201858111156134a957600080fd5b82518660208202830111600160201b821117156134c557600080fd5b82525081516020918201928201910280838360005b838110156134f25781810151838201526020016134da565b5050505090500160405250505090506135208160028151811061351157fe5b60200260200101518989613637565b9550955095505050505b9450945094915050565b601a6020526000908152604090208054600182015460029092015490919083565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b601e546001600160a01b0316331461358457600080fd5b601d80546001600160a01b039092166001600160a01b0319928316179055601e80549091169055565b60106020526000908152604090205481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60166020908152600092835260408084209091529082529020805460018201546002909201549091906001600160401b0380821691600160401b810490911690600160801b900460ff1685565b6000806000613647611c55613efa565b336001600160a01b03851614801590613664575061366484615314565b61366d57600080fd5b60016001600160401b038616108015906136925750613be26001600160401b03861611155b61369b57600080fd5b620f42408610156136ab57600080fd5b60008060006136bc338a8a8a61531f565b6001600160401b0316925092509250600083610120015111156137b3576136e1615ce5565b3381526001600160801b0319831660208201526001608082015261370488615413565b6001600160a01b0389811660009081526015602090815260408083206001600160801b0319868116855290835292819020865181546001600160a01b031916951694909417845590850151600184018054909316608091821c179092558401516002830155606084015160038301558301516004909101805460ff191691151591909117905594506137958861543c565b6137b18460a001516001600160401b031685610120015161545c565b505b3360008181526014602090815260408083206001600160801b031987168452825291829020865181559086015160018201559085015160028201556060850151600382018054608088015160a089015160c08a015167ffffffffffffffff199093166001600160401b039586161767ffffffffffffffff60401b1916600160401b928616929092029190911767ffffffffffffffff60801b1916600160801b91851691909102176001600160c01b0316600160c01b939091169290920291909117905560e0850151600482015561010085015160058201556101208501516006820155610140850151600790910180546101608701516001600160a01b03199091166001600160a01b039093169290921760ff60a01b1916600160a01b921515929092029190911790556138e69061548b565b6138fe836020015184600001518561012001516154ab565b6139198360a001516001600160401b031684600001516154de565b866001600160a01b0316336001600160a01b0316836001600160801b0319167f6619c8f19b39bf3558af16516f9ca110fcac4a7ab6d846d1b02a17b11f703a338660200151876000015188610120015189606001518a608001518b610100015160405180878152602001868152602001858152602001846001600160401b03168152602001836001600160401b03168152602001828152602001965050505050505060405180910390a490945092505093509350939050565b6014602090815260009283526040808420909152908252902080546001820154600283015460038401546004850154600586015460068701546007909701549596949593946001600160401b0380851695600160401b8604821695600160801b8104831695600160c01b909104909216939192906001600160a01b03811690600160a01b900460ff168c565b601c602052600090815260409020805460019091015482565b601d546001600160a01b03163314613a8e57600080fd5b611c658282614edf565b606060008084118015613ac257506001600160a01b03851660009081526010602052604090205484105b613ae4576001600160a01b038516600090815260106020526040902054613b01565b6001600160a01b0385166000908152601060205260409020548490035b905060008084118015613b1357508382115b613b1e576000613b22565b8382035b905060008183036001600160401b0381118015613b3e57600080fd5b50604051908082528060200260200182016040528015613b68578160200160208202803683370190505b509350825b82811115611ac6576000613b8a896000198401600160f91b613033565b6001600160a01b03808b1660009081526015602090815260408083206001600160801b031986168452909152902054919250613bc6911661550d565b15613bf85780868481518110613bd857fe5b6001600160801b0319909216602092830291909101909101526001909201915b5060001901613b6d565b613c0d611c55613efa565b60005b8251811015613c5257613c4a33848381518110613c2957fe5b6020026020010151848481518110613c3d57fe5b602002602001015161423f565b600101613c10565b505050565b3390565b6001600160a01b038316613c6e57600080fd5b6001600160a01b038216613c8157600080fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008061016d61ffff168360400151016001600160401b0316905060008160066003015410613d125781613d16565b6009545b60408501519091506001600160401b03165b81811015613d63576000818152601c60205260409020600101548551670de0b6b3a76400000281613d5557fe5b049390930192600101613d28565b505050919050565b600082821115613d7a57600080fd5b50900390565b6001600160a01b038316613d9357600080fd5b6001600160a01b038216613da657600080fd5b6001600160a01b038316600090815260208190526040902054613dc99082613d6b565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613df89082614def565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b038216613e6557600080fd5b6001600160a01b038216600090815260208190526040902054613e889082613d6b565b6001600160a01b038316600090815260208190526040902055600554613eae9082613d6b565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b4290565b6000611bd4613f07613ef6565b61551b565b6000613f16613efa565b600101905090565b613f26611edf565b600654600954600091905b836001600160401b0316811015611dd45760001981016000908152601a602081815260408084206002015485855260178352818520549383529381902081516060810183528154815260019091015492810192909252919092019082018190526007549094508410613fa4576000613fab565b6007548490035b815261406a61405684613fbc6116f2565b60008681526019602090815260409182902054600c5483516330550a4b60e01b815263ffffffff909116600482015292519092739c306cad86550ec80d77668c0a8bee6eb34684b6926330550a4b92602480840193829003018186803b15801561402557600080fd5b505afa158015614039573d6000803e3d6000fd5b505050506040513d602081101561404f57600080fd5b505161554c565b82516120a290670de0b6b3a764000061461e565b60208083019182526000848152601a825260408082208551815593516001808601919091558186015160029586015560001987018352601b80855282842090950154878452601885528284205495855292829020825160608101845281548152910154938101939093529201918101829052600a549195509085106140f05760006140f7565b600a548590035b815261410d614056856141086116f2565b615569565b60208083019182526000858152601b8252604080822085518155935160018086019190915581860151600290950194909455601c83529081902081518083019092529092015490820152600b5481526141fc6140568661416b6116f2565b600c54604080516330550a4b60e01b8152600160201b90920463ffffffff16600483015251739c306cad86550ec80d77668c0a8bee6eb34684b6916330550a4b916024808301926020929190829003018186803b1580156141cb57600080fd5b505afa1580156141df573d6000803e3d6000fd5b505050506040513d60208110156141f557600080fd5b5051615578565b60208083019182526000868152601c90915260409020825181559051600190910155614226615589565b5050600980546001908101909155919091019050613f31565b6001600160a01b0380841660009081526015602090815260408083206001600160801b0319808816855290835292819020815160a08101835281549095168552600180820154608090811b90951693860193909352600281015491850191909152600381015460608501526004015460ff161515918301829052146142c357600080fd5b80516020808301516001600160a01b0380841660009081526014845260408082206001600160801b03198516835285528082208151610180810183528154815260018201549681019690965260028101549186019190915260038101546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b9091041660c0860152600481015460e08601526005810154610100860152600681015461012086015260070154918216610140850152600160a01b90910460ff1615156101608401529091906143a78286614692565b905060006143b483614717565b90506143bf83614775565b15614413576000871180156143dc57506143d98282615670565b87105b156144065760608601516143f09088614def565b60608701526143ff8288614def565b905061440e565b600060808701525b614451565b61442d8261441f613efa565b6001600160401b0316615670565b606087015190975061443f9088614def565b606087015261444e8288614def565b90505b600061445e848484614747565b60408801519091506144709082614def565b87604001818152505086601560008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008b6001600160801b0319166001600160801b031916815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160801b03021916908360801c0217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506145598a82614edf565b604080516001600160801b03198b811682526020820184905282516001600160a01b03808f1694928a1693908b16927f5d13067bdc9e4d510839580df1e932220b31fb2bc7790b5bd35aae14f0303bed92918290030190a450505050505050505050565b6000808260c001516001600160401b0316116145f9576145db613efa565b6001600160401b03168260a001516001600160401b0316111561163e565b8160c001516001600160401b03168260a001516001600160401b031611159050919050565b60008261462d5750600061163e565b8282028284828161463a57fe5b041461464557600080fd5b9392505050565b600080821161465a57600080fd5b600082848161466557fe5b04949350505050565b600c805460ff60e01b1916600160e01b179055565b600c805460ff60e01b19169055565b6000614645826060015184606001516001600160401b0316601260008761014001516001600160a01b03166001600160a01b0316815260200190815260200160002060010154116146f05784606001516001600160401b0316612857565b6101408501516001600160a01b031660009081526012602052604090206001015490614def565b6000808260c001516001600160401b03161161473657611cbb82614d90565b5060c001516001600160401b031690565b6000614757846101400151615691565b61476b576147668484846156b0565b611eb6565b5060009392505050565b610160810151600090158061163e575061163e826145bd565b6001600160a01b03821660009081526014602090815260408083206001600160801b0319851684529091528120600701548190600160a01b900460ff166147d457600080fd5b6001600160a01b03841660009081526014602090815260408083206001600160801b0319871684529091529020915061480b613efa565b6003830180546001600160c01b0316600160c01b6001600160401b0393841681029190911791829055604080516101808101825286548152600187015460208201526002870154918101919091528284166060820152600160401b830484166080820152600160801b8304841660a0820152910490911660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff1615156101608201526148d7906156ef565b60028301819055604080516101808101825284548152600185015460208201529081019190915260038301546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0820152600483015460e08201526005830154610100820152600683015461012082015260078301546001600160a01b038116610140830152600160a01b900460ff16151561016082015261498d90614f9a565b60078301805460ff60a01b1916905560018301549091506149c490859083106149b75760006149bf565b828460010154035b614edf565b6149d2848360020154614edf565b9250929050565b60065483106149e95760006149f0565b6006548390035b6006556007548210614a03576000614a0a565b6007548290035b6007558015614a2e57600a548110614a23576000614a2a565b600a548190035b600a555b613c52615710565b614a3f82615767565b15614a87576000828152601760205260409020548110614a60576000614a73565b6000828152601760205260409020548190035b600083815260176020526040902055611c65565b6000614a91615783565b6001600160401b03166000818152601a60205260409020600201549091508210614abc576000614ad2565b6000818152601a60205260409020600201548290035b6000918252601a6020526040909120600201555050565b614af282615767565b15614b3a576000828152601860205260409020548110614b13576000614b26565b6000828152601860205260409020548190035b600083815260186020526040902055611c65565b6000614b44615783565b6001600160401b03166000818152601b60205260409020600201549091508210614b6f576000614b85565b6000818152601b60205260409020600201548290035b6000918252601b6020526040909120600201555050565b614ba581615795565b158015614bb65750614bb68361550d565b15613c52576001600160a01b0383166000908152601260205260409020548210614be1576000614bfe565b6001600160a01b0383166000908152601260205260409020548290035b6001600160a01b038416600090815260126020526040902055614c20836157b1565b6001600160a01b038416600090815260126020526040902060010155505050565b8015611c65576001600160401b038216600090815260196020526040902054614c6a9082614def565b6001600160401b0383166000908152601960205260409020555050565b600081118015614ca757506041614c9c613efa565b6001600160401b0316115b15614d63576000614cbb86868486886157c9565b600854909150811115614d5d57600854614cdd906064906120a290606e61461e565b8110614cfd57600854614cf8906064906120a290606e61461e565b614cff565b805b90507fb52ab4a425c20017539fcd851fc4ddbb50d17546576353cd51a2d483d80a45b881600660020154614d31613efa565b6040805193845260208401929092526001600160401b031682820152519081900360600190a160088190555b50614d89565b6041614d6d613efa565b6001600160401b03161415614d8957670186cc6acd4b00006008555b5050505050565b60006006600301548260a001516001600160401b031611614dbe578160a001516001600160401b031661163e565b505060095490565b60008160e00151600014614dde578160e0015161163e565b50606001516001600160401b031690565b60008282018381101561464557600080fd5b6000825b82811015614e3f576000818152601a6020526040902060010154670de0b6b3a7640000860281614e3157fe5b049190910190600101614e05565b509392505050565b61016081015160009015614e7c57611cbb614e60613efa565b6001600160401b03168360a001516001600160401b0316615670565b61163e8260c001516001600160401b03168360a001516001600160401b0316615670565b6000614eab8361550d565b614ec557614ec08585846402540be400615826565b614ed6565b614ed685858464028fa6ae00615826565b95945050505050565b6001600160a01b038216614ef257600080fd5b600554614eff9082614def565b6005556001600160a01b038216600090815260208190526040902054614f259082614def565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000816101600151614f9157816040015161163e565b61163e82615848565b6000614fa582615860565b80614fb45750614fb4826145bd565b611cc057611cbb826158bf565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b6020831061503d5780518252601f19909201916020918201910161501e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461509f576040519150601f19603f3d011682016040523d82523d6000602084013e6150a4565b606091505b50915091508180156150d25750805115806150d257508080602001905160208110156150cf57600080fd5b50515b614d8957600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b6020831061515f5780518252601f199092019160209182019101615140565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146151c1576040519150601f19603f3d011682016040523d82523d6000602084013e6151c6565b606091505b50915091508180156151f45750805115806151f457508080602001905160208110156151f157600080fd5b50515b6151fd57600080fd5b505050505050565b6001600160a01b03811660009081526011602052604081205461163e908390600360f81b613033565b6001600160a01b0316600090815260116020526040902080546001019055565b60408051600380825260808201909252606091602082018380368337019050509050828160008151811061527e57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106152c057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081816002815181106152ee57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505092915050565b3b63ffffffff161590565b615327615d13565b6000806153348787613e52565b61533c613f0c565b9050615347876158f5565b6001600160401b0380871660808601819052838216606087015283880190911660a086015260016101608601526020850188905260085491935061538f918891908790614ea0565b835261539961591e565b506020830151600d546153b991670de0b6b3a7640000916120a29161461e565b6101008401526153c88461550d565b1561352a576001600160a01b03841661014084018190526101008401516153ef9190615b0d565b61540386866001600160401b031686615b75565b6101208401529450945094915050565b6001600160a01b03811660009081526010602052604081205461163e908390600160f91b613033565b6001600160a01b0316600090815260106020526040902080546001019055565b6000828152601860205260409020546154759082614def565b6000928352601860205260409092209190915550565b6001600160a01b03166000908152600f6020526040902080546001019055565b6006546154b89084614def565b6006556007546154c89083614def565b6007558015614a2e57600a54614a2a9082614def565b6000828152601760205260409020546154f79082614def565b6000928352601760205260409092209190915550565b6001600160a01b0316151590565b6000620151807f000000000000000000000000000000000000000000000000000000005fa9d80083035b0492915050565b60008282858701612710028161555e57fe5b040195945050505050565b6315dd2ecd9101612710020490565b600081838501612710028161466557fe5b600c54600160e01b900460ff16151560011480156155b95750600c5462019258600160201b90910463ffffffff16105b1561560357600c805463ffffffff1967ffffffff00000000198216600160201b9283900463ffffffff90811660060181169093021790811690821660051901909116179055611cf4565b600c54600160e01b900460ff161580156156295750600c546201925863ffffffff909116105b15611cf457600c805467ffffffff000000001963ffffffff19821663ffffffff928316600601831617908116600160201b9182900483166005190190921602179055611cf4565b6000818311615688576156838284613d6b565b614645565b50600092915050565b6001600160a01b03166000908152601260205260409020600101541590565b6000825b82811015614e3f576000818152601b60205260409020600101548551670de0b6b3a764000002816156e157fe5b0491909101906001016156b4565b600061163e826000015161570284614dc6565b61570b85614d90565b614e01565b600954600754600654600854600a54604080519485526020850193909352838301919091526060830152517fea8ce1d041020595d75f4f48ba3378787b84e61d101465836fa54f1b338a4db59181900360800190a2565b6000615771613efa565b6001600160401b031690911015919050565b6000600161578f613efa565b03905090565b600061579f613efa565b6001600160401b031690911115919050565b60006157bc82615ba6565b611cc057611cbb82615bcd565b6000806157fb846157d98561550d565b6157e8576402540be4006157ef565b64028fa6ae005b64ffffffffff16615c22565b905061581b856120a26305f5e10061581585818d8d614def565b9061461e565b979650505050505050565b6000614ed66402540be4006120a261583e8786615c22565b6158158988615c6c565b600061585382615860565b611cc057611cbb826156ef565b6000808260c001516001600160401b03161161589b5761587e613efa565b6001600160401b031682606001516001600160401b03161161163e565b8160c001516001600160401b031682606001516001600160401b0316119050919050565b60006103e86158cd83615c84565b60016158d885614e47565b0361032002816158e457fe5b046064018360200151028161554557fe5b6001600160a01b0381166000908152600f602052604081205461163e908390600160f81b613033565b6040805163d06ca61f60e01b8152670de0b6b3a76400006004820181815260248301938452600e805460448501819052600095737a250d5630b4cf539739df2c5dacb4c659f2488d9563d06ca61f959492606490910190849080156159ac57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161598e575b5050935050505060006040518083038186803b1580156159cb57600080fd5b505afa925050508015615a8b57506040513d6000823e601f3d908101601f1916820160405260208110156159fe57600080fd5b8101908080516040519392919084600160201b821115615a1d57600080fd5b908301906020820185811115615a3257600080fd5b82518660208202830111600160201b82111715615a4e57600080fd5b82525081516020918201928201910280838360005b83811015615a7b578181015183820152602001615a63565b5050505090500160405250505060015b615ae757615a97615da9565b80615aa25750615aac565b5050600d54611623565b3d808015615ad6576040519150601f19603f3d011682016040523d82523d6000602084013e615adb565b606091505b50600d54915050611623565b80600281518110615af457fe5b6020026020010151600d81905550600d54915050611623565b6001600160a01b038216600090815260126020526040902054615b309082614def565b6001600160a01b038316600090815260126020526040902055615b52826157b1565b6001600160a01b0390921660009081526012602052604090206001019190915550565b6000615b8082615691565b80615b8c575061016d83105b61476b5761476684846006600201546402540be400615826565b6001600160a01b031660009081526012602052604090205469021e19e0c9bab24000001190565b6001600160a01b038116600090815260126020526040812060010154615c0357615bf5613efa565b6001600160401b031661163e565b506001600160a01b031660009081526012602052604090206001015490565b600081615c4f6107218511615c38576000615c3f565b6107201985015b660150b9a52b11286134c1615cba565b615c63856630aad4df397abe610721615cba565b01019392505050565b6000614645826120a285670de0b6b3a764000061461e565b6000600182608001516001600160401b031611615ca2576001615cab565b60018260800151035b6001600160401b031692915050565b6000611eb66402540be400838611615cdb57615cd6868661461e565b6120a2565b6120a2848661461e565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60405180610180016040528060008152602001600081526020016000815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160006001600160401b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b60e01c90565b600060443d1015615db957611623565b600481823e6308c379a0615dcd8251615da3565b14615dd757611623565b6040513d600319016004823e80513d6001600160401b038160248401118184111715615e065750505050611623565b82840192508251915080821115615e205750505050611623565b503d83016020828401011115615e3857505050611623565b601f01601f191681016020016040529150509056fea264697066735822122077ab368710148891aff560da25363ab814108ed0459319cf37cd25027984ed7964736f6c63430007060033

Deployed Bytecode Sourcemap

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

Swarm Source

ipfs://77ab368710148891aff560da25363ab814108ed0459319cf37cd25027984ed79

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

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

Validator Index Block Amount
View All Withdrawals

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

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