ETH Price: $2,523.03 (-0.06%)

Token

Jackpot Ethereum (JETH)
 

Overview

Max Total Supply

158,547,698.29379746 JETH

Holders

56

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
28,804.6142754 JETH

Value
$0.00
0x43d5472835f5f24df67ec0f94f1369527e5c8b79
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Jackpot

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-05-05
*/

// File: openzeppelin-solidity/contracts/GSN/Context.sol

pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/Jackpot.sol

pragma solidity ^0.5.0;





/**
 * @dev Implementation of the {ERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20Mintable}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {ERC20-approve}.
 */
contract ERC20 is Context, IERC20, Ownable {
    using SafeMath for uint256;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    // allocating 30 million tokens for promotion, airdrop, liquidity and dev share
    uint256 private _totalSupply = 99999900 * (10**8);

    constructor() public {
        _balances[msg.sender] = _totalSupply;
    }

    /**
     * @dev See {ERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {ERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {ERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {ERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {ERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {ERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {ERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    /* function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    } */
    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {ERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    /* function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    } */
    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * 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 {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _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 {
        require(account != address(0), "ERC20: mint to the zero address");
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");
        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * 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 {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    /* function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    } */
}

contract GlobalsAndUtility is ERC20 {
    /*  XfLobbyEnter
     */
    event XfLobbyEnter(
        uint256 timestamp,
        uint256 enterDay,
        uint256 indexed entryIndex,
        uint256 indexed rawAmount
    );
    /*  XfLobbyExit
     */
    event XfLobbyExit(
        uint256 timestamp,
        uint256 enterDay,
        uint256 indexed entryIndex,
        uint256 indexed xfAmount,
        address indexed referrerAddr
    );
    /*  DailyDataUpdate
     */
    event DailyDataUpdate(
        address indexed updaterAddr,
        uint256 timestamp,
        uint256 beginDay,
        uint256 endDay
    );
    /*  StakeStart
     */
    event StakeStart(
        uint40 indexed stakeId,
        address indexed stakerAddr,
        uint256 stakedSuns,
        uint256 stakeShares,
        uint256 stakedDays
    );
    /*  StakeGoodAccounting
     */
    event StakeGoodAccounting(
        uint40 indexed stakeId,
        address indexed stakerAddr,
        address indexed senderAddr,
        uint256 stakedSuns,
        uint256 stakeShares,
        uint256 payout,
        uint256 penalty
    );
    /*  StakeEnd
     */
    event StakeEnd(
        uint40 indexed stakeId,
        uint40 prevUnlocked,
        address indexed stakerAddr,
        uint256 lockedDay,
        uint256 servedDays,
        uint256 stakedSuns,
        uint256 stakeShares,
        uint256 payout,
        uint256 penalty,
        uint256 stakeReturn
    );
    /*  ShareRateChange
     */
    event ShareRateChange(
        uint40 indexed stakeId,
        uint256 timestamp,
        uint256 newShareRate
    );
    //uint256 internal constant ROUND_TIME = 1 days;
    //uint256 internal constant ROUND_TIME = 2 hours;
    uint256 public ROUND_TIME;
    //uint256 internal constant ROUND_TIME = 5 minutes;
    //uint256 internal constant LOTERY_ENTRY_TIME = 1 hours;
    //uint256 internal constant LOTERY_ENTRY_TIME = 20 minutes;
    uint256 public LOTERY_ENTRY_TIME;
    address public defaultReferrerAddr;
    /* Flush address */
    address payable public flushAddr;
    uint256 internal firstAuction = uint256(-1);
    uint256 internal LAST_FLUSHED_DAY = 0;
    /* ERC20 constants */
    string public constant name = "Jackpot Ethereum";
    string public constant symbol = "JETH";
    uint8 public constant decimals = 8;
    uint256 public LAUNCH_TIME; // = 1606046700;
    uint256 public dayNumberBegin; // = 2;
    /* Start of claim phase */
    uint256 internal constant CLAIM_STARTING_AMOUNT =
        2500000 * (10**uint256(decimals));
    uint256 internal constant CLAIM_LOWEST_AMOUNT =
        1000000 * (10**uint256(decimals));
    /* Number of words to hold 1 bit for each transform lobby day */
    uint256 internal constant XF_LOBBY_DAY_WORDS = ((1 + (50 * 7)) + 255) >> 8;
    /* Stake timing parameters */
    uint256 internal constant MIN_STAKE_DAYS = 1;
    uint256 internal constant MAX_STAKE_DAYS = 180; // Approx 0.5 years
    uint256 internal constant EARLY_PENALTY_MIN_DAYS = 90;
    //uint256 private constant LATE_PENALTY_GRACE_WEEKS = 2;
    uint256 internal constant LATE_PENALTY_GRACE_DAYS = 2 * 7;
    //uint256 private constant LATE_PENALTY_SCALE_WEEKS = 100;
    uint256 internal constant LATE_PENALTY_SCALE_DAYS = 100 * 7;
    /* Stake shares Longer Pays Better bonus constants used by _stakeStartBonusSuns() */
    //uint256 private constant LPB_BONUS_PERCENT = 20;
    //uint256 private constant LPB_BONUS_MAX_PERCENT = 200;
    uint256 internal constant LPB = (18 * 100) / 20; /* LPB_BONUS_PERCENT */
    uint256 internal constant LPB_MAX_DAYS = (LPB * 200) / 100; /* LPB_BONUS_MAX_PERCENT */
    /* Stake shares Bigger Pays Better bonus constants used by _stakeStartBonusSuns() */
    //uint256 private constant BPB_BONUS_PERCENT = 10;
    //uint256 private constant BPB_MAX_JACKPOT = 7 * 1e6;
    uint256 internal constant BPB_MAX_SUNS =
        7 *
            1e6 * /* BPB_MAX_JACKPOT */
            (10**uint256(decimals));
    uint256 internal constant BPB = (BPB_MAX_SUNS * 100) / 10; /* BPB_BONUS_PERCENT */
    /* Share rate is scaled to increase precision */
    uint256 internal constant SHARE_RATE_SCALE = 1e5;
    /* Share rate max (after scaling) */
    uint256 internal constant SHARE_RATE_UINT_SIZE = 40;
    uint256 internal constant SHARE_RATE_MAX = (1 << SHARE_RATE_UINT_SIZE) - 1;
    /* weekly staking bonus */
    uint8 internal constant BONUS_DAY_SCALE = 2;
    /* Globals expanded for memory (except _latestStakeId) and compact for storage */
    struct GlobalsCache {
        uint256 _lockedSunsTotal;
        uint256 _nextStakeSharesTotal;
        uint256 _shareRate;
        uint256 _stakePenaltyTotal;
        uint256 _dailyDataCount;
        uint256 _stakeSharesTotal;
        uint40 _latestStakeId;
        uint256 _currentDay;
    }
    struct GlobalsStore {
        uint256 lockedSunsTotal;
        uint256 nextStakeSharesTotal;
        uint40 shareRate;
        uint256 stakePenaltyTotal;
        uint16 dailyDataCount;
        uint256 stakeSharesTotal;
        uint40 latestStakeId;
    }
    GlobalsStore public globals;
    /* Daily data */
    struct DailyDataStore {
        uint256 dayPayoutTotal;
        uint256 dayDividends;
        uint256 dayStakeSharesTotal;
    }
    mapping(uint256 => DailyDataStore) public dailyData;
    /* Stake expanded for memory (except _stakeId) and compact for storage */
    struct StakeCache {
        uint40 _stakeId;
        uint256 _stakedSuns;
        uint256 _stakeShares;
        uint256 _lockedDay;
        uint256 _stakedDays;
        uint256 _unlockedDay;
    }
    struct StakeStore {
        uint40 stakeId;
        uint256 stakedSuns;
        uint256 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
    }
    struct UnstakeStore {
        uint40 stakeId;
        uint256 stakedSuns;
        uint256 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        uint256 unstakePayout;
        uint256 unstakeDividends;
    }
    mapping(address => StakeStore[]) public stakeLists;
    mapping(address => UnstakeStore[]) public endedStakeLists;
    /* Temporary state for calculating daily rounds */
    struct DailyRoundState {
        uint256 _allocSupplyCached;
        uint256 _payoutTotal;
    }
    struct XfLobbyEntryStore {
        uint96 rawAmount;
        address referrerAddr;
    }
    struct XfLobbyQueueStore {
        uint40 headIndex;
        uint40 tailIndex;
        mapping(uint256 => XfLobbyEntryStore) entries;
    }
    mapping(uint256 => uint256) public xfLobby;
    mapping(uint256 => mapping(address => XfLobbyQueueStore))
        public xfLobbyMembers;
    mapping(address => uint256) public fromReferrs;
    mapping(uint256 => mapping(address => uint256))
        public jackpotReceivedAuction;

    /*  loteryLobbyEnter
     */
    event loteryLobbyEnter(
        uint256 timestamp,
        uint256 enterDay,
        uint256 indexed rawAmount
    );
    /*  loteryLobbyExit
     */
    event loteryLobbyExit(
        uint256 timestamp,
        uint256 enterDay,
        uint256 indexed rawAmount
    );
    event loteryWin(uint256 day, uint256 amount, address who);
    struct LoteryStore {
        uint256 change;
        uint256 chanceCount;
    }
    struct LoteryCount {
        address who;
        uint256 chanceCount;
    }
    struct winLoteryStat {
        address payable who;
        uint256 totalAmount;
        uint256 restAmount;
    }
    uint256 public lastEndedLoteryDay = 0;
    uint256 public lastEndedLoteryDayWithWinner = 0;
    uint256 public loteryDayWaitingForWinner = 0;
    uint256 public loteryDayWaitingForWinnerNew = 0;
    mapping(uint256 => winLoteryStat) public winners;
    mapping(uint256 => uint256) public dayChanceCount;
    // day => address => chance count
    mapping(uint256 => mapping(address => LoteryStore)) public loteryLobby;
    mapping(uint256 => LoteryCount[]) public loteryCount;

    /**
     * @dev PUBLIC FACING: Optionally update daily data for a smaller
     * range to reduce gas cost for a subsequent operation
     * @param beforeDay Only update days before this day number (optional; 0 for current day)
     */
    function dailyDataUpdate(uint256 beforeDay) external {
        GlobalsCache memory g;
        GlobalsCache memory gSnapshot;
        _globalsLoad(g, gSnapshot);
        /* Skip pre-claim period */
        require(g._currentDay > 1, "JACKPOT: Too early"); /* CLAIM_PHASE_START_DAY */
        if (beforeDay != 0) {
            require(
                beforeDay <= g._currentDay,
                "JACKPOT: beforeDay cannot be in the future"
            );
            _dailyDataUpdate(g, beforeDay);
        } else {
            /* Default to updating before current day */
            _dailyDataUpdate(g, g._currentDay);
        }
        _globalsSync(g, gSnapshot);
    }

    /**
     * @dev PUBLIC FACING: External helper to return multiple values of daily data with
     * a single call.
     * @param beginDay First day of data range
     * @param endDay Last day (non-inclusive) of data range
     * @return array of day stake shares total
     * @return array of day payout total
     */
    /* function dailyDataRange(uint256 beginDay, uint256 endDay)
        external
        view
        returns (uint256[] memory _dayStakeSharesTotal, uint256[] memory _dayPayoutTotal, uint256[] memory _dayDividends)
    {
        require(beginDay < endDay && endDay <= globals.dailyDataCount, "JACKPOT: range invalid");
        _dayStakeSharesTotal = new uint256[](endDay - beginDay);
        _dayPayoutTotal = new uint256[](endDay - beginDay);
        _dayDividends = new uint256[](endDay - beginDay);
        uint256 src = beginDay;
        uint256 dst = 0;
        do {
            _dayStakeSharesTotal[dst] = uint256(dailyData[src].dayStakeSharesTotal);
            _dayPayoutTotal[dst++] = uint256(dailyData[src].dayPayoutTotal);
            _dayDividends[dst++] = dailyData[src].dayDividends;
        } while (++src < endDay);
        return (_dayStakeSharesTotal, _dayPayoutTotal, _dayDividends);
    } */
    /**
     * @dev PUBLIC FACING: External helper to return most global info with a single call.
     * Ugly implementation due to limitations of the standard ABI encoder.
     * @return Fixed array of values
     */
    function globalInfo() external view returns (uint256[10] memory) {
        return [
            globals.lockedSunsTotal,
            globals.nextStakeSharesTotal,
            globals.shareRate,
            globals.stakePenaltyTotal,
            globals.dailyDataCount,
            globals.stakeSharesTotal,
            globals.latestStakeId,
            block.timestamp,
            totalSupply(),
            xfLobby[_currentDay()]
        ];
    }

    /**
     * @dev PUBLIC FACING: ERC20 totalSupply() is the circulating supply and does not include any
     * staked Suns. allocatedSupply() includes both.
     * @return Allocated Supply in Suns
     */
    function allocatedSupply() external view returns (uint256) {
        return totalSupply().add(globals.lockedSunsTotal);
    }

    /**
     * @dev PUBLIC FACING: External helper for the current day number since launch time
     * @return Current day number (zero-based)
     */
    function currentDay() external view returns (uint256) {
        return _currentDay();
    }

    function _currentDay() internal view returns (uint256) {
        return block.timestamp.sub(LAUNCH_TIME).div(ROUND_TIME);
    }

    function _dailyDataUpdateAuto(GlobalsCache memory g) internal {
        _dailyDataUpdate(g, g._currentDay);
    }

    function _globalsLoad(GlobalsCache memory g, GlobalsCache memory gSnapshot)
        internal
        view
    {
        g._lockedSunsTotal = globals.lockedSunsTotal;
        g._nextStakeSharesTotal = globals.nextStakeSharesTotal;
        g._shareRate = globals.shareRate;
        g._stakePenaltyTotal = globals.stakePenaltyTotal;
        g._dailyDataCount = globals.dailyDataCount;
        g._stakeSharesTotal = globals.stakeSharesTotal;
        g._latestStakeId = globals.latestStakeId;
        g._currentDay = _currentDay();
        _globalsCacheSnapshot(g, gSnapshot);
    }

    function _globalsCacheSnapshot(
        GlobalsCache memory g,
        GlobalsCache memory gSnapshot
    ) internal pure {
        gSnapshot._lockedSunsTotal = g._lockedSunsTotal;
        gSnapshot._nextStakeSharesTotal = g._nextStakeSharesTotal;
        gSnapshot._shareRate = g._shareRate;
        gSnapshot._stakePenaltyTotal = g._stakePenaltyTotal;
        gSnapshot._dailyDataCount = g._dailyDataCount;
        gSnapshot._stakeSharesTotal = g._stakeSharesTotal;
        gSnapshot._latestStakeId = g._latestStakeId;
    }

    function _globalsSync(GlobalsCache memory g, GlobalsCache memory gSnapshot)
        internal
    {
        if (
            g._lockedSunsTotal != gSnapshot._lockedSunsTotal ||
            g._nextStakeSharesTotal != gSnapshot._nextStakeSharesTotal ||
            g._shareRate != gSnapshot._shareRate ||
            g._stakePenaltyTotal != gSnapshot._stakePenaltyTotal
        ) {
            globals.lockedSunsTotal = g._lockedSunsTotal;
            globals.nextStakeSharesTotal = g._nextStakeSharesTotal;
            globals.shareRate = uint40(g._shareRate);
            globals.stakePenaltyTotal = g._stakePenaltyTotal;
        }
        if (
            g._dailyDataCount != gSnapshot._dailyDataCount ||
            g._stakeSharesTotal != gSnapshot._stakeSharesTotal ||
            g._latestStakeId != gSnapshot._latestStakeId
        ) {
            globals.dailyDataCount = uint16(g._dailyDataCount);
            globals.stakeSharesTotal = g._stakeSharesTotal;
            globals.latestStakeId = g._latestStakeId;
        }
    }

    function _stakeLoad(
        StakeStore storage stRef,
        uint40 stakeIdParam,
        StakeCache memory st
    ) internal view {
        /* Ensure caller's stakeIndex is still current */
        require(
            stakeIdParam == stRef.stakeId,
            "JACKPOT: stakeIdParam not in stake"
        );
        st._stakeId = stRef.stakeId;
        st._stakedSuns = stRef.stakedSuns;
        st._stakeShares = stRef.stakeShares;
        st._lockedDay = stRef.lockedDay;
        st._stakedDays = stRef.stakedDays;
        st._unlockedDay = stRef.unlockedDay;
    }

    function _stakeUpdate(StakeStore storage stRef, StakeCache memory st)
        internal
    {
        stRef.stakeId = st._stakeId;
        stRef.stakedSuns = st._stakedSuns;
        stRef.stakeShares = st._stakeShares;
        stRef.lockedDay = uint16(st._lockedDay);
        stRef.stakedDays = uint16(st._stakedDays);
        stRef.unlockedDay = uint16(st._unlockedDay);
    }

    function _stakeAdd(
        StakeStore[] storage stakeListRef,
        uint40 newStakeId,
        uint256 newStakedSuns,
        uint256 newStakeShares,
        uint256 newLockedDay,
        uint256 newStakedDays
    ) internal {
        stakeListRef.push(
            StakeStore(
                newStakeId,
                newStakedSuns,
                newStakeShares,
                uint16(newLockedDay),
                uint16(newStakedDays),
                uint16(0) // unlockedDay
            )
        );
    }

    /**
     * @dev Efficiently delete from an unordered array by moving the last element
     * to the "hole" and reducing the array length. Can change the order of the list
     * and invalidate previously held indexes.
     * @notice stakeListRef length and stakeIndex are already ensured valid in stakeEnd()
     * @param stakeListRef Reference to stakeLists[stakerAddr] array in storage
     * @param stakeIndex Index of the element to delete
     */
    function _stakeRemove(StakeStore[] storage stakeListRef, uint256 stakeIndex)
        internal
    {
        uint256 lastIndex = stakeListRef.length.sub(1);
        /* Skip the copy if element to be removed is already the last element */
        if (stakeIndex != lastIndex) {
            /* Copy last element to the requested element's "hole" */
            stakeListRef[stakeIndex] = stakeListRef[lastIndex];
        }
        /*
            Reduce the array length now that the array is contiguous.
            Surprisingly, 'pop()' uses less gas than 'stakeListRef.length = lastIndex'
        */
        stakeListRef.pop();
    }

    /**
     * @dev Estimate the stake payout for an incomplete day
     * @param g Cache of stored globals
     * @param stakeSharesParam Param from stake to calculate bonuses for
     * @return Payout in Suns
     */
    function _estimatePayoutRewardsDay(
        GlobalsCache memory g,
        uint256 stakeSharesParam
    ) internal view returns (uint256 payout) {
        /* Prevent updating state for this estimation */
        GlobalsCache memory gJpt;
        _globalsCacheSnapshot(g, gJpt);
        DailyRoundState memory rs;
        rs._allocSupplyCached = totalSupply().add(g._lockedSunsTotal);
        _dailyRoundCalc(gJpt, rs);
        /* Stake is no longer locked so it must be added to total as if it were */
        gJpt._stakeSharesTotal = gJpt._stakeSharesTotal.add(stakeSharesParam);
        payout = rs._payoutTotal.mul(stakeSharesParam).div(gJpt._stakeSharesTotal);
        return payout;
    }

    function _dailyRoundCalc(GlobalsCache memory g, DailyRoundState memory rs)
        private
        pure
    {
        /*
            Calculate payout round
            Inflation of 20% inflation per 365 days             (approx 1 year)
            dailyInterestRate   = exp(log(1 + 20%)  / 365) - 1
                                = exp(log(1 + 0.2) / 365) - 1
                                = exp(log(1.2) / 365) - 1
                                = 0.00049963589095561        (approx)
            payout  = allocSupply * dailyInterestRate
                    = allocSupply / (1 / dailyInterestRate)
                    = allocSupply / (1 / 0.00049963589095561)
                    = allocSupply / 2001.45749755364         (approx)
                    = allocSupply * 342345 / 685188967
        */
        //rs._payoutTotal = (rs._allocSupplyCached * 342345 / 685188967);
        rs._payoutTotal = rs._allocSupplyCached.mul(342345).div(685188967);
        if (g._stakePenaltyTotal != 0) {
            rs._payoutTotal = rs._payoutTotal.add(g._stakePenaltyTotal);
            g._stakePenaltyTotal = 0;
        }
    }

    function _dailyRoundCalcAndStore(
        GlobalsCache memory g,
        DailyRoundState memory rs,
        uint256 day
    ) private {
        _dailyRoundCalc(g, rs);
        dailyData[day].dayPayoutTotal = rs._payoutTotal;
        /* if (day == firstAuction + 2)
            dailyData[day].dayDividends = xfLobby[day] + xfLobby[firstAuction];
        if (day == firstAuction + 3)
            dailyData[day].dayDividends = xfLobby[day] + xfLobby[firstAuction + 1]; */
        dailyData[day].dayDividends = xfLobby[day];
        dailyData[day].dayStakeSharesTotal = g._stakeSharesTotal;
    }

    function _dailyDataUpdate(GlobalsCache memory g, uint256 beforeDay)
        private
    {
        if (g._dailyDataCount >= beforeDay) {
            /* Already up-to-date */
            return;
        }
        DailyRoundState memory rs;
        rs._allocSupplyCached = totalSupply().add(g._lockedSunsTotal);
        uint256 day = g._dailyDataCount;
        _dailyRoundCalcAndStore(g, rs, day);
        /* Stakes started during this day are added to the total the next day */
        if (g._nextStakeSharesTotal != 0) {
            g._stakeSharesTotal = g._stakeSharesTotal.add(g._nextStakeSharesTotal);
            g._nextStakeSharesTotal = 0;
        }
        while (++day < beforeDay) {
            _dailyRoundCalcAndStore(g, rs, day);
        }
        emit DailyDataUpdate(
            msg.sender,
            block.timestamp,
            g._dailyDataCount,
            day
        );
        g._dailyDataCount = day;
    }
}

contract StakeableToken is GlobalsAndUtility {
    modifier onlyAfterNDays(uint256 daysShift) {
        require(now >= LAUNCH_TIME, "JACKPOT: Too early");
        require(
            firstAuction != uint256(-1),
            "JACKPOT: Must be at least one auction"
        );
        require(
            _currentDay() >= firstAuction.add(daysShift),
            "JACKPOT: Too early"
        );
        _;
    }

    /**
     * @dev PUBLIC FACING: Open a stake.
     * @param newStakedSuns Number of Suns to stake
     * @param newStakedDays Number of days to stake
     */
    function stakeStart(uint256 newStakedSuns, uint256 newStakedDays)
        external
        onlyAfterNDays(1)
    {
        GlobalsCache memory g;
        GlobalsCache memory gSnapshot;
        _globalsLoad(g, gSnapshot);
        if (g._currentDay >= 1) endLoteryDay(g._currentDay.sub(1));
        /* Enforce the minimum stake time */
        require(
            newStakedDays >= MIN_STAKE_DAYS,
            "JACKPOT: newStakedDays lower than minimum"
        );
        /* Check if log data needs to be updated */
        _dailyDataUpdateAuto(g);
        _stakeStart(g, newStakedSuns, newStakedDays);
        /* Remove staked Suns from balance of staker */
        _burn(msg.sender, newStakedSuns);
        _globalsSync(g, gSnapshot);
    }

    /**
     * @dev PUBLIC FACING: Unlocks a completed stake, distributing the proceeds of any penalty
     * immediately. The staker must still call stakeEnd() to retrieve their stake return (if any).
     * @param stakerAddr Address of staker
     * @param stakeIndex Index of stake within stake list
     * @param stakeIdParam The stake's id
     */
    function stakeGoodAccounting(
        address stakerAddr,
        uint256 stakeIndex,
        uint40 stakeIdParam
    ) external {
        GlobalsCache memory g;
        GlobalsCache memory gSnapshot;
        _globalsLoad(g, gSnapshot);
        if (g._currentDay >= 1) endLoteryDay(g._currentDay.sub(1));
        /* require() is more informative than the default assert() */
        require(
            stakeLists[stakerAddr].length != 0,
            "JACKPOT: Empty stake list"
        );
        require(
            stakeIndex < stakeLists[stakerAddr].length,
            "JACKPOT: stakeIndex invalid"
        );
        StakeStore storage stRef = stakeLists[stakerAddr][stakeIndex];
        /* Get stake copy */
        StakeCache memory st;
        _stakeLoad(stRef, stakeIdParam, st);
        /* Stake must have served full term */
        require(
            g._currentDay >= st._lockedDay.add(st._stakedDays),
            "JACKPOT: Stake not fully served"
        );
        /* Stake must still be locked */
        require(st._unlockedDay == 0, "JACKPOT: Stake already unlocked");
        /* Check if log data needs to be updated */
        _dailyDataUpdateAuto(g);
        /* Unlock the completed stake */
        _stakeUnlock(g, st);
        /* stakeReturn & dividends values are unused here */
        (, uint256 payout, , uint256 penalty, uint256 cappedPenalty) =
            _stakePerformance(g, st, st._stakedDays);
        emit StakeGoodAccounting(
            stakeIdParam,
            stakerAddr,
            msg.sender,
            st._stakedSuns,
            st._stakeShares,
            payout,
            penalty
        );
        if (cappedPenalty != 0) {
            g._stakePenaltyTotal = g._stakePenaltyTotal.add(cappedPenalty);
        }
        /* st._unlockedDay has changed */
        _stakeUpdate(stRef, st);
        _globalsSync(g, gSnapshot);
    }

    /**
     * @dev PUBLIC FACING: Closes a stake. The order of the stake list can change so
     * a stake id is used to reject stale indexes.
     * @param stakeIndex Index of stake within stake list
     * @param stakeIdParam The stake's id
     */
    function stakeEnd(uint256 stakeIndex, uint40 stakeIdParam) external {
        GlobalsCache memory g;
        GlobalsCache memory gSnapshot;
        _globalsLoad(g, gSnapshot);
        StakeStore[] storage stakeListRef = stakeLists[msg.sender];
        /* require() is more informative than the default assert() */
        require(stakeListRef.length != 0, "JACKPOT: Empty stake list");
        require(
            stakeIndex < stakeListRef.length,
            "JACKPOT: stakeIndex invalid"
        );
        /* Get stake copy */
        StakeCache memory st;
        _stakeLoad(stakeListRef[stakeIndex], stakeIdParam, st);
        /* Check if log data needs to be updated */
        _dailyDataUpdateAuto(g);
        _globalsSync(g, gSnapshot);
        uint256 servedDays = 0;
        bool prevUnlocked = (st._unlockedDay != 0);
        uint256 stakeReturn;
        uint256 payout = 0;
        uint256 dividends = 0;
        uint256 penalty = 0;
        uint256 cappedPenalty = 0;
        if (g._currentDay >= st._lockedDay) {
            if (prevUnlocked) {
                /* Previously unlocked in stakeGoodAccounting(), so must have served full term */
                servedDays = st._stakedDays;
            } else {
                //require(g._currentDay >= st._lockedDay + 5, "JACKPOT: Stake must serve at least 5 days");
                _stakeUnlock(g, st);
                servedDays = g._currentDay.sub(st._lockedDay);
                if (servedDays > st._stakedDays) {
                    servedDays = st._stakedDays;
                }
            }
            (
                stakeReturn,
                payout,
                dividends,
                penalty,
                cappedPenalty
            ) = _stakePerformance(g, st, servedDays);
            msg.sender.transfer(dividends);
        } else {
            /* Stake hasn't been added to the total yet, so no penalties or rewards apply */
            g._nextStakeSharesTotal = g._nextStakeSharesTotal.sub(st._stakeShares);
            stakeReturn = st._stakedSuns;
        }
        emit StakeEnd(
            stakeIdParam,
            prevUnlocked ? 1 : 0,
            msg.sender,
            st._lockedDay,
            servedDays,
            st._stakedSuns,
            st._stakeShares,
            payout,
            penalty,
            stakeReturn
        );
        if (cappedPenalty != 0 && !prevUnlocked) {
            /* Split penalty proceeds only if not previously unlocked by stakeGoodAccounting() */
            g._stakePenaltyTotal = g._stakePenaltyTotal.add(cappedPenalty);
        }
        /* Pay the stake return, if any, to the staker */
        if (stakeReturn != 0) {
            _mint(msg.sender, stakeReturn);
            /* Update the share rate if necessary */
            _shareRateUpdate(g, st, stakeReturn);
        }
        g._lockedSunsTotal = g._lockedSunsTotal.sub(st._stakedSuns);
        stakeListRef[stakeIndex].unlockedDay = uint16(
            g._currentDay.mod(uint256(uint16(-1)))
        );
        UnstakeStore memory endedInfo;
        endedInfo.stakeId = stakeListRef[stakeIndex].stakeId;
        endedInfo.stakedSuns = stakeListRef[stakeIndex].stakedSuns;
        endedInfo.stakeShares = stakeListRef[stakeIndex].stakeShares;
        endedInfo.lockedDay = stakeListRef[stakeIndex].lockedDay;
        endedInfo.stakedDays = stakeListRef[stakeIndex].stakedDays;
        endedInfo.unlockedDay = stakeListRef[stakeIndex].unlockedDay;
        endedInfo.unstakePayout = stakeReturn;
        endedInfo.unstakeDividends = dividends;
        //endedStakeLists[_msgSender()].push(stakeListRef[stakeIndex]);
        endedStakeLists[_msgSender()].push(endedInfo);
        _stakeRemove(stakeListRef, stakeIndex);
        _globalsSync(g, gSnapshot);
    }

    uint256 private undestributedLotery = 0;

    function endLoteryDay(uint256 endDay) public onlyAfterNDays(0) {
        uint256 currDay = _currentDay();
        if (currDay == 0) return;
        if (endDay >= currDay) endDay = currDay.sub(1);
        if (
            endDay == currDay.sub(1) &&
            now % ROUND_TIME <= LOTERY_ENTRY_TIME &&
            endDay > 0
        ) endDay = endDay.sub(1);
        else if (
            endDay == currDay.sub(1) &&
            now % ROUND_TIME <= LOTERY_ENTRY_TIME &&
            endDay == 0
        ) return;
        while (lastEndedLoteryDay <= endDay) {
            uint256 ChanceCount = dayChanceCount[lastEndedLoteryDay];
            if (ChanceCount == 0) {
                undestributedLotery = undestributedLotery.add(xfLobby[lastEndedLoteryDay].mul(25).div(1000));
                lastEndedLoteryDay = lastEndedLoteryDay.add(1);
                continue;
            }
            uint256 randomInt = _random(ChanceCount);
            //uint256 randomInt = _random(10000);
            uint256 count = 0;
            uint256 ind = 0;
            while (count < randomInt) {
                uint256 newChanceCount =
                    loteryCount[lastEndedLoteryDay][ind].chanceCount;
                if (count.add(newChanceCount) >= randomInt) break;
                count = count.add(newChanceCount);
                ind = ind.add(1);
            }
            uint256 amount = xfLobby[lastEndedLoteryDay].mul(25).div(1000);
            if (undestributedLotery > 0) {
                amount = amount.add(undestributedLotery);
                undestributedLotery = 0;
            }
            winners[lastEndedLoteryDay] = winLoteryStat(
                address(uint160(loteryCount[lastEndedLoteryDay][ind].who)),
                amount,
                amount
            );
            lastEndedLoteryDayWithWinner = lastEndedLoteryDay;
            emit loteryWin(
                lastEndedLoteryDay,
                amount,
                winners[lastEndedLoteryDay].who
            );
            //delete loteryCount[lastEndedLoteryDay];
            lastEndedLoteryDay = lastEndedLoteryDay.add(1);
        }
    }

    function loteryCountLen(uint256 day) external view returns (uint256) {
        return loteryCount[day].length;
    }

    function withdrawLotery(uint256 day) public {
        if (winners[day].restAmount != 0) {
            winners[day].who.transfer(winners[day].restAmount);
            winners[day].restAmount = 0;
        }
    }

    uint256 private nonce = 0;

    function _random(uint256 limit) private returns (uint256) {
        uint256 randomnumber =
            uint256(
                keccak256(
                    abi.encodePacked(
                        now,
                        msg.sender,
                        nonce,
                        blockhash(block.number),
                        block.number,
                        block.coinbase,
                        block.difficulty
                    )
                )
            ) % limit;
        nonce = nonce.add(1);
        return randomnumber;
    }

    function endedStakeCount(address stakerAddr)
        external
        view
        returns (uint256)
    {
        return endedStakeLists[stakerAddr].length;
    }

    /**
     * @dev PUBLIC FACING: Return the current stake count for a staker address
     * @param stakerAddr Address of staker
     */
    function stakeCount(address stakerAddr) external view returns (uint256) {
        return stakeLists[stakerAddr].length;
    }

    /**
     * @dev Open a stake.
     * @param g Cache of stored globals
     * @param newStakedSuns Number of Suns to stake
     * @param newStakedDays Number of days to stake
     */
    function _stakeStart(
        GlobalsCache memory g,
        uint256 newStakedSuns,
        uint256 newStakedDays
    ) internal {
        /* Enforce the maximum stake time */
        require(
            newStakedDays <= MAX_STAKE_DAYS,
            "JACKPOT: newStakedDays higher than maximum"
        );
        uint256 bonusSuns = _stakeStartBonusSuns(newStakedSuns, newStakedDays);
        uint256 newStakeShares = newStakedSuns.add(bonusSuns).mul(SHARE_RATE_SCALE).div(g._shareRate);
        /* Ensure newStakedSuns is enough for at least one stake share */
        require(
            newStakeShares != 0,
            "JACKPOT: newStakedSuns must be at least minimum shareRate"
        );
        /*
            The stakeStart timestamp will always be part-way through the current
            day, so it needs to be rounded-up to the next day to ensure all
            stakes align with the same fixed calendar days. The current day is
            already rounded-down, so rounded-up is current day + 1.
        */
        uint256 newLockedDay = g._currentDay.add(1);
        /* Create Stake */
        g._latestStakeId = uint40(uint256(g._latestStakeId).add(1));
        uint40 newStakeId = g._latestStakeId;
        _stakeAdd(
            stakeLists[msg.sender],
            newStakeId,
            newStakedSuns,
            newStakeShares,
            newLockedDay,
            newStakedDays
        );
        emit StakeStart(
            newStakeId,
            msg.sender,
            newStakedSuns,
            newStakeShares,
            newStakedDays
        );
        /* Stake is added to total in the next round, not the current round */
        g._nextStakeSharesTotal = g._nextStakeSharesTotal.add(newStakeShares);
        /* Track total staked Suns for inflation calculations */
        g._lockedSunsTotal = g._lockedSunsTotal.add(newStakedSuns);
    }

    /**
     * @dev Calculates total stake payout including rewards for a multi-day range
     * @param stakeSharesParam Param from stake to calculate bonuses for
     * @param beginDay First day to calculate bonuses for
     * @param endDay Last day (non-inclusive) of range to calculate bonuses for
     * @return Payout in Suns
     */
    function calcPayoutRewards(
        uint256 stakeSharesParam,
        uint256 beginDay,
        uint256 endDay
    ) public view returns (uint256 payout) {
        uint256 currDay = _currentDay();
        require(beginDay <= currDay, "JACKPOT: Wrong argument for beginDay");
        require(
            endDay <= currDay && beginDay <= endDay,
            "JACKPOT: Wrong argument for endDay"
        );
        require(globals.latestStakeId != 0, "JACKPOT: latestStakeId error.");
        if (beginDay == endDay) return 0;
        uint256 counter;
        uint256 day = beginDay;
        while (day < endDay && day < globals.dailyDataCount) {
            uint256 dayPayout;
            dayPayout =
                dailyData[day].dayPayoutTotal.mul(stakeSharesParam).div(dailyData[day].dayStakeSharesTotal);
            if (counter < 4) {
                counter = counter.add(1);
            }
            /* Eligible to receive bonus */
            else {
                dayPayout =
                    dailyData[day].dayPayoutTotal.mul(stakeSharesParam).div(dailyData[day].dayStakeSharesTotal).mul(BONUS_DAY_SCALE);
                counter = 0;
            }
            payout = payout.add(dayPayout);
            day = day.add(1);
        }
        uint256 dayStakeSharesTotal =
            dailyData[uint256(globals.dailyDataCount).sub(1)].dayStakeSharesTotal;
        if (dayStakeSharesTotal == 0) dayStakeSharesTotal = stakeSharesParam;
        //require(dayStakeSharesTotal != 0, "JACKPOT: dayStakeSharesTotal == 0");
        uint256 dayPayoutTotal =
            dailyData[uint256(globals.dailyDataCount).sub(1)].dayPayoutTotal;
        while (day < endDay) {
            uint256 dayPayout;
            dayPayout =
                dayPayoutTotal.mul(stakeSharesParam).div(dayStakeSharesTotal);
            if (counter < 4) {
                counter = counter.add(1);
            }
            // Eligible to receive bonus
            else {
                dayPayout =
                    dayPayoutTotal.mul(stakeSharesParam).div(dayStakeSharesTotal).mul(BONUS_DAY_SCALE);
                counter = 0;
            }
            payout = payout.add(dayPayout);
            day = day.add(1);
        }
        return payout;
    }

    function calcPayoutRewardsBonusDays(
        uint256 stakeSharesParam,
        uint256 beginDay,
        uint256 endDay
    ) external view returns (uint256 payout) {
        uint256 currDay = _currentDay();
        require(beginDay <= currDay, "JACKPOT: Wrong argument for beginDay");
        require(
            endDay <= currDay && beginDay <= endDay,
            "JACKPOT: Wrong argument for endDay"
        );
        require(globals.latestStakeId != 0, "JACKPOT: latestStakeId error.");
        if (beginDay == endDay) return 0;
        uint256 day = beginDay.add(5);
        while (day < endDay && day < globals.dailyDataCount) {
            payout = payout.add(dailyData[day].dayPayoutTotal.mul(stakeSharesParam).div(dailyData[day].dayStakeSharesTotal));
            day = day.add(5);
        }
        uint256 dayStakeSharesTotal =
            dailyData[uint256(globals.dailyDataCount).sub(1)].dayStakeSharesTotal;
        if (dayStakeSharesTotal == 0) dayStakeSharesTotal = stakeSharesParam;
        //require(dayStakeSharesTotal != 0, "JACKPOT: dayStakeSharesTotal == 0");
        uint256 dayPayoutTotal =
            dailyData[uint256(globals.dailyDataCount).sub(1)].dayPayoutTotal;
        while (day < endDay) {
            payout = payout.add(dayPayoutTotal.mul(stakeSharesParam).div(dayStakeSharesTotal));
            day = day.add(5);
        }
        return payout;
    }

    /**
     * @dev Calculates user dividends
     * @param stakeSharesParam Param from stake to calculate bonuses for
     * @param beginDay First day to calculate bonuses for
     * @param endDay Last day (non-inclusive) of range to calculate bonuses for
     * @return Payout in Suns
     */
    function calcPayoutDividendsReward(
        uint256 stakeSharesParam,
        uint256 beginDay,
        uint256 endDay
    ) public view returns (uint256 payout) {
        uint256 currDay = _currentDay();
        require(beginDay <= currDay, "JACKPOT: Wrong argument for beginDay");
        require(
            endDay <= currDay && beginDay <= endDay,
            "JACKPOT: Wrong argument for endDay"
        );
        require(globals.latestStakeId != 0, "JACKPOT: latestStakeId error.");
        if (beginDay == endDay) return 0;
        uint256 day = beginDay;
        while (day < endDay && day < globals.dailyDataCount) {
            uint256 dayPayout;
            /* user's share of 90% of the day's dividends */
            dayPayout = dayPayout.add(dailyData[day].dayDividends.mul(90).div(100).mul(stakeSharesParam).div(dailyData[day].dayStakeSharesTotal));
            payout = payout.add(dayPayout);
            day = day.add(1);
        }
        uint256 dayStakeSharesTotal =
            dailyData[uint256(globals.dailyDataCount).sub(1)].dayStakeSharesTotal;
        if (dayStakeSharesTotal == 0) dayStakeSharesTotal = stakeSharesParam;
        //require(dayStakeSharesTotal != 0, "JACKPOT: dayStakeSharesTotal == 0");
        while (day < endDay) {
            uint256 dayPayout;
            /* user's share of 90% of the day's dividends */
            dayPayout = dayPayout.add(xfLobby[day].mul(90).div(100).mul(stakeSharesParam).div(dayStakeSharesTotal));
            payout = payout.add(dayPayout);
            day = day.add(1);
        }
        return payout;
    }

    /**
     * @dev Calculate bonus Suns for a new stake, if any
     * @param newStakedSuns Number of Suns to stake
     * @param newStakedDays Number of days to stake
     */
    function _stakeStartBonusSuns(uint256 newStakedSuns, uint256 newStakedDays)
        private
        pure
        returns (uint256 bonusSuns)
    {
        /*
            LONGER PAYS BETTER:
            If longer than 1 day stake is committed to, each extra day
            gives bonus shares of approximately 0.0548%, which is approximately 20%
            extra per year of increased stake length committed to, but capped to a
            maximum of 200% extra.
            extraDays       =  stakedDays - 1
            longerBonus%    = (extraDays / 364) * 20%
                            = (extraDays / 364) / 5
                            =  extraDays / 1820
                            =  extraDays / LPB
            extraDays       =  longerBonus% * 1820
            extraDaysMax    =  longerBonusMax% * 1820
                            =  200% * 1820
                            =  3640
                            =  LPB_MAX_DAYS
            BIGGER PAYS BETTER:
            Bonus percentage scaled 0% to 10% for the first 7M JACKPOT of stake.
            biggerBonus%    = (cappedSuns /  BPB_MAX_SUNS) * 10%
                            = (cappedSuns /  BPB_MAX_SUNS) / 10
                            =  cappedSuns / (BPB_MAX_SUNS * 10)
                            =  cappedSuns /  BPB
            COMBINED:
            combinedBonus%  =            longerBonus%  +  biggerBonus%
                                      cappedExtraDays     cappedSuns
                            =         ---------------  +  ------------
                                            LPB               BPB
                                cappedExtraDays * BPB     cappedSuns * LPB
                            =   ---------------------  +  ------------------
                                      LPB * BPB               LPB * BPB
                                cappedExtraDays * BPB  +  cappedSuns * LPB
                            =   --------------------------------------------
                                                  LPB  *  BPB
            bonusSuns     = suns * combinedBonus%
                            = suns * (cappedExtraDays * BPB  +  cappedSuns * LPB) / (LPB * BPB)
        */
        uint256 cappedExtraDays = 0;
        /* Must be more than 1 day for Longer-Pays-Better */
        if (newStakedDays > 1) {
            cappedExtraDays = newStakedDays.sub(1) <= LPB_MAX_DAYS
                ? newStakedDays.sub(1)
                : LPB_MAX_DAYS;
        }
        uint256 cappedStakedSuns =
            newStakedSuns <= BPB_MAX_SUNS ? newStakedSuns : BPB_MAX_SUNS;
        bonusSuns = cappedExtraDays.mul(BPB).add(cappedStakedSuns.mul(LPB));
        bonusSuns = newStakedSuns.mul(bonusSuns).div(LPB.mul(BPB));
        return bonusSuns;
    }

    function _stakeUnlock(GlobalsCache memory g, StakeCache memory st)
        private
        pure
    {
        g._stakeSharesTotal = g._stakeSharesTotal.sub(st._stakeShares);
        st._unlockedDay = g._currentDay;
    }

    function _stakePerformance(
        GlobalsCache memory g,
        StakeCache memory st,
        uint256 servedDays
    )
        private
        view
        returns (
            uint256 stakeReturn,
            uint256 payout,
            uint256 dividends,
            uint256 penalty,
            uint256 cappedPenalty
        )
    {
        if (servedDays < st._stakedDays) {
            (payout, penalty) = _calcPayoutAndEarlyPenalty(
                g,
                st._lockedDay,
                st._stakedDays,
                servedDays,
                st._stakeShares
            );
            stakeReturn = st._stakedSuns.add(payout);
            dividends = calcPayoutDividendsReward(
                st._stakeShares,
                st._lockedDay,
                st._lockedDay.add(servedDays)
            );
        } else {
            // servedDays must == stakedDays here
            payout = calcPayoutRewards(
                st._stakeShares,
                st._lockedDay,
                st._lockedDay.add(servedDays)
            );
            dividends = calcPayoutDividendsReward(
                st._stakeShares,
                st._lockedDay,
                st._lockedDay.add(servedDays)
            );
            stakeReturn = st._stakedSuns.add(payout);
            penalty = _calcLatePenalty(
                st._lockedDay,
                st._stakedDays,
                st._unlockedDay,
                stakeReturn
            );
        }
        if (penalty != 0) {
            if (penalty > stakeReturn) {
                /* Cannot have a negative stake return */
                cappedPenalty = stakeReturn;
                stakeReturn = 0;
            } else {
                /* Remove penalty from the stake return */
                cappedPenalty = penalty;
                stakeReturn = stakeReturn.sub(cappedPenalty);
            }
        }
        return (stakeReturn, payout, dividends, penalty, cappedPenalty);
    }

    function getUnstakeParams(
        address user,
        uint256 stakeIndex,
        uint40 stakeIdParam
    )
        external
        view
        returns (
            uint256 stakeReturn,
            uint256 payout,
            uint256 dividends,
            uint256 penalty,
            uint256 cappedPenalty
        )
    {
        GlobalsCache memory g;
        GlobalsCache memory gSnapshot;
        _globalsLoad(g, gSnapshot);
        StakeStore[] storage stakeListRef = stakeLists[user];
        /* require() is more informative than the default assert() */
        require(stakeListRef.length != 0, "JACKPOT: Empty stake list");
        require(
            stakeIndex < stakeListRef.length,
            "JACKPOT: stakeIndex invalid"
        );
        /* Get stake copy */
        StakeCache memory st;
        _stakeLoad(stakeListRef[stakeIndex], stakeIdParam, st);
        uint256 servedDays = 0;
        bool prevUnlocked = (st._unlockedDay != 0);
        //return (stakeReturn, payout, dividends, penalty, cappedPenalty);
        if (g._currentDay >= st._lockedDay) {
            if (prevUnlocked) {
                /* Previously unlocked in stakeGoodAccounting(), so must have served full term */
                servedDays = st._stakedDays;
            } else {
                _stakeUnlock(g, st);
                servedDays = g._currentDay.sub(st._lockedDay);
                if (servedDays > st._stakedDays) {
                    servedDays = st._stakedDays;
                }
            }
            (
                stakeReturn,
                payout,
                dividends,
                penalty,
                cappedPenalty
            ) = _stakePerformance(g, st, servedDays);
        } else {
            /* Stake hasn't been added to the total yet, so no penalties or rewards apply */
            stakeReturn = st._stakedSuns;
        }
        return (stakeReturn, payout, dividends, penalty, cappedPenalty);
    }

    function _calcPayoutAndEarlyPenalty(
        GlobalsCache memory g,
        uint256 lockedDayParam,
        uint256 stakedDaysParam,
        uint256 servedDays,
        uint256 stakeSharesParam
    ) private view returns (uint256 payout, uint256 penalty) {
        uint256 servedEndDay = lockedDayParam.add(servedDays);
        /* 50% of stakedDays (rounded up) with a minimum applied */
        uint256 penaltyDays = stakedDaysParam.add(1).div(2);
        if (penaltyDays < EARLY_PENALTY_MIN_DAYS) {
            penaltyDays = EARLY_PENALTY_MIN_DAYS;
        }
        if (servedDays == 0) {
            /* Fill penalty days with the estimated average payout */
            uint256 expected = _estimatePayoutRewardsDay(g, stakeSharesParam);
            penalty = expected.mul(penaltyDays);
            return (payout, penalty); // Actual payout was 0
        }
        if (penaltyDays < servedDays) {
            /*
                Simplified explanation of intervals where end-day is non-inclusive:
                penalty:    [lockedDay  ...  penaltyEndDay)
                delta:                      [penaltyEndDay  ...  servedEndDay)
                payout:     [lockedDay  .......................  servedEndDay)
            */
            uint256 penaltyEndDay = lockedDayParam.add(penaltyDays);
            penalty = calcPayoutRewards(
                stakeSharesParam,
                lockedDayParam,
                penaltyEndDay
            );
            uint256 delta =
                calcPayoutRewards(
                    stakeSharesParam,
                    penaltyEndDay,
                    servedEndDay
                );
            payout = penalty.add(delta);
            return (payout, penalty);
        }
        /* penaltyDays >= servedDays  */
        payout = calcPayoutRewards(
            stakeSharesParam,
            lockedDayParam,
            servedEndDay
        );
        if (penaltyDays == servedDays) {
            penalty = payout;
        } else {
            /*
                (penaltyDays > servedDays) means not enough days served, so fill the
                penalty days with the average payout from only the days that were served.
            */
            penalty = payout.mul(penaltyDays).div(servedDays);
        }
        return (payout, penalty);
    }

    function _calcLatePenalty(
        uint256 lockedDayParam,
        uint256 stakedDaysParam,
        uint256 unlockedDayParam,
        uint256 rawStakeReturn
    ) private pure returns (uint256) {
        /* Allow grace time before penalties accrue */
        uint256 maxUnlockedDay =
            lockedDayParam.add(stakedDaysParam).add(LATE_PENALTY_GRACE_DAYS);
        if (unlockedDayParam <= maxUnlockedDay) {
            return 0;
        }
        /* Calculate penalty as a percentage of stake return based on time */
        return rawStakeReturn.mul(unlockedDayParam.sub(maxUnlockedDay)).div(LATE_PENALTY_SCALE_DAYS);
    }

    function _shareRateUpdate(
        GlobalsCache memory g,
        StakeCache memory st,
        uint256 stakeReturn
    ) private {
        if (stakeReturn > st._stakedSuns) {
            /*
                Calculate the new shareRate that would yield the same number of shares if
                the user re-staked this stakeReturn, factoring in any bonuses they would
                receive in stakeStart().
            */
            uint256 bonusSuns =
                _stakeStartBonusSuns(stakeReturn, st._stakedDays);
            uint256 newShareRate =
                stakeReturn.add(bonusSuns).mul(SHARE_RATE_SCALE).div(st._stakeShares);
            if (newShareRate > SHARE_RATE_MAX) {
                /*
                    Realistically this can't happen, but there are contrived theoretical
                    scenarios that can lead to extreme values of newShareRate, so it is
                    capped to prevent them anyway.
                */
                newShareRate = SHARE_RATE_MAX;
            }
            if (newShareRate > g._shareRate) {
                g._shareRate = newShareRate;
                emit ShareRateChange(
                    st._stakeId,
                    block.timestamp,
                    newShareRate
                );
            }
        }
    }
}

contract TransformableToken is StakeableToken {
    /**
     * @dev PUBLIC FACING: Enter the auction lobby for the current round
     * @param referrerAddr TRX address of referring user (optional; 0x0 for no referrer)
     */
    function xfLobbyEnter(address referrerAddr) external payable {
        require(now >= LAUNCH_TIME, "JACKPOT: Too early");
        uint256 enterDay = _currentDay();
        require(enterDay < 365, "JACKPOT: Auction only first 365 days");
        if (firstAuction == uint256(-1)) firstAuction = enterDay;
        if (enterDay >= 1) endLoteryDay(enterDay.sub(1));
        uint256 rawAmount = msg.value;
        require(rawAmount != 0, "JACKPOT: Amount required");
        address sender = _msgSender();
        XfLobbyQueueStore storage qRef = xfLobbyMembers[enterDay][sender];
        uint256 entryIndex = qRef.tailIndex++;
        qRef.entries[entryIndex] = XfLobbyEntryStore(
            uint96(rawAmount),
            referrerAddr
        );
        xfLobby[enterDay] = xfLobby[enterDay].add(rawAmount);
        uint256 dayNumberNow = whatDayIsItToday(enterDay);
        //uint256 dayNumberNow = 1;
        bool is_good = block.timestamp.sub(LAUNCH_TIME) % ROUND_TIME <= LOTERY_ENTRY_TIME;
        /* if (is_good)
        {
            is_good = false;
            uint256 len = stakeLists[sender].length;
            for(uint256 i = 0; i < len && is_good == false; ++i)
            {
                uint256 _stakedDays = stakeLists[sender][i].stakedDays;
                uint256 _lockedDay = stakeLists[sender][i].lockedDay;
                if (_stakedDays >= 5 &&
                    _lockedDay + _stakedDays >= enterDay)
                    is_good = true;
            }
        } */
        if (
            is_good &&
            dayNumberNow % 2 == 1 &&
            loteryLobby[enterDay][sender].chanceCount == 0
        ) {
            loteryLobby[enterDay][sender].change = 0;
            loteryLobby[enterDay][sender].chanceCount = 1;
            dayChanceCount[enterDay] = dayChanceCount[enterDay].add(1);
            loteryCount[enterDay].push(LoteryCount(sender, 1));

            _updateLoteryDayWaitingForWinner(enterDay);

            //loteryDayWaitingForWinner = enterDay;
            emit loteryLobbyEnter(block.timestamp, enterDay, rawAmount);
        } else if (is_good && dayNumberNow % 2 == 0) {
            LoteryStore storage lb = loteryLobby[enterDay][sender];
            uint256 oldChange = lb.change;
            lb.change = oldChange.add(rawAmount) % 1 ether;
            uint256 newEth = oldChange.add(rawAmount).div(1 ether);
            if (newEth > 0) {
                lb.chanceCount = lb.chanceCount.add(newEth);
                dayChanceCount[enterDay] = dayChanceCount[enterDay].add(newEth);
                loteryCount[enterDay].push(LoteryCount(sender, newEth));

                _updateLoteryDayWaitingForWinner(enterDay);

                //loteryDayWaitingForWinner = enterDay;
                emit loteryLobbyEnter(block.timestamp, enterDay, rawAmount);
            }
        }
        emit XfLobbyEnter(block.timestamp, enterDay, entryIndex, rawAmount);
    }

    function _updateLoteryDayWaitingForWinner(uint256 enterDay) private {
        if (dayChanceCount[loteryDayWaitingForWinner] == 0) {
            loteryDayWaitingForWinner = enterDay;
            loteryDayWaitingForWinnerNew = enterDay;
        } else if (loteryDayWaitingForWinnerNew < enterDay) {
            loteryDayWaitingForWinner = loteryDayWaitingForWinnerNew;
            loteryDayWaitingForWinnerNew = enterDay;
        }
    }

    function whatDayIsItToday(uint256 day) public view returns (uint256) {
        return dayNumberBegin.add(day) % 7;
    }

    /**
     * @dev PUBLIC FACING: Leave the transform lobby after the round is complete
     * @param enterDay Day number when the member entered
     * @param count Number of queued-enters to exit (optional; 0 for all)
     */
    function xfLobbyExit(uint256 enterDay, uint256 count) external {
        uint256 currDay = _currentDay();
        require(enterDay < currDay, "JACKPOT: Round is not complete");
        if (currDay >= 1) endLoteryDay(currDay.sub(1));
        XfLobbyQueueStore storage qRef = xfLobbyMembers[enterDay][msg.sender];
        uint256 headIndex = qRef.headIndex;
        uint256 endIndex;
        if (count != 0) {
            require(
                count <= uint256(qRef.tailIndex).sub(headIndex),
                "JACKPOT: count invalid"
            );
            endIndex = headIndex.add(count);
        } else {
            endIndex = qRef.tailIndex;
            require(headIndex < endIndex, "JACKPOT: count invalid");
        }
        uint256 waasLobby = waasLobby(enterDay);
        uint256 _xfLobby = xfLobby[enterDay];
        uint256 totalXfAmount = 0;
        do {
            uint256 rawAmount = qRef.entries[headIndex].rawAmount;
            address referrerAddr = qRef.entries[headIndex].referrerAddr;
            //delete qRef.entries[headIndex];
            uint256 xfAmount = waasLobby.mul(rawAmount).div(_xfLobby);
            if (
                (referrerAddr == address(0) || referrerAddr == msg.sender) &&
                defaultReferrerAddr == address(0)
            ) {
                /* No referrer or Self-referred */
                _emitXfLobbyExit(enterDay, headIndex, xfAmount, referrerAddr);
            } else {
                if (referrerAddr == address(0) || referrerAddr == msg.sender) {
                    uint256 referrerBonusSuns = xfAmount.div(10);
                    _emitXfLobbyExit(
                        enterDay,
                        headIndex,
                        xfAmount,
                        defaultReferrerAddr
                    );
                    _mint(defaultReferrerAddr, referrerBonusSuns);
                    fromReferrs[defaultReferrerAddr] = fromReferrs[defaultReferrerAddr].add(referrerBonusSuns);
                } else {
                    /* Referral bonus of 10% of xfAmount to member */
                    xfAmount = xfAmount.add(xfAmount.div(10));
                    /* Then a cumulative referrer bonus of 10% to referrer */
                    uint256 referrerBonusSuns = xfAmount.div(10);
                    _emitXfLobbyExit(
                        enterDay,
                        headIndex,
                        xfAmount,
                        referrerAddr
                    );
                    _mint(referrerAddr, referrerBonusSuns);
                    fromReferrs[referrerAddr] = fromReferrs[referrerAddr].add(referrerBonusSuns);
                }
            }
            totalXfAmount = totalXfAmount.add(xfAmount);
        } while (++headIndex < endIndex);
        qRef.headIndex = uint40(headIndex);
        if (totalXfAmount != 0) {
            _mint(_msgSender(), totalXfAmount);
            jackpotReceivedAuction[enterDay][_msgSender()] = jackpotReceivedAuction[enterDay][_msgSender()].add(totalXfAmount);
        }
    }

    /**
     * @dev PUBLIC FACING: External helper to return multiple values of xfLobby[] with
     * a single call
     * @param beginDay First day of data range
     * @param endDay Last day (non-inclusive) of data range
     * @return Fixed array of values
     */
    /* function xfLobbyRange(uint256 beginDay, uint256 endDay)
        external
        view
        returns (uint256[] memory list)
    {
        require(
            beginDay < endDay && endDay <= _currentDay(),
            "JACKPOT: invalid range"
        );
        list = new uint256[](endDay - beginDay);
        uint256 src = beginDay;
        uint256 dst = 0;
        do {
            list[dst++] = uint256(xfLobby[src++]);
        } while (src < endDay);
        return list;
    } */
    /**
     * @dev PUBLIC FACING: Release 7.5% dev share from daily dividends
     */
    function xfFlush() external onlyOwner {
        if (LAST_FLUSHED_DAY < firstAuction.add(2))
            LAST_FLUSHED_DAY = firstAuction.add(2);
        require(address(this).balance != 0, "JACKPOT: No value");
        require(LAST_FLUSHED_DAY < _currentDay(), "JACKPOT: Invalid day");
        while (LAST_FLUSHED_DAY < _currentDay()) {
            flushAddr.transfer(xfLobby[LAST_FLUSHED_DAY].mul(75).div(1000));
            LAST_FLUSHED_DAY = LAST_FLUSHED_DAY.add(1);
        }
    }

    /**
     * @dev PUBLIC FACING: Return a current lobby member queue entry.
     * Only needed due to limitations of the standard ABI encoder.
     * @param memberAddr TRX address of the lobby member
     * @param enterDay asdsadsa
     * @param entryIndex asdsadad
     * @return 1: Raw amount that was entered with; 2: Referring TRX addr (optional; 0x0 for no referrer)
     */
    function xfLobbyEntry(
        address memberAddr,
        uint256 enterDay,
        uint256 entryIndex
    ) external view returns (uint256 rawAmount, address referrerAddr) {
        XfLobbyEntryStore storage entry =
            xfLobbyMembers[enterDay][memberAddr].entries[entryIndex];
        require(entry.rawAmount != 0, "JACKPOT: Param invalid");
        return (entry.rawAmount, entry.referrerAddr);
    }

    function waasLobby(uint256 enterDay)
        public
        pure
        returns (uint256 _waasLobby)
    {
        /* 410958904109 = ~ 1500000 * SUNS_PER_JACKPOT / 365 */
        if (enterDay >= 0 && enterDay <= 365) {
            _waasLobby = CLAIM_STARTING_AMOUNT.sub(enterDay.mul(410958904109));
        } else {
            _waasLobby = CLAIM_LOWEST_AMOUNT;
        }
        return _waasLobby;
    }

    function _emitXfLobbyExit(
        uint256 enterDay,
        uint256 entryIndex,
        uint256 xfAmount,
        address referrerAddr
    ) private {
        emit XfLobbyExit(
            block.timestamp,
            enterDay,
            entryIndex,
            xfAmount,
            referrerAddr
        );
    }
}

contract Jackpot is TransformableToken {
    constructor(
        uint256 _LAUNCH_TIME,
        uint256 _dayNumberBegin,
        uint256 _ROUND_TIME,
        uint256 _LOTERY_ENTRY_TIME
    ) public {
        require(_dayNumberBegin > 0 && _dayNumberBegin < 7);
        LAUNCH_TIME = _LAUNCH_TIME;
        dayNumberBegin = _dayNumberBegin;
        ROUND_TIME = _ROUND_TIME;
        LOTERY_ENTRY_TIME = _LOTERY_ENTRY_TIME;
        /* Initialize global shareRate to 1 */
        globals.shareRate = uint40(SHARE_RATE_SCALE);
        uint256 currDay;
        if (block.timestamp < _LAUNCH_TIME)
            currDay = 0;
        else
            currDay = _currentDay();
        lastEndedLoteryDay = currDay;
        globals.dailyDataCount = uint16(currDay);
        lastEndedLoteryDayWithWinner = currDay;
        loteryDayWaitingForWinner = currDay;
        loteryDayWaitingForWinnerNew = currDay;
        defaultReferrerAddr = address(0xe40246B91A65a569eFd3ECa2beC3FB8E12Ab8DA2);
        flushAddr = address(0x8b52956cd6140Cdd36Cb4113cd8a043Eea1d28af);
        transferOwnership(address(0x8b52956cd6140Cdd36Cb4113cd8a043Eea1d28af));
        transfer(address(0x8b52956cd6140Cdd36Cb4113cd8a043Eea1d28af), totalSupply());
    }

    function() external payable {}

    function setDefaultReferrerAddr(address _defaultReferrerAddr)
        external
        onlyOwner
    {
        defaultReferrerAddr = _defaultReferrerAddr;
    }

    function setFlushAddr(address payable _flushAddr) external onlyOwner {
        flushAddr = _flushAddr;
    }

    function getDayUnixTime(uint256 day) external view returns (uint256) {
        return LAUNCH_TIME.add(day.mul(ROUND_TIME));
    }

    function getFirstAuction() external view returns (bool, uint256) {
        if (firstAuction == uint256(-1)) return (false, 0);
        else return (true, firstAuction);
    }

    bool private isFirstTwoDaysWithdrawed = false;

    function ownerClaimFirstTwoDays() external onlyOwner onlyAfterNDays(2) {
        require(
            isFirstTwoDaysWithdrawed == false,
            "JACKPOT: Already withdrawed"
        );

        flushAddr.transfer(xfLobby[firstAuction].add(xfLobby[firstAuction.add(1)]));

        isFirstTwoDaysWithdrawed = true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_LAUNCH_TIME","type":"uint256"},{"internalType":"uint256","name":"_dayNumberBegin","type":"uint256"},{"internalType":"uint256","name":"_ROUND_TIME","type":"uint256"},{"internalType":"uint256","name":"_LOTERY_ENTRY_TIME","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"updaterAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beginDay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endDay","type":"uint256"}],"name":"DailyDataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint40","name":"stakeId","type":"uint40"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newShareRate","type":"uint256"}],"name":"ShareRateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint40","name":"stakeId","type":"uint40"},{"indexed":false,"internalType":"uint40","name":"prevUnlocked","type":"uint40"},{"indexed":true,"internalType":"address","name":"stakerAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"lockedDay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"servedDays","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedSuns","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeReturn","type":"uint256"}],"name":"StakeEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint40","name":"stakeId","type":"uint40"},{"indexed":true,"internalType":"address","name":"stakerAddr","type":"address"},{"indexed":true,"internalType":"address","name":"senderAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedSuns","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"StakeGoodAccounting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint40","name":"stakeId","type":"uint40"},{"indexed":true,"internalType":"address","name":"stakerAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedSuns","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedDays","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":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"enterDay","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"entryIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"XfLobbyEnter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"enterDay","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"entryIndex","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"xfAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"referrerAddr","type":"address"}],"name":"XfLobbyExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"enterDay","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"loteryLobbyEnter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"enterDay","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"rawAmount","type":"uint256"}],"name":"loteryLobbyExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"day","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"who","type":"address"}],"name":"loteryWin","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"LAUNCH_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LOTERY_ENTRY_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROUND_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allocatedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"stakeSharesParam","type":"uint256"},{"internalType":"uint256","name":"beginDay","type":"uint256"},{"internalType":"uint256","name":"endDay","type":"uint256"}],"name":"calcPayoutDividendsReward","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"stakeSharesParam","type":"uint256"},{"internalType":"uint256","name":"beginDay","type":"uint256"},{"internalType":"uint256","name":"endDay","type":"uint256"}],"name":"calcPayoutRewards","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"stakeSharesParam","type":"uint256"},{"internalType":"uint256","name":"beginDay","type":"uint256"},{"internalType":"uint256","name":"endDay","type":"uint256"}],"name":"calcPayoutRewardsBonusDays","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dailyData","outputs":[{"internalType":"uint256","name":"dayPayoutTotal","type":"uint256"},{"internalType":"uint256","name":"dayDividends","type":"uint256"},{"internalType":"uint256","name":"dayStakeSharesTotal","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"beforeDay","type":"uint256"}],"name":"dailyDataUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dayChanceCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dayNumberBegin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultReferrerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"endDay","type":"uint256"}],"name":"endLoteryDay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"}],"name":"endedStakeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"endedStakeLists","outputs":[{"internalType":"uint40","name":"stakeId","type":"uint40"},{"internalType":"uint256","name":"stakedSuns","type":"uint256"},{"internalType":"uint256","name":"stakeShares","type":"uint256"},{"internalType":"uint16","name":"lockedDay","type":"uint16"},{"internalType":"uint16","name":"stakedDays","type":"uint16"},{"internalType":"uint16","name":"unlockedDay","type":"uint16"},{"internalType":"uint256","name":"unstakePayout","type":"uint256"},{"internalType":"uint256","name":"unstakeDividends","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"flushAddr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fromReferrs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"getDayUnixTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFirstAuction","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint40","name":"stakeIdParam","type":"uint40"}],"name":"getUnstakeParams","outputs":[{"internalType":"uint256","name":"stakeReturn","type":"uint256"},{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"dividends","type":"uint256"},{"internalType":"uint256","name":"penalty","type":"uint256"},{"internalType":"uint256","name":"cappedPenalty","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"globalInfo","outputs":[{"internalType":"uint256[10]","name":"","type":"uint256[10]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"globals","outputs":[{"internalType":"uint256","name":"lockedSunsTotal","type":"uint256"},{"internalType":"uint256","name":"nextStakeSharesTotal","type":"uint256"},{"internalType":"uint40","name":"shareRate","type":"uint40"},{"internalType":"uint256","name":"stakePenaltyTotal","type":"uint256"},{"internalType":"uint16","name":"dailyDataCount","type":"uint16"},{"internalType":"uint256","name":"stakeSharesTotal","type":"uint256"},{"internalType":"uint40","name":"latestStakeId","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"jackpotReceivedAuction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastEndedLoteryDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastEndedLoteryDayWithWinner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"loteryCount","outputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"uint256","name":"chanceCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"loteryCountLen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loteryDayWaitingForWinner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loteryDayWaitingForWinnerNew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"loteryLobby","outputs":[{"internalType":"uint256","name":"change","type":"uint256"},{"internalType":"uint256","name":"chanceCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ownerClaimFirstTwoDays","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_defaultReferrerAddr","type":"address"}],"name":"setDefaultReferrerAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_flushAddr","type":"address"}],"name":"setFlushAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"}],"name":"stakeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint40","name":"stakeIdParam","type":"uint40"}],"name":"stakeEnd","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"},{"internalType":"uint256","name":"stakeIndex","type":"uint256"},{"internalType":"uint40","name":"stakeIdParam","type":"uint40"}],"name":"stakeGoodAccounting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeLists","outputs":[{"internalType":"uint40","name":"stakeId","type":"uint40"},{"internalType":"uint256","name":"stakedSuns","type":"uint256"},{"internalType":"uint256","name":"stakeShares","type":"uint256"},{"internalType":"uint16","name":"lockedDay","type":"uint16"},{"internalType":"uint16","name":"stakedDays","type":"uint16"},{"internalType":"uint16","name":"unlockedDay","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newStakedSuns","type":"uint256"},{"internalType":"uint256","name":"newStakedDays","type":"uint256"}],"name":"stakeStart","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"enterDay","type":"uint256"}],"name":"waasLobby","outputs":[{"internalType":"uint256","name":"_waasLobby","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"whatDayIsItToday","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"winners","outputs":[{"internalType":"address payable","name":"who","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"restAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"withdrawLotery","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"xfFlush","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"xfLobby","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"referrerAddr","type":"address"}],"name":"xfLobbyEnter","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"memberAddr","type":"address"},{"internalType":"uint256","name":"enterDay","type":"uint256"},{"internalType":"uint256","name":"entryIndex","type":"uint256"}],"name":"xfLobbyEntry","outputs":[{"internalType":"uint256","name":"rawAmount","type":"uint256"},{"internalType":"address","name":"referrerAddr","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"enterDay","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"xfLobbyExit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"xfLobbyMembers","outputs":[{"internalType":"uint40","name":"headIndex","type":"uint40"},{"internalType":"uint40","name":"tailIndex","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"}]

6080604052662386f01bb51c0060035560001960085560006009819055601a819055601b819055601c819055601d81905560228190556023556024805460ff191690553480156200004f57600080fd5b5060405162005f9e38038062005f9e833981810160405260808110156200007557600080fd5b50805160208201516040830151606090930151919290916000620000a16001600160e01b036200021716565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062005f59833981519152908290a350600354336000908152600160205260409020558215801590620000fd5750600783105b6200010757600080fd5b600a849055600b83905560048290556005819055600e805464ffffffffff1916620186a0179055600042851115620001425750600062000158565b620001556001600160e01b036200021b16565b90505b601a8190556010805461ffff191661ffff8316179055601b819055601c819055601d8190556006805473e40246b91a65a569efd3eca2bec3fb8e12ab8da26001600160a01b03199182161790915560078054738b52956cd6140cdd36cb4113cd8a043eea1d28af921682179055620001d09062000259565b6200020b738b52956cd6140cdd36cb4113cd8a043eea1d28af620001fc6001600160e01b03620002d516565b6001600160e01b03620002db16565b5050505050506200073f565b3390565b60006200025460045462000240600a54426200030e60201b62003e881790919060201c565b6200035f60201b62004ba81790919060201c565b905090565b6200026c6001600160e01b03620003a916565b620002be576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b620002d2816001600160e01b03620003d816565b50565b60035490565b600062000305620002f46001600160e01b036200021716565b84846001600160e01b036200046916565b50600192915050565b60006200035883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250620005e060201b60201c565b9392505050565b60006200035883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200067b60201b60201c565b600080546001600160a01b0316620003c96001600160e01b036200021716565b6001600160a01b031614905090565b6001600160a01b0381166200041f5760405162461bcd60e51b815260040180806020018281038252602681526020018062005f0d6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062005f5983398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316620004b05760405162461bcd60e51b815260040180806020018281038252602581526020018062005f796025913960400191505060405180910390fd5b6001600160a01b038216620004f75760405162461bcd60e51b815260040180806020018281038252602381526020018062005eea6023913960400191505060405180910390fd5b620005448160405180606001604052806026815260200162005f33602691396001600160a01b03861660009081526001602090815260409091205492919062004118620005e0821b17901c565b6001600160a01b03808516600090815260016020908152604080832094909455918516815291909120546200058491839062004507620006e4821b17901c565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115620006735760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620006375781810151838201526020016200061d565b50505050905090810190601f168015620006655780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183620006cd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620006375781810151838201526020016200061d565b506000838581620006da57fe5b0495945050505050565b60008282018381101562000358576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61579b806200074f6000396000f3fe6080604052600436106103ad5760003560e01c8063731a0d9a116101e7578063c88cb1ae1161010d578063d826f9ab116100a0578063ed3aa2e31161006f578063ed3aa2e314610f48578063f04b5fa014610f72578063f2fde38b14610fc0578063f5a5ad0314610ff3576103ad565b8063d826f9ab14610ece578063dd62ed3e14610ee3578063e4df526514610f1e578063eb17d46c14610f33576103ad565b8063ce7d1f77116100dc578063ce7d1f7714610e1e578063ce877a9214610e44578063d109c52f14610e7a578063d47650f114610ea4576103ad565b8063c88cb1ae14610d91578063c95074ef14610dc4578063cb135fda14610dd9578063cbb151d314610dee576103ad565b80638f1c65c01161018557806395d89b411161015457806395d89b4114610c97578063a2fb117514610cac578063a9059cbb14610cfe578063c312452514610d37576103ad565b80638f1c65c014610be05780638f32d59b14610c0a5780638fc4d76e14610c1f57806390de687114610c4f576103ad565b806387a0f31c116101c157806387a0f31c14610aef5780638afbcac914610b195780638da5cb5b14610ba15780638e752e0314610bb6576103ad565b8063731a0d9a14610a715780637892fd2914610aa457806382088e9a14610ab9576103ad565b806332ab59ac116102d757806352a438b81161026a57806365cf71b21161023957806365cf71b214610972578063687fe7d8146109b857806370a0823114610a29578063715018a614610a5c576103ad565b806352a438b8146108ee57806353aaa0461461091e5780635c9302c91461093357806360e9b1e414610948576103ad565b80633a70a5ca116102a65780633a70a5ca14610814578063421a8a861461082957806344203faf1461087c5780635238ffe0146108d9576103ad565b806332ab59ac1461074657806333060d9014610777578063343009a2146107aa57806338b49845146107e1576103ad565b8063193d4d121161034f578063268ca0081161031e578063268ca0081461067c5780632933e8b3146106a65780632e60d1c4146106bb578063313ce5671461071b576103ad565b8063193d4d121461053a5780631ae8605d1461058c57806323b872dd146105bf5780632607443b14610602576103ad565b806307c6340f1161038b57806307c6340f14610499578063095ea7b3146104c357806318160ddd1461051057806318dc1cc714610525576103ad565b8063022466b5146103af57806306fdde03146103d65780630713e39614610460575b005b3480156103bb57600080fd5b506103c4611029565b60408051918252519081900360200190f35b3480156103e257600080fd5b506103eb61102f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042557818101518382015260200161040d565b50505050905090810190601f1680156104525780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046c57600080fd5b506103c46004803603604081101561048357600080fd5b50803590602001356001600160a01b031661105b565b3480156104a557600080fd5b506103c4600480360360208110156104bc57600080fd5b5035611078565b3480156104cf57600080fd5b506104fc600480360360408110156104e657600080fd5b506001600160a01b0381351690602001356110c3565b604080519115158252519081900360200190f35b34801561051c57600080fd5b506103c46110e1565b34801561053157600080fd5b506103c46110e7565b34801561054657600080fd5b506105736004803603604081101561055d57600080fd5b50803590602001356001600160a01b03166110ed565b6040805192835260208301919091528051918290030190f35b34801561059857600080fd5b506103ad600480360360208110156105af57600080fd5b50356001600160a01b031661110f565b3480156105cb57600080fd5b506104fc600480360360608110156105e257600080fd5b506001600160a01b03813581169160208101359091169060400135611178565b34801561060e57600080fd5b5061063b6004803603604081101561062557600080fd5b506001600160a01b038135169060200135611206565b6040805164ffffffffff909716875260208701959095528585019390935261ffff9182166060860152811660808501521660a0830152519081900360c00190f35b34801561068857600080fd5b506103ad6004803603602081101561069f57600080fd5b503561126a565b3480156106b257600080fd5b506103c46112e3565b3480156106c757600080fd5b506106fa600480360360608110156106de57600080fd5b506001600160a01b0381351690602081013590604001356112e9565b604080519283526001600160a01b0390911660208301528051918290030190f35b34801561072757600080fd5b50610730611394565b6040805160ff9092168252519081900360200190f35b34801561075257600080fd5b5061075b611399565b604080516001600160a01b039092168252519081900360200190f35b34801561078357600080fd5b506103c46004803603602081101561079a57600080fd5b50356001600160a01b03166113a8565b3480156107b657600080fd5b506103ad600480360360408110156107cd57600080fd5b508035906020013564ffffffffff166113c3565b3480156107ed57600080fd5b506103c46004803603602081101561080457600080fd5b50356001600160a01b031661190b565b34801561082057600080fd5b506103c4611926565b34801561083557600080fd5b506108596004803603604081101561084c57600080fd5b508035906020013561194a565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561088857600080fd5b506108b56004803603604081101561089f57600080fd5b50803590602001356001600160a01b031661198d565b6040805164ffffffffff938416815291909216602082015281519081900390910190f35b3480156108e557600080fd5b506103ad6119bc565b3480156108fa57600080fd5b506103ad6004803603604081101561091157600080fd5b5080359060200135611be7565b34801561092a57600080fd5b5061075b611d8f565b34801561093f57600080fd5b506103c4611d9e565b34801561095457600080fd5b506103c46004803603602081101561096b57600080fd5b5035611da8565b34801561097e57600080fd5b506103ad6004803603606081101561099557600080fd5b5080356001600160a01b0316906020810135906040013564ffffffffff16611dba565b3480156109c457600080fd5b506109fe600480360360608110156109db57600080fd5b5080356001600160a01b0316906020810135906040013564ffffffffff166120be565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610a3557600080fd5b506103c460048036036020811015610a4c57600080fd5b50356001600160a01b0316612262565b348015610a6857600080fd5b506103ad61227d565b348015610a7d57600080fd5b506103ad60048036036020811015610a9457600080fd5b50356001600160a01b031661230e565b348015610ab057600080fd5b506103c4612377565b348015610ac557600080fd5b506103c460048036036060811015610adc57600080fd5b508035906020810135906040013561237d565b348015610afb57600080fd5b506103c460048036036020811015610b1257600080fd5b50356125d6565b348015610b2557600080fd5b50610b5260048036036040811015610b3c57600080fd5b506001600160a01b0381351690602001356125e8565b6040805164ffffffffff909916895260208901979097528787019590955261ffff9384166060880152918316608087015290911660a085015260c084015260e083015251908190036101000190f35b348015610bad57600080fd5b5061075b61265b565b348015610bc257600080fd5b506103c460048036036020811015610bd957600080fd5b503561266a565b348015610bec57600080fd5b506103ad60048036036020811015610c0357600080fd5b503561267c565b348015610c1657600080fd5b506104fc612759565b348015610c2b57600080fd5b50610c3461277d565b60408051921515835260208301919091528051918290030190f35b348015610c5b57600080fd5b50610c7960048036036020811015610c7257600080fd5b50356127a4565b60408051938452602084019290925282820152519081900360600190f35b348015610ca357600080fd5b506103eb6127c5565b348015610cb857600080fd5b50610cd660048036036020811015610ccf57600080fd5b50356127e5565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b348015610d0a57600080fd5b506104fc60048036036040811015610d2157600080fd5b506001600160a01b038135169060200135612810565b348015610d4357600080fd5b50610d4c612824565b60408051978852602088019690965264ffffffffff94851687870152606087019390935261ffff909116608086015260a08501521660c0830152519081900360e00190f35b348015610d9d57600080fd5b506103c460048036036020811015610db457600080fd5b50356001600160a01b031661284e565b348015610dd057600080fd5b506103c4612860565b348015610de557600080fd5b506103c4612866565b348015610dfa57600080fd5b506103ad60048036036040811015610e1157600080fd5b508035906020013561286c565b6103ad60048036036020811015610e3457600080fd5b50356001600160a01b0316612cac565b348015610e5057600080fd5b506103c460048036036060811015610e6757600080fd5b50803590602081013590604001356131cf565b348015610e8657600080fd5b506103ad60048036036020811015610e9d57600080fd5b50356134b6565b348015610eb057600080fd5b506103c460048036036020811015610ec757600080fd5b50356138d6565b348015610eda57600080fd5b506103c46138ff565b348015610eef57600080fd5b506103c460048036036040811015610f0657600080fd5b506001600160a01b0381358116916020013516613905565b348015610f2a57600080fd5b506103ad613930565b348015610f3f57600080fd5b506103c4613adc565b348015610f5457600080fd5b506103c460048036036020811015610f6b57600080fd5b5035613ae2565b348015610f7e57600080fd5b50610f87613b09565b604051808261014080838360005b83811015610fad578181015183820152602001610f95565b5050505090500191505060405180910390f35b348015610fcc57600080fd5b506103ad60048036036020811015610fe357600080fd5b50356001600160a01b0316613b9e565b348015610fff57600080fd5b506103c46004803603606081101561101657600080fd5b5080359060208101359060400135613bee565b600a5481565b6040518060400160405280601081526020016f4a61636b706f7420457468657265756d60801b81525081565b601960209081526000928352604080842090915290825290205481565b600061016d82116110b5576110ae61109b83645faf0f3b2d63ffffffff613e2f16565b65e35fa931a0009063ffffffff613e8816565b90506110be565b50655af3107a40005b919050565b60006110d76110d0613eca565b8484613ece565b5060015b92915050565b60035490565b601b5481565b6020808052600092835260408084209091529082529020805460019091015482565b611117612759565b611156576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000611185848484613fba565b6111fb84611191613eca565b6111f685604051806060016040528060288152602001615691602891396001600160a01b038a166000908152600260205260408120906111cf613eca565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61411816565b613ece565b5060015b9392505050565b6014602052816000526040600020818154811061121f57fe5b6000918252602090912060049091020180546001820154600283015460039093015464ffffffffff9092169450925061ffff80821691620100008104821691600160201b9091041686565b6000818152601e6020526040902060020154156112e0576000818152601e6020526040808220805460029091015491516001600160a01b039091169282156108fc02929190818181858888f193505050501580156112cc573d6000803e3d6000fd5b506000818152601e60205260408120600201555b50565b601c5481565b60008281526017602090815260408083206001600160a01b03871684528252808320848452600101909152812080548291906001600160601b031661136e576040805162461bcd60e51b8152602060048201526016602482015275129050d2d413d50e8814185c985b481a5b9d985b1a5960521b604482015290519081900360640190fd5b546001600160601b03811696600160601b9091046001600160a01b031695509350505050565b600881565b6007546001600160a01b031681565b6001600160a01b031660009081526014602052604090205490565b6113cb61535f565b6113d361535f565b6113dd82826141af565b336000908152601460205260409020805461143b576040805162461bcd60e51b8152602060048201526019602482015278129050d2d413d50e88115b5c1d1e481cdd185ad9481b1a5cdd603a1b604482015290519081900360640190fd5b80548510611490576040805162461bcd60e51b815260206004820152601b60248201527f4a41434b504f543a207374616b65496e64657820696e76616c69640000000000604482015290519081900360640190fd5b6114986153ab565b6114bc8287815481106114a757fe5b90600052602060002090600402018683614209565b6114c5846142a4565b6114cf84846142b2565b60a0810151606082015160e08601516000921515918391829182918291829110611589578515611505578760800151965061153e565b61150f8b896143b5565b606088015160e08c01516115289163ffffffff613e8816565b9650876080015187111561153e57876080015196505b6115498b89896143e2565b60405194995092975090955093509150339084156108fc029085906000818181858888f19350505050158015611583573d6000803e3d6000fd5b506115b1565b604088015160208c01516115a29163ffffffff613e8816565b6020808d019190915288015194505b3364ffffffffff8d167ff3d5726a848893c8a5bc08c97918bac796866ae949000ce3d179312f988769ea886115e75760006115ea565b60015b8b606001518b8d602001518e604001518b8a8e604051808960ff1664ffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390a3801580159061165a575085155b1561167a5760608b0151611674908263ffffffff61450716565b60608c01525b84156116955761168a3386614561565b6116958b8987614653565b60208801518b516116ab9163ffffffff613e8816565b8b5260e08b01516116c49061ffff63ffffffff61470a16565b898e815481106116d057fe5b906000526020600020906004020160030160046101000a81548161ffff021916908361ffff1602179055506117036153e8565b898e8154811061170f57fe5b600091825260209091206004909102015464ffffffffff16815289548a908f90811061173757fe5b906000526020600020906004020160010154816020018181525050898e8154811061175e57fe5b906000526020600020906004020160020154816040018181525050898e8154811061178557fe5b600091825260209091206003600490920201015461ffff16606082015289548a908f9081106117b057fe5b600091825260209091206004909102016003015462010000900461ffff16608082015289548a908f9081106117e157fe5b6000918252602082206003600490920201015461ffff600160201b9091041660a083015260c0820187905260e0820185905260159061181e613eca565b6001600160a01b0316815260208082019290925260409081016000908120805460018082018355918352918490208551600690930201805464ffffffffff191664ffffffffff909316929092178255928401519281019290925582015160028201556060820151600382018054608085015160a086015161ffff1990921661ffff9485161763ffff0000191662010000918516919091021765ffff000000001916600160201b939091169290920291909117905560c0820151600482015560e08201516005909101556118f18a8f61474c565b6118fb8c8c6142b2565b5050505050505050505050505050565b6001600160a01b031660009081526015602052604090205490565b6000611945600c600001546119396110e1565b9063ffffffff61450716565b905090565b6021602052816000526040600020818154811061196357fe5b6000918252602090912060029091020180546001909101546001600160a01b039091169250905082565b601760209081526000928352604080842090915290825290205464ffffffffff80821691600160281b90041682565b6119c4612759565b611a03576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b6002600a54421015611a51576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b6000196008541415611a945760405162461bcd60e51b815260040180806020018281038252602581526020018061558e6025913960400191505060405180910390fd5b600854611aa7908263ffffffff61450716565b611aaf614877565b1015611af7576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b60245460ff1615611b4f576040805162461bcd60e51b815260206004820152601b60248201527f4a41434b504f543a20416c726561647920776974686472617765640000000000604482015290519081900360640190fd5b6007546008546001600160a01b03909116906108fc90611bae90601690600090611b8090600163ffffffff61450716565b815260208082019290925260409081016000908120546008548252601690935220549063ffffffff61450716565b6040518115909202916000818181858888f19350505050158015611bd6573d6000803e3d6000fd5b50506024805460ff19166001179055565b6001600a54421015611c35576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b6000196008541415611c785760405162461bcd60e51b815260040180806020018281038252602581526020018061558e6025913960400191505060405180910390fd5b600854611c8b908263ffffffff61450716565b611c93614877565b1015611cdb576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b611ce361535f565b611ceb61535f565b611cf582826141af565b60018260e0015110611d205760e0820151611d2090611d1b90600163ffffffff613e8816565b6134b6565b6001841015611d605760405162461bcd60e51b815260040180806020018281038252602981526020018061561d6029913960400191505060405180910390fd5b611d69826142a4565b611d74828686614894565b611d7e3386614a2a565b611d8882826142b2565b5050505050565b6006546001600160a01b031681565b6000611945614877565b60009081526021602052604090205490565b611dc261535f565b611dca61535f565b611dd482826141af565b60018260e0015110611dfa5760e0820151611dfa90611d1b90600163ffffffff613e8816565b6001600160a01b038516600090815260146020526040902054611e60576040805162461bcd60e51b8152602060048201526019602482015278129050d2d413d50e88115b5c1d1e481cdd185ad9481b1a5cdd603a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152601460205260409020548410611ecc576040805162461bcd60e51b815260206004820152601b60248201527f4a41434b504f543a207374616b65496e64657820696e76616c69640000000000604482015290519081900360640190fd5b6001600160a01b0385166000908152601460205260408120805486908110611ef057fe5b90600052602060002090600402019050611f086153ab565b611f13828683614209565b60808101516060820151611f2c9163ffffffff61450716565b8460e001511015611f84576040805162461bcd60e51b815260206004820152601f60248201527f4a41434b504f543a205374616b65206e6f742066756c6c792073657276656400604482015290519081900360640190fd5b60a081015115611fdb576040805162461bcd60e51b815260206004820152601f60248201527f4a41434b504f543a205374616b6520616c726561647920756e6c6f636b656400604482015290519081900360640190fd5b611fe4846142a4565b611fee84826143b5565b6000806000612002878586608001516143e2565b9450945050935050336001600160a01b03168a6001600160a01b03168964ffffffffff167f0bff00790f1231cf0c26911db2d0c4e670b204ebb02d6a73d3fb5c995910705e8760200151886040015188886040518085815260200184815260200183815260200182815260200194505050505060405180910390a4801561209e576060870151612098908263ffffffff61450716565b60608801525b6120a88585614b26565b6120b287876142b2565b50505050505050505050565b60008060008060006120ce61535f565b6120d661535f565b6120e082826141af565b6001600160a01b038a1660009081526014602052604090208054612147576040805162461bcd60e51b8152602060048201526019602482015278129050d2d413d50e88115b5c1d1e481cdd185ad9481b1a5cdd603a1b604482015290519081900360640190fd5b80548a1061219c576040805162461bcd60e51b815260206004820152601b60248201527f4a41434b504f543a207374616b65496e64657820696e76616c69640000000000604482015290519081900360640190fd5b6121a46153ab565b6121c8828c815481106121b357fe5b90600052602060002090600402018b83614209565b60a0810151606082015160e0860151600092151591116122495780156121f4578260800151915061222d565b6121fe86846143b5565b606083015160e08701516122179163ffffffff613e8816565b9150826080015182111561222d57826080015191505b6122388684846143e2565b939e50919c509a5098509650612251565b82602001519a505b505050505050939792965093509350565b6001600160a01b031660009081526001602052604090205490565b612285612759565b6122c4576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b612316612759565b612355576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60045481565b600080612388614877565b9050808411156123c95760405162461bcd60e51b81526004018080602001828103825260248152602001806156d96024913960400191505060405180910390fd5b8083111580156123d95750828411155b6124145760405162461bcd60e51b81526004018080602001828103825260228152602001806155fb6022913960400191505060405180910390fd5b60125464ffffffffff1661246f576040805162461bcd60e51b815260206004820152601d60248201527f4a41434b504f543a206c61746573745374616b654964206572726f722e000000604482015290519081900360640190fd5b828414156124815760009150506111ff565b600061249485600563ffffffff61450716565b90505b83811080156124ab575060105461ffff1681105b15612510576000818152601360205260409020600281015490546124f6916124e9916124dd908a63ffffffff613e2f16565b9063ffffffff614ba816565b849063ffffffff61450716565b925061250981600563ffffffff61450716565b9050612497565b60105460009060139082906125309061ffff16600163ffffffff613e8816565b815260200190815260200160002060020154905080600014156125505750855b60105460009060139082906125709061ffff16600163ffffffff613e8816565b81526020019081526020016000206000015490505b858310156125cb576125b16125a4836124dd848c63ffffffff613e2f16565b869063ffffffff61450716565b94506125c483600563ffffffff61450716565b9250612585565b505050509392505050565b60166020526000908152604090205481565b6015602052816000526040600020818154811061260157fe5b600091825260209091206006909102018054600182015460028301546003840154600485015460059095015464ffffffffff90941696509194509261ffff80831693620100008404821693600160201b9004909116919088565b6000546001600160a01b031690565b601f6020526000908152604090205481565b61268461535f565b61268c61535f565b61269682826141af565b60018260e00151116126e4576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b821561273c578160e0015183111561272d5760405162461bcd60e51b815260040180806020018281038252602a815260200180615564602a913960400191505060405180910390fd5b6127378284614bea565b61274a565b61274a828360e00151614bea565b61275482826142b2565b505050565b600080546001600160a01b031661276e613eca565b6001600160a01b031614905090565b6000806000196008541415612797575060009050806127a0565b50506008546001905b9091565b60136020526000908152604090208054600182015460029092015490919083565b604051806040016040528060048152602001630948aa8960e31b81525081565b601e602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b60006110d761281d613eca565b8484613fba565b600c54600d54600e54600f5460105460115460125464ffffffffff9485169461ffff909316921687565b60186020526000908152604090205481565b601d5481565b600b5481565b6000612876614877565b90508083106128cc576040805162461bcd60e51b815260206004820152601e60248201527f4a41434b504f543a20526f756e64206973206e6f7420636f6d706c6574650000604482015290519081900360640190fd5b600181106128e8576128e8611d1b82600163ffffffff613e8816565b600083815260176020908152604080832033845290915281208054909164ffffffffff90911690841561299357825461292f90600160281b900464ffffffffff1683613e88565b85111561297c576040805162461bcd60e51b8152602060048201526016602482015275129050d2d413d50e8818dbdd5b9d081a5b9d985b1a5960521b604482015290519081900360640190fd5b61298c828663ffffffff61450716565b90506129f1565b508154600160281b900464ffffffffff168082106129f1576040805162461bcd60e51b8152602060048201526016602482015275129050d2d413d50e8818dbdd5b9d081a5b9d985b1a5960521b604482015290519081900360640190fd5b60006129fc87611078565b6000888152601660205260408120549192505b60008581526001870160205260408120546001600160601b03811691600160601b9091046001600160a01b031690612a4b856124dd8886613e2f565b90506001600160a01b0382161580612a6b57506001600160a01b03821633145b8015612a8057506006546001600160a01b0316155b15612a9657612a918c898385614cbf565b612bde565b6001600160a01b0382161580612ab457506001600160a01b03821633145b15612b4c576000612acc82600a63ffffffff614ba816565b600654909150612aea908e908b9085906001600160a01b0316614cbf565b600654612b00906001600160a01b031682614561565b6006546001600160a01b0316600090815260186020526040902054612b2b908263ffffffff61450716565b6006546001600160a01b031660009081526018602052604090205550612bde565b612b6d612b6082600a63ffffffff614ba816565b829063ffffffff61450716565b90506000612b8282600a63ffffffff614ba816565b9050612b908d8a8486614cbf565b612b9a8382614561565b6001600160a01b038316600090815260186020526040902054612bc3908263ffffffff61450716565b6001600160a01b038416600090815260186020526040902055505b612bee848263ffffffff61450716565b9350505050838560010195508510612a0f57855464ffffffffff191664ffffffffff86161786558015612ca157612c2c612c26613eca565b82614561565b6000898152601960205260408120612c6f91839190612c49613eca565b6001600160a01b031681526020810191909152604001600020549063ffffffff61450716565b60008a815260196020526040812090612c86613eca565b6001600160a01b031681526020810191909152604001600020555b505050505050505050565b600a54421015612cf8576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b6000612d02614877565b905061016d8110612d445760405162461bcd60e51b815260040180806020018281038252602481526020018061549d6024913960400191505060405180910390fd5b6000196008541415612d565760088190555b60018110612d7257612d72611d1b82600163ffffffff613e8816565b3480612dc5576040805162461bcd60e51b815260206004820152601860248201527f4a41434b504f543a20416d6f756e742072657175697265640000000000000000604482015290519081900360640190fd5b6000612dcf613eca565b60008481526017602090815260408083206001600160a01b0380861685529083528184208054600164ffffffffff600160281b80840482168381019092160269ffffffffff000000000019909316929092178355845180860186526001600160601b03808c1682528d8616828901908152848a529285018852868920915182549351909616600160601b029581166bffffffffffffffffffffffff199093169290921790911693909317909255888552601690935292205492935091612e9b908563ffffffff61450716565b600086815260166020526040812091909155612eb686613ae2565b90506000600554600454612ed5600a5442613e8890919063ffffffff16565b81612edc57fe5b0611159050808015612ef15750600282066001145b8015612f1e57506000878152602080805260408083206001600160a01b0389168452909152902060010154155b15613019576000878152602080805260408083206001600160a01b0389168452825280832083815560019081018190558a8452601f90925290912054612f699163ffffffff61450716565b6000888152601f60209081526040808320939093556021815282822083518085019094526001600160a01b038981168552600185840181815283548083018555938652939094209451600290920290940180546001600160a01b0319169190941617835551910155612fda87614d10565b6040805142815260208101899052815188927fb6c1f2c809dae1f76ed948be6273bc6773a8fb237fada16871b9179036900a05928290030190a2613184565b808015613027575060028206155b15613184576000878152602080805260408083206001600160a01b038916845290915290208054670de0b6b3a7640000613067828a63ffffffff61450716565b8161306e57fe5b068255600061308f670de0b6b3a76400006124dd848c63ffffffff61450716565b905080156131805760018301546130ac908263ffffffff61450716565b600184015560008a8152601f60205260409020546130d0908263ffffffff61450716565b60008b8152601f60209081526040808320939093556021815282822083518085019094526001600160a01b038c81168552848301868152825460018082018555938652939094209451600290930290940180546001600160a01b0319169290941691909117835590519101556131458a614d10565b60408051428152602081018c905281518b927fb6c1f2c809dae1f76ed948be6273bc6773a8fb237fada16871b9179036900a05928290030190a25b5050505b85837f683f950243ca541a09abd8157385ce15a23ac43a47b8d0306de2bdc20d0b9e09428a604051808381526020018281526020019250505060405180910390a35050505050505050565b6000806131da614877565b90508084111561321b5760405162461bcd60e51b81526004018080602001828103825260248152602001806156d96024913960400191505060405180910390fd5b80831115801561322b5750828411155b6132665760405162461bcd60e51b81526004018080602001828103825260228152602001806155fb6022913960400191505060405180910390fd5b60125464ffffffffff166132c1576040805162461bcd60e51b815260206004820152601d60248201527f4a41434b504f543a206c61746573745374616b654964206572726f722e000000604482015290519081900360640190fd5b828414156132d35760009150506111ff565b6000845b84811080156132eb575060105461ffff1681105b156133a95760008181526013602052604081206002810154905461331a91906124dd908b63ffffffff613e2f16565b9050600483101561333d5761333683600163ffffffff61450716565b925061337e565b600082815260136020526040902060028181015491546133779261336b916124dd908d63ffffffff613e2f16565b9063ffffffff613e2f16565b9050600092505b61338e858263ffffffff61450716565b94506133a182600163ffffffff61450716565b9150506132d7565b60105460009060139082906133c99061ffff16600163ffffffff613e8816565b815260200190815260200160002060020154905080600014156133e95750865b60105460009060139082906134099061ffff16600163ffffffff613e8816565b81526020019081526020016000206000015490505b868310156134aa57600061343c836124dd848d63ffffffff613e2f16565b9050600485101561345f5761345885600163ffffffff61450716565b945061347f565b613478600261336b856124dd868f63ffffffff613e2f16565b9050600094505b61348f878263ffffffff61450716565b96506134a284600163ffffffff61450716565b93505061341e565b50505050509392505050565b6000600a54421015613504576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b60001960085414156135475760405162461bcd60e51b815260040180806020018281038252602581526020018061558e6025913960400191505060405180910390fd5b60085461355a908263ffffffff61450716565b613562614877565b10156135aa576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b60006135b4614877565b9050806135c157506138d2565b8083106135dc576135d981600163ffffffff613e8816565b92505b6135ed81600163ffffffff613e8816565b831480156136085750600554600454428161360457fe5b0611155b80156136145750600083115b156136315761362a83600163ffffffff613e8816565b9250613672565b61364281600163ffffffff613e8816565b8314801561365d5750600554600454428161365957fe5b0611155b8015613667575082155b1561367257506138d2565b82601a541161275457601a546000908152601f6020526040902054806136f057601a546000908152601660205260409020546136d0906136c1906103e8906124dd90601963ffffffff613e2f16565b6022549063ffffffff61450716565b602255601a546136e790600163ffffffff61450716565b601a5550613672565b60006136fb82614d49565b90506000805b8282101561378457601a54600090815260216020526040812080548390811061372657fe5b90600052602060002090600202016001015490508361374e828561450790919063ffffffff16565b106137595750613784565b613769838263ffffffff61450716565b925061377c82600163ffffffff61450716565b915050613701565b601a546000908152601660205260408120546137af906103e8906124dd90601963ffffffff613e2f16565b602254909150156137d6576022546137ce90829063ffffffff61450716565b600060225590505b604051806060016040528060216000601a548152602001908152602001600020848154811061380157fe5b60009182526020808320600292830201546001600160a01b0390811685528482018790526040948501879052601a80548552601e8352858520875181546001600160a01b0319169084161781558784015160018201559686015196909301959095559054601b8190558083529183902054835192835290820185905290921682820152517f6ecdfccd3210b67ae02fb6df321669a4d3b0b29d7581add7d3f547b608c776b8916060908290030190a1601a546138c490600163ffffffff61450716565b601a55506136729350505050565b5050565b60006110db6138f060045484613e2f90919063ffffffff16565b600a549063ffffffff61450716565b601a5481565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b613938612759565b613977576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b60085461398b90600263ffffffff61450716565b60095410156139ac576008546139a890600263ffffffff61450716565b6009555b476139f2576040805162461bcd60e51b81526020600482015260116024820152704a41434b504f543a204e6f2076616c756560781b604482015290519081900360640190fd5b6139fa614877565b60095410613a46576040805162461bcd60e51b81526020600482015260146024820152734a41434b504f543a20496e76616c69642064617960601b604482015290519081900360640190fd5b613a4e614877565b6009541015613ada576007546009546000908152601660205260409020546001600160a01b03909116906108fc90613a95906103e8906124dd90604b63ffffffff613e2f16565b6040518115909202916000818181858888f19350505050158015613abd573d6000803e3d6000fd5b50600954613ad290600163ffffffff61450716565b600955613a46565b565b60055481565b60006007613afb83600b5461450790919063ffffffff16565b81613b0257fe5b0692915050565b613b11615440565b6040805161014081018252600c548152600d546020820152600e5464ffffffffff90811692820192909252600f54606082015260105461ffff16608082015260115460a082015260125490911660c08201524260e08201526101008101613b766110e1565b815260200160166000613b87614877565b815260200190815260200160002054815250905090565b613ba6612759565b613be5576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b6112e081614dd3565b600080613bf9614877565b905080841115613c3a5760405162461bcd60e51b81526004018080602001828103825260248152602001806156d96024913960400191505060405180910390fd5b808311158015613c4a5750828411155b613c855760405162461bcd60e51b81526004018080602001828103825260228152602001806155fb6022913960400191505060405180910390fd5b60125464ffffffffff16613ce0576040805162461bcd60e51b815260206004820152601d60248201527f4a41434b504f543a206c61746573745374616b654964206572726f722e000000604482015290519081900360640190fd5b82841415613cf25760009150506111ff565b835b8381108015613d08575060105461ffff1681105b15613d775760008181526013602052604081206002810154600190910154613d4a91612b60916124dd908b9061336b906064908490605a63ffffffff613e2f16565b9050613d5c848263ffffffff61450716565b9350613d6f82600163ffffffff61450716565b915050613cf4565b6010546000906013908290613d979061ffff16600163ffffffff613e8816565b81526020019081526020016000206002015490508060001415613db75750855b84821015613e25576000613df8612b60836124dd8b61336b60646124dd605a601660008d815260200190815260200160002054613e2f90919063ffffffff16565b9050613e0a858263ffffffff61450716565b9450613e1d83600163ffffffff61450716565b925050613db7565b5050509392505050565b600082613e3e575060006110db565b82820282848281613e4b57fe5b04146111ff5760405162461bcd60e51b81526004018080602001828103825260218152602001806156706021913960400191505060405180910390fd5b60006111ff83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614118565b3390565b6001600160a01b038316613f135760405162461bcd60e51b81526004018080602001828103825260248152602001806157436024913960400191505060405180910390fd5b6001600160a01b038216613f585760405162461bcd60e51b81526004018080602001828103825260228152602001806155426022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316613fff5760405162461bcd60e51b815260040180806020018281038252602581526020018061571e6025913960400191505060405180910390fd5b6001600160a01b0382166140445760405162461bcd60e51b815260040180806020018281038252602381526020018061547a6023913960400191505060405180910390fd5b614087816040518060600160405280602681526020016155b3602691396001600160a01b038616600090815260016020526040902054919063ffffffff61411816565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546140bc908263ffffffff61450716565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156141a75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561416c578181015183820152602001614154565b50505050905090810190601f1680156141995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600c548252600d546020830152600e5464ffffffffff9081166040840152600f54606084015260105461ffff16608084015260115460a08401526012541660c08301526141fa614877565b60e08301526138d28282614e73565b825464ffffffffff8381169116146142525760405162461bcd60e51b81526004018080602001828103825260228152602001806155d96022913960400191505060405180910390fd5b825464ffffffffff168152600183015460208201526002830154604082015260039092015461ffff808216606085015262010000820481166080850152600160201b9091041660a09092019190915250565b6112e0818260e00151614bea565b805182511415806142cb57508060200151826020015114155b806142de57508060400151826040015114155b806142f157508060600151826060015114155b1561432c578151600c556020820151600d556040820151600e805464ffffffffff191664ffffffffff9092169190911790556060820151600f555b8060800151826080015114158061434b57508060a001518260a0015114155b8061436c57508060c0015164ffffffffff168260c0015164ffffffffff1614155b156138d2575060808101516010805461ffff191661ffff90921691909117905560a081015160115560c001516012805464ffffffffff191664ffffffffff909216919091179055565b604081015160a08301516143ce9163ffffffff613e8816565b60a08084019190915260e090920151910152565b600080600080600086608001518610156144565761440f8888606001518960800151898b60400151614ebb565b60208901519195509250614429908563ffffffff61450716565b6040880151606089015191965061444f9161444a818a63ffffffff61450716565b613bee565b92506144d0565b6040870151606088015161447a9190614475818a63ffffffff61450716565b6131cf565b6040880151606089015191955061449b9161444a818a63ffffffff61450716565b60208801519093506144b3908563ffffffff61450716565b94506144cd876060015188608001518960a0015188614fbb565b91505b81156144fc57848211156144e757506000936144fc565b50806144f9858263ffffffff613e8816565b94505b939792965093509350565b6000828201838110156111ff576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0382166145bc576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6003546145cf908263ffffffff61450716565b6003556001600160a01b0382166000908152600160205260409020546145fb908263ffffffff61450716565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b816020015181111561275457600061466f828460800151615018565b9050600061469584604001516124dd620186a061336b868861450790919063ffffffff16565b905064ffffffffff8111156146ac575064ffffffffff5b8460400151811115611d885760408086018290528451815142815260208101849052825164ffffffffff909216927faf62aa7dadbf7e5e54b91236b109372266fcf681cc74f199a41e14c242a3db3f92918290030190a25050505050565b60006111ff83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506150c9565b815460009061476290600163ffffffff613e8816565b90508082146148265782818154811061477757fe5b906000526020600020906004020183838154811061479157fe5b600091825260209091208254600490920201805464ffffffffff191664ffffffffff90921691909117815560018083015490820155600280830154908201556003918201805492909101805461ffff191661ffff938416178082558254620100009081900485160263ffff000019909116178082559154600160201b9081900490931690920265ffff00000000199091161790555b8280548061483057fe5b600082815260208120600460001990930192830201805464ffffffffff19168155600181018290556002810191909155600301805465ffffffffffff191690559055505050565b60006119456004546124dd600a5442613e8890919063ffffffff16565b60b48111156148d45760405162461bcd60e51b815260040180806020018281038252602a815260200180615646602a913960400191505060405180910390fd5b60006148e08383615018565b9050600061490685604001516124dd620186a061336b868961450790919063ffffffff16565b9050806149445760405162461bcd60e51b81526004018080602001828103825260398152602001806154e36039913960400191505060405180910390fd5b60e085015160009061495d90600163ffffffff61450716565b60c087015190915061497d9064ffffffffff16600163ffffffff61450716565b64ffffffffff1660c087018190523360009081526014602052604090206149a890828886868a61512b565b60408051878152602081018590528082018790529051339164ffffffffff8416917fa75ea2f0baef0a6cfa36f61bc0cdc9b3a55ce8876892cf96f640208f65c799e99181900360600190a36020870151614a08908463ffffffff61450716565b60208801528651614a1f908763ffffffff61450716565b909652505050505050565b6001600160a01b038216614a6f5760405162461bcd60e51b81526004018080602001828103825260218152602001806156fd6021913960400191505060405180910390fd5b614ab2816040518060600160405280602281526020016154c1602291396001600160a01b038516600090815260016020526040902054919063ffffffff61411816565b6001600160a01b038316600090815260016020526040902055600354614ade908263ffffffff613e8816565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b8051825464ffffffffff191664ffffffffff9091161782556020810151600183015560408101516002830155606081015160039092018054608083015160a09093015161ffff1990911661ffff9485161763ffff0000191662010000938516939093029290921765ffff000000001916600160201b9390921692909202179055565b60006111ff83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506151f6565b80826080015110614bfa576138d2565b614c0261545f565b8251614c10906119396110e1565b81526080830151614c2284838361525b565b602084015115614c5257602084015160a0850151614c459163ffffffff61450716565b60a0850152600060208501525b60010182811015614c6d57614c6884838361525b565b614c52565b60808401516040805142815260208101929092528181018390525133917fe00f6f1c2b3ba17574be0a8136275368d74f37631cf36525a360b272fe21195b919081900360600190a26080840152505050565b806001600160a01b031682847ff8fa88708321411fd98e823a1eb882047c8dc276ba17a8b81722ed282c4560f74288604051808381526020018281526020019250505060405180910390a450505050565b601c546000908152601f6020526040902054614d3557601c819055601d8190556112e0565b80601d5410156112e057601d8054601c5555565b602354604080514260208083019190915233606090811b838501526054830194909452438040607484015260948301524190931b60b48201524460c8808301919091528251808303909101815260e890910190915280519101206000908190839081614db157fe5b069050614dca600160235461450790919063ffffffff16565b60235592915050565b6001600160a01b038116614e185760405162461bcd60e51b815260040180806020018281038252602681526020018061551c6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c09182015164ffffffffff16910152565b60008080614ecf878663ffffffff61450716565b90506000614ee960026124dd89600163ffffffff61450716565b9050605a811015614ef85750605a5b85614f26576000614f098a8761529c565b9050614f1b818363ffffffff613e2f16565b9350614fb192505050565b85811015614f7a576000614f40898363ffffffff61450716565b9050614f4d868a836131cf565b93506000614f5c8783866131cf565b9050614f6e858263ffffffff61450716565b9550614fb19350505050565b614f858589846131cf565b935085811415614f9757839250614fae565b614fab866124dd868463ffffffff613e2f16565b92505b50505b9550959350505050565b600080614fd3600e611939888863ffffffff61450716565b9050808411614fe6576000915050615010565b61500c6102bc6124dd614fff878563ffffffff613e8816565b869063ffffffff613e2f16565b9150505b949350505050565b60008060018311156150525760b4615031846001613e88565b111561503e5760b461504f565b61504f83600163ffffffff613e8816565b90505b600066027ca57357c0008511156150705766027ca57357c000615072565b845b905061509961508882605a63ffffffff613e2f16565b611939846618de76816d8000613e2f565b92506150c06150b0605a6618de76816d8000613e2f565b6124dd878663ffffffff613e2f16565b95945050505050565b600081836151185760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561416c578181015183820152602001614154565b5082848161512257fe5b06949350505050565b6040805160c08101825264ffffffffff9687168152602080820196875291810194855261ffff9384166060820190815292841660808201908152600060a083018181528a5460018181018d559b8352949091209251600490940290920180549390981664ffffffffff1990931692909217875594519686019690965591516002850155905160039093018054945192518216600160201b0265ffff0000000019938316620100000263ffff0000199590931661ffff1990961695909517939093161716919091179055565b600081836152455760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561416c578181015183820152602001614154565b50600083858161525157fe5b0495945050505050565b6152658383615308565b602091820151600091825260138084526040808420928355601685529092205491909252600182015560a090910151600290910155565b60006152a661535f565b6152b08482614e73565b6152b861545f565b84516152c6906119396110e1565b81526152d28282615308565b60a08201516152e7908563ffffffff61450716565b60a0830181905260208201516150c091906124dd908763ffffffff613e2f16565b8051615327906328d72767906124dd906205394963ffffffff613e2f16565b60208201526060820151156138d2576060820151602082015161534f9163ffffffff61450716565b6020820152600060608301525050565b604051806101000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600064ffffffffff168152602001600081525090565b6040518060c00160405280600064ffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101000160405280600064ffffffffff1681526020016000815260200160008152602001600061ffff168152602001600061ffff168152602001600061ffff16815260200160008152602001600081525090565b604051806101400160405280600a906020820280388339509192915050565b60405180604001604052806000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734a41434b504f543a2041756374696f6e206f6e6c7920666972737420333635206461797345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654a41434b504f543a206e65775374616b656453756e73206d757374206265206174206c65617374206d696e696d756d207368617265526174654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734a41434b504f543a206265666f72654461792063616e6e6f7420626520696e20746865206675747572654a41434b504f543a204d757374206265206174206c65617374206f6e652061756374696f6e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654a41434b504f543a207374616b654964506172616d206e6f7420696e207374616b654a41434b504f543a2057726f6e6720617267756d656e7420666f7220656e644461794a41434b504f543a206e65775374616b656444617973206c6f776572207468616e206d696e696d756d4a41434b504f543a206e65775374616b65644461797320686967686572207468616e206d6178696d756d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724a41434b504f543a2057726f6e6720617267756d656e7420666f7220626567696e44617945524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723158205f30f02b23cfa28f7081cbb2bcf6440179258fde30572adc72e4b65b68a0b54864736f6c6343000511003245524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a207472616e736665722066726f6d20746865207a65726f20616464726573730000000000000000000000000000000000000000000000000000000060933f90000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000e10

Deployed Bytecode

0x6080604052600436106103ad5760003560e01c8063731a0d9a116101e7578063c88cb1ae1161010d578063d826f9ab116100a0578063ed3aa2e31161006f578063ed3aa2e314610f48578063f04b5fa014610f72578063f2fde38b14610fc0578063f5a5ad0314610ff3576103ad565b8063d826f9ab14610ece578063dd62ed3e14610ee3578063e4df526514610f1e578063eb17d46c14610f33576103ad565b8063ce7d1f77116100dc578063ce7d1f7714610e1e578063ce877a9214610e44578063d109c52f14610e7a578063d47650f114610ea4576103ad565b8063c88cb1ae14610d91578063c95074ef14610dc4578063cb135fda14610dd9578063cbb151d314610dee576103ad565b80638f1c65c01161018557806395d89b411161015457806395d89b4114610c97578063a2fb117514610cac578063a9059cbb14610cfe578063c312452514610d37576103ad565b80638f1c65c014610be05780638f32d59b14610c0a5780638fc4d76e14610c1f57806390de687114610c4f576103ad565b806387a0f31c116101c157806387a0f31c14610aef5780638afbcac914610b195780638da5cb5b14610ba15780638e752e0314610bb6576103ad565b8063731a0d9a14610a715780637892fd2914610aa457806382088e9a14610ab9576103ad565b806332ab59ac116102d757806352a438b81161026a57806365cf71b21161023957806365cf71b214610972578063687fe7d8146109b857806370a0823114610a29578063715018a614610a5c576103ad565b806352a438b8146108ee57806353aaa0461461091e5780635c9302c91461093357806360e9b1e414610948576103ad565b80633a70a5ca116102a65780633a70a5ca14610814578063421a8a861461082957806344203faf1461087c5780635238ffe0146108d9576103ad565b806332ab59ac1461074657806333060d9014610777578063343009a2146107aa57806338b49845146107e1576103ad565b8063193d4d121161034f578063268ca0081161031e578063268ca0081461067c5780632933e8b3146106a65780632e60d1c4146106bb578063313ce5671461071b576103ad565b8063193d4d121461053a5780631ae8605d1461058c57806323b872dd146105bf5780632607443b14610602576103ad565b806307c6340f1161038b57806307c6340f14610499578063095ea7b3146104c357806318160ddd1461051057806318dc1cc714610525576103ad565b8063022466b5146103af57806306fdde03146103d65780630713e39614610460575b005b3480156103bb57600080fd5b506103c4611029565b60408051918252519081900360200190f35b3480156103e257600080fd5b506103eb61102f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042557818101518382015260200161040d565b50505050905090810190601f1680156104525780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561046c57600080fd5b506103c46004803603604081101561048357600080fd5b50803590602001356001600160a01b031661105b565b3480156104a557600080fd5b506103c4600480360360208110156104bc57600080fd5b5035611078565b3480156104cf57600080fd5b506104fc600480360360408110156104e657600080fd5b506001600160a01b0381351690602001356110c3565b604080519115158252519081900360200190f35b34801561051c57600080fd5b506103c46110e1565b34801561053157600080fd5b506103c46110e7565b34801561054657600080fd5b506105736004803603604081101561055d57600080fd5b50803590602001356001600160a01b03166110ed565b6040805192835260208301919091528051918290030190f35b34801561059857600080fd5b506103ad600480360360208110156105af57600080fd5b50356001600160a01b031661110f565b3480156105cb57600080fd5b506104fc600480360360608110156105e257600080fd5b506001600160a01b03813581169160208101359091169060400135611178565b34801561060e57600080fd5b5061063b6004803603604081101561062557600080fd5b506001600160a01b038135169060200135611206565b6040805164ffffffffff909716875260208701959095528585019390935261ffff9182166060860152811660808501521660a0830152519081900360c00190f35b34801561068857600080fd5b506103ad6004803603602081101561069f57600080fd5b503561126a565b3480156106b257600080fd5b506103c46112e3565b3480156106c757600080fd5b506106fa600480360360608110156106de57600080fd5b506001600160a01b0381351690602081013590604001356112e9565b604080519283526001600160a01b0390911660208301528051918290030190f35b34801561072757600080fd5b50610730611394565b6040805160ff9092168252519081900360200190f35b34801561075257600080fd5b5061075b611399565b604080516001600160a01b039092168252519081900360200190f35b34801561078357600080fd5b506103c46004803603602081101561079a57600080fd5b50356001600160a01b03166113a8565b3480156107b657600080fd5b506103ad600480360360408110156107cd57600080fd5b508035906020013564ffffffffff166113c3565b3480156107ed57600080fd5b506103c46004803603602081101561080457600080fd5b50356001600160a01b031661190b565b34801561082057600080fd5b506103c4611926565b34801561083557600080fd5b506108596004803603604081101561084c57600080fd5b508035906020013561194a565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561088857600080fd5b506108b56004803603604081101561089f57600080fd5b50803590602001356001600160a01b031661198d565b6040805164ffffffffff938416815291909216602082015281519081900390910190f35b3480156108e557600080fd5b506103ad6119bc565b3480156108fa57600080fd5b506103ad6004803603604081101561091157600080fd5b5080359060200135611be7565b34801561092a57600080fd5b5061075b611d8f565b34801561093f57600080fd5b506103c4611d9e565b34801561095457600080fd5b506103c46004803603602081101561096b57600080fd5b5035611da8565b34801561097e57600080fd5b506103ad6004803603606081101561099557600080fd5b5080356001600160a01b0316906020810135906040013564ffffffffff16611dba565b3480156109c457600080fd5b506109fe600480360360608110156109db57600080fd5b5080356001600160a01b0316906020810135906040013564ffffffffff166120be565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b348015610a3557600080fd5b506103c460048036036020811015610a4c57600080fd5b50356001600160a01b0316612262565b348015610a6857600080fd5b506103ad61227d565b348015610a7d57600080fd5b506103ad60048036036020811015610a9457600080fd5b50356001600160a01b031661230e565b348015610ab057600080fd5b506103c4612377565b348015610ac557600080fd5b506103c460048036036060811015610adc57600080fd5b508035906020810135906040013561237d565b348015610afb57600080fd5b506103c460048036036020811015610b1257600080fd5b50356125d6565b348015610b2557600080fd5b50610b5260048036036040811015610b3c57600080fd5b506001600160a01b0381351690602001356125e8565b6040805164ffffffffff909916895260208901979097528787019590955261ffff9384166060880152918316608087015290911660a085015260c084015260e083015251908190036101000190f35b348015610bad57600080fd5b5061075b61265b565b348015610bc257600080fd5b506103c460048036036020811015610bd957600080fd5b503561266a565b348015610bec57600080fd5b506103ad60048036036020811015610c0357600080fd5b503561267c565b348015610c1657600080fd5b506104fc612759565b348015610c2b57600080fd5b50610c3461277d565b60408051921515835260208301919091528051918290030190f35b348015610c5b57600080fd5b50610c7960048036036020811015610c7257600080fd5b50356127a4565b60408051938452602084019290925282820152519081900360600190f35b348015610ca357600080fd5b506103eb6127c5565b348015610cb857600080fd5b50610cd660048036036020811015610ccf57600080fd5b50356127e5565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b348015610d0a57600080fd5b506104fc60048036036040811015610d2157600080fd5b506001600160a01b038135169060200135612810565b348015610d4357600080fd5b50610d4c612824565b60408051978852602088019690965264ffffffffff94851687870152606087019390935261ffff909116608086015260a08501521660c0830152519081900360e00190f35b348015610d9d57600080fd5b506103c460048036036020811015610db457600080fd5b50356001600160a01b031661284e565b348015610dd057600080fd5b506103c4612860565b348015610de557600080fd5b506103c4612866565b348015610dfa57600080fd5b506103ad60048036036040811015610e1157600080fd5b508035906020013561286c565b6103ad60048036036020811015610e3457600080fd5b50356001600160a01b0316612cac565b348015610e5057600080fd5b506103c460048036036060811015610e6757600080fd5b50803590602081013590604001356131cf565b348015610e8657600080fd5b506103ad60048036036020811015610e9d57600080fd5b50356134b6565b348015610eb057600080fd5b506103c460048036036020811015610ec757600080fd5b50356138d6565b348015610eda57600080fd5b506103c46138ff565b348015610eef57600080fd5b506103c460048036036040811015610f0657600080fd5b506001600160a01b0381358116916020013516613905565b348015610f2a57600080fd5b506103ad613930565b348015610f3f57600080fd5b506103c4613adc565b348015610f5457600080fd5b506103c460048036036020811015610f6b57600080fd5b5035613ae2565b348015610f7e57600080fd5b50610f87613b09565b604051808261014080838360005b83811015610fad578181015183820152602001610f95565b5050505090500191505060405180910390f35b348015610fcc57600080fd5b506103ad60048036036020811015610fe357600080fd5b50356001600160a01b0316613b9e565b348015610fff57600080fd5b506103c46004803603606081101561101657600080fd5b5080359060208101359060400135613bee565b600a5481565b6040518060400160405280601081526020016f4a61636b706f7420457468657265756d60801b81525081565b601960209081526000928352604080842090915290825290205481565b600061016d82116110b5576110ae61109b83645faf0f3b2d63ffffffff613e2f16565b65e35fa931a0009063ffffffff613e8816565b90506110be565b50655af3107a40005b919050565b60006110d76110d0613eca565b8484613ece565b5060015b92915050565b60035490565b601b5481565b6020808052600092835260408084209091529082529020805460019091015482565b611117612759565b611156576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000611185848484613fba565b6111fb84611191613eca565b6111f685604051806060016040528060288152602001615691602891396001600160a01b038a166000908152600260205260408120906111cf613eca565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61411816565b613ece565b5060015b9392505050565b6014602052816000526040600020818154811061121f57fe5b6000918252602090912060049091020180546001820154600283015460039093015464ffffffffff9092169450925061ffff80821691620100008104821691600160201b9091041686565b6000818152601e6020526040902060020154156112e0576000818152601e6020526040808220805460029091015491516001600160a01b039091169282156108fc02929190818181858888f193505050501580156112cc573d6000803e3d6000fd5b506000818152601e60205260408120600201555b50565b601c5481565b60008281526017602090815260408083206001600160a01b03871684528252808320848452600101909152812080548291906001600160601b031661136e576040805162461bcd60e51b8152602060048201526016602482015275129050d2d413d50e8814185c985b481a5b9d985b1a5960521b604482015290519081900360640190fd5b546001600160601b03811696600160601b9091046001600160a01b031695509350505050565b600881565b6007546001600160a01b031681565b6001600160a01b031660009081526014602052604090205490565b6113cb61535f565b6113d361535f565b6113dd82826141af565b336000908152601460205260409020805461143b576040805162461bcd60e51b8152602060048201526019602482015278129050d2d413d50e88115b5c1d1e481cdd185ad9481b1a5cdd603a1b604482015290519081900360640190fd5b80548510611490576040805162461bcd60e51b815260206004820152601b60248201527f4a41434b504f543a207374616b65496e64657820696e76616c69640000000000604482015290519081900360640190fd5b6114986153ab565b6114bc8287815481106114a757fe5b90600052602060002090600402018683614209565b6114c5846142a4565b6114cf84846142b2565b60a0810151606082015160e08601516000921515918391829182918291829110611589578515611505578760800151965061153e565b61150f8b896143b5565b606088015160e08c01516115289163ffffffff613e8816565b9650876080015187111561153e57876080015196505b6115498b89896143e2565b60405194995092975090955093509150339084156108fc029085906000818181858888f19350505050158015611583573d6000803e3d6000fd5b506115b1565b604088015160208c01516115a29163ffffffff613e8816565b6020808d019190915288015194505b3364ffffffffff8d167ff3d5726a848893c8a5bc08c97918bac796866ae949000ce3d179312f988769ea886115e75760006115ea565b60015b8b606001518b8d602001518e604001518b8a8e604051808960ff1664ffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390a3801580159061165a575085155b1561167a5760608b0151611674908263ffffffff61450716565b60608c01525b84156116955761168a3386614561565b6116958b8987614653565b60208801518b516116ab9163ffffffff613e8816565b8b5260e08b01516116c49061ffff63ffffffff61470a16565b898e815481106116d057fe5b906000526020600020906004020160030160046101000a81548161ffff021916908361ffff1602179055506117036153e8565b898e8154811061170f57fe5b600091825260209091206004909102015464ffffffffff16815289548a908f90811061173757fe5b906000526020600020906004020160010154816020018181525050898e8154811061175e57fe5b906000526020600020906004020160020154816040018181525050898e8154811061178557fe5b600091825260209091206003600490920201015461ffff16606082015289548a908f9081106117b057fe5b600091825260209091206004909102016003015462010000900461ffff16608082015289548a908f9081106117e157fe5b6000918252602082206003600490920201015461ffff600160201b9091041660a083015260c0820187905260e0820185905260159061181e613eca565b6001600160a01b0316815260208082019290925260409081016000908120805460018082018355918352918490208551600690930201805464ffffffffff191664ffffffffff909316929092178255928401519281019290925582015160028201556060820151600382018054608085015160a086015161ffff1990921661ffff9485161763ffff0000191662010000918516919091021765ffff000000001916600160201b939091169290920291909117905560c0820151600482015560e08201516005909101556118f18a8f61474c565b6118fb8c8c6142b2565b5050505050505050505050505050565b6001600160a01b031660009081526015602052604090205490565b6000611945600c600001546119396110e1565b9063ffffffff61450716565b905090565b6021602052816000526040600020818154811061196357fe5b6000918252602090912060029091020180546001909101546001600160a01b039091169250905082565b601760209081526000928352604080842090915290825290205464ffffffffff80821691600160281b90041682565b6119c4612759565b611a03576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b6002600a54421015611a51576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b6000196008541415611a945760405162461bcd60e51b815260040180806020018281038252602581526020018061558e6025913960400191505060405180910390fd5b600854611aa7908263ffffffff61450716565b611aaf614877565b1015611af7576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b60245460ff1615611b4f576040805162461bcd60e51b815260206004820152601b60248201527f4a41434b504f543a20416c726561647920776974686472617765640000000000604482015290519081900360640190fd5b6007546008546001600160a01b03909116906108fc90611bae90601690600090611b8090600163ffffffff61450716565b815260208082019290925260409081016000908120546008548252601690935220549063ffffffff61450716565b6040518115909202916000818181858888f19350505050158015611bd6573d6000803e3d6000fd5b50506024805460ff19166001179055565b6001600a54421015611c35576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b6000196008541415611c785760405162461bcd60e51b815260040180806020018281038252602581526020018061558e6025913960400191505060405180910390fd5b600854611c8b908263ffffffff61450716565b611c93614877565b1015611cdb576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b611ce361535f565b611ceb61535f565b611cf582826141af565b60018260e0015110611d205760e0820151611d2090611d1b90600163ffffffff613e8816565b6134b6565b6001841015611d605760405162461bcd60e51b815260040180806020018281038252602981526020018061561d6029913960400191505060405180910390fd5b611d69826142a4565b611d74828686614894565b611d7e3386614a2a565b611d8882826142b2565b5050505050565b6006546001600160a01b031681565b6000611945614877565b60009081526021602052604090205490565b611dc261535f565b611dca61535f565b611dd482826141af565b60018260e0015110611dfa5760e0820151611dfa90611d1b90600163ffffffff613e8816565b6001600160a01b038516600090815260146020526040902054611e60576040805162461bcd60e51b8152602060048201526019602482015278129050d2d413d50e88115b5c1d1e481cdd185ad9481b1a5cdd603a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152601460205260409020548410611ecc576040805162461bcd60e51b815260206004820152601b60248201527f4a41434b504f543a207374616b65496e64657820696e76616c69640000000000604482015290519081900360640190fd5b6001600160a01b0385166000908152601460205260408120805486908110611ef057fe5b90600052602060002090600402019050611f086153ab565b611f13828683614209565b60808101516060820151611f2c9163ffffffff61450716565b8460e001511015611f84576040805162461bcd60e51b815260206004820152601f60248201527f4a41434b504f543a205374616b65206e6f742066756c6c792073657276656400604482015290519081900360640190fd5b60a081015115611fdb576040805162461bcd60e51b815260206004820152601f60248201527f4a41434b504f543a205374616b6520616c726561647920756e6c6f636b656400604482015290519081900360640190fd5b611fe4846142a4565b611fee84826143b5565b6000806000612002878586608001516143e2565b9450945050935050336001600160a01b03168a6001600160a01b03168964ffffffffff167f0bff00790f1231cf0c26911db2d0c4e670b204ebb02d6a73d3fb5c995910705e8760200151886040015188886040518085815260200184815260200183815260200182815260200194505050505060405180910390a4801561209e576060870151612098908263ffffffff61450716565b60608801525b6120a88585614b26565b6120b287876142b2565b50505050505050505050565b60008060008060006120ce61535f565b6120d661535f565b6120e082826141af565b6001600160a01b038a1660009081526014602052604090208054612147576040805162461bcd60e51b8152602060048201526019602482015278129050d2d413d50e88115b5c1d1e481cdd185ad9481b1a5cdd603a1b604482015290519081900360640190fd5b80548a1061219c576040805162461bcd60e51b815260206004820152601b60248201527f4a41434b504f543a207374616b65496e64657820696e76616c69640000000000604482015290519081900360640190fd5b6121a46153ab565b6121c8828c815481106121b357fe5b90600052602060002090600402018b83614209565b60a0810151606082015160e0860151600092151591116122495780156121f4578260800151915061222d565b6121fe86846143b5565b606083015160e08701516122179163ffffffff613e8816565b9150826080015182111561222d57826080015191505b6122388684846143e2565b939e50919c509a5098509650612251565b82602001519a505b505050505050939792965093509350565b6001600160a01b031660009081526001602052604090205490565b612285612759565b6122c4576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b612316612759565b612355576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60045481565b600080612388614877565b9050808411156123c95760405162461bcd60e51b81526004018080602001828103825260248152602001806156d96024913960400191505060405180910390fd5b8083111580156123d95750828411155b6124145760405162461bcd60e51b81526004018080602001828103825260228152602001806155fb6022913960400191505060405180910390fd5b60125464ffffffffff1661246f576040805162461bcd60e51b815260206004820152601d60248201527f4a41434b504f543a206c61746573745374616b654964206572726f722e000000604482015290519081900360640190fd5b828414156124815760009150506111ff565b600061249485600563ffffffff61450716565b90505b83811080156124ab575060105461ffff1681105b15612510576000818152601360205260409020600281015490546124f6916124e9916124dd908a63ffffffff613e2f16565b9063ffffffff614ba816565b849063ffffffff61450716565b925061250981600563ffffffff61450716565b9050612497565b60105460009060139082906125309061ffff16600163ffffffff613e8816565b815260200190815260200160002060020154905080600014156125505750855b60105460009060139082906125709061ffff16600163ffffffff613e8816565b81526020019081526020016000206000015490505b858310156125cb576125b16125a4836124dd848c63ffffffff613e2f16565b869063ffffffff61450716565b94506125c483600563ffffffff61450716565b9250612585565b505050509392505050565b60166020526000908152604090205481565b6015602052816000526040600020818154811061260157fe5b600091825260209091206006909102018054600182015460028301546003840154600485015460059095015464ffffffffff90941696509194509261ffff80831693620100008404821693600160201b9004909116919088565b6000546001600160a01b031690565b601f6020526000908152604090205481565b61268461535f565b61268c61535f565b61269682826141af565b60018260e00151116126e4576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b821561273c578160e0015183111561272d5760405162461bcd60e51b815260040180806020018281038252602a815260200180615564602a913960400191505060405180910390fd5b6127378284614bea565b61274a565b61274a828360e00151614bea565b61275482826142b2565b505050565b600080546001600160a01b031661276e613eca565b6001600160a01b031614905090565b6000806000196008541415612797575060009050806127a0565b50506008546001905b9091565b60136020526000908152604090208054600182015460029092015490919083565b604051806040016040528060048152602001630948aa8960e31b81525081565b601e602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b60006110d761281d613eca565b8484613fba565b600c54600d54600e54600f5460105460115460125464ffffffffff9485169461ffff909316921687565b60186020526000908152604090205481565b601d5481565b600b5481565b6000612876614877565b90508083106128cc576040805162461bcd60e51b815260206004820152601e60248201527f4a41434b504f543a20526f756e64206973206e6f7420636f6d706c6574650000604482015290519081900360640190fd5b600181106128e8576128e8611d1b82600163ffffffff613e8816565b600083815260176020908152604080832033845290915281208054909164ffffffffff90911690841561299357825461292f90600160281b900464ffffffffff1683613e88565b85111561297c576040805162461bcd60e51b8152602060048201526016602482015275129050d2d413d50e8818dbdd5b9d081a5b9d985b1a5960521b604482015290519081900360640190fd5b61298c828663ffffffff61450716565b90506129f1565b508154600160281b900464ffffffffff168082106129f1576040805162461bcd60e51b8152602060048201526016602482015275129050d2d413d50e8818dbdd5b9d081a5b9d985b1a5960521b604482015290519081900360640190fd5b60006129fc87611078565b6000888152601660205260408120549192505b60008581526001870160205260408120546001600160601b03811691600160601b9091046001600160a01b031690612a4b856124dd8886613e2f565b90506001600160a01b0382161580612a6b57506001600160a01b03821633145b8015612a8057506006546001600160a01b0316155b15612a9657612a918c898385614cbf565b612bde565b6001600160a01b0382161580612ab457506001600160a01b03821633145b15612b4c576000612acc82600a63ffffffff614ba816565b600654909150612aea908e908b9085906001600160a01b0316614cbf565b600654612b00906001600160a01b031682614561565b6006546001600160a01b0316600090815260186020526040902054612b2b908263ffffffff61450716565b6006546001600160a01b031660009081526018602052604090205550612bde565b612b6d612b6082600a63ffffffff614ba816565b829063ffffffff61450716565b90506000612b8282600a63ffffffff614ba816565b9050612b908d8a8486614cbf565b612b9a8382614561565b6001600160a01b038316600090815260186020526040902054612bc3908263ffffffff61450716565b6001600160a01b038416600090815260186020526040902055505b612bee848263ffffffff61450716565b9350505050838560010195508510612a0f57855464ffffffffff191664ffffffffff86161786558015612ca157612c2c612c26613eca565b82614561565b6000898152601960205260408120612c6f91839190612c49613eca565b6001600160a01b031681526020810191909152604001600020549063ffffffff61450716565b60008a815260196020526040812090612c86613eca565b6001600160a01b031681526020810191909152604001600020555b505050505050505050565b600a54421015612cf8576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b6000612d02614877565b905061016d8110612d445760405162461bcd60e51b815260040180806020018281038252602481526020018061549d6024913960400191505060405180910390fd5b6000196008541415612d565760088190555b60018110612d7257612d72611d1b82600163ffffffff613e8816565b3480612dc5576040805162461bcd60e51b815260206004820152601860248201527f4a41434b504f543a20416d6f756e742072657175697265640000000000000000604482015290519081900360640190fd5b6000612dcf613eca565b60008481526017602090815260408083206001600160a01b0380861685529083528184208054600164ffffffffff600160281b80840482168381019092160269ffffffffff000000000019909316929092178355845180860186526001600160601b03808c1682528d8616828901908152848a529285018852868920915182549351909616600160601b029581166bffffffffffffffffffffffff199093169290921790911693909317909255888552601690935292205492935091612e9b908563ffffffff61450716565b600086815260166020526040812091909155612eb686613ae2565b90506000600554600454612ed5600a5442613e8890919063ffffffff16565b81612edc57fe5b0611159050808015612ef15750600282066001145b8015612f1e57506000878152602080805260408083206001600160a01b0389168452909152902060010154155b15613019576000878152602080805260408083206001600160a01b0389168452825280832083815560019081018190558a8452601f90925290912054612f699163ffffffff61450716565b6000888152601f60209081526040808320939093556021815282822083518085019094526001600160a01b038981168552600185840181815283548083018555938652939094209451600290920290940180546001600160a01b0319169190941617835551910155612fda87614d10565b6040805142815260208101899052815188927fb6c1f2c809dae1f76ed948be6273bc6773a8fb237fada16871b9179036900a05928290030190a2613184565b808015613027575060028206155b15613184576000878152602080805260408083206001600160a01b038916845290915290208054670de0b6b3a7640000613067828a63ffffffff61450716565b8161306e57fe5b068255600061308f670de0b6b3a76400006124dd848c63ffffffff61450716565b905080156131805760018301546130ac908263ffffffff61450716565b600184015560008a8152601f60205260409020546130d0908263ffffffff61450716565b60008b8152601f60209081526040808320939093556021815282822083518085019094526001600160a01b038c81168552848301868152825460018082018555938652939094209451600290930290940180546001600160a01b0319169290941691909117835590519101556131458a614d10565b60408051428152602081018c905281518b927fb6c1f2c809dae1f76ed948be6273bc6773a8fb237fada16871b9179036900a05928290030190a25b5050505b85837f683f950243ca541a09abd8157385ce15a23ac43a47b8d0306de2bdc20d0b9e09428a604051808381526020018281526020019250505060405180910390a35050505050505050565b6000806131da614877565b90508084111561321b5760405162461bcd60e51b81526004018080602001828103825260248152602001806156d96024913960400191505060405180910390fd5b80831115801561322b5750828411155b6132665760405162461bcd60e51b81526004018080602001828103825260228152602001806155fb6022913960400191505060405180910390fd5b60125464ffffffffff166132c1576040805162461bcd60e51b815260206004820152601d60248201527f4a41434b504f543a206c61746573745374616b654964206572726f722e000000604482015290519081900360640190fd5b828414156132d35760009150506111ff565b6000845b84811080156132eb575060105461ffff1681105b156133a95760008181526013602052604081206002810154905461331a91906124dd908b63ffffffff613e2f16565b9050600483101561333d5761333683600163ffffffff61450716565b925061337e565b600082815260136020526040902060028181015491546133779261336b916124dd908d63ffffffff613e2f16565b9063ffffffff613e2f16565b9050600092505b61338e858263ffffffff61450716565b94506133a182600163ffffffff61450716565b9150506132d7565b60105460009060139082906133c99061ffff16600163ffffffff613e8816565b815260200190815260200160002060020154905080600014156133e95750865b60105460009060139082906134099061ffff16600163ffffffff613e8816565b81526020019081526020016000206000015490505b868310156134aa57600061343c836124dd848d63ffffffff613e2f16565b9050600485101561345f5761345885600163ffffffff61450716565b945061347f565b613478600261336b856124dd868f63ffffffff613e2f16565b9050600094505b61348f878263ffffffff61450716565b96506134a284600163ffffffff61450716565b93505061341e565b50505050509392505050565b6000600a54421015613504576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b60001960085414156135475760405162461bcd60e51b815260040180806020018281038252602581526020018061558e6025913960400191505060405180910390fd5b60085461355a908263ffffffff61450716565b613562614877565b10156135aa576040805162461bcd60e51b81526020600482015260126024820152714a41434b504f543a20546f6f206561726c7960701b604482015290519081900360640190fd5b60006135b4614877565b9050806135c157506138d2565b8083106135dc576135d981600163ffffffff613e8816565b92505b6135ed81600163ffffffff613e8816565b831480156136085750600554600454428161360457fe5b0611155b80156136145750600083115b156136315761362a83600163ffffffff613e8816565b9250613672565b61364281600163ffffffff613e8816565b8314801561365d5750600554600454428161365957fe5b0611155b8015613667575082155b1561367257506138d2565b82601a541161275457601a546000908152601f6020526040902054806136f057601a546000908152601660205260409020546136d0906136c1906103e8906124dd90601963ffffffff613e2f16565b6022549063ffffffff61450716565b602255601a546136e790600163ffffffff61450716565b601a5550613672565b60006136fb82614d49565b90506000805b8282101561378457601a54600090815260216020526040812080548390811061372657fe5b90600052602060002090600202016001015490508361374e828561450790919063ffffffff16565b106137595750613784565b613769838263ffffffff61450716565b925061377c82600163ffffffff61450716565b915050613701565b601a546000908152601660205260408120546137af906103e8906124dd90601963ffffffff613e2f16565b602254909150156137d6576022546137ce90829063ffffffff61450716565b600060225590505b604051806060016040528060216000601a548152602001908152602001600020848154811061380157fe5b60009182526020808320600292830201546001600160a01b0390811685528482018790526040948501879052601a80548552601e8352858520875181546001600160a01b0319169084161781558784015160018201559686015196909301959095559054601b8190558083529183902054835192835290820185905290921682820152517f6ecdfccd3210b67ae02fb6df321669a4d3b0b29d7581add7d3f547b608c776b8916060908290030190a1601a546138c490600163ffffffff61450716565b601a55506136729350505050565b5050565b60006110db6138f060045484613e2f90919063ffffffff16565b600a549063ffffffff61450716565b601a5481565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b613938612759565b613977576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b60085461398b90600263ffffffff61450716565b60095410156139ac576008546139a890600263ffffffff61450716565b6009555b476139f2576040805162461bcd60e51b81526020600482015260116024820152704a41434b504f543a204e6f2076616c756560781b604482015290519081900360640190fd5b6139fa614877565b60095410613a46576040805162461bcd60e51b81526020600482015260146024820152734a41434b504f543a20496e76616c69642064617960601b604482015290519081900360640190fd5b613a4e614877565b6009541015613ada576007546009546000908152601660205260409020546001600160a01b03909116906108fc90613a95906103e8906124dd90604b63ffffffff613e2f16565b6040518115909202916000818181858888f19350505050158015613abd573d6000803e3d6000fd5b50600954613ad290600163ffffffff61450716565b600955613a46565b565b60055481565b60006007613afb83600b5461450790919063ffffffff16565b81613b0257fe5b0692915050565b613b11615440565b6040805161014081018252600c548152600d546020820152600e5464ffffffffff90811692820192909252600f54606082015260105461ffff16608082015260115460a082015260125490911660c08201524260e08201526101008101613b766110e1565b815260200160166000613b87614877565b815260200190815260200160002054815250905090565b613ba6612759565b613be5576040805162461bcd60e51b815260206004820181905260248201526000805160206156b9833981519152604482015290519081900360640190fd5b6112e081614dd3565b600080613bf9614877565b905080841115613c3a5760405162461bcd60e51b81526004018080602001828103825260248152602001806156d96024913960400191505060405180910390fd5b808311158015613c4a5750828411155b613c855760405162461bcd60e51b81526004018080602001828103825260228152602001806155fb6022913960400191505060405180910390fd5b60125464ffffffffff16613ce0576040805162461bcd60e51b815260206004820152601d60248201527f4a41434b504f543a206c61746573745374616b654964206572726f722e000000604482015290519081900360640190fd5b82841415613cf25760009150506111ff565b835b8381108015613d08575060105461ffff1681105b15613d775760008181526013602052604081206002810154600190910154613d4a91612b60916124dd908b9061336b906064908490605a63ffffffff613e2f16565b9050613d5c848263ffffffff61450716565b9350613d6f82600163ffffffff61450716565b915050613cf4565b6010546000906013908290613d979061ffff16600163ffffffff613e8816565b81526020019081526020016000206002015490508060001415613db75750855b84821015613e25576000613df8612b60836124dd8b61336b60646124dd605a601660008d815260200190815260200160002054613e2f90919063ffffffff16565b9050613e0a858263ffffffff61450716565b9450613e1d83600163ffffffff61450716565b925050613db7565b5050509392505050565b600082613e3e575060006110db565b82820282848281613e4b57fe5b04146111ff5760405162461bcd60e51b81526004018080602001828103825260218152602001806156706021913960400191505060405180910390fd5b60006111ff83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614118565b3390565b6001600160a01b038316613f135760405162461bcd60e51b81526004018080602001828103825260248152602001806157436024913960400191505060405180910390fd5b6001600160a01b038216613f585760405162461bcd60e51b81526004018080602001828103825260228152602001806155426022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316613fff5760405162461bcd60e51b815260040180806020018281038252602581526020018061571e6025913960400191505060405180910390fd5b6001600160a01b0382166140445760405162461bcd60e51b815260040180806020018281038252602381526020018061547a6023913960400191505060405180910390fd5b614087816040518060600160405280602681526020016155b3602691396001600160a01b038616600090815260016020526040902054919063ffffffff61411816565b6001600160a01b0380851660009081526001602052604080822093909355908416815220546140bc908263ffffffff61450716565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156141a75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561416c578181015183820152602001614154565b50505050905090810190601f1680156141995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600c548252600d546020830152600e5464ffffffffff9081166040840152600f54606084015260105461ffff16608084015260115460a08401526012541660c08301526141fa614877565b60e08301526138d28282614e73565b825464ffffffffff8381169116146142525760405162461bcd60e51b81526004018080602001828103825260228152602001806155d96022913960400191505060405180910390fd5b825464ffffffffff168152600183015460208201526002830154604082015260039092015461ffff808216606085015262010000820481166080850152600160201b9091041660a09092019190915250565b6112e0818260e00151614bea565b805182511415806142cb57508060200151826020015114155b806142de57508060400151826040015114155b806142f157508060600151826060015114155b1561432c578151600c556020820151600d556040820151600e805464ffffffffff191664ffffffffff9092169190911790556060820151600f555b8060800151826080015114158061434b57508060a001518260a0015114155b8061436c57508060c0015164ffffffffff168260c0015164ffffffffff1614155b156138d2575060808101516010805461ffff191661ffff90921691909117905560a081015160115560c001516012805464ffffffffff191664ffffffffff909216919091179055565b604081015160a08301516143ce9163ffffffff613e8816565b60a08084019190915260e090920151910152565b600080600080600086608001518610156144565761440f8888606001518960800151898b60400151614ebb565b60208901519195509250614429908563ffffffff61450716565b6040880151606089015191965061444f9161444a818a63ffffffff61450716565b613bee565b92506144d0565b6040870151606088015161447a9190614475818a63ffffffff61450716565b6131cf565b6040880151606089015191955061449b9161444a818a63ffffffff61450716565b60208801519093506144b3908563ffffffff61450716565b94506144cd876060015188608001518960a0015188614fbb565b91505b81156144fc57848211156144e757506000936144fc565b50806144f9858263ffffffff613e8816565b94505b939792965093509350565b6000828201838110156111ff576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0382166145bc576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6003546145cf908263ffffffff61450716565b6003556001600160a01b0382166000908152600160205260409020546145fb908263ffffffff61450716565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b816020015181111561275457600061466f828460800151615018565b9050600061469584604001516124dd620186a061336b868861450790919063ffffffff16565b905064ffffffffff8111156146ac575064ffffffffff5b8460400151811115611d885760408086018290528451815142815260208101849052825164ffffffffff909216927faf62aa7dadbf7e5e54b91236b109372266fcf681cc74f199a41e14c242a3db3f92918290030190a25050505050565b60006111ff83836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506150c9565b815460009061476290600163ffffffff613e8816565b90508082146148265782818154811061477757fe5b906000526020600020906004020183838154811061479157fe5b600091825260209091208254600490920201805464ffffffffff191664ffffffffff90921691909117815560018083015490820155600280830154908201556003918201805492909101805461ffff191661ffff938416178082558254620100009081900485160263ffff000019909116178082559154600160201b9081900490931690920265ffff00000000199091161790555b8280548061483057fe5b600082815260208120600460001990930192830201805464ffffffffff19168155600181018290556002810191909155600301805465ffffffffffff191690559055505050565b60006119456004546124dd600a5442613e8890919063ffffffff16565b60b48111156148d45760405162461bcd60e51b815260040180806020018281038252602a815260200180615646602a913960400191505060405180910390fd5b60006148e08383615018565b9050600061490685604001516124dd620186a061336b868961450790919063ffffffff16565b9050806149445760405162461bcd60e51b81526004018080602001828103825260398152602001806154e36039913960400191505060405180910390fd5b60e085015160009061495d90600163ffffffff61450716565b60c087015190915061497d9064ffffffffff16600163ffffffff61450716565b64ffffffffff1660c087018190523360009081526014602052604090206149a890828886868a61512b565b60408051878152602081018590528082018790529051339164ffffffffff8416917fa75ea2f0baef0a6cfa36f61bc0cdc9b3a55ce8876892cf96f640208f65c799e99181900360600190a36020870151614a08908463ffffffff61450716565b60208801528651614a1f908763ffffffff61450716565b909652505050505050565b6001600160a01b038216614a6f5760405162461bcd60e51b81526004018080602001828103825260218152602001806156fd6021913960400191505060405180910390fd5b614ab2816040518060600160405280602281526020016154c1602291396001600160a01b038516600090815260016020526040902054919063ffffffff61411816565b6001600160a01b038316600090815260016020526040902055600354614ade908263ffffffff613e8816565b6003556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b8051825464ffffffffff191664ffffffffff9091161782556020810151600183015560408101516002830155606081015160039092018054608083015160a09093015161ffff1990911661ffff9485161763ffff0000191662010000938516939093029290921765ffff000000001916600160201b9390921692909202179055565b60006111ff83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506151f6565b80826080015110614bfa576138d2565b614c0261545f565b8251614c10906119396110e1565b81526080830151614c2284838361525b565b602084015115614c5257602084015160a0850151614c459163ffffffff61450716565b60a0850152600060208501525b60010182811015614c6d57614c6884838361525b565b614c52565b60808401516040805142815260208101929092528181018390525133917fe00f6f1c2b3ba17574be0a8136275368d74f37631cf36525a360b272fe21195b919081900360600190a26080840152505050565b806001600160a01b031682847ff8fa88708321411fd98e823a1eb882047c8dc276ba17a8b81722ed282c4560f74288604051808381526020018281526020019250505060405180910390a450505050565b601c546000908152601f6020526040902054614d3557601c819055601d8190556112e0565b80601d5410156112e057601d8054601c5555565b602354604080514260208083019190915233606090811b838501526054830194909452438040607484015260948301524190931b60b48201524460c8808301919091528251808303909101815260e890910190915280519101206000908190839081614db157fe5b069050614dca600160235461450790919063ffffffff16565b60235592915050565b6001600160a01b038116614e185760405162461bcd60e51b815260040180806020018281038252602681526020018061551c6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c09182015164ffffffffff16910152565b60008080614ecf878663ffffffff61450716565b90506000614ee960026124dd89600163ffffffff61450716565b9050605a811015614ef85750605a5b85614f26576000614f098a8761529c565b9050614f1b818363ffffffff613e2f16565b9350614fb192505050565b85811015614f7a576000614f40898363ffffffff61450716565b9050614f4d868a836131cf565b93506000614f5c8783866131cf565b9050614f6e858263ffffffff61450716565b9550614fb19350505050565b614f858589846131cf565b935085811415614f9757839250614fae565b614fab866124dd868463ffffffff613e2f16565b92505b50505b9550959350505050565b600080614fd3600e611939888863ffffffff61450716565b9050808411614fe6576000915050615010565b61500c6102bc6124dd614fff878563ffffffff613e8816565b869063ffffffff613e2f16565b9150505b949350505050565b60008060018311156150525760b4615031846001613e88565b111561503e5760b461504f565b61504f83600163ffffffff613e8816565b90505b600066027ca57357c0008511156150705766027ca57357c000615072565b845b905061509961508882605a63ffffffff613e2f16565b611939846618de76816d8000613e2f565b92506150c06150b0605a6618de76816d8000613e2f565b6124dd878663ffffffff613e2f16565b95945050505050565b600081836151185760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561416c578181015183820152602001614154565b5082848161512257fe5b06949350505050565b6040805160c08101825264ffffffffff9687168152602080820196875291810194855261ffff9384166060820190815292841660808201908152600060a083018181528a5460018181018d559b8352949091209251600490940290920180549390981664ffffffffff1990931692909217875594519686019690965591516002850155905160039093018054945192518216600160201b0265ffff0000000019938316620100000263ffff0000199590931661ffff1990961695909517939093161716919091179055565b600081836152455760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561416c578181015183820152602001614154565b50600083858161525157fe5b0495945050505050565b6152658383615308565b602091820151600091825260138084526040808420928355601685529092205491909252600182015560a090910151600290910155565b60006152a661535f565b6152b08482614e73565b6152b861545f565b84516152c6906119396110e1565b81526152d28282615308565b60a08201516152e7908563ffffffff61450716565b60a0830181905260208201516150c091906124dd908763ffffffff613e2f16565b8051615327906328d72767906124dd906205394963ffffffff613e2f16565b60208201526060820151156138d2576060820151602082015161534f9163ffffffff61450716565b6020820152600060608301525050565b604051806101000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600064ffffffffff168152602001600081525090565b6040518060c00160405280600064ffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101000160405280600064ffffffffff1681526020016000815260200160008152602001600061ffff168152602001600061ffff168152602001600061ffff16815260200160008152602001600081525090565b604051806101400160405280600a906020820280388339509192915050565b60405180604001604052806000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734a41434b504f543a2041756374696f6e206f6e6c7920666972737420333635206461797345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654a41434b504f543a206e65775374616b656453756e73206d757374206265206174206c65617374206d696e696d756d207368617265526174654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734a41434b504f543a206265666f72654461792063616e6e6f7420626520696e20746865206675747572654a41434b504f543a204d757374206265206174206c65617374206f6e652061756374696f6e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654a41434b504f543a207374616b654964506172616d206e6f7420696e207374616b654a41434b504f543a2057726f6e6720617267756d656e7420666f7220656e644461794a41434b504f543a206e65775374616b656444617973206c6f776572207468616e206d696e696d756d4a41434b504f543a206e65775374616b65644461797320686967686572207468616e206d6178696d756d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724a41434b504f543a2057726f6e6720617267756d656e7420666f7220626567696e44617945524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723158205f30f02b23cfa28f7081cbb2bcf6440179258fde30572adc72e4b65b68a0b54864736f6c63430005110032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000060933f90000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000e10

-----Decoded View---------------
Arg [0] : _LAUNCH_TIME (uint256): 1620262800
Arg [1] : _dayNumberBegin (uint256): 4
Arg [2] : _ROUND_TIME (uint256): 86400
Arg [3] : _LOTERY_ENTRY_TIME (uint256): 3600

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000060933f90
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [2] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000e10


Deployed Bytecode Sourcemap

82697:2300:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23297:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23297:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;23156:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23156:48:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23156:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27822:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27822:86:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27822:86:0;;;;;;-1:-1:-1;;;;;27822:86:0;;:::i;81936:417::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81936:417:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;81936:417:0;;:::i;14874:152::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14874:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14874:152:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13867:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13867:91:0;;;:::i;28644:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28644:47:0;;;:::i;28953:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28953:70:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28953:70:0;;;;;;-1:-1:-1;;;;;28953:70:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;84166:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84166:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;84166:110:0;-1:-1:-1;;;;;84166:110:0;;:::i;15497:437::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15497:437:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15497:437:0;;;;;;;;;;;;;;;;;:::i;27097:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27097:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27097:50:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51528:215;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51528:215:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51528:215:0;;:::i;28698:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28698:44:0;;;:::i;81507:421::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;81507:421:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;81507:421:0;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;81507:421:0;;;;;;;;;;;;;;;;23256:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23256:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22996:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22996:32:0;;;:::i;:::-;;;;-1:-1:-1;;;;;22996:32:0;;;;;;;;;;;;;;52697:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52697:127:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52697:127:0;-1:-1:-1;;;;;52697:127:0;;:::i;45299:3858::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45299:3858:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45299:3858:0;;;;;;;;;:::i;52378:169::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52378:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52378:169:0;-1:-1:-1;;;;;52378:169:0;;:::i;32197:127::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32197:127:0;;;:::i;29030:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29030:52:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29030:52:0;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;29030:52:0;;;;;;;;;;;;;;;;;;;;;27674:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27674:88:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27674:88:0;;;;;;-1:-1:-1;;;;;27674:88:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84662:332;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84662:332:0;;;:::i;41969:760::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41969:760:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41969:760:0;;;;;;;:::i;22930:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22930:34:0;;;:::i;32487:93::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32487:93:0;;;:::i;51402:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51402:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51402:118:0;;:::i;43097:1936::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43097:1936:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43097:1936:0;;-1:-1:-1;;;;;43097:1936:0;;;;;;;;;;;;;:::i;66223:2009::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66223:2009:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66223:2009:0;;-1:-1:-1;;;;;66223:2009:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14020:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14020:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14020:110:0;-1:-1:-1;;;;;14020:110:0;;:::i;11385:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11385:140:0;;;:::i;83993:165::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83993:165:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;83993:165:0;-1:-1:-1;;;;;83993:165:0;;:::i;22675:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22675:25:0;;;:::i;57600:1420::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57600:1420:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57600:1420:0;;;;;;;;;;;;:::i;27625:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27625:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27625:42:0;;:::i;27154:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27154:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27154:57:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10574:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10574:79:0;;;:::i;28858:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28858:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28858:49:0;;:::i;29335:688::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29335:688:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29335:688:0;;:::i;10940:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10940:94:0;;;:::i;84423:177::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84423:177:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;26282:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26282:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26282:51:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;23211:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23211:38:0;;;:::i;28803:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28803:48:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28803:48:0;;:::i;:::-;;;;-1:-1:-1;;;;;28803:48:0;;;;;;;;;;;;;;;;;;;;;;;;;14342:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14342:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14342:158:0;;;;;;;;:::i;26088:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26088:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27769:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27769:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27769:46:0;-1:-1:-1;;;;;27769:46:0;;:::i;28749:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28749:47:0;;;:::i;23347:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23347:29:0;;;:::i;76632:3100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76632:3100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76632:3100:0;;;;;;;:::i;72841:2968::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;72841:2968:0;-1:-1:-1;;;;;72841:2968:0;;:::i;55299:2293::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55299:2293:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55299:2293:0;;;;;;;;;;;;:::i;49213:2181::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49213:2181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49213:2181:0;;:::i;84284:131::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;84284:131:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;84284:131:0;;:::i;28600:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28600:37:0;;;:::i;14562:166::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14562:166:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14562:166:0;;;;;;;;;;:::i;80616:493::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;80616:493:0;;;:::i;22891:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22891:32:0;;;:::i;76268:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;76268:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76268:122:0;;:::i;31515:462::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31515:462:0;;;:::i;:::-;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31515:462:0;;;;;;;;;;;;;;;;11680:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11680:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11680:109:0;-1:-1:-1;;;;;11680:109:0;;:::i;59330:1617::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59330:1617:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59330:1617:0;;;;;;;;;;;;:::i;23297:26::-;;;;:::o;23156:48::-;;;;;;;;;;;;;;-1:-1:-1;;;23156:48:0;;;;:::o;27822:86::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;81936:417::-;82021:18;82155:3;82143:8;:15;82122:196;;82188:53;82214:26;:8;82227:12;82214:26;:12;:26;:::i;:::-;23482:33;;82188:53;:25;:53;:::i;:::-;82175:66;;82122:196;;;-1:-1:-1;23579:33:0;82122:196;81936:417;;;:::o;14874:152::-;14940:4;14957:39;14966:12;:10;:12::i;:::-;14980:7;14989:6;14957:8;:39::i;:::-;-1:-1:-1;15014:4:0;14874:152;;;;;:::o;13867:91::-;13938:12;;13867:91;:::o;28644:47::-;;;;:::o;28953:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;84166:110::-;10786:9;:7;:9::i;:::-;10778:54;;;;;-1:-1:-1;;;10778:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10778:54:0;;;;;;;;;;;;;;;84246:9;:22;;-1:-1:-1;;;;;;84246:22:0;-1:-1:-1;;;;;84246:22:0;;;;;;;;;;84166:110::o;15497:437::-;15620:4;15637:36;15647:6;15655:9;15666:6;15637:9;:36::i;:::-;15684:220;15707:6;15728:12;:10;:12::i;:::-;15755:138;15811:6;15755:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15755:19:0;;;;;;:11;:19;;;;;;15775:12;:10;:12::i;:::-;-1:-1:-1;;;;;15755:33:0;;;;;;;;;;;;-1:-1:-1;15755:33:0;;;:138;;:37;:138;:::i;:::-;15684:8;:220::i;:::-;-1:-1:-1;15922:4:0;15497:437;;;;;;:::o;27097:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27097:50:0;-1:-1:-1;27097:50:0;;;;;;;;;;;-1:-1:-1;;;27097:50:0;;;;;:::o;51528:215::-;51587:12;;;;:7;:12;;;;;:23;;;:28;51583:153;;51632:12;;;;:7;:12;;;;;;:16;;51658:23;;;;;51632:50;;-1:-1:-1;;;;;51632:16:0;;;;:50;;;;;51658:23;51632:50;;:12;:50;51658:23;51632:16;:50;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;51723:1:0;51697:12;;;:7;:12;;;;;:23;;:27;51583:153;51528:215;:::o;28698:44::-;;;;:::o;81507:421::-;81644:17;81743:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;81743:36:0;;;;;;;;;:56;;;:44;;:56;;;;;81818:15;;81644:17;;81743:56;-1:-1:-1;;;;;81818:15:0;81810:55;;;;;-1:-1:-1;;;81810:55:0;;;;;;;;;;;;-1:-1:-1;;;81810:55:0;;;;;;;;;;;;;;;81884:15;-1:-1:-1;;;;;81884:15:0;;;-1:-1:-1;;;81901:18:0;;;-1:-1:-1;;;;;81901:18:0;;-1:-1:-1;81507:421:0;-1:-1:-1;;;;81507:421:0:o;23256:34::-;23289:1;23256:34;:::o;22996:32::-;;;-1:-1:-1;;;;;22996:32:0;;:::o;52697:127::-;-1:-1:-1;;;;;52787:22:0;52760:7;52787:22;;;:10;:22;;;;;:29;;52697:127::o;45299:3858::-;45378:21;;:::i;:::-;45410:29;;:::i;:::-;45450:26;45463:1;45466:9;45450:12;:26::i;:::-;45534:10;45487:33;45523:22;;;:10;:22;;;;;45635:19;;45627:62;;;;;-1:-1:-1;;;45627:62:0;;;;;;;;;;;;-1:-1:-1;;;45627:62:0;;;;;;;;;;;;;;;45735:19;;45722:32;;45700:109;;;;;-1:-1:-1;;;45700:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45850:20;;:::i;:::-;45881:54;45892:12;45905:10;45892:24;;;;;;;;;;;;;;;;;;45918:12;45932:2;45881:10;:54::i;:::-;45999:23;46020:1;45999:20;:23::i;:::-;46033:26;46046:1;46049:9;46033:12;:26::i;:::-;46124:15;;;;46334:13;;;;46317;;;;46070:18;;46124:20;;;46070:18;;;;;;;;;;46317:30;46313:1090;;46368:12;46364:533;;;46513:2;:14;;;46500:27;;46364:533;;;46677:19;46690:1;46693:2;46677:12;:19::i;:::-;46746:13;;;;46728;;;;:32;;;:17;:32;:::i;:::-;46715:45;;46796:2;:14;;;46783:10;:27;46779:103;;;46848:2;:14;;;46835:27;;46779:103;47070:36;47088:1;47091:2;47095:10;47070:17;:36::i;:::-;47121:30;;46911:195;;-1:-1:-1;46911:195:0;;-1:-1:-1;46911:195:0;;-1:-1:-1;46911:195:0;-1:-1:-1;46911:195:0;-1:-1:-1;47121:10:0;;:30;;;;;46911:195;;47121:30;;;;46911:195;47121:10;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47121:30:0;46313:1090;;;47332:15;;;;47304:23;;;;:44;;;:27;:44;:::i;:::-;47278:23;;;;:70;;;;47377:14;;;;-1:-1:-1;46313:1090:0;47503:10;47418:287;;;;47468:12;:20;;47487:1;47468:20;;;47483:1;47468:20;47528:2;:13;;;47556:10;47581:2;:14;;;47610:2;:15;;;47640:6;47661:7;47683:11;47418:287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47720:18;;;;;:35;;;47743:12;47742:13;47720:35;47716:229;;;47894:20;;;;:39;;47919:13;47894:39;:24;:39;:::i;:::-;47871:20;;;:62;47716:229;48018:16;;48014:184;;48051:30;48057:10;48069:11;48051:5;:30::i;:::-;48150:36;48167:1;48170:2;48174:11;48150:16;:36::i;:::-;48252:14;;;;48229:18;;:38;;;:22;:38;:::i;:::-;48208:59;;48338:13;;;;:38;;48356:19;48338:38;:17;:38;:::i;:::-;48278:12;48291:10;48278:24;;;;;;;;;;;;;;;;;;:36;;;:109;;;;;;;;;;;;;;;;;;48398:29;;:::i;:::-;48458:12;48471:10;48458:24;;;;;;;;;;;;;;;;;;;;;:32;;;48438:52;;48524:24;;:12;;48537:10;;48524:24;;;;;;;;;;;;;;;;:35;;;48501:9;:20;;:58;;;;;48594:12;48607:10;48594:24;;;;;;;;;;;;;;;;;;:36;;;48570:9;:21;;:60;;;;;48663:12;48676:10;48663:24;;;;;;;;;;;;;;;;:34;:24;;;;;:34;;;;48641:19;;;:56;48731:24;;:12;;48744:10;;48731:24;;;;;;;;;;;;;;;;;;;:35;;;;;;;;48708:20;;;:58;48801:24;;;;48814:10;;48801:24;;;;;;;;;;;;;:36;:24;;;;;:36;;;-1:-1:-1;;;48801:36:0;;;;48777:21;;;:60;48848:23;;;:37;;;48896:26;;;:38;;;49018:15;;49034:12;:10;:12::i;:::-;-1:-1:-1;;;;;49018:29:0;;;;;;;;;;;;;;;-1:-1:-1;49018:29:0;;;27:10:-1;;39:1;23:18;;;45:23;;49018:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;49018:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49018:45:0;;;;;;;;-1:-1:-1;;49018:45:0;;;;;;;;;;-1:-1:-1;;49018:45:0;-1:-1:-1;;;49018:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49074:38;49087:12;49101:10;49074:12;:38::i;:::-;49123:26;49136:1;49139:9;49123:12;:26::i;:::-;45299:3858;;;;;;;;;;;;;;:::o;52378:169::-;-1:-1:-1;;;;;52505:27:0;52473:7;52505:27;;;:15;:27;;;;;:34;;52378:169::o;32197:127::-;32247:7;32274:42;32292:7;:23;;;32274:13;:11;:13::i;:::-;:17;:42;:17;:42;:::i;:::-;32267:49;;32197:127;:::o;29030:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29030:52:0;;;;-1:-1:-1;29030:52:0;-1:-1:-1;29030:52:0;:::o;27674:88::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27674:88:0;;;;:::o;84662:332::-;10786:9;:7;:9::i;:::-;10778:54;;;;;-1:-1:-1;;;10778:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10778:54:0;;;;;;;;;;;;;;;84730:1;41493:11;;41486:3;:18;;41478:49;;;;;-1:-1:-1;;;41478:49:0;;;;;;;;;;;;-1:-1:-1;;;41478:49:0;;;;;;;;;;;;;;;-1:-1:-1;;41560:12:0;;:27;;41538:114;;;;-1:-1:-1;;;41538:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41702:12;;:27;;41719:9;41702:27;:16;:27;:::i;:::-;41685:13;:11;:13::i;:::-;:44;;41663:112;;;;;-1:-1:-1;;;41663:112:0;;;;;;;;;;;;-1:-1:-1;;;41663:112:0;;;;;;;;;;;;;;;84766:24;;;;:33;84744:110;;;;;-1:-1:-1;;;84744:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84867:9;;84920:12;;-1:-1:-1;;;;;84867:9:0;;;;:75;;84886:55;;84912:7;;84867:9;;84920:19;;84867:9;84920:19;:16;:19;:::i;:::-;84912:28;;;;;;;;;;;;;;-1:-1:-1;84912:28:0;;;;84894:12;;84886:21;;:7;:21;;;;;;:55;:25;:55;:::i;:::-;84867:75;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;84955:24:0;:31;;-1:-1:-1;;84955:31:0;84982:4;84955:31;;;84662:332::o;41969:760::-;42077:1;41493:11;;41486:3;:18;;41478:49;;;;;-1:-1:-1;;;41478:49:0;;;;;;;;;;;;-1:-1:-1;;;41478:49:0;;;;;;;;;;;;;;;-1:-1:-1;;41560:12:0;;:27;;41538:114;;;;-1:-1:-1;;;41538:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41702:12;;:27;;41719:9;41702:27;:16;:27;:::i;:::-;41685:13;:11;:13::i;:::-;:44;;41663:112;;;;;-1:-1:-1;;;41663:112:0;;;;;;;;;;;;-1:-1:-1;;;41663:112:0;;;;;;;;;;;;;;;42096:21;;:::i;:::-;42128:29;;:::i;:::-;42168:26;42181:1;42184:9;42168:12;:26::i;:::-;42226:1;42209;:13;;;:18;42205:58;;42242:13;;;;42229:34;;42242:20;;42260:1;42242:20;:17;:20;:::i;:::-;42229:12;:34::i;:::-;23848:1;42342:13;:31;;42320:122;;;;-1:-1:-1;;;42320:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42506:23;42527:1;42506:20;:23::i;:::-;42540:44;42552:1;42555:13;42570;42540:11;:44::i;:::-;42652:32;42658:10;42670:13;42652:5;:32::i;:::-;42695:26;42708:1;42711:9;42695:12;:26::i;:::-;41786:1;;41969:760;;;:::o;22930:34::-;;;-1:-1:-1;;;;;22930:34:0;;:::o;32487:93::-;32532:7;32559:13;:11;:13::i;51402:118::-;51462:7;51489:16;;;:11;:16;;;;;:23;;51402:118::o;43097:1936::-;43241:21;;:::i;:::-;43273:29;;:::i;:::-;43313:26;43326:1;43329:9;43313:12;:26::i;:::-;43371:1;43354;:13;;;:18;43350:58;;43387:13;;;;43374:34;;43387:20;;43405:1;43387:20;:17;:20;:::i;43374:34::-;-1:-1:-1;;;;;43512:22:0;;;;;;:10;:22;;;;;:29;43490:109;;;;;-1:-1:-1;;;43490:109:0;;;;;;;;;;;;-1:-1:-1;;;43490:109:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;43645:22:0;;;;;;:10;:22;;;;;:29;43632:42;;43610:119;;;;;-1:-1:-1;;;43610:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43767:22:0;;43740:24;43767:22;;;:10;:22;;;;;:34;;43790:10;;43767:34;;;;;;;;;;;;;;;;43740:61;;43842:20;;:::i;:::-;43873:35;43884:5;43891:12;43905:2;43873:10;:35::i;:::-;44024:14;;;;44006:13;;;;:33;;;:17;:33;:::i;:::-;43989:1;:13;;;:50;;43967:131;;;;;-1:-1:-1;;;43967:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44159:15;;;;:20;44151:64;;;;;-1:-1:-1;;;44151:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44279:23;44300:1;44279:20;:23::i;:::-;44355:19;44368:1;44371:2;44355:12;:19::i;:::-;44450:14;44468:15;44485:21;44523:40;44541:1;44544:2;44548;:14;;;44523:17;:40::i;:::-;44447:116;;;;;;;;44665:10;-1:-1:-1;;;;;44579:209:0;44640:10;-1:-1:-1;;;;;44579:209:0;44613:12;44579:209;;;44690:2;:14;;;44719:2;:15;;;44749:6;44770:7;44579:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44803:18;;44799:113;;44861:20;;;;:39;;44886:13;44861:39;:24;:39;:::i;:::-;44838:20;;;:62;44799:113;44965:23;44978:5;44985:2;44965:12;:23::i;:::-;44999:26;45012:1;45015:9;44999:12;:26::i;:::-;43097:1936;;;;;;;;;;:::o;66223:2009::-;66402:19;66436:14;66465:17;66497:15;66527:21;66576;;:::i;:::-;66608:29;;:::i;:::-;66648:26;66661:1;66664:9;66648:12;:26::i;:::-;-1:-1:-1;;;;;66721:16:0;;66685:33;66721:16;;;:10;:16;;;;;66827:19;;66819:62;;;;;-1:-1:-1;;;66819:62:0;;;;;;;;;;;;-1:-1:-1;;;66819:62:0;;;;;;;;;;;;;;;66927:19;;66914:32;;66892:109;;;;;-1:-1:-1;;;66892:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67042:20;;:::i;:::-;67073:54;67084:12;67097:10;67084:24;;;;;;;;;;;;;;;;;;67110:12;67124:2;67073:10;:54::i;:::-;67192:15;;;;67321:13;;;;67304;;;;67138:18;;67192:20;;;-1:-1:-1;67300:851:0;;67355:12;67351:424;;;67500:2;:14;;;67487:27;;67351:424;;;67555:19;67568:1;67571:2;67555:12;:19::i;:::-;67624:13;;;;67606;;;;:32;;;:17;:32;:::i;:::-;67593:45;;67674:2;:14;;;67661:10;:27;67657:103;;;67726:2;:14;;;67713:27;;67657:103;67948:36;67966:1;67969:2;67973:10;67948:17;:36::i;:::-;67789:195;;-1:-1:-1;67789:195:0;;-1:-1:-1;67789:195:0;-1:-1:-1;67789:195:0;-1:-1:-1;67789:195:0;-1:-1:-1;67300:851:0;;;68125:2;:14;;;68111:28;;67300:851;-1:-1:-1;;;;;;66223:2009:0;;;;;;;;;:::o;14020:110::-;-1:-1:-1;;;;;14104:18:0;14077:7;14104:18;;;:9;:18;;;;;;;14020:110::o;11385:140::-;10786:9;:7;:9::i;:::-;10778:54;;;;;-1:-1:-1;;;10778:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10778:54:0;;;;;;;;;;;;;;;11484:1;11468:6;;11447:40;;-1:-1:-1;;;;;11468:6:0;;;;11447:40;;11484:1;;11447:40;11515:1;11498:19;;-1:-1:-1;;;;;;11498:19:0;;;11385:140::o;83993:165::-;10786:9;:7;:9::i;:::-;10778:54;;;;;-1:-1:-1;;;10778:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10778:54:0;;;;;;;;;;;;;;;84108:19;:42;;-1:-1:-1;;;;;;84108:42:0;-1:-1:-1;;;;;84108:42:0;;;;;;;;;;83993:165::o;22675:25::-;;;;:::o;57600:1420::-;57753:14;57780:15;57798:13;:11;:13::i;:::-;57780:31;;57842:7;57830:8;:19;;57822:68;;;;-1:-1:-1;;;57822:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57933:7;57923:6;:17;;:39;;;;;57956:6;57944:8;:18;;57923:39;57901:123;;;;-1:-1:-1;;;57901:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58043:21;;;;58035:68;;;;;-1:-1:-1;;;58035:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58130:6;58118:8;:18;58114:32;;;58145:1;58138:8;;;;;58114:32;58157:11;58171:15;:8;58184:1;58171:15;:12;:15;:::i;:::-;58157:29;;58197:223;58210:6;58204:3;:12;:44;;;;-1:-1:-1;58226:22:0;;;;58220:28;;58204:44;58197:223;;;58341:14;;;;:9;:14;;;;;:34;;;;58285:29;;58274:103;;58285:91;;:51;;58319:16;58285:51;:33;:51;:::i;:::-;:55;:91;:55;:91;:::i;:::-;58274:6;;:103;:10;:103;:::i;:::-;58265:112;-1:-1:-1;58398:10:0;:3;58406:1;58398:10;:7;:10;:::i;:::-;58392:16;;58197:223;;;58491:22;;58430:27;;58473:9;;58430:27;;58483:38;;58491:22;;58519:1;58483:38;:35;:38;:::i;:::-;58473:49;;;;;;;;;;;:69;;;58430:112;;58557:19;58580:1;58557:24;58553:68;;;-1:-1:-1;58605:16:0;58553:68;58771:22;;58715;;58753:9;;58715:22;;58763:38;;58771:22;;58799:1;58763:38;:35;:38;:::i;:::-;58753:49;;;;;;;;;;;:64;;;58715:102;;58828:161;58841:6;58835:3;:12;58828:161;;;58873:73;58884:61;58925:19;58884:36;:14;58903:16;58884:36;:18;:36;:::i;:61::-;58873:6;;:73;:10;:73;:::i;:::-;58864:82;-1:-1:-1;58967:10:0;:3;58975:1;58967:10;:7;:10;:::i;:::-;58961:16;;58828:161;;;-1:-1:-1;;;;57600:1420:0;;;;;:::o;27625:42::-;;;;;;;;;;;;;:::o;27154:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27154:57:0;;-1:-1:-1;27154:57:0;;;;;;;;;;;;-1:-1:-1;;;27154:57:0;;;;;;;;:::o;10574:79::-;10612:7;10639:6;-1:-1:-1;;;;;10639:6:0;10574:79;:::o;28858:49::-;;;;;;;;;;;;;:::o;29335:688::-;29399:21;;:::i;:::-;29431:29;;:::i;:::-;29471:26;29484:1;29487:9;29471:12;:26::i;:::-;29569:1;29553;:13;;;:17;29545:48;;;;;-1:-1:-1;;;29545:48:0;;;;;;;;;;;;-1:-1:-1;;;29545:48:0;;;;;;;;;;;;;;;29636:14;;29632:347;;29706:1;:13;;;29693:9;:26;;29667:130;;;;-1:-1:-1;;;29667:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29812:30;29829:1;29832:9;29812:16;:30::i;:::-;29632:347;;;29933:34;29950:1;29953;:13;;;29933:16;:34::i;:::-;29989:26;30002:1;30005:9;29989:12;:26::i;:::-;29335:688;;;:::o;10940:94::-;10980:4;11020:6;;-1:-1:-1;;;;;11020:6:0;11004:12;:10;:12::i;:::-;-1:-1:-1;;;;;11004:22:0;;10997:29;;10940:94;:::o;84423:177::-;84473:4;84479:7;-1:-1:-1;;84503:12:0;;:27;84499:93;;;-1:-1:-1;84540:5:0;;-1:-1:-1;84540:5:0;84532:17;;84499:93;-1:-1:-1;;84579:12:0;;84573:4;;84499:93;84423:177;;:::o;26282:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23211:38::-;;;;;;;;;;;;;;-1:-1:-1;;;23211:38:0;;;;:::o;28803:48::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28803:48:0;;;;;;:::o;14342:158::-;14411:4;14428:42;14438:12;:10;:12::i;:::-;14452:9;14463:6;14428:9;:42::i;26088:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27769:46::-;;;;;;;;;;;;;:::o;28749:47::-;;;;:::o;23347:29::-;;;;:::o;76632:3100::-;76706:15;76724:13;:11;:13::i;:::-;76706:31;;76767:7;76756:8;:18;76748:61;;;;;-1:-1:-1;;;76748:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;76835:1;76824:7;:12;76820:46;;76838:28;76851:14;:7;76863:1;76851:14;:11;:14;:::i;76838:28::-;76877:30;76910:24;;;:14;:24;;;;;;;;76935:10;76910:36;;;;;;;76977:14;;76910:36;;76977:14;;;;;77033:10;;77029:348;;77103:14;;77095:38;;-1:-1:-1;;;77103:14:0;;;;77123:9;77095:27;:38::i;:::-;77086:5;:47;;77060:131;;;;;-1:-1:-1;;;77060:131:0;;;;;;;;;;;;-1:-1:-1;;;77060:131:0;;;;;;;;;;;;;;;77217:20;:9;77231:5;77217:20;:13;:20;:::i;:::-;77206:31;;77029:348;;;-1:-1:-1;77281:14:0;;-1:-1:-1;;;77281:14:0;;;;77318:20;;;77310:55;;;;;-1:-1:-1;;;77310:55:0;;;;;;;;;;;;-1:-1:-1;;;77310:55:0;;;;;;;;;;;;;;;77387:17;77407:19;77417:8;77407:9;:19::i;:::-;77437:16;77456:17;;;:7;:17;;;;;;77387:39;;-1:-1:-1;77520:1936:0;77538:17;77558:23;;;:12;;;:23;;;;;:33;-1:-1:-1;;;;;77558:33:0;;;-1:-1:-1;;;77629:36:0;;;-1:-1:-1;;;;;77629:36:0;;77746:38;77775:8;77746:24;:9;77558:33;77746:13;:24::i;:38::-;77727:57;-1:-1:-1;;;;;;77822:26:0;;;;:56;;-1:-1:-1;;;;;;77852:26:0;;77868:10;77852:26;77822:56;77821:112;;;;-1:-1:-1;77900:19:0;;-1:-1:-1;;;;;77900:19:0;:33;77821:112;77799:1556;;;78020:61;78037:8;78047:9;78058:8;78068:12;78020:16;:61::i;:::-;77799:1556;;;-1:-1:-1;;;;;78126:26:0;;;;:56;;-1:-1:-1;;;;;;78156:26:0;;78172:10;78156:26;78126:56;78122:1218;;;78207:25;78235:16;:8;78248:2;78235:16;:12;:16;:::i;:::-;78423:19;;78207:44;;-1:-1:-1;78274:191:0;;78317:8;;78352:9;;78388:8;;-1:-1:-1;;;;;78423:19:0;78274:16;:191::i;:::-;78494:19;;78488:45;;-1:-1:-1;;;;;78494:19:0;78515:17;78488:5;:45::i;:::-;78603:19;;-1:-1:-1;;;;;78603:19:0;78591:32;;;;:11;:32;;;;;;:55;;78628:17;78591:55;:36;:55;:::i;:::-;78568:19;;-1:-1:-1;;;;;78568:19:0;78556:32;;;;:11;:32;;;;;:90;-1:-1:-1;78122:1218:0;;;78777:30;78790:16;:8;78803:2;78790:16;:12;:16;:::i;:::-;78777:8;;:30;:12;:30;:::i;:::-;78766:41;-1:-1:-1;78909:25:0;78937:16;78766:41;78950:2;78937:16;:12;:16;:::i;:::-;78909:44;;78976:184;79019:8;79054:9;79090:8;79125:12;78976:16;:184::i;:::-;79183:38;79189:12;79203:17;79183:5;:38::i;:::-;-1:-1:-1;;;;;79272:25:0;;;;;;:11;:25;;;;;;:48;;79302:17;79272:48;:29;:48;:::i;:::-;-1:-1:-1;;;;;79244:25:0;;;;;;:11;:25;;;;;:76;-1:-1:-1;78122:1218:0;79385:27;:13;79403:8;79385:27;:17;:27;:::i;:::-;79369:43;;77520:1936;;;79446:8;79432:11;;;;;;:22;77520:1936;;79466:34;;-1:-1:-1;;79466:34:0;;;;;;;79515:18;;79511:214;;79550:34;79556:12;:10;:12::i;:::-;79570:13;79550:5;:34::i;:::-;79648:32;;;;:22;:32;;;;;:65;;79699:13;;79648:32;79681:12;:10;:12::i;:::-;-1:-1:-1;;;;;79648:46:0;;;;;;;;;;;;-1:-1:-1;79648:46:0;;;:65;:50;:65;:::i;:::-;79599:32;;;;:22;:32;;;;;;79632:12;:10;:12::i;:::-;-1:-1:-1;;;;;79599:46:0;;;;;;;;;;;;-1:-1:-1;79599:46:0;:114;79511:214;76632:3100;;;;;;;;;:::o;72841:2968::-;72928:11;;72921:3;:18;;72913:49;;;;;-1:-1:-1;;;72913:49:0;;;;;;;;;;;;-1:-1:-1;;;72913:49:0;;;;;;;;;;;;;;;72973:16;72992:13;:11;:13::i;:::-;72973:32;;73035:3;73024:8;:14;73016:63;;;;-1:-1:-1;;;73016:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73094:12:0;;:27;73090:56;;;73123:12;:23;;;73090:56;73173:1;73161:8;:13;73157:48;;73176:29;73189:15;:8;73202:1;73189:15;:12;:15;:::i;73176:29::-;73236:9;73264:14;73256:51;;;;;-1:-1:-1;;;73256:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;73318:14;73335:12;:10;:12::i;:::-;73358:30;73391:24;;;:14;:24;;;;;;;;-1:-1:-1;;;;;73391:32:0;;;;;;;;;;;73455:16;;;;-1:-1:-1;;;73455:16:0;;;;;;;;;;;;-1:-1:-1;;73455:16:0;;;;;;;;;73509:87;;;;;;;-1:-1:-1;;;;;73509:87:0;;;;;;;;;;;;;;73482:24;;;:12;;;:24;;;;;:114;;;;;;;;;-1:-1:-1;;;73482:114:0;;;;-1:-1:-1;;73482:114:0;;;;;;;;;;;;;;;;;73627:17;;;:7;:17;;;;;;73318:29;;-1:-1:-1;73391:32:0;73627;;73548:9;73627:32;:21;:32;:::i;:::-;73607:17;;;;:7;:17;;;;;:52;;;;73693:26;73615:8;73693:16;:26::i;:::-;73670:49;;73767:12;73831:17;;73817:10;;73782:32;73802:11;;73782:15;:19;;:32;;;;:::i;:::-;:45;;;;;;:66;;73767:81;;74388:7;:45;;;;-1:-1:-1;74427:1:0;74412:12;:16;74432:1;74412:21;74388:45;:108;;;;-1:-1:-1;74450:21:0;;;;:11;:21;;;;;;;-1:-1:-1;;;;;74450:29:0;;;;;;;;;:41;;;:46;74388:108;74370:1354;;;74562:1;74523:21;;;:11;:21;;;;;;;-1:-1:-1;;;;;74523:29:0;;;;;;;;;:40;;;74622:1;74578:41;;;:45;;;74665:24;;;:14;:24;;;;;;;:31;;;:28;:31;:::i;:::-;74638:24;;;;:14;:24;;;;;;;;:58;;;;74711:11;:21;;;;;74738:22;;;;;;;;-1:-1:-1;;;;;74738:22:0;;;;;74758:1;74738:22;;;;;;27:10:-1;;23:18;;;45:23;;74711:50:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;74711:50:0;;;;;;;;;;;;74778:42;74638:24;74778:32;:42::i;:::-;74895:54;;;74912:15;74895:54;;;;;;;;;;74939:9;;74895:54;;;;;;;;74370:1354;;;74971:7;:32;;;;-1:-1:-1;74997:1:0;74982:12;:16;:21;74971:32;74967:757;;;75020:22;75045:21;;;:11;:21;;;;;;;-1:-1:-1;;;;;75045:29:0;;;;;;;;;75109:9;;75172:7;75145:24;75109:9;75159;75145:24;:13;:24;:::i;:::-;:34;;;;;;75133:46;;:9;75211:37;75240:7;75211:24;:9;75225;75211:24;:13;:24;:::i;:37::-;75194:54;-1:-1:-1;75267:10:0;;75263:450;;75315:14;;;;:26;;75334:6;75315:26;:18;:26;:::i;:::-;75298:14;;;:43;75387:24;;;;:14;:24;;;;;;:36;;75416:6;75387:36;:28;:36;:::i;:::-;75360:24;;;;:14;:24;;;;;;;;:63;;;;75442:11;:21;;;;;75469:27;;;;;;;;-1:-1:-1;;;;;75469:27:0;;;;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;75442:55:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;75442:55:0;;;;;;;;;;;;;;;;75518:42;75360:24;75518:32;:42::i;:::-;75643:54;;;75660:15;75643:54;;;;;;;;;;75687:9;;75643:54;;;;;;;;75263:450;74967:757;;;;75791:9;75779:10;75739:62;75752:15;75769:8;75739:62;;;;;;;;;;;;;;;;;;;;;;;;72841:2968;;;;;;;;:::o;55299:2293::-;55441:14;55468:15;55486:13;:11;:13::i;:::-;55468:31;;55530:7;55518:8;:19;;55510:68;;;;-1:-1:-1;;;55510:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55621:7;55611:6;:17;;:39;;;;;55644:6;55632:8;:18;;55611:39;55589:123;;;;-1:-1:-1;;;55589:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55731:21;;;;55723:68;;;;;-1:-1:-1;;;55723:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55818:6;55806:8;:18;55802:32;;;55833:1;55826:8;;;;;55802:32;55845:15;55885:8;55904:672;55917:6;55911:3;:12;:44;;;;-1:-1:-1;55933:22:0;;;;55927:28;;55911:44;55904:672;;;55972:17;56089:14;;;:9;:14;;;;;:34;;;;56033:29;;:91;;56089:34;56033:51;;56067:16;56033:51;:33;:51;:::i;:91::-;56004:120;;56153:1;56143:7;:11;56139:350;;;56185:14;:7;56197:1;56185:14;:11;:14;:::i;:::-;56175:24;;56139:350;;;56387:14;;;;:9;:14;;;;;25418:1;56387:34;;;;56331:29;;:112;;:91;;:51;;56365:16;56331:51;:33;:51;:::i;:91::-;:95;:112;:95;:112;:::i;:::-;56298:145;;56472:1;56462:11;;56139:350;56512:21;:6;56523:9;56512:21;:10;:21;:::i;:::-;56503:30;-1:-1:-1;56554:10:0;:3;56562:1;56554:10;:7;:10;:::i;:::-;56548:16;;55904:672;;;;56647:22;;56586:27;;56629:9;;56586:27;;56639:38;;56647:22;;56675:1;56639:38;:35;:38;:::i;:::-;56629:49;;;;;;;;;;;:69;;;56586:112;;56713:19;56736:1;56713:24;56709:68;;;-1:-1:-1;56761:16:0;56709:68;56927:22;;56871;;56909:9;;56871:22;;56919:38;;56927:22;;56955:1;56919:38;:35;:38;:::i;:::-;56909:49;;;;;;;;;;;:64;;;56871:102;;56984:577;56997:6;56991:3;:12;56984:577;;;57020:17;57081:61;57122:19;57081:36;:14;57100:16;57081:36;:18;:36;:::i;:61::-;57052:90;;57171:1;57161:7;:11;57157:317;;;57203:14;:7;57215:1;57203:14;:11;:14;:::i;:::-;57193:24;;57157:317;;;57346:82;25418:1;57346:61;57387:19;57346:36;:14;57365:16;57346:36;:18;:36;:::i;:82::-;57313:115;;57457:1;57447:11;;57157:317;57497:21;:6;57508:9;57497:21;:10;:21;:::i;:::-;57488:30;-1:-1:-1;57539:10:0;:3;57547:1;57539:10;:7;:10;:::i;:::-;57533:16;;56984:577;;;;-1:-1:-1;;;;;55299:2293:0;;;;;:::o;49213:2181::-;49273:1;41493:11;;41486:3;:18;;41478:49;;;;;-1:-1:-1;;;41478:49:0;;;;;;;;;;;;-1:-1:-1;;;41478:49:0;;;;;;;;;;;;;;;-1:-1:-1;;41560:12:0;;:27;;41538:114;;;;-1:-1:-1;;;41538:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41702:12;;:27;;41719:9;41702:27;:16;:27;:::i;:::-;41685:13;:11;:13::i;:::-;:44;;41663:112;;;;;-1:-1:-1;;;41663:112:0;;;;;;;;;;;;-1:-1:-1;;;41663:112:0;;;;;;;;;;;;;;;49287:15;49305:13;:11;:13::i;:::-;49287:31;-1:-1:-1;49333:12:0;49329:25;;49347:7;;;49329:25;49378:7;49368:6;:17;49364:46;;49396:14;:7;49408:1;49396:14;:11;:14;:::i;:::-;49387:23;;49364:46;49449:14;:7;49461:1;49449:14;:11;:14;:::i;:::-;49439:6;:24;:78;;;;;49500:17;;49486:10;;49480:3;:16;;;;;;:37;;49439:78;:105;;;;;49543:1;49534:6;:10;49439:105;49421:316;;;49565:13;:6;49576:1;49565:13;:10;:13;:::i;:::-;49556:22;;49421:316;;;49622:14;:7;49634:1;49622:14;:11;:14;:::i;:::-;49612:6;:24;:78;;;;;49673:17;;49659:10;;49653:3;:16;;;;;;:37;;49612:78;:106;;;;-1:-1:-1;49707:11:0;;49612:106;49594:143;;;49730:7;;;49594:143;49776:6;49754:18;;:28;49747:1640;;49836:18;;49799:19;49821:34;;;:14;:34;;;;;;49874:16;49870:241;;49965:18;;49957:27;;;;:7;:27;;;;;;49933:70;;49957:45;;49997:4;;49957:35;;49989:2;49957:35;:31;:35;:::i;:45::-;49933:19;;;:70;:23;:70;:::i;:::-;49911:19;:92;50043:18;;:25;;50066:1;50043:25;:22;:25;:::i;:::-;50022:18;:46;-1:-1:-1;50087:8:0;;49870:241;50125:17;50145:20;50153:11;50145:7;:20::i;:::-;50125:40;-1:-1:-1;50231:13:0;;50293:310;50308:9;50300:5;:17;50293:310;;;50396:18;;50338:22;50384:31;;;:11;:31;;;;;:36;;50416:3;;50384:36;;;;;;;;;;;;;;;;:48;;;50338:94;;50484:9;50455:25;50465:14;50455:5;:9;;:25;;;;:::i;:::-;:38;50451:49;;50495:5;;;50451:49;50527:25;:5;50537:14;50527:25;:9;:25;:::i;:::-;50519:33;-1:-1:-1;50577:10:0;:3;50585:1;50577:10;:7;:10;:::i;:::-;50571:16;;50293:310;;;;50642:18;;50617:14;50634:27;;;:7;:27;;;;;;:45;;50674:4;;50634:35;;50666:2;50634:35;:31;:35;:::i;:45::-;50698:19;;50617:62;;-1:-1:-1;50698:23:0;50694:146;;50762:19;;50751:31;;:6;;:31;:10;:31;:::i;:::-;50823:1;50801:19;:23;50742:40;-1:-1:-1;50694:146:0;50884:155;;;;;;;;50932:11;:31;50944:18;;50932:31;;;;;;;;;;;50964:3;50932:36;;;;;;;;;;;;;;;;;;;;;:40;-1:-1:-1;;;;;50932:40:0;;;50884:155;;;;;;;;;;;;;;;50862:18;;;50854:27;;:7;:27;;;;;:185;;;;-1:-1:-1;;;;;;50854:185:0;;;;;;;;;;;-1:-1:-1;50854:185:0;;;;;;;;;;;;;;;51085:18;;51054:28;:49;;;51213:27;;;;;;;:31;51123:136;;;;;;;;;;;51213:31;;;51123:136;;;;;;;;;;;;;;;51350:18;;:25;;51373:1;51350:25;:22;:25;:::i;:::-;51329:18;:46;-1:-1:-1;49747:1640:0;;-1:-1:-1;;;;49747:1640:0;41786:1;49213:2181;;:::o;84284:131::-;84344:7;84371:36;84387:19;84395:10;;84387:3;:7;;:19;;;;:::i;:::-;84371:11;;;:36;:15;:36;:::i;28600:37::-;;;;:::o;14562:166::-;-1:-1:-1;;;;;14693:18:0;;;14661:7;14693:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14562:166::o;80616:493::-;10786:9;:7;:9::i;:::-;10778:54;;;;;-1:-1:-1;;;10778:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10778:54:0;;;;;;;;;;;;;;;80688:12;;:19;;80705:1;80688:19;:16;:19;:::i;:::-;80669:16;;:38;80665:95;;;80741:12;;:19;;80758:1;80741:19;:16;:19;:::i;:::-;80722:16;:38;80665:95;80779:21;80771:56;;;;;-1:-1:-1;;;80771:56:0;;;;;;;;;;;;-1:-1:-1;;;80771:56:0;;;;;;;;;;;;;;;80865:13;:11;:13::i;:::-;80846:16;;:32;80838:65;;;;;-1:-1:-1;;;80838:65:0;;;;;;;;;;;;-1:-1:-1;;;80838:65:0;;;;;;;;;;;;;;;80940:13;:11;:13::i;:::-;80921:16;;:32;80914:188;;;80970:9;;80997:16;;80970:9;80989:25;;;:7;:25;;;;;;-1:-1:-1;;;;;80970:9:0;;;;:63;;80989:43;;81027:4;;80989:33;;81019:2;80989:33;:29;:33;:::i;:43::-;80970:63;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;81067:16:0;;:23;;81088:1;81067:23;:20;:23;:::i;:::-;81048:16;:42;80914:188;;;80616:493::o;22891:32::-;;;;:::o;76268:122::-;76328:7;76381:1;76355:23;76374:3;76355:14;;:18;;:23;;;;:::i;:::-;:27;;;;;;;76268:122;-1:-1:-1;;76268:122:0:o;31515:462::-;31560:18;;:::i;:::-;31591:378;;;;;;;;31613:7;:23;31591:378;;31651:28;;31591:378;;;;31694:17;;;;;;31591:378;;;;;;;31726:25;;31591:378;;;;31766:22;;;;31591:378;;;;31803:24;;31591:378;;;;31842:21;;;;;31591:378;;;;31878:15;31591:378;;;;31694:17;31591:378;;31908:13;:11;:13::i;:::-;31591:378;;;;31936:7;:22;31944:13;:11;:13::i;:::-;31936:22;;;;;;;;;;;;31591:378;;;;;31515:462;:::o;11680:109::-;10786:9;:7;:9::i;:::-;10778:54;;;;;-1:-1:-1;;;10778:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10778:54:0;;;;;;;;;;;;;;;11753:28;11772:8;11753:18;:28::i;59330:1617::-;59480:14;59507:15;59525:13;:11;:13::i;:::-;59507:31;;59569:7;59557:8;:19;;59549:68;;;;-1:-1:-1;;;59549:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59660:7;59650:6;:17;;:39;;;;;59683:6;59671:8;:18;;59650:39;59628:123;;;;-1:-1:-1;;;59628:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59770:21;;;;59762:68;;;;;-1:-1:-1;;;59762:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59857:6;59845:8;:18;59841:32;;;59872:1;59865:8;;;;;59841:32;59898:8;59917:383;59930:6;59924:3;:12;:44;;;;-1:-1:-1;59946:22:0;;;;59940:28;;59924:44;59917:383;;;59985:17;60176:14;;;:9;:14;;;;;:34;;;;60105:27;;;;;60091:121;;60105:106;;:66;;60154:16;;60105:44;;60145:3;;60105:66;;60137:2;60105:35;:31;:35;:::i;60091:121::-;60079:133;-1:-1:-1;60236:21:0;:6;60079:133;60236:21;:10;:21;:::i;:::-;60227:30;-1:-1:-1;60278:10:0;:3;60286:1;60278:10;:7;:10;:::i;:::-;60272:16;;59917:383;;;;60371:22;;60310:27;;60353:9;;60310:27;;60363:38;;60371:22;;60399:1;60363:38;:35;:38;:::i;:::-;60353:49;;;;;;;;;;;:69;;;60310:112;;60437:19;60460:1;60437:24;60433:68;;;-1:-1:-1;60485:16:0;60433:68;60608:6;60602:3;:12;60595:321;;;60631:17;60737:91;60751:76;60807:19;60751:51;60785:16;60751:29;60776:3;60751:20;60768:2;60751:7;:12;60759:3;60751:12;;;;;;;;;;;;:16;;:20;;;;:::i;60737:91::-;60725:103;-1:-1:-1;60852:21:0;:6;60725:103;60852:21;:10;:21;:::i;:::-;60843:30;-1:-1:-1;60894:10:0;:3;60902:1;60894:10;:7;:10;:::i;:::-;60888:16;;60595:321;;;;-1:-1:-1;;;59330:1617:0;;;;;:::o;6385:471::-;6443:7;6688:6;6684:47;;-1:-1:-1;6718:1:0;6711:8;;6684:47;6755:5;;;6759:1;6755;:5;:1;6779:5;;;;;:10;6771:56;;;;-1:-1:-1;;;6771:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5469:136;5527:7;5554:43;5558:1;5561;5554:43;;;;;;;;;;;;;;;;;:3;:43::i;866:98::-;946:10;866:98;:::o;20095:370::-;-1:-1:-1;;;;;20223:19:0;;20215:68;;;;-1:-1:-1;;;20215:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20302:21:0;;20294:68;;;;-1:-1:-1;;;20294:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20373:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20425:32;;;;;;;;;;;;;;;;;20095:370;;;:::o;17813:540::-;-1:-1:-1;;;;;17945:20:0;;17937:70;;;;-1:-1:-1;;;17937:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18026:23:0;;18018:71;;;;-1:-1:-1;;;18018:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18120:108;18156:6;18120:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18120:17:0;;;;;;:9;:17;;;;;;;:108;;:21;:108;:::i;:::-;-1:-1:-1;;;;;18100:17:0;;;;;;;:9;:17;;;;;;:128;;;;18262:20;;;;;;;:32;;18287:6;18262:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;18239:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;18310:35;;;;;;;18239:20;;18310:35;;;;;;;;;;;;;17813:540;;;:::o;5942:192::-;6028:7;6064:12;6056:6;;;;6048:29;;;;-1:-1:-1;;;6048:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6048:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6100:5:0;;;5942:192::o;32848:590::-;32993:7;:23;32972:44;;33053:28;;33027:23;;;:54;33107:17;;;;;;33092:12;;;:32;33158:25;;33135:20;;;:48;33214:22;;;;33194:17;;;:42;33269:24;;33247:19;;;:46;33323:21;;;33304:16;;;:40;33371:13;:11;:13::i;:::-;33355;;;:29;33395:35;33355:1;33420:9;33395:21;:35::i;35055:588::-;35300:13;;;35284:29;;;35300:13;;35284:29;35262:113;;;;-1:-1:-1;;;35262:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35400:13;;;;35386:27;;35400:13;35441:16;;;35424:14;;;:33;35486:17;;;;35468:15;;;:35;35530:15;;;;;;;;;35514:13;;;:31;35573:16;;;;;35556:14;;;:33;-1:-1:-1;;;35618:17:0;;;;35600:15;;;;:35;;;;-1:-1:-1;35055:588:0:o;32725:115::-;32798:34;32815:1;32818;:13;;;32798:16;:34::i;33990:1057::-;34140:26;;34118:18;;:48;;;:123;;;34210:9;:31;;;34183:1;:23;;;:58;;34118:123;:176;;;;34274:9;:20;;;34258:1;:12;;;:36;;34118:176;:245;;;;34335:9;:28;;;34311:1;:20;;;:52;;34118:245;34100:533;;;34416:18;;34390:7;:44;34480:23;;;;34449:28;:54;34545:12;;;;34518:17;:40;;-1:-1:-1;;34518:40:0;;;;;;;;;;;34601:20;;;;34573:25;:48;34100:533;34682:9;:25;;;34661:1;:17;;;:46;;:113;;;;34747:9;:27;;;34724:1;:19;;;:50;;34661:113;:174;;;;34811:9;:24;;;34791:44;;:1;:16;;;:44;;;;34661:174;34643:397;;;-1:-1:-1;34894:17:0;;;;34862:22;:50;;-1:-1:-1;;34862:50:0;;;;;;;;;;;34954:19;;;;34927:24;:46;35012:16;;;34988:21;:40;;-1:-1:-1;;34988:40:0;;;;;;;;;;;33990:1057::o;63949:226::-;64109:15;;;;64085:19;;;;:40;;;:23;:40;:::i;:::-;64063:19;;;;:62;;;;64154:13;;;;;64136:15;;:31;63949:226::o;64183:2032::-;64372:19;64406:14;64435:17;64467:15;64497:21;64563:2;:14;;;64550:10;:27;64546:1165;;;64614:189;64659:1;64679:2;:13;;;64711:2;:14;;;64744:10;64773:2;:15;;;64614:26;:189::i;:::-;64832:14;;;;64594:209;;-1:-1:-1;64594:209:0;-1:-1:-1;64832:26:0;;64594:209;64832:26;:18;:26;:::i;:::-;64929:15;;;;64963:13;;;;64818:40;;-1:-1:-1;64885:154:0;;64995:29;64963:13;65013:10;64995:29;:17;:29;:::i;:::-;64885:25;:154::i;:::-;64873:166;;64546:1165;;;65168:15;;;;65202:13;;;;65132:146;;65168:15;65234:29;65202:13;65252:10;65234:29;:17;:29;:::i;:::-;65132:17;:146::i;:::-;65349:15;;;;65383:13;;;;65123:155;;-1:-1:-1;65305:154:0;;65415:29;65383:13;65433:10;65415:29;:17;:29;:::i;65305:154::-;65488:14;;;;65293:166;;-1:-1:-1;65488:26:0;;65507:6;65488:26;:18;:26;:::i;:::-;65474:40;;65539:160;65574:2;:13;;;65606:2;:14;;;65639:2;:15;;;65673:11;65539:16;:160::i;:::-;65529:170;;64546:1165;65725:12;;65721:413;;65768:11;65758:7;:21;65754:369;;;-1:-1:-1;65919:1:0;;65754:369;;;-1:-1:-1;66037:7:0;66077:30;:11;66037:7;66077:30;:15;:30;:::i;:::-;66063:44;;65754:369;64183:2032;;;;;;;;;:::o;5013:181::-;5071:7;5103:5;;;5127:6;;;;5119:46;;;;;-1:-1:-1;;;5119:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18634:306;-1:-1:-1;;;;;18710:21:0;;18702:65;;;;;-1:-1:-1;;;18702:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18793:12;;:24;;18810:6;18793:24;:16;:24;:::i;:::-;18778:12;:39;-1:-1:-1;;;;;18849:18:0;;;;;;:9;:18;;;;;;:30;;18872:6;18849:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;18828:18:0;;;;;;:9;:18;;;;;;;;:51;;;;18895:37;;;;;;;18828:18;;;;18895:37;;;;;;;;;;18634:306;;:::o;71263:1336::-;71426:2;:14;;;71412:11;:28;71408:1184;;;71712:17;71749:49;71770:11;71783:2;:14;;;71749:20;:49::i;:::-;71712:86;;71813:20;71853:69;71906:2;:15;;;71853:48;25153:3;71853:26;71869:9;71853:11;:15;;:26;;;;:::i;:69::-;71813:109;-1:-1:-1;25306:31:0;71941:29;;71937:370;;;-1:-1:-1;25306:31:0;71937:370;72340:1;:12;;;72325;:27;72321:260;;;72373:12;;;;:27;;;72462:11;;72424:141;;72496:15;72424:141;;;;;;;;;;;;;;;;;;;;;;;;71408:1184;;71263:1336;;;:::o;8788:130::-;8846:7;8873:37;8877:1;8880;8873:37;;;;;;;;;;;;;;;;;:3;:37::i;37054:646::-;37185:19;;37165:17;;37185:26;;37209:1;37185:26;:23;:26;:::i;:::-;37165:46;;37322:9;37308:10;:23;37304:177;;37446:12;37459:9;37446:23;;;;;;;;;;;;;;;;;;37419:12;37432:10;37419:24;;;;;;;;;;;;;;;;:50;;:24;;;;;:50;;-1:-1:-1;;37419:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37419:50:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37419:50:0;;;;;;;;;-1:-1:-1;;;37419:50:0;;;;;;;;;;-1:-1:-1;;37419:50:0;;;;;;37304:177;37674:12;:18;;;;;;;;;;;;;;;-1:-1:-1;;37674:18:0;;;;;;;;;-1:-1:-1;;37674:18:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37674:18:0;;;;;-1:-1:-1;;;37054:646:0:o;32588:129::-;32634:7;32661:48;32698:10;;32661:32;32681:11;;32661:15;:19;;:32;;;;:::i;53024:1921::-;23899:3;53236:13;:31;;53214:123;;;;-1:-1:-1;;;53214:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53348:17;53368:50;53389:13;53404;53368:20;:50::i;:::-;53348:70;;53429:22;53454:68;53509:1;:12;;;53454:50;25153:3;53454:28;53472:9;53454:13;:17;;:28;;;;:::i;:68::-;53429:93;-1:-1:-1;53630:19:0;53608:126;;;;-1:-1:-1;;;53608:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54100:13;;;;54077:20;;54100;;54118:1;54100:20;:17;:20;:::i;:::-;54193:16;;;;54077:43;;-1:-1:-1;54185:32:0;;:25;;54215:1;54185:32;:29;:32;:::i;:::-;54159:59;;:16;;;:59;;;54311:10;54229:17;54300:22;;;:10;:22;;;;;54276:194;;54159:59;54362:13;54390:14;54419:12;54446:13;54276:9;:194::i;:::-;54486:156;;;;;;;;;;;;;;;;;;;;54536:10;;54486:156;;;;;;;;;;;;;54759:23;;;;:43;;54787:14;54759:43;:27;:43;:::i;:::-;54733:23;;;:69;54900:18;;:37;;54923:13;54900:37;:22;:37;:::i;:::-;54879:58;;;-1:-1:-1;;;;;;53024:1921:0:o;19272:383::-;-1:-1:-1;;;;;19348:21:0;;19340:67;;;;-1:-1:-1;;;19340:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19439:105;19476:6;19439:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19439:18:0;;;;;;:9;:18;;;;;;;:105;;:22;:105;:::i;:::-;-1:-1:-1;;;;;19418:18:0;;;;;;:9;:18;;;;;:126;19570:12;;:24;;19587:6;19570:24;:16;:24;:::i;:::-;19555:12;:39;19610:37;;;;;;;;19636:1;;-1:-1:-1;;;;;19610:37:0;;;;;;;;;;;;19272:383;;:::o;35651:385::-;35771:11;;35755:27;;-1:-1:-1;;35755:27:0;;;;;;;;35812:14;;;;-1:-1:-1;35793:16:0;;:33;35857:15;;;;35837:17;;;:35;35908:13;;;;35883:15;;;;:39;;35959:14;;;;36012:15;;;;;-1:-1:-1;;35883:39:0;;;;;;;;-1:-1:-1;;35933:41:0;;;;;;;;;;;;;-1:-1:-1;;35985:43:0;-1:-1:-1;;;35985:43:0;;;;;;;;;;;35651:385::o;7324:132::-;7382:7;7409:39;7413:1;7416;7409:39;;;;;;;;;;;;;;;;;:3;:39::i;40410:955::-;40536:9;40515:1;:17;;;:30;40511:107;;40600:7;;40511:107;40628:25;;:::i;:::-;40706:18;;40688:37;;:13;:11;:13::i;:37::-;40664:61;;40750:17;;;;40778:35;40750:1;40664:2;40750:17;40778:23;:35::i;:::-;40910:23;;;;:28;40906:173;;41001:23;;;;40977:19;;;;:48;;;:23;:48;:::i;:::-;40955:19;;;:70;41066:1;41040:23;;;:27;40906:173;41096:5;;:17;;;41089:88;;;41130:35;41154:1;41157:2;41161:3;41130:23;:35::i;:::-;41089:88;;;41277:17;;;;41192:131;;;41247:15;41192:131;;;;;;;;;;;;;;;;41222:10;;41192:131;;;;;;;;;;41334:17;;;:23;-1:-1:-1;40410:955:0;;:::o;82361:329::-;82659:12;-1:-1:-1;;;;;82532:150:0;82636:8;82611:10;82532:150;82558:15;82588:8;82532:150;;;;;;;;;;;;;;;;;;;;;;;;82361:329;;;;:::o;75817:443::-;75915:25;;75900:41;;;;:14;:41;;;;;;75896:357;;75963:25;:36;;;76014:28;:39;;;75896:357;;;76106:8;76075:28;;:39;76071:182;;;76159:28;;;76131:25;:56;76202:39;75817:443::o;51785:585::-;52058:5;;51948:311;;;51991:3;51948:311;;;;;;;;52021:10;51948:311;;;;;;;;;;;;;;;52100:12;52090:23;;51948:311;;;;;;;;52179:14;51948:311;;;;;;;52220:16;51948:311;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;51948:311:0;;;;;;;51916:362;;;;;51834:7;;;;52296:5;;;51890:411;;;;;51854:447;;52320:12;52330:1;52320:5;;:9;;:12;;;;:::i;:::-;52312:5;:20;52350:12;51785:585;-1:-1:-1;;51785:585:0:o;11895:229::-;-1:-1:-1;;;;;11969:22:0;;11961:73;;;;-1:-1:-1;;;11961:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12071:6;;;12050:38;;-1:-1:-1;;;;;12050:38:0;;;;12071:6;;;12050:38;;;12099:6;:17;;-1:-1:-1;;;;;;12099:17:0;-1:-1:-1;;;;;12099:17:0;;;;;;;;;;11895:229::o;33446:536::-;33610:18;;33581:47;;33673:23;;;;;33639:31;;;:57;33730:12;;;;;33707:20;;;:35;33784:20;;;;;33753:28;;;:51;33843:17;;;;;33815:25;;;:45;33901:19;;;;;33871:27;;;:49;33958:16;;;;;33931:43;;:24;;:43;33446:536::o;68240:2364::-;68468:14;;;68535:30;:14;68554:10;68535:30;:18;:30;:::i;:::-;68512:53;-1:-1:-1;68645:19:0;68667:29;68694:1;68667:22;:15;68687:1;68667:22;:19;:22;:::i;:29::-;68645:51;;23980:2;68711:11;:36;68707:105;;;-1:-1:-1;23980:2:0;68707:105;68826:15;68822:296;;68929:16;68948:46;68974:1;68977:16;68948:25;:46::i;:::-;68929:65;-1:-1:-1;69019:25:0;68929:65;69032:11;69019:25;:12;:25;:::i;:::-;69009:35;-1:-1:-1;69059:24:0;;-1:-1:-1;;;69059:24:0;68822:296;69146:10;69132:11;:24;69128:882;;;69511:21;69535:31;:14;69554:11;69535:31;:18;:31;:::i;:::-;69511:55;;69591:132;69627:16;69662:14;69695:13;69591:17;:132::i;:::-;69581:142;;69738:13;69771:146;69811:16;69850:13;69886:12;69771:17;:146::i;:::-;69738:179;-1:-1:-1;69941:18:0;:7;69738:179;69941:18;:11;:18;:::i;:::-;69932:27;-1:-1:-1;69974:24:0;;-1:-1:-1;;;;69974:24:0;69128:882;70071:115;70103:16;70134:14;70163:12;70071:17;:115::i;:::-;70062:124;;70216:10;70201:11;:25;70197:365;;;70253:6;70243:16;;70197:365;;;70511:39;70539:10;70511:23;:6;70522:11;70511:23;:10;:23;:::i;:39::-;70501:49;;70197:365;-1:-1:-1;;68240:2364:0;;;;;;;;;:::o;70612:643::-;70802:7;;70916:64;24103:5;70916:35;:14;70935:15;70916:35;:18;:35;:::i;:64::-;70878:102;;71015:14;70995:16;:34;70991:75;;71053:1;71046:8;;;;;70991:75;71162:85;24231:7;71162:56;71181:36;:16;71202:14;71181:36;:20;:36;:::i;:::-;71162:14;;:56;:18;:56;:::i;:85::-;71155:92;;;70612:643;;;;;;;:::o;61137:2804::-;61262:17;;63493:1;63477:17;;63473:176;;;24571:17;63529:20;:13;63547:1;63529:17;:20::i;:::-;:36;;:108;;24571:17;63529:108;;;63585:20;:13;63603:1;63585:20;:17;:20;:::i;:::-;63511:126;;63473:176;63659:24;24878:81;63699:29;;;:60;;24878:81;63699:60;;;63731:13;63699:60;63659:100;-1:-1:-1;63782:55:0;63811:25;63659:100;24484:15;63811:25;:20;:25;:::i;:::-;63782:24;:15;24998:25;63782:19;:24::i;:55::-;63770:67;-1:-1:-1;63860:46:0;63893:12;24484:15;24998:25;63893:7;:12::i;:::-;63860:28;:13;63878:9;63860:28;:17;:28;:::i;:46::-;63848:58;61137:2804;-1:-1:-1;;;;;61137:2804:0:o;9437:166::-;9523:7;9559:12;9551:6;9543:29;;;;-1:-1:-1;;;9543:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9543:29:0;;9594:1;9590;:5;;;;;;;9437:166;-1:-1:-1;;;;9437:166:0:o;36044:538::-;36322:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36322:241:0;;;;;;27:10:-1;;39:1;23:18;;;45:23;;36290:284:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36290:284:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36290:284:0;-1:-1:-1;;36290:284:0;;;;;-1:-1:-1;;36290:284:0;;;;-1:-1:-1;;36290:284:0;;;;;;;;;;;;;;;;;;;36044:538::o;7986:345::-;8072:7;8174:12;8167:5;8159:28;;;;-1:-1:-1;;;8159:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;8159:28:0;;8198:9;8214:1;8210;:5;;;;;;;7986:345;-1:-1:-1;;;;;7986:345:0:o;39797:605::-;39946:22;39962:1;39965:2;39946:15;:22::i;:::-;40011:15;;;;;39979:14;;;;:9;:14;;;;;;;:47;;;40315:7;:12;;;;;;40285:14;;;;:27;;;:42;40375:19;;;;;40338:34;;;;:56;39797:605::o;37933:707::-;38065:14;38150:24;;:::i;:::-;38185:30;38207:1;38210:4;38185:21;:30::i;:::-;38226:25;;:::i;:::-;38304:18;;38286:37;;:13;:11;:13::i;:37::-;38262:61;;38334:25;38350:4;38262:2;38334:15;:25::i;:::-;38479:22;;;;:44;;38506:16;38479:44;:26;:44;:::i;:::-;38454:22;;;:69;;;38543:15;;;;:65;;38454:69;38543:37;;38563:16;38543:37;:19;:37;:::i;38648:1141::-;39567:21;;:48;;39605:9;;39567:33;;39593:6;39567:33;:25;:33;:::i;:48::-;39549:15;;;:66;39630:20;;;;:25;39626:156;;39710:20;;;;39690:15;;;;:41;;;:19;:41;:::i;:::-;39672:15;;;:59;39769:1;39746:20;;;:24;38648:1141;;:::o;82697:2300::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;82697:2300:0;;;-1:-1:-1;;82697:2300:0:o;:::-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://5f30f02b23cfa28f7081cbb2bcf6440179258fde30572adc72e4b65b68a0b548
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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