Contract 0x3d69a3290cbf4a6651d95027093cde13e77f8461

Contract Overview

Balance:
0 MATIC
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf9fcf233c84bd19a9f75d7104ef2fcbe8b5933258acd65d15fc59a2c26f0d8edStake219346712021-11-26 5:27:499 days 15 hrs ago0xc94e3be02278f2ebe8e92592793279174d65e828 IN  0x3d69a3290cbf4a6651d95027093cde13e77f84610 MATIC0.000566825
0x391c97e8edbfd2bcd052f866cf1becc9b1c6e0bead0aa10122ef4c7a755251f1Approve219346472021-11-26 5:26:579 days 15 hrs ago0xc94e3be02278f2ebe8e92592793279174d65e828 IN  0x3d69a3290cbf4a6651d95027093cde13e77f84610 MATIC0.0001045135
0x2cd6cccd0590bf876baee0df52831dbd83496521ead2112db953b9f6cb949469Stake219335792021-11-26 4:50:179 days 16 hrs ago0xda6839464c46857e8da02b9a677b2383ab9697cb IN  0x3d69a3290cbf4a6651d95027093cde13e77f84610 MATIC0.0005505185
0xe1603a9edcfcdbc15d4ceaa748fcc60f8cfcad46583880e34c2f2b96ba593005Approve219335132021-11-26 4:48:019 days 16 hrs ago0xda6839464c46857e8da02b9a677b2383ab9697cb IN  0x3d69a3290cbf4a6651d95027093cde13e77f84610 MATIC0.0001044715
0x54739ebb4ec4feca0ac5bf7b63f93c5444b61c589fe5b553041625b38519796bApprove219333742021-11-26 4:43:119 days 16 hrs ago0xda6839464c46857e8da02b9a677b2383ab9697cb IN  0x3d69a3290cbf4a6651d95027093cde13e77f84610 MATIC0.0001641115
0xfede5ecf8ee2a588972e9b363cf323ce708f69d7536b57da111b76eb0daececbApprove219332052021-11-26 4:37:259 days 16 hrs ago0xc94e3be02278f2ebe8e92592793279174d65e828 IN  0x3d69a3290cbf4a6651d95027093cde13e77f84610 MATIC0.0001641115
0x88a445d982b107e305141aa6f56fbd09998c4d7fbc7a464f586a2be6b807dfd4Approve219331782021-11-26 4:36:279 days 16 hrs ago0xc94e3be02278f2ebe8e92592793279174d65e828 IN  0x3d69a3290cbf4a6651d95027093cde13e77f84610 MATIC0.0001641115
0x6dffe6dc54dc358d6847fe79683404fafd296b6cb0c20a3102a014090304a3090x61016060219330562021-11-26 4:32:199 days 16 hrs ago0xc94e3be02278f2ebe8e92592793279174d65e828 IN  Contract Creation0 MATIC0.0143858015
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakedPTKE

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-11-26
*/

/**
 *Submitted for verification at Etherscan.io on 2020-09-24
*/

// File: contracts/interfaces/IERC20.sol

// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 * From https://github.com/OpenZeppelin/openzeppelin-contracts
 */
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: contracts/interfaces/IStakedAave.sol


pragma solidity 0.6.12;

interface IStakedAave {
  function stake(address to, uint256 amount) external;

  function redeem(address to, uint256 amount) external;

  function cooldown() external;

  function claimRewards(address to, uint256 amount) external;
}

// File: contracts/interfaces/ITransferHook.sol


pragma solidity 0.6.12;

interface ITransferHook {
    function onTransfer(address from, address to, uint256 amount) external;
}

// File: contracts/lib/Context.sol



pragma solidity 0.6.12;

/**
 * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts
 * 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.
 */
abstract contract Context {
    function _msgSender() internal virtual view returns (address payable) {
        return msg.sender;
    }

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

// File: contracts/interfaces/IERC20Detailed.sol


pragma solidity 0.6.12;


/**
 * @dev Interface for ERC20 including metadata
 **/
interface IERC20Detailed is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

// File: contracts/lib/SafeMath.sol


pragma solidity 0.6.12;

/**
 * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts
 * 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.
     */
    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.
     */
    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.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts/lib/ERC20.sol


pragma solidity 0.6.12;





/**
 * @title ERC20
 * @notice Basic ERC20 implementation
 * @author Aave
 **/
contract ERC20 is Context, IERC20, IERC20Detailed {
  using SafeMath for uint256;

  mapping(address => uint256) private _balances;
  mapping(address => mapping(address => uint256)) private _allowances;
  uint256 private _totalSupply;
  string private _name;
  string private _symbol;
  uint8 private _decimals;

  constructor(
    string memory name,
    string memory symbol,
    uint8 decimals
  ) public {
    _name = name;
    _symbol = symbol;
    _decimals = decimals;
  }

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

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

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

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

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

  /**
   * @dev executes a transfer of tokens from msg.sender to recipient
   * @param recipient the recipient of the tokens
   * @param amount the amount of tokens being transferred
   * @return true if the transfer succeeds, false otherwise
   **/
  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
    _transfer(_msgSender(), recipient, amount);
    return true;
  }

  /**
   * @dev returns the allowance of spender on the tokens owned by owner
   * @param owner the owner of the tokens
   * @param spender the user allowed to spend the owner's tokens
   * @return the amount of owner's tokens spender is allowed to spend
   **/
  function allowance(address owner, address spender)
    public
    virtual
    override
    view
    returns (uint256)
  {
    return _allowances[owner][spender];
  }

  /**
   * @dev allows spender to spend the tokens owned by msg.sender
   * @param spender the user allowed to spend msg.sender tokens
   * @return true
   **/
  function approve(address spender, uint256 amount) public virtual override returns (bool) {
    _approve(_msgSender(), spender, amount);
    return true;
  }

  /**
   * @dev executes a transfer of token from sender to recipient, if msg.sender is allowed to do so
   * @param sender the owner of the tokens
   * @param recipient the recipient of the tokens
   * @param amount the amount of tokens being transferred
   * @return true if the transfer succeeds, false otherwise
   **/
  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) public virtual override returns (bool) {
    _transfer(sender, recipient, amount);
    _approve(
      sender,
      _msgSender(),
      _allowances[sender][_msgSender()].sub(amount, 'ERC20: transfer amount exceeds allowance')
    );
    return true;
  }

  /**
   * @dev increases the allowance of spender to spend msg.sender tokens
   * @param spender the user allowed to spend on behalf of msg.sender
   * @param addedValue the amount being added to the allowance
   * @return true
   **/
  function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
    _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
    return true;
  }

  /**
   * @dev decreases the allowance of spender to spend msg.sender tokens
   * @param spender the user allowed to spend on behalf of msg.sender
   * @param subtractedValue the amount being subtracted to the allowance
   * @return true
   **/
  function decreaseAllowance(address spender, uint256 subtractedValue)
    public
    virtual
    returns (bool)
  {
    _approve(
      _msgSender(),
      spender,
      _allowances[_msgSender()][spender].sub(
        subtractedValue,
        'ERC20: decreased allowance below zero'
      )
    );
    return true;
  }

  function _transfer(
    address sender,
    address recipient,
    uint256 amount
  ) internal virtual {
    require(sender != address(0), 'ERC20: transfer from the zero address');
    require(recipient != address(0), 'ERC20: transfer to the zero address');

    _beforeTokenTransfer(sender, recipient, amount);

    _balances[sender] = _balances[sender].sub(amount, 'ERC20: transfer amount exceeds balance');
    _balances[recipient] = _balances[recipient].add(amount);
    emit Transfer(sender, recipient, amount);
  }

  function _mint(address account, uint256 amount) internal virtual {
    require(account != address(0), 'ERC20: mint to the zero address');

    _beforeTokenTransfer(address(0), account, amount);

    _totalSupply = _totalSupply.add(amount);
    _balances[account] = _balances[account].add(amount);
    emit Transfer(address(0), account, amount);
  }

  function _burn(address account, uint256 amount) internal virtual {
    require(account != address(0), 'ERC20: burn from the zero address');

    _beforeTokenTransfer(account, address(0), amount);

    _balances[account] = _balances[account].sub(amount, 'ERC20: burn amount exceeds balance');
    _totalSupply = _totalSupply.sub(amount);
    emit Transfer(account, address(0), amount);
  }

  function _approve(
    address owner,
    address spender,
    uint256 amount
  ) internal virtual {
    require(owner != address(0), 'ERC20: approve from the zero address');
    require(spender != address(0), 'ERC20: approve to the zero address');

    _allowances[owner][spender] = amount;
    emit Approval(owner, spender, amount);
  }

  function _setName(string memory newName) internal {
    _name = newName;
  }

  function _setSymbol(string memory newSymbol) internal {
    _symbol = newSymbol;
  }

  function _setDecimals(uint8 newDecimals) internal {
    _decimals = newDecimals;
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 amount
  ) internal virtual {}
}

// File: contracts/lib/ERC20WithSnapshot.sol


pragma solidity 0.6.12;



/**
 * @title ERC20WithSnapshot
 * @notice ERC20 including snapshots of balances on transfer-related actions
 * @author Aave
 **/
contract ERC20WithSnapshot is ERC20 {

    /// @dev snapshot of a value on a specific block, used for balances
    struct Snapshot {
        uint128 blockNumber;
        uint128 value;
    }

    mapping (address => mapping (uint256 => Snapshot)) public _snapshots;
    mapping (address => uint256) public _countsSnapshots;
    /// @dev reference to the Aave governance contract to call (if initialized) on _beforeTokenTransfer
    /// !!! IMPORTANT The Aave governance is considered a trustable contract, being its responsibility
    /// to control all potential reentrancies by calling back the this contract
    ITransferHook public _aaveGovernance;

    event SnapshotDone(address owner, uint128 oldValue, uint128 newValue);

    constructor(string memory name, string memory symbol, uint8 decimals) public ERC20(name, symbol, decimals) {}

    function _setAaveGovernance(ITransferHook aaveGovernance) internal virtual {
        _aaveGovernance = aaveGovernance;
    }

    /**
    * @dev Writes a snapshot for an owner of tokens
    * @param owner The owner of the tokens
    * @param oldValue The value before the operation that is gonna be executed after the snapshot
    * @param newValue The value after the operation
    */
    function _writeSnapshot(address owner, uint128 oldValue, uint128 newValue) internal virtual {
        uint128 currentBlock = uint128(block.number);

        uint256 ownerCountOfSnapshots = _countsSnapshots[owner];
        mapping (uint256 => Snapshot) storage snapshotsOwner = _snapshots[owner];

        // Doing multiple operations in the same block
        if (ownerCountOfSnapshots != 0 && snapshotsOwner[ownerCountOfSnapshots.sub(1)].blockNumber == currentBlock) {
            snapshotsOwner[ownerCountOfSnapshots.sub(1)].value = newValue;
        } else {
            snapshotsOwner[ownerCountOfSnapshots] = Snapshot(currentBlock, newValue);
            _countsSnapshots[owner] = ownerCountOfSnapshots.add(1);
        }

        emit SnapshotDone(owner, oldValue, newValue);
    }

    /**
    * @dev Writes a snapshot before any operation involving transfer of value: _transfer, _mint and _burn
    * - On _transfer, it writes snapshots for both "from" and "to"
    * - On _mint, only for _to
    * - On _burn, only for _from
    * @param from the from address
    * @param to the to address
    * @param amount the amount to transfer
    */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override {
        if (from == to) {
            return;
        }

        if (from != address(0)) {
            uint256 fromBalance = balanceOf(from);
            _writeSnapshot(from, uint128(fromBalance), uint128(fromBalance.sub(amount)));
        }
        if (to != address(0)) {
            uint256 toBalance = balanceOf(to);
            _writeSnapshot(to, uint128(toBalance), uint128(toBalance.add(amount)));
        }

        // caching the aave governance address to avoid multiple state loads
        ITransferHook aaveGovernance = _aaveGovernance;
        if (aaveGovernance != ITransferHook(0)) {
            aaveGovernance.onTransfer(from, to, amount);
        }
    }
}

// File: contracts/lib/Address.sol


pragma solidity 0.6.12;

/**
 * @dev Collection of functions related to the address type
 * From https://github.com/OpenZeppelin/openzeppelin-contracts
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, 'Address: insufficient balance');

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}('');
        require(success, 'Address: unable to send value, recipient may have reverted');
    }
}

// File: contracts/lib/SafeERC20.sol



pragma solidity 0.6.12;




/**
 * @title SafeERC20
 * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts
 * Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/utils/VersionedInitializable.sol


pragma solidity 0.6.12;

/**
 * @title VersionedInitializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 *
 * @author Aave, inspired by the OpenZeppelin Initializable contract
 */
abstract contract VersionedInitializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    uint256 internal lastInitializedRevision = 0;

    /**
     * @dev Modifier to use in the initializer function of a contract.
     */
    modifier initializer() {
        uint256 revision = getRevision();
        require(
            revision > lastInitializedRevision,
            'Contract instance has already been initialized'
        );

        lastInitializedRevision = revision;

        _;
    }

    /// @dev returns the revision number of the contract.
    /// Needs to be defined in the inherited class as a constant.
    function getRevision() internal virtual pure returns (uint256);

    // Reserved storage space to allow for layout changes in the future.
    uint256[50] private ______gap;
}

// File: contracts/lib/DistributionTypes.sol


pragma solidity 0.6.12;


library DistributionTypes {
  struct AssetConfigInput {
    uint128 emissionPerSecond;
    uint256 totalStaked;
    address underlyingAsset;
  }

  struct UserStakeInput {
    address underlyingAsset;
    uint256 stakedByUser;
    uint256 totalStaked;
  }
}

// File: contracts/interfaces/IAaveDistributionManager.sol


pragma solidity 0.6.12;



interface IAaveDistributionManager {
  function configureAssets(DistributionTypes.AssetConfigInput[] calldata assetsConfigInput) external;
}

// File: contracts/stake/AaveDistributionManager.sol


pragma solidity 0.6.12;





/**
 * @title AaveDistributionManager
 * @notice Accounting contract to manage multiple staking distributions
 * @author Aave
 **/
contract AaveDistributionManager is IAaveDistributionManager {
  using SafeMath for uint256;

  struct AssetData {
    uint128 emissionPerSecond;
    uint128 lastUpdateTimestamp;
    uint256 index;
    mapping(address => uint256) users;
  }

  uint256 public immutable DISTRIBUTION_END;

  address public immutable EMISSION_MANAGER;

  uint8 public constant PRECISION = 18;

  mapping(address => AssetData) public assets;

  event AssetConfigUpdated(address indexed asset, uint256 emission);
  event AssetIndexUpdated(address indexed asset, uint256 index);
  event UserIndexUpdated(address indexed user, address indexed asset, uint256 index);

  constructor(address emissionManager, uint256 distributionDuration) public {
    DISTRIBUTION_END = block.timestamp.add(distributionDuration);
    EMISSION_MANAGER = emissionManager;
  }

  /**
   * @dev Configures the distribution of rewards for a list of assets
   * @param assetsConfigInput The list of configurations to apply
   **/
  function configureAssets(DistributionTypes.AssetConfigInput[] calldata assetsConfigInput) external override {
    require(msg.sender == EMISSION_MANAGER, 'ONLY_EMISSION_MANAGER');

    for (uint256 i = 0; i < assetsConfigInput.length; i++) {
      AssetData storage assetConfig = assets[assetsConfigInput[i].underlyingAsset];

      _updateAssetStateInternal(
        assetsConfigInput[i].underlyingAsset,
        assetConfig,
        assetsConfigInput[i].totalStaked
      );

      assetConfig.emissionPerSecond = assetsConfigInput[i].emissionPerSecond;

      emit AssetConfigUpdated(
        assetsConfigInput[i].underlyingAsset,
        assetsConfigInput[i].emissionPerSecond
      );
    }
  }

  /**
   * @dev Updates the state of one distribution, mainly rewards index and timestamp
   * @param underlyingAsset The address used as key in the distribution, for example sAAVE or the aTokens addresses on Aave
   * @param assetConfig Storage pointer to the distribution's config
   * @param totalStaked Current total of staked assets for this distribution
   * @return The new distribution index
   **/
  function _updateAssetStateInternal(
    address underlyingAsset,
    AssetData storage assetConfig,
    uint256 totalStaked
  ) internal returns (uint256) {
    uint256 oldIndex = assetConfig.index;
    uint128 lastUpdateTimestamp = assetConfig.lastUpdateTimestamp;

    if (block.timestamp == lastUpdateTimestamp) {
      return oldIndex;
    }

    uint256 newIndex = _getAssetIndex(
      oldIndex,
      assetConfig.emissionPerSecond,
      lastUpdateTimestamp,
      totalStaked
    );

    if (newIndex != oldIndex) {
      assetConfig.index = newIndex;
      emit AssetIndexUpdated(underlyingAsset, newIndex);
    }

    assetConfig.lastUpdateTimestamp = uint128(block.timestamp);

    return newIndex;
  }

  /**
   * @dev Updates the state of an user in a distribution
   * @param user The user's address
   * @param asset The address of the reference asset of the distribution
   * @param stakedByUser Amount of tokens staked by the user in the distribution at the moment
   * @param totalStaked Total tokens staked in the distribution
   * @return The accrued rewards for the user until the moment
   **/
  function _updateUserAssetInternal(
    address user,
    address asset,
    uint256 stakedByUser,
    uint256 totalStaked
  ) internal returns (uint256) {
    AssetData storage assetData = assets[asset];
    uint256 userIndex = assetData.users[user];
    uint256 accruedRewards = 0;

    uint256 newIndex = _updateAssetStateInternal(asset, assetData, totalStaked);

    if (userIndex != newIndex) {
      if (stakedByUser != 0) {
        accruedRewards = _getRewards(stakedByUser, newIndex, userIndex);
      }

      assetData.users[user] = newIndex;
      emit UserIndexUpdated(user, asset, newIndex);
    }

    return accruedRewards;
  }

  /**
   * @dev Used by "frontend" stake contracts to update the data of an user when claiming rewards from there
   * @param user The address of the user
   * @param stakes List of structs of the user data related with his stake
   * @return The accrued rewards for the user until the moment
   **/
  function _claimRewards(address user, DistributionTypes.UserStakeInput[] memory stakes)
    internal
    returns (uint256)
  {
    uint256 accruedRewards = 0;

    for (uint256 i = 0; i < stakes.length; i++) {
      accruedRewards = accruedRewards.add(
        _updateUserAssetInternal(
          user,
          stakes[i].underlyingAsset,
          stakes[i].stakedByUser,
          stakes[i].totalStaked
        )
      );
    }

    return accruedRewards;
  }

  /**
   * @dev Return the accrued rewards for an user over a list of distribution
   * @param user The address of the user
   * @param stakes List of structs of the user data related with his stake
   * @return The accrued rewards for the user until the moment
   **/
  function _getUnclaimedRewards(address user, DistributionTypes.UserStakeInput[] memory stakes)
    internal
    view
    returns (uint256)
  {
    uint256 accruedRewards = 0;

    for (uint256 i = 0; i < stakes.length; i++) {
      AssetData storage assetConfig = assets[stakes[i].underlyingAsset];
      uint256 assetIndex = _getAssetIndex(
        assetConfig.index,
        assetConfig.emissionPerSecond,
        assetConfig.lastUpdateTimestamp,
        stakes[i].totalStaked
      );

      accruedRewards = accruedRewards.add(
        _getRewards(stakes[i].stakedByUser, assetIndex, assetConfig.users[user])
      );
    }
    return accruedRewards;
  }

  /**
   * @dev Internal function for the calculation of user's rewards on a distribution
   * @param principalUserBalance Amount staked by the user on a distribution
   * @param reserveIndex Current index of the distribution
   * @param userIndex Index stored for the user, representation his staking moment
   * @return The rewards
   **/
  function _getRewards(
    uint256 principalUserBalance,
    uint256 reserveIndex,
    uint256 userIndex
  ) internal pure returns (uint256) {
    return principalUserBalance.mul(reserveIndex.sub(userIndex)).div(10**uint256(PRECISION));
  }

  /**
   * @dev Calculates the next value of an specific distribution index, with validations
   * @param currentIndex Current index of the distribution
   * @param emissionPerSecond Representing the total rewards distributed per second per asset unit, on the distribution
   * @param lastUpdateTimestamp Last moment this distribution was updated
   * @param totalBalance of tokens considered for the distribution
   * @return The new index.
   **/
  function _getAssetIndex(
    uint256 currentIndex,
    uint256 emissionPerSecond,
    uint128 lastUpdateTimestamp,
    uint256 totalBalance
  ) internal view returns (uint256) {
    if (
      emissionPerSecond == 0 ||
      totalBalance == 0 ||
      lastUpdateTimestamp == block.timestamp ||
      lastUpdateTimestamp >= DISTRIBUTION_END
    ) {
      return currentIndex;
    }

    uint256 currentTimestamp = block.timestamp > DISTRIBUTION_END
      ? DISTRIBUTION_END
      : block.timestamp;
    uint256 timeDelta = currentTimestamp.sub(lastUpdateTimestamp);
    return
      emissionPerSecond.mul(timeDelta).mul(10**uint256(PRECISION)).div(totalBalance).add(
        currentIndex
      );
  }

  /**
   * @dev Returns the data of an user on a distribution
   * @param user Address of the user
   * @param asset The address of the reference asset of the distribution
   * @return The new index
   **/
  function getUserAssetData(address user, address asset) public view returns (uint256) {
    return assets[asset].users[user];
  }
}

// File: contracts/stake/StakedToken.sol


pragma solidity 0.6.12;










/**
 * @title StakedToken
 * @notice Contract to stake Aave token, tokenize the position and get rewards, inheriting from a distribution manager contract
 * @author Aave
 **/
contract StakedToken is IStakedAave, ERC20WithSnapshot, VersionedInitializable, AaveDistributionManager {
  using SafeERC20 for IERC20;

  uint256 public constant REVISION = 1;

  IERC20 public immutable STAKED_TOKEN;
  IERC20 public immutable REWARD_TOKEN;
  uint256 public immutable COOLDOWN_SECONDS;

  /// @notice Seconds available to redeem once the cooldown period is fullfilled
  uint256 public immutable UNSTAKE_WINDOW;

  /// @notice Address to pull from the rewards, needs to have approved this contract
  address public immutable REWARDS_VAULT;

  mapping(address => uint256) public stakerRewardsToClaim;
  mapping(address => uint256) public stakersCooldowns;

  event Staked(address indexed from, address indexed onBehalfOf, uint256 amount);
  event Redeem(address indexed from, address indexed to, uint256 amount);

  event RewardsAccrued(address user, uint256 amount);
  event RewardsClaimed(address indexed from, address indexed to, uint256 amount);

  event Cooldown(address indexed user);

  constructor(
    IERC20 stakedToken,
    IERC20 rewardToken,
    uint256 cooldownSeconds,
    uint256 unstakeWindow,
    address rewardsVault,
    address emissionManager,
    uint128 distributionDuration,
    string memory name,
    string memory symbol,
    uint8 decimals
  ) public ERC20WithSnapshot(name, symbol, decimals) AaveDistributionManager(emissionManager, distributionDuration) {
    STAKED_TOKEN = stakedToken;
    REWARD_TOKEN = rewardToken;
    COOLDOWN_SECONDS = cooldownSeconds;
    UNSTAKE_WINDOW = unstakeWindow;
    REWARDS_VAULT = rewardsVault;
  }

  /**
   * @dev Called by the proxy contract
   **/
  function initialize(ITransferHook aaveGovernance, string calldata name, string calldata symbol, uint8 decimals) external initializer {
    _setName(name);
    _setSymbol(symbol);
    _setDecimals(decimals);
    _setAaveGovernance(aaveGovernance);
  }

  function stake(address onBehalfOf, uint256 amount) external override {
    require(amount != 0, 'INVALID_ZERO_AMOUNT');
    uint256 balanceOfUser = balanceOf(onBehalfOf);

    uint256 accruedRewards = _updateUserAssetInternal(
      onBehalfOf,
      address(this),
      balanceOfUser,
      totalSupply()
    );
    if (accruedRewards != 0) {
      emit RewardsAccrued(onBehalfOf, accruedRewards);
      stakerRewardsToClaim[onBehalfOf] = stakerRewardsToClaim[onBehalfOf].add(accruedRewards);
    }

    stakersCooldowns[onBehalfOf] = getNextCooldownTimestamp(0, amount, onBehalfOf, balanceOfUser);

    _mint(onBehalfOf, amount);
    IERC20(STAKED_TOKEN).safeTransferFrom(msg.sender, address(this), amount);

    emit Staked(msg.sender, onBehalfOf, amount);
  }

  /**
   * @dev Redeems staked tokens, and stop earning rewards
   * @param to Address to redeem to
   * @param amount Amount to redeem
   **/
  function redeem(address to, uint256 amount) external override {
    require(amount != 0, 'INVALID_ZERO_AMOUNT');
    //solium-disable-next-line
    uint256 cooldownStartTimestamp = stakersCooldowns[msg.sender];
    require(
      block.timestamp > cooldownStartTimestamp.add(COOLDOWN_SECONDS),
      'INSUFFICIENT_COOLDOWN'
    );
    require(
      block.timestamp.sub(cooldownStartTimestamp.add(COOLDOWN_SECONDS)) <= UNSTAKE_WINDOW,
      'UNSTAKE_WINDOW_FINISHED'
    );
    uint256 balanceOfMessageSender = balanceOf(msg.sender);

    uint256 amountToRedeem = (amount > balanceOfMessageSender) ? balanceOfMessageSender : amount;

    _updateCurrentUnclaimedRewards(msg.sender, balanceOfMessageSender, true);

    _burn(msg.sender, amountToRedeem);

    if (balanceOfMessageSender.sub(amountToRedeem) == 0) {
      stakersCooldowns[msg.sender] = 0;
    }

    IERC20(STAKED_TOKEN).safeTransfer(to, amountToRedeem);

    emit Redeem(msg.sender, to, amountToRedeem);
  }

  /**
   * @dev Activates the cooldown period to unstake
   * - It can't be called if the user is not staking
   **/
  function cooldown() external override {
    require(balanceOf(msg.sender) != 0, "INVALID_BALANCE_ON_COOLDOWN");
    //solium-disable-next-line
    stakersCooldowns[msg.sender] = block.timestamp;

    emit Cooldown(msg.sender);
  }

  /**
   * @dev Claims an `amount` of `REWARD_TOKEN` to the address `to`
   * @param to Address to stake for
   * @param amount Amount to stake
   **/
  function claimRewards(address to, uint256 amount) external override {
    uint256 newTotalRewards = _updateCurrentUnclaimedRewards(
      msg.sender,
      balanceOf(msg.sender),
      false
    );
    uint256 amountToClaim = (amount == type(uint256).max) ? newTotalRewards : amount;

    stakerRewardsToClaim[msg.sender] = newTotalRewards.sub(amountToClaim, "INVALID_AMOUNT");

    REWARD_TOKEN.safeTransferFrom(REWARDS_VAULT, to, amountToClaim);

    emit RewardsClaimed(msg.sender, to, amountToClaim);
  }

  /**
   * @dev Internal ERC20 _transfer of the tokenized staked tokens
   * @param from Address to transfer from
   * @param to Address to transfer to
   * @param amount Amount to transfer
   **/
  function _transfer(
    address from,
    address to,
    uint256 amount
  ) internal override {
    uint256 balanceOfFrom = balanceOf(from);
    // Sender
    _updateCurrentUnclaimedRewards(from, balanceOfFrom, true);

    // Recipient
    if (from != to) {
      uint256 balanceOfTo = balanceOf(to);
      _updateCurrentUnclaimedRewards(to, balanceOfTo, true);

      uint256 previousSenderCooldown = stakersCooldowns[from];
      stakersCooldowns[to] = getNextCooldownTimestamp(previousSenderCooldown, amount, to, balanceOfTo);
      // if cooldown was set and whole balance of sender was transferred - clear cooldown
      if (balanceOfFrom == amount && previousSenderCooldown != 0) {
        stakersCooldowns[from] = 0;
      }
    }

    super._transfer(from, to, amount);
  }

  /**
   * @dev Updates the user state related with his accrued rewards
   * @param user Address of the user
   * @param userBalance The current balance of the user
   * @param updateStorage Boolean flag used to update or not the stakerRewardsToClaim of the user
   * @return The unclaimed rewards that were added to the total accrued
   **/
  function _updateCurrentUnclaimedRewards(
    address user,
    uint256 userBalance,
    bool updateStorage
  ) internal returns (uint256) {
    uint256 accruedRewards = _updateUserAssetInternal(
      user,
      address(this),
      userBalance,
      totalSupply()
    );
    uint256 unclaimedRewards = stakerRewardsToClaim[user].add(accruedRewards);

    if (accruedRewards != 0) {
      if (updateStorage) {
        stakerRewardsToClaim[user] = unclaimedRewards;
      }
      emit RewardsAccrued(user, accruedRewards);
    }

    return unclaimedRewards;
  }

  /**
   * @dev Calculates the how is gonna be a new cooldown timestamp depending on the sender/receiver situation
   *  - If the timestamp of the sender is "better" or the timestamp of the recipient is 0, we take the one of the recipient
   *  - Weighted average of from/to cooldown timestamps if:
   *    # The sender doesn't have the cooldown activated (timestamp 0).
   *    # The sender timestamp is expired
   *    # The sender has a "worse" timestamp
   *  - If the receiver's cooldown timestamp expired (too old), the next is 0
   * @param fromCooldownTimestamp Cooldown timestamp of the sender
   * @param amountToReceive Amount
   * @param toAddress Address of the recipient
   * @param toBalance Current balance of the receiver
   * @return The new cooldown timestamp
   **/
  function getNextCooldownTimestamp(
    uint256 fromCooldownTimestamp,
    uint256 amountToReceive,
    address toAddress,
    uint256 toBalance
  ) public returns (uint256) {
    uint256 toCooldownTimestamp = stakersCooldowns[toAddress];
    if (toCooldownTimestamp == 0) {
      return 0;
    }

    uint256 minimalValidCooldownTimestamp = block.timestamp.sub(COOLDOWN_SECONDS).sub(
      UNSTAKE_WINDOW
    );

    if (minimalValidCooldownTimestamp > toCooldownTimestamp) {
      toCooldownTimestamp = 0;
    } else {
       fromCooldownTimestamp = (minimalValidCooldownTimestamp > fromCooldownTimestamp)
        ? block.timestamp
        : fromCooldownTimestamp;

      if (fromCooldownTimestamp < toCooldownTimestamp) {
        return toCooldownTimestamp;
      } else {
        toCooldownTimestamp = (
          amountToReceive.mul(fromCooldownTimestamp).add(toBalance.mul(toCooldownTimestamp))
        )
          .div(amountToReceive.add(toBalance));
      }
    }
    stakersCooldowns[toAddress] = toCooldownTimestamp;

    return toCooldownTimestamp;
  }

  /**
   * @dev Return the total rewards pending to claim by an staker
   * @param staker The staker address
   * @return The rewards
   */
  function getTotalRewardsBalance(address staker) external view returns (uint256) {

      DistributionTypes.UserStakeInput[] memory userStakeInputs
     = new DistributionTypes.UserStakeInput[](1);
    userStakeInputs[0] = DistributionTypes.UserStakeInput({
      underlyingAsset: address(this),
      stakedByUser: balanceOf(staker),
      totalStaked: totalSupply()
    });
    return stakerRewardsToClaim[staker].add(_getUnclaimedRewards(staker, userStakeInputs));
  }

  /**
   * @dev returns the revision of the implementation contract
   * @return The revision
   */
  function getRevision() internal override pure returns (uint256) {
    return REVISION;
  }
}

// File: contracts/stake/StakedAave.sol


pragma solidity 0.6.12;




/**
 * @title StakedCHTX
 * @notice StakedToken with CHTX token as staked token
 * @author CHTX
 **/
contract StakedPTKE is StakedToken {
  string internal constant NAME = 'Staked PTKE';
  string internal constant SYMBOL = 'stkPTKE';
  uint8 internal constant DECIMALS = 18;
  
  constructor(
    IERC20 stakedToken,
    IERC20 rewardToken,
    uint256 cooldownSeconds,
    uint256 unstakeWindow,
    address rewardsVault,
    address emissionManager,
    uint128 distributionDuration
  ) public StakedToken(
    stakedToken,
    rewardToken,
    cooldownSeconds,
    unstakeWindow,
    rewardsVault,
    emissionManager,
    distributionDuration,
    NAME,
    SYMBOL,
    DECIMALS) {}
}

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"stakedToken","type":"address"},{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"cooldownSeconds","type":"uint256"},{"internalType":"uint256","name":"unstakeWindow","type":"uint256"},{"internalType":"address","name":"rewardsVault","type":"address"},{"internalType":"address","name":"emissionManager","type":"address"},{"internalType":"uint128","name":"distributionDuration","type":"uint128"}],"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":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"emission","type":"uint256"}],"name":"AssetConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"AssetIndexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Cooldown","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":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsAccrued","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":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint128","name":"oldValue","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"newValue","type":"uint128"}],"name":"SnapshotDone","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"UserIndexUpdated","type":"event"},{"inputs":[],"name":"COOLDOWN_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISTRIBUTION_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_MANAGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARDS_VAULT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKED_TOKEN","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNSTAKE_WINDOW","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_aaveGovernance","outputs":[{"internalType":"contract ITransferHook","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_countsSnapshots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_snapshots","outputs":[{"internalType":"uint128","name":"blockNumber","type":"uint128"},{"internalType":"uint128","name":"value","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assets","outputs":[{"internalType":"uint128","name":"emissionPerSecond","type":"uint128"},{"internalType":"uint128","name":"lastUpdateTimestamp","type":"uint128"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint128","name":"emissionPerSecond","type":"uint128"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"address","name":"underlyingAsset","type":"address"}],"internalType":"struct DistributionTypes.AssetConfigInput[]","name":"assetsConfigInput","type":"tuple[]"}],"name":"configureAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromCooldownTimestamp","type":"uint256"},{"internalType":"uint256","name":"amountToReceive","type":"uint256"},{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"toBalance","type":"uint256"}],"name":"getNextCooldownTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTotalRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"asset","type":"address"}],"name":"getUserAssetData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITransferHook","name":"aaveGovernance","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakerRewardsToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakersCooldowns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

61016060405260006009553480156200001757600080fd5b5060405162004e3538038062004e3583398181016040528101906200003d9190620003a2565b868686868686866040518060400160405280600b81526020017f5374616b65642050544b450000000000000000000000000000000000000000008152506040518060400160405280600781526020017f73746b50544b4500000000000000000000000000000000000000000000000000815250601284846fffffffffffffffffffffffffffffffff168484848282828260039080519060200190620000e4929190620002a0565b508160049080519060200190620000fd929190620002a0565b5080600560006101000a81548160ff021916908360ff1602179055505050505050506200013981426200024860201b62001c8d1790919060201c565b608081815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050508973ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508873ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508761010081815250508661012081815250508573ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050505050505050505050505050505050506200059a565b60008082840190508381101562000296576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028d9062000491565b60405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002e357805160ff191683800117855562000314565b8280016001018555821562000314579182015b8281111562000313578251825591602001919060010190620002f6565b5b50905062000323919062000327565b5090565b5b808211156200034257600081600090555060010162000328565b5090565b600081519050620003578162000532565b92915050565b6000815190506200036e816200054c565b92915050565b600081519050620003858162000566565b92915050565b6000815190506200039c8162000580565b92915050565b600080600080600080600060e0888a031215620003be57600080fd5b6000620003ce8a828b016200035d565b9750506020620003e18a828b016200035d565b9650506040620003f48a828b016200038b565b9550506060620004078a828b016200038b565b94505060806200041a8a828b0162000346565b93505060a06200042d8a828b0162000346565b92505060c0620004408a828b0162000374565b91505092959891949750929550565b60006200045e601b83620004b3565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006020820190508181036000830152620004ac816200044f565b9050919050565b600082825260208201905092915050565b6000620004d18262000508565b9050919050565b6000620004e582620004c4565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6200053d81620004c4565b81146200054957600080fd5b50565b6200055781620004d8565b81146200056357600080fd5b50565b6200057181620004ec565b81146200057d57600080fd5b50565b6200058b8162000528565b81146200059757600080fd5b50565b60805160a05160601c60c05160601c60e05160601c61010051610120516101405160601c6147fa6200063b6000398061108052806112455250806109035280610d005280611a3b525080610892528061092a5280610e1f5280611a5f5250806111465280611268525080610a475280610c3b52806115a952508061165b52806118cc52508061105c52806131a452806131ea528061321752506147fa6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80638dbefee211610125578063adc9772e116100ad578063dd62ed3e1161007c578063dd62ed3e14610657578063dde43cba14610687578063f11b8188146106a5578063f1cc432a146106d7578063f6d2ee861461070757610211565b8063adc9772e146105e3578063b2a5dbfa146105ff578063c3863ada1461061b578063cbcbb5071461063957610211565b806399248ea7116100f457806399248ea71461052b5780639a99b4f014610549578063a457c2d714610565578063a9059cbb14610595578063aaf5eb68146105c557610211565b80638dbefee2146104a1578063919cd40f146104d1578063946776cd146104ef57806395d89b411461050d57610211565b8063313ce567116101a857806370a082311161017757806370a08231146103e957806372b49d6314610419578063787a08a6146104375780637e90d7ef146104415780638779588c1461047157610211565b8063313ce5671461034d5780633373ee4c1461036b578063359c4a961461039b57806339509351146103b957610211565b80631e9a6950116101e45780631e9a6950146102b257806323b872dd146102ce5780632acbf823146102fe578063312f6b831461032f57610211565b806306fdde0314610216578063091030c314610234578063095ea7b31461026457806318160ddd14610294575b600080fd5b61021e610723565b60405161022b919061425f565b60405180910390f35b61024e6004803603810190610249919061386e565b6107c5565b60405161025b919061451c565b60405180910390f35b61027e60048036038101906102799190613922565b6107dd565b60405161028b919061420e565b60405180910390f35b61029c6107fb565b6040516102a9919061451c565b60405180910390f35b6102cc60048036038101906102c79190613922565b610805565b005b6102e860048036038101906102e391906138d3565b610af7565b6040516102f5919061420e565b60405180910390f35b61031860048036038101906103139190613922565b610bd0565b6040516103269291906144bc565b60405180910390f35b610337610c39565b6040516103449190614229565b60405180910390f35b610355610c5d565b6040516103629190614537565b60405180910390f35b61038560048036038101906103809190613897565b610c74565b604051610392919061451c565b60405180910390f35b6103a3610cfe565b6040516103b0919061451c565b60405180910390f35b6103d360048036038101906103ce9190613922565b610d22565b6040516103e0919061420e565b60405180910390f35b61040360048036038101906103fe919061386e565b610dd5565b604051610410919061451c565b60405180910390f35b610421610e1d565b60405161042e919061451c565b60405180910390f35b61043f610e41565b005b61045b6004803603810190610456919061386e565b610f16565b604051610468919061451c565b60405180910390f35b61048b6004803603810190610486919061386e565b610f2e565b604051610498919061451c565b60405180910390f35b6104bb60048036038101906104b6919061386e565b610f46565b6040516104c8919061451c565b60405180910390f35b6104d961105a565b6040516104e6919061451c565b60405180910390f35b6104f761107e565b604051610504919061415c565b60405180910390f35b6105156110a2565b604051610522919061425f565b60405180910390f35b610533611144565b6040516105409190614229565b60405180910390f35b610563600480360381019061055e9190613922565b611168565b005b61057f600480360381019061057a9190613922565b611318565b60405161058c919061420e565b60405180910390f35b6105af60048036038101906105aa9190613922565b6113e5565b6040516105bc919061420e565b60405180910390f35b6105cd611403565b6040516105da9190614537565b60405180910390f35b6105fd60048036038101906105f89190613922565b611408565b005b6106196004803603810190610614919061395e565b611659565b005b6106236118a4565b6040516106309190614244565b60405180910390f35b6106416118ca565b60405161064e919061415c565b60405180910390f35b610671600480360381019061066c9190613897565b6118ee565b60405161067e919061451c565b60405180910390f35b61068f611975565b60405161069c919061451c565b60405180910390f35b6106bf60048036038101906106ba919061386e565b61197a565b6040516106ce939291906144e5565b60405180910390f35b6106f160048036038101906106ec9190613a90565b6119dc565b6040516106fe919061451c565b60405180910390f35b610721600480360381019061071c91906139cc565b611b81565b005b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107bb5780601f10610790576101008083540402835291602001916107bb565b820191906000526020600020905b81548152906001019060200180831161079e57829003601f168201915b5050505050905090565b603e6020528060005260406000206000915090505481565b60006107f16107ea611ce2565b8484611cea565b6001905092915050565b6000600254905090565b6000811415610849576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610840906142e1565b60405180910390fd5b6000603e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506108c07f000000000000000000000000000000000000000000000000000000000000000082611c8d90919063ffffffff16565b4211610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f890614321565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006109676109587f000000000000000000000000000000000000000000000000000000000000000084611c8d90919063ffffffff16565b42611eb590919063ffffffff16565b11156109a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099f906143e1565b60405180910390fd5b60006109b333610dd5565b905060008184116109c457836109c6565b815b90506109d433836001611eff565b506109df3382612006565b60006109f48284611eb590919063ffffffff16565b1415610a40576000603e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b610a8b85827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166121b49092919063ffffffff16565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd12200efa34901b99367694174c3b0d32c99585fdf37c7c26892136ddd0836d983604051610ae8919061451c565b60405180910390a35050505050565b6000610b0484848461223a565b610bc584610b10611ce2565b610bc08560405180606001604052806028815260200161477860289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b76611ce2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123a39092919063ffffffff16565b611cea565b600190509392505050565b6006602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16905082565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560009054906101000a900460ff16905090565b6000603c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dcb610d2f611ce2565b84610dc68560016000610d40611ce2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c8d90919063ffffffff16565b611cea565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e4c33610dd5565b1415610e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8490614441565b60405180910390fd5b42603e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167ff52f50426b32362d3e6bb8cb36b7074756b224622def6352a59eac7f66ebe6e860405160405180910390a2565b603d6020528060005260406000206000915090505481565b60076020528060005260406000206000915090505481565b60006060600167ffffffffffffffff81118015610f6257600080fd5b50604051908082528060200260200182016040528015610f9c57816020015b610f89613688565b815260200190600190039081610f815790505b50905060405180606001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001610fcf85610dd5565b8152602001610fdc6107fb565b81525081600081518110610fec57fe5b602002602001018190525061105261100484836123fe565b603d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c8d90919063ffffffff16565b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561113a5780601f1061110f5761010080835404028352916020019161113a565b820191906000526020600020905b81548152906001019060200180831161111d57829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061117e3361117733610dd5565b6000611eff565b905060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83146111af57826111b1565b815b90506111fd816040518060400160405280600e81526020017f494e56414c49445f414d4f554e54000000000000000000000000000000000000815250846123a39092919063ffffffff16565b603d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506112ad7f000000000000000000000000000000000000000000000000000000000000000085837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612579909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9310ccfcb8de723f578a9e4282ea9f521f05ae40dc08f3068dfad528a65ee3c78360405161130a919061451c565b60405180910390a350505050565b60006113db611325611ce2565b846113d6856040518060600160405280602581526020016147a0602591396001600061134f611ce2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123a39092919063ffffffff16565b611cea565b6001905092915050565b60006113f96113f2611ce2565b848461223a565b6001905092915050565b601281565b600081141561144c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611443906142e1565b60405180910390fd5b600061145783610dd5565b9050600061146e8430846114696107fb565b612602565b905060008114611547577f2468f9268c60ad90e2d49edb0032c8a001e733ae888b3ab8e982edf535be1a7684826040516114a99291906141e5565b60405180910390a161150381603d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c8d90919063ffffffff16565b603d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61155460008486856119dc565b603e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115a18484612774565b6115ee3330857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612579909392919063ffffffff16565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5dac0c1b1112564a045ba943c9d50270893e8e826c49be8e7073adc713ab7bd78560405161164b919061451c565b60405180910390a350505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116de90614381565b60405180910390fd5b60005b8282905081101561189f576000603c600085858581811061170757fe5b905060600201604001602081019061171f919061386e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061179e84848481811061176a57fe5b9050606002016040016020810190611782919061386e565b8286868681811061178f57fe5b90506060020160200135612908565b508383838181106117ab57fe5b90506060020160000160208101906117c39190613a67565b8160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083838381811061180957fe5b9050606002016040016020810190611821919061386e565b73ffffffffffffffffffffffffffffffffffffffff167f87fa03892a0556cb6b8f97e6d533a150d4d55fcbf275fff5fa003fa636bcc7fa85858581811061186457fe5b905060600201600001602081019061187c9190613a67565b60405161188991906144a1565b60405180910390a25080806001019150506116ea565b505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600181565b603c6020528060005260406000206000915090508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff16908060010154905083565b600080603e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811415611a34576000915050611b79565b6000611a9b7f0000000000000000000000000000000000000000000000000000000000000000611a8d7f000000000000000000000000000000000000000000000000000000000000000042611eb590919063ffffffff16565b611eb590919063ffffffff16565b905081811115611aae5760009150611b2f565b868111611abb5786611abd565b425b965081871015611ad1578192505050611b79565b611b2c611ae78588611c8d90919063ffffffff16565b611b1e611afd8588612a4590919063ffffffff16565b611b108b8b612a4590919063ffffffff16565b611c8d90919063ffffffff16565b612ab590919063ffffffff16565b91505b81603e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081925050505b949350505050565b6000611b8b612aff565b90506009548111611bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc890614361565b60405180910390fd5b80600981905550611c2586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b08565b611c7284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b22565b611c7b82612b3c565b611c8487612b5a565b50505050505050565b600080828401905083811015611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf906142c1565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5190614401565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc1906142a1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ea8919061451c565b60405180910390a3505050565b6000611ef783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506123a3565b905092915050565b600080611f15853086611f106107fb565b612602565b90506000611f6b82603d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c8d90919063ffffffff16565b905060008214611ffa578315611fc05780603d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f2468f9268c60ad90e2d49edb0032c8a001e733ae888b3ab8e982edf535be1a768683604051611ff19291906141e5565b60405180910390a15b80925050509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d906143a1565b60405180910390fd5b61208282600083612b9e565b6120ed81604051806060016040528060228152602001614730602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123a39092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061214481600254611eb590919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516121a8919061451c565b60405180910390a35050565b6122358363a9059cbb60e01b84846040516024016121d39291906141e5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612d69565b505050565b600061224584610dd5565b905061225384826001611eff565b508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461239257600061229284610dd5565b90506122a084826001611eff565b506000603e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506122f1818587856119dc565b603e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508383148015612344575060008114155b1561238f576000603e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b50505b61239d848484612edb565b50505050565b60008383111582906123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e2919061425f565b60405180910390fd5b5060008385039050809150509392505050565b6000806000905060005b835181101561256e576000603c600086848151811061242357fe5b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006124e682600101548360000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460000160109054906101000a90046fffffffffffffffffffffffffffffffff168987815181106124d557fe5b602002602001015160400151613170565b905061255d61254e8785815181106124fa57fe5b602002602001015160200151838560020160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132bf565b85611c8d90919063ffffffff16565b935050508080600101915050612408565b508091505092915050565b6125fc846323b872dd60e01b85858560405160240161259a93929190614177565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612d69565b50505050565b600080603c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008061269a888588612908565b905080831461276557600087146126b9576126b68782856132bf565b91505b808460020160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fbb123b5c06d5408bbea3c4fef481578175cfb432e3b482c6186f02ed9086585b8360405161275c919061451c565b60405180910390a35b81945050505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127db90614481565b60405180910390fd5b6127f060008383612b9e565b61280581600254611c8d90919063ffffffff16565b60028190555061285c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c8d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516128fc919061451c565b60405180910390a35050565b6000808360010154905060008460000160109054906101000a90046fffffffffffffffffffffffffffffffff169050806fffffffffffffffffffffffffffffffff1642141561295b578192505050612a3e565b600061299b838760000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168488613170565b90508281146129fc578086600101819055508673ffffffffffffffffffffffffffffffffffffffff167f5777ca300dfe5bead41006fbce4389794dbc0ed8d6cccebfaf94630aa04184bc826040516129f3919061451c565b60405180910390a25b428660000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508093505050505b9392505050565b600080831415612a585760009050612aaf565b6000828402905082848281612a6957fe5b0414612aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa190614341565b60405180910390fd5b809150505b92915050565b6000612af783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613308565b905092915050565b60006001905090565b8060039080519060200190612b1e9291906136bf565b5050565b8060049080519060200190612b389291906136bf565b5050565b80600560006101000a81548160ff021916908360ff16021790555050565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bd757612d64565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c37576000612c1684610dd5565b9050612c358482612c308585611eb590919063ffffffff16565b613369565b505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c97576000612c7683610dd5565b9050612c958382612c908585611c8d90919063ffffffff16565b613369565b505b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612d62578073ffffffffffffffffffffffffffffffffffffffff16634a3931498585856040518463ffffffff1660e01b8152600401612d2f93929190614177565b600060405180830381600087803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b505050505b505b505050565b612d888273ffffffffffffffffffffffffffffffffffffffff1661363d565b612dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbe90614461565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612df09190614145565b6000604051808303816000865af19150503d8060008114612e2d576040519150601f19603f3d011682016040523d82523d6000602084013e612e32565b606091505b509150915081612e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6e90614301565b60405180910390fd5b600081511115612ed55780806020019051810190612e9591906139a3565b612ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecb90614421565b60405180910390fd5b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f42906143c1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb290614281565b60405180910390fd5b612fc6838383612b9e565b61303181604051806060016040528060268152602001614752602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123a39092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130c4816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c8d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613163919061451c565b60405180910390a3505050565b6000808414806131805750600082145b8061319c575042836fffffffffffffffffffffffffffffffff16145b806131d957507f0000000000000000000000000000000000000000000000000000000000000000836fffffffffffffffffffffffffffffffff1610155b156131e6578490506132b7565b60007f000000000000000000000000000000000000000000000000000000000000000042116132155742613237565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000613260856fffffffffffffffffffffffffffffffff1683611eb590919063ffffffff16565b90506132b2876132a486613296601260ff16600a0a613288878d612a4590919063ffffffff16565b612a4590919063ffffffff16565b612ab590919063ffffffff16565b611c8d90919063ffffffff16565b925050505b949350505050565b60006132ff601260ff16600a0a6132f16132e28587611eb590919063ffffffff16565b87612a4590919063ffffffff16565b612ab590919063ffffffff16565b90509392505050565b6000808311829061334f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613346919061425f565b60405180910390fd5b50600083858161335b57fe5b049050809150509392505050565b60004390506000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000821415801561346d5750826fffffffffffffffffffffffffffffffff1681600061342b600186611eb590919063ffffffff16565b815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16145b156134d6578381600061348a600186611eb590919063ffffffff16565b815260200190815260200160002060000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506135fa565b6040518060400160405280846fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681525081600084815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050506135b6600183611c8d90919063ffffffff16565b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b7f2cd3c83ddac2953ee75f53265d9ea4463eaf05030e5459a1b7e63819b7ce88f786868660405161362d939291906141ae565b60405180910390a1505050505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561367f57506000801b8214155b92505050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061370057805160ff191683800117855561372e565b8280016001018555821561372e579182015b8281111561372d578251825591602001919060010190613712565b5b50905061373b919061373f565b5090565b5b80821115613758576000816000905550600101613740565b5090565b60008135905061376b816146a5565b92915050565b60008083601f84011261378357600080fd5b8235905067ffffffffffffffff81111561379c57600080fd5b6020830191508360608202830111156137b457600080fd5b9250929050565b6000815190506137ca816146bc565b92915050565b6000813590506137df816146d3565b92915050565b60008083601f8401126137f757600080fd5b8235905067ffffffffffffffff81111561381057600080fd5b60208301915083600182028301111561382857600080fd5b9250929050565b60008135905061383e816146ea565b92915050565b60008135905061385381614701565b92915050565b60008135905061386881614718565b92915050565b60006020828403121561388057600080fd5b600061388e8482850161375c565b91505092915050565b600080604083850312156138aa57600080fd5b60006138b88582860161375c565b92505060206138c98582860161375c565b9150509250929050565b6000806000606084860312156138e857600080fd5b60006138f68682870161375c565b93505060206139078682870161375c565b925050604061391886828701613844565b9150509250925092565b6000806040838503121561393557600080fd5b60006139438582860161375c565b925050602061395485828601613844565b9150509250929050565b6000806020838503121561397157600080fd5b600083013567ffffffffffffffff81111561398b57600080fd5b61399785828601613771565b92509250509250929050565b6000602082840312156139b557600080fd5b60006139c3848285016137bb565b91505092915050565b600080600080600080608087890312156139e557600080fd5b60006139f389828a016137d0565b965050602087013567ffffffffffffffff811115613a1057600080fd5b613a1c89828a016137e5565b9550955050604087013567ffffffffffffffff811115613a3b57600080fd5b613a4789828a016137e5565b93509350506060613a5a89828a01613859565b9150509295509295509295565b600060208284031215613a7957600080fd5b6000613a878482850161382f565b91505092915050565b60008060008060808587031215613aa657600080fd5b6000613ab487828801613844565b9450506020613ac587828801613844565b9350506040613ad68782880161375c565b9250506060613ae787828801613844565b91505092959194509250565b613afc81614584565b82525050565b613b0b81614596565b82525050565b6000613b1c82614552565b613b268185614568565b9350613b36818560208601614661565b80840191505092915050565b613b4b81614607565b82525050565b613b5a8161462b565b82525050565b6000613b6b8261455d565b613b758185614573565b9350613b85818560208601614661565b613b8e81614694565b840191505092915050565b6000613ba6602383614573565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c0c602283614573565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c72601b83614573565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613cb2601383614573565b91507f494e56414c49445f5a45524f5f414d4f554e54000000000000000000000000006000830152602082019050919050565b6000613cf2602083614573565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b6000613d32601583614573565b91507f494e53554646494349454e545f434f4f4c444f574e00000000000000000000006000830152602082019050919050565b6000613d72602183614573565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dd8602e83614573565b91507f436f6e747261637420696e7374616e63652068617320616c726561647920626560008301527f656e20696e697469616c697a65640000000000000000000000000000000000006020830152604082019050919050565b6000613e3e601583614573565b91507f4f4e4c595f454d495353494f4e5f4d414e4147455200000000000000000000006000830152602082019050919050565b6000613e7e602183614573565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee4602583614573565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f4a601783614573565b91507f554e5354414b455f57494e444f575f46494e49534845440000000000000000006000830152602082019050919050565b6000613f8a602483614573565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ff0602a83614573565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000614056601b83614573565b91507f494e56414c49445f42414c414e43455f4f4e5f434f4f4c444f574e00000000006000830152602082019050919050565b6000614096601f83614573565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b60006140d6601f83614573565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b614112816145b4565b82525050565b6141218161464f565b82525050565b614130816145f0565b82525050565b61413f816145fa565b82525050565b60006141518284613b11565b915081905092915050565b60006020820190506141716000830184613af3565b92915050565b600060608201905061418c6000830186613af3565b6141996020830185613af3565b6141a66040830184614127565b949350505050565b60006060820190506141c36000830186613af3565b6141d06020830185614109565b6141dd6040830184614109565b949350505050565b60006040820190506141fa6000830185613af3565b6142076020830184614127565b9392505050565b60006020820190506142236000830184613b02565b92915050565b600060208201905061423e6000830184613b42565b92915050565b60006020820190506142596000830184613b51565b92915050565b600060208201905081810360008301526142798184613b60565b905092915050565b6000602082019050818103600083015261429a81613b99565b9050919050565b600060208201905081810360008301526142ba81613bff565b9050919050565b600060208201905081810360008301526142da81613c65565b9050919050565b600060208201905081810360008301526142fa81613ca5565b9050919050565b6000602082019050818103600083015261431a81613ce5565b9050919050565b6000602082019050818103600083015261433a81613d25565b9050919050565b6000602082019050818103600083015261435a81613d65565b9050919050565b6000602082019050818103600083015261437a81613dcb565b9050919050565b6000602082019050818103600083015261439a81613e31565b9050919050565b600060208201905081810360008301526143ba81613e71565b9050919050565b600060208201905081810360008301526143da81613ed7565b9050919050565b600060208201905081810360008301526143fa81613f3d565b9050919050565b6000602082019050818103600083015261441a81613f7d565b9050919050565b6000602082019050818103600083015261443a81613fe3565b9050919050565b6000602082019050818103600083015261445a81614049565b9050919050565b6000602082019050818103600083015261447a81614089565b9050919050565b6000602082019050818103600083015261449a816140c9565b9050919050565b60006020820190506144b66000830184614118565b92915050565b60006040820190506144d16000830185614109565b6144de6020830184614109565b9392505050565b60006060820190506144fa6000830186614109565b6145076020830185614109565b6145146040830184614127565b949350505050565b60006020820190506145316000830184614127565b92915050565b600060208201905061454c6000830184614136565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061458f826145d0565b9050919050565b60008115159050919050565b60006145ad82614584565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061461282614619565b9050919050565b6000614624826145d0565b9050919050565b60006146368261463d565b9050919050565b6000614648826145d0565b9050919050565b600061465a826145b4565b9050919050565b60005b8381101561467f578082015181840152602081019050614664565b8381111561468e576000848401525b50505050565b6000601f19601f8301169050919050565b6146ae81614584565b81146146b957600080fd5b50565b6146c581614596565b81146146d057600080fd5b50565b6146dc816145a2565b81146146e757600080fd5b50565b6146f3816145b4565b81146146fe57600080fd5b50565b61470a816145f0565b811461471557600080fd5b50565b614721816145fa565b811461472c57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d0222cbbb11baf42f390151b68378afa5067f6895a8d8ab0fdd0fe717c9f608b64736f6c634300060c00330000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb0000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb0000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb0000000000000000000000000000000000000000000000000000000000002710

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

0000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb0000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb0000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb0000000000000000000000000000000000000000000000000000000000002710

-----Decoded View---------------
Arg [0] : stakedToken (address): 0x2acf9d3c107c90d842b953717e6a48a13a61cfeb
Arg [1] : rewardToken (address): 0x2acf9d3c107c90d842b953717e6a48a13a61cfeb
Arg [2] : cooldownSeconds (uint256): 10000
Arg [3] : unstakeWindow (uint256): 10000
Arg [4] : rewardsVault (address): 0x2acf9d3c107c90d842b953717e6a48a13a61cfeb
Arg [5] : emissionManager (address): 0x2acf9d3c107c90d842b953717e6a48a13a61cfeb
Arg [6] : distributionDuration (uint128): 10000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb
Arg [1] : 0000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [4] : 0000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb
Arg [5] : 0000000000000000000000002acf9d3c107c90d842b953717e6a48a13a61cfeb
Arg [6] : 0000000000000000000000000000000000000000000000000000000000002710


Deployed ByteCode Sourcemap

45475:611:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11044:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36302:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12803:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11491:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38551:998;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13298:355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17168:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;35853:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11340:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35260:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36065:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13901:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11645:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35935:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39676:236;;;:::i;:::-;;36242:55;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17243:52;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44602:480;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27791:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36197:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11189:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35894:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40074:521;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14367:332;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12020:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27887:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37612:785;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28552:718;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17592:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27839:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12459:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35810:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27930:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;43354:1097;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37351:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11044:86;11090:13;11119:5;11112:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11044:86;:::o;36302:51::-;;;;;;;;;;;;;;;;;:::o;12803:159::-;12886:4;12899:39;12908:12;:10;:12::i;:::-;12922:7;12931:6;12899:8;:39::i;:::-;12952:4;12945:11;;12803:159;;;;:::o;11491:94::-;11544:7;11567:12;;11560:19;;11491:94;:::o;38551:998::-;38638:1;38628:6;:11;;38620:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;38702:30;38735:16;:28;38752:10;38735:28;;;;;;;;;;;;;;;;38702:61;;38804:44;38831:16;38804:22;:26;;:44;;;;:::i;:::-;38786:15;:62;38770:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;38979:14;38910:65;38930:44;38957:16;38930:22;:26;;:44;;;;:::i;:::-;38910:15;:19;;:65;;;;:::i;:::-;:83;;38894:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;39041:30;39074:21;39084:10;39074:9;:21::i;:::-;39041:54;;39104:22;39139;39130:6;:31;39129:67;;39190:6;39129:67;;;39165:22;39129:67;39104:92;;39205:72;39236:10;39248:22;39272:4;39205:30;:72::i;:::-;;39286:33;39292:10;39304:14;39286:5;:33::i;:::-;39378:1;39332:42;39359:14;39332:22;:26;;:42;;;;:::i;:::-;:47;39328:102;;;39421:1;39390:16;:28;39407:10;39390:28;;;;;;;;;;;;;;;:32;;;;39328:102;39438:53;39472:2;39476:14;39445:12;39438:33;;;;:53;;;;;:::i;:::-;39524:2;39505:38;;39512:10;39505:38;;;39528:14;39505:38;;;;;;:::i;:::-;;;;;;;;38551:998;;;;;:::o;13298:355::-;13424:4;13437:36;13447:6;13455:9;13466:6;13437:9;:36::i;:::-;13480:149;13497:6;13512:12;:10;:12::i;:::-;13533:89;13571:6;13533:89;;;;;;;;;;;;;;;;;:11;:19;13545:6;13533:19;;;;;;;;;;;;;;;:33;13553:12;:10;:12::i;:::-;13533:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;13480:8;:149::i;:::-;13643:4;13636:11;;13298:355;;;;;:::o;17168:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35853:36::-;;;:::o;11340:86::-;11390:5;11411:9;;;;;;;;;;;11404:16;;11340:86;:::o;35260:130::-;35336:7;35359:6;:13;35366:5;35359:13;;;;;;;;;;;;;;;:19;;:25;35379:4;35359:25;;;;;;;;;;;;;;;;35352:32;;35260:130;;;;:::o;36065:39::-;;;:::o;13901:208::-;13989:4;14002:83;14011:12;:10;:12::i;:::-;14025:7;14034:50;14073:10;14034:11;:25;14046:12;:10;:12::i;:::-;14034:25;;;;;;;;;;;;;;;:34;14060:7;14034:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;14002:8;:83::i;:::-;14099:4;14092:11;;13901:208;;;;:::o;11645:113::-;11711:7;11734:9;:18;11744:7;11734:18;;;;;;;;;;;;;;;;11727:25;;11645:113;;;:::o;35935:41::-;;;:::o;39676:236::-;39754:1;39729:21;39739:10;39729:9;:21::i;:::-;:26;;39721:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39857:15;39826:16;:28;39843:10;39826:28;;;;;;;;;;;;;;;:46;;;;39895:10;39886:20;;;;;;;;;;;;39676:236::o;36242:55::-;;;;;;;;;;;;;;;;;:::o;17243:52::-;;;;;;;;;;;;;;;;;:::o;44602:480::-;44673:7;44693:57;44798:1;44759:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;44693:107;;44828:155;;;;;;;;44895:4;44828:155;;;;;;44923:17;44933:6;44923:9;:17::i;:::-;44828:155;;;;44962:13;:11;:13::i;:::-;44828:155;;;44807:15;44823:1;44807:18;;;;;;;;;;;;;:176;;;;44997:79;45030:45;45051:6;45059:15;45030:20;:45::i;:::-;44997:20;:28;45018:6;44997:28;;;;;;;;;;;;;;;;:32;;:79;;;;:::i;:::-;44990:86;;;44602:480;;;:::o;27791:41::-;;;:::o;36197:38::-;;;:::o;11189:90::-;11237:13;11266:7;11259:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11189:90;:::o;35894:36::-;;;:::o;40074:521::-;40149:23;40175:100;40214:10;40233:21;40243:10;40233:9;:21::i;:::-;40263:5;40175:30;:100::i;:::-;40149:126;;40282:21;40317:17;40307:6;:27;40306:56;;40356:6;40306:56;;;40338:15;40306:56;40282:80;;40406:52;40426:13;40406:52;;;;;;;;;;;;;;;;;:15;:19;;:52;;;;;:::i;:::-;40371:20;:32;40392:10;40371:32;;;;;;;;;;;;;;;:87;;;;40467:63;40497:13;40512:2;40516:13;40467:12;:29;;;;:63;;;;;;:::i;:::-;40571:2;40544:45;;40559:10;40544:45;;;40575:13;40544:45;;;;;;:::i;:::-;;;;;;;;40074:521;;;;:::o;14367:332::-;14475:4;14491:184;14508:12;:10;:12::i;:::-;14529:7;14545:123;14594:15;14545:123;;;;;;;;;;;;;;;;;:11;:25;14557:12;:10;:12::i;:::-;14545:25;;;;;;;;;;;;;;;:34;14571:7;14545:34;;;;;;;;;;;;;;;;:38;;:123;;;;;:::i;:::-;14491:8;:184::i;:::-;14689:4;14682:11;;14367:332;;;;:::o;12020:165::-;12106:4;12119:42;12129:12;:10;:12::i;:::-;12143:9;12154:6;12119:9;:42::i;:::-;12175:4;12168:11;;12020:165;;;;:::o;27887:36::-;27921:2;27887:36;:::o;37612:785::-;37706:1;37696:6;:11;;37688:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;37738:21;37762;37772:10;37762:9;:21::i;:::-;37738:45;;37792:22;37817:116;37850:10;37877:4;37891:13;37913;:11;:13::i;:::-;37817:24;:116::i;:::-;37792:141;;37962:1;37944:14;:19;37940:185;;37979:42;37994:10;38006:14;37979:42;;;;;;;:::i;:::-;;;;;;;;38065:52;38102:14;38065:20;:32;38086:10;38065:32;;;;;;;;;;;;;;;;:36;;:52;;;;:::i;:::-;38030:20;:32;38051:10;38030:32;;;;;;;;;;;;;;;:87;;;;37940:185;38164:62;38189:1;38192:6;38200:10;38212:13;38164:24;:62::i;:::-;38133:16;:28;38150:10;38133:28;;;;;;;;;;;;;;;:93;;;;38235:25;38241:10;38253:6;38235:5;:25::i;:::-;38267:72;38305:10;38325:4;38332:6;38274:12;38267:37;;;;:72;;;;;;:::i;:::-;38372:10;38353:38;;38360:10;38353:38;;;38384:6;38353:38;;;;;;:::i;:::-;;;;;;;;37612:785;;;;:::o;28552:718::-;28689:16;28675:30;;:10;:30;;;28667:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28745:9;28740:525;28764:17;;:24;;28760:1;:28;28740:525;;;28804:29;28836:6;:44;28843:17;;28861:1;28843:20;;;;;;;;;;;;:36;;;;;;;;;;:::i;:::-;28836:44;;;;;;;;;;;;;;;28804:76;;28891:146;28927:17;;28945:1;28927:20;;;;;;;;;;;;:36;;;;;;;;;;:::i;:::-;28974:11;28996:17;;29014:1;28996:20;;;;;;;;;;;;:32;;;28891:25;:146::i;:::-;;29080:17;;29098:1;29080:20;;;;;;;;;;;;:38;;;;;;;;;;:::i;:::-;29048:11;:29;;;:70;;;;;;;;;;;;;;;;;;29163:17;;29181:1;29163:20;;;;;;;;;;;;:36;;;;;;;;;;:::i;:::-;29134:123;;;29210:17;;29228:1;29210:20;;;;;;;;;;;;:38;;;;;;;;;;:::i;:::-;29134:123;;;;;;:::i;:::-;;;;;;;;28740:525;28790:3;;;;;;;28740:525;;;;28552:718;;:::o;17592:36::-;;;;;;;;;;;;;:::o;27839:41::-;;;:::o;12459:173::-;12573:7;12599:11;:18;12611:5;12599:18;;;;;;;;;;;;;;;:27;12618:7;12599:27;;;;;;;;;;;;;;;;12592:34;;12459:173;;;;:::o;35810:36::-;35845:1;35810:36;:::o;27930:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43354:1097::-;43523:7;43539:27;43569:16;:27;43586:9;43569:27;;;;;;;;;;;;;;;;43539:57;;43630:1;43607:19;:24;43603:55;;;43649:1;43642:8;;;;;43603:55;43666:37;43706:71;43756:14;43706:37;43726:16;43706:15;:19;;:37;;;;:::i;:::-;:41;;:71;;;;:::i;:::-;43666:111;;43822:19;43790:29;:51;43786:569;;;43874:1;43852:23;;43786:569;;;43956:21;43924:29;:53;43923:115;;44017:21;43923:115;;;43990:15;43923:115;43899:139;;44077:19;44053:21;:43;44049:299;;;44116:19;44109:26;;;;;;44049:299;44184:154;44307:30;44327:9;44307:15;:19;;:30;;;;:::i;:::-;44197:82;44244:34;44258:19;44244:9;:13;;:34;;;;:::i;:::-;44197:42;44217:21;44197:15;:19;;:42;;;;:::i;:::-;:46;;:82;;;;:::i;:::-;44184:122;;:154;;;;:::i;:::-;44162:176;;43786:569;44391:19;44361:16;:27;44378:9;44361:27;;;;;;;;;;;;;;;:49;;;;44426:19;44419:26;;;;43354:1097;;;;;;;:::o;37351:255::-;26157:16;26176:13;:11;:13::i;:::-;26157:32;;26233:23;;26222:8;:34;26200:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;26369:8;26343:23;:34;;;;37491:14:::1;37500:4;;37491:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:14::i;:::-;37512:18;37523:6;;37512:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:18::i;:::-;37537:22;37550:8;37537:12;:22::i;:::-;37566:34;37585:14;37566:18;:34::i;:::-;37351:255:::0;;;;;;;:::o;5760:181::-;5818:7;5838:9;5854:1;5850;:5;5838:17;;5879:1;5874;:6;;5866:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5932:1;5925:8;;;5760:181;;;;:::o;4079:106::-;4132:15;4167:10;4160:17;;4079:106;:::o;16008:348::-;16143:1;16126:19;;:5;:19;;;;16118:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16220:1;16201:21;;:7;:21;;;;16193:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16300:6;16270:11;:18;16282:5;16270:18;;;;;;;;;;;;;;;:27;16289:7;16270:27;;;;;;;;;;;;;;;:36;;;;16334:7;16318:32;;16327:5;16318:32;;;16343:6;16318:32;;;;;;:::i;:::-;;;;;;;;16008:348;;;:::o;6216:136::-;6274:7;6301:43;6305:1;6308;6301:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6294:50;;6216:136;;;;:::o;41964:584::-;42097:7;42113:22;42138:108;42171:4;42192;42206:11;42226:13;:11;:13::i;:::-;42138:24;:108::i;:::-;42113:133;;42253:24;42280:46;42311:14;42280:20;:26;42301:4;42280:26;;;;;;;;;;;;;;;;:30;;:46;;;;:::i;:::-;42253:73;;42357:1;42339:14;:19;42335:176;;42373:13;42369:85;;;42428:16;42399:20;:26;42420:4;42399:26;;;;;;;;;;;;;;;:45;;;;42369:85;42467:36;42482:4;42488:14;42467:36;;;;;;;:::i;:::-;;;;;;;;42335:176;42526:16;42519:23;;;;41964:584;;;;;:::o;15606:396::-;15705:1;15686:21;;:7;:21;;;;15678:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;15754:49;15775:7;15792:1;15796:6;15754:20;:49::i;:::-;15833:68;15856:6;15833:68;;;;;;;;;;;;;;;;;:9;:18;15843:7;15833:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;15812:9;:18;15822:7;15812:18;;;;;;;;;;;;;;;:89;;;;15923:24;15940:6;15923:12;;:16;;:24;;;;:::i;:::-;15908:12;:39;;;;15985:1;15959:37;;15968:7;15959:37;;;15989:6;15959:37;;;;;;:::i;:::-;;;;;;;;15606:396;;:::o;23690:176::-;23773:85;23792:5;23822:23;;;23847:2;23851:5;23799:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23773:18;:85::i;:::-;23690:176;;;:::o;40804:805::-;40910:21;40934:15;40944:4;40934:9;:15::i;:::-;40910:39;;40971:57;41002:4;41008:13;41023:4;40971:30;:57::i;:::-;;41067:2;41059:10;;:4;:10;;;41055:507;;41080:19;41102:13;41112:2;41102:9;:13::i;:::-;41080:35;;41124:53;41155:2;41159:11;41172:4;41124:30;:53::i;:::-;;41188:30;41221:16;:22;41238:4;41221:22;;;;;;;;;;;;;;;;41188:55;;41275:73;41300:22;41324:6;41332:2;41336:11;41275:24;:73::i;:::-;41252:16;:20;41269:2;41252:20;;;;;;;;;;;;;;;:96;;;;41469:6;41452:13;:23;:54;;;;;41505:1;41479:22;:27;;41452:54;41448:107;;;41544:1;41519:16;:22;41536:4;41519:22;;;;;;;;;;;;;;;:26;;;;41448:107;41055:507;;;41570:33;41586:4;41592:2;41596:6;41570:15;:33::i;:::-;40804:805;;;;:::o;6647:226::-;6767:7;6800:1;6795;:6;;6803:12;6787:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;6827:9;6843:1;6839;:5;6827:17;;6864:1;6857:8;;;6647:226;;;;;:::o;32580:678::-;32712:7;32731:22;32756:1;32731:26;;32771:9;32766:459;32790:6;:13;32786:1;:17;32766:459;;;32819:29;32851:6;:33;32858:6;32865:1;32858:9;;;;;;;;;;;;;;:25;;;32851:33;;;;;;;;;;;;;;;32819:65;;32893:18;32914:165;32939:11;:17;;;32967:11;:29;;;;;;;;;;;;32914:165;;33007:11;:31;;;;;;;;;;;;33049:6;33056:1;33049:9;;;;;;;;;;;;;;:21;;;32914:14;:165::i;:::-;32893:186;;33107:110;33136:72;33148:6;33155:1;33148:9;;;;;;;;;;;;;;:22;;;33172:10;33184:11;:17;;:23;33202:4;33184:23;;;;;;;;;;;;;;;;33136:11;:72::i;:::-;33107:14;:18;;:110;;;;:::i;:::-;33090:127;;32766:459;;32805:3;;;;;;;32766:459;;;;33238:14;33231:21;;;32580:678;;;;:::o;23874:204::-;23975:95;23994:5;24024:27;;;24053:4;24059:2;24063:5;24001:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23975:18;:95::i;:::-;23874:204;;;;:::o;30845:663::-;30994:7;31010:27;31040:6;:13;31047:5;31040:13;;;;;;;;;;;;;;;31010:43;;31060:17;31080:9;:15;;:21;31096:4;31080:21;;;;;;;;;;;;;;;;31060:41;;31108:22;31143:16;31162:56;31188:5;31195:9;31206:11;31162:25;:56::i;:::-;31143:75;;31244:8;31231:9;:21;31227:246;;31283:1;31267:12;:17;31263:107;;31314:46;31326:12;31340:8;31350:9;31314:11;:46::i;:::-;31297:63;;31263:107;31404:8;31380:9;:15;;:21;31396:4;31380:21;;;;;;;;;;;;;;;:32;;;;31449:5;31426:39;;31443:4;31426:39;;;31456:8;31426:39;;;;;;:::i;:::-;;;;;;;;31227:246;31488:14;31481:21;;;;;;30845:663;;;;;;:::o;15244:356::-;15343:1;15324:21;;:7;:21;;;;15316:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15390:49;15419:1;15423:7;15432:6;15390:20;:49::i;:::-;15463:24;15480:6;15463:12;;:16;;:24;;;;:::i;:::-;15448:12;:39;;;;15515:30;15538:6;15515:9;:18;15525:7;15515:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;15494:9;:18;15504:7;15494:18;;;;;;;;;;;;;;;:51;;;;15578:7;15557:37;;15574:1;15557:37;;;15587:6;15557:37;;;;;;:::i;:::-;;;;;;;;15244:356;;:::o;29690:740::-;29840:7;29856:16;29875:11;:17;;;29856:36;;29899:27;29929:11;:31;;;;;;;;;;;;29899:61;;29992:19;29973:38;;:15;:38;29969:76;;;30029:8;30022:15;;;;;;29969:76;30053:16;30072:124;30095:8;30112:11;:29;;;;;;;;;;;;30072:124;;30150:19;30178:11;30072:14;:124::i;:::-;30053:143;;30221:8;30209;:20;30205:129;;30260:8;30240:11;:17;;:28;;;;30300:15;30282:44;;;30317:8;30282:44;;;;;;:::i;:::-;;;;;;;;30205:129;30384:15;30342:11;:31;;;:58;;;;;;;;;;;;;;;;;;30416:8;30409:15;;;;;29690:740;;;;;;:::o;7124:471::-;7182:7;7432:1;7427;:6;7423:47;;;7457:1;7450:8;;;;7423:47;7482:9;7498:1;7494;:5;7482:17;;7527:1;7522;7518;:5;;;;;;:10;7510:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;7586:1;7579:8;;;7124:471;;;;;:::o;8063:132::-;8121:7;8148:39;8152:1;8155;8148:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8141:46;;8063:132;;;;:::o;45192:92::-;45247:7;35845:1;45263:15;;45192:92;:::o;16362:78::-;16427:7;16419:5;:15;;;;;;;;;;;;:::i;:::-;;16362:78;:::o;16446:86::-;16517:9;16507:7;:19;;;;;;;;;;;;:::i;:::-;;16446:86;:::o;16538:::-;16607:11;16595:9;;:23;;;;;;;;;;;;;;;;;;16538:86;:::o;17832:126::-;17936:14;17918:15;;:32;;;;;;;;;;;;;;;;;;17832:126;:::o;19411:782::-;19524:2;19516:10;;:4;:10;;;19512:49;;;19543:7;;19512:49;19593:1;19577:18;;:4;:18;;;19573:179;;19612:19;19634:15;19644:4;19634:9;:15::i;:::-;19612:37;;19664:76;19679:4;19693:11;19715:23;19731:6;19715:11;:15;;:23;;;;:::i;:::-;19664:14;:76::i;:::-;19573:179;;19780:1;19766:16;;:2;:16;;;19762:167;;19799:17;19819:13;19829:2;19819:9;:13::i;:::-;19799:33;;19847:70;19862:2;19874:9;19894:21;19908:6;19894:9;:13;;:21;;;;:::i;:::-;19847:14;:70::i;:::-;19762:167;;20019:28;20050:15;;;;;;;;;;;20019:46;;20112:1;20080:34;;:14;:34;;;20076:110;;20131:14;:25;;;20157:4;20163:2;20167:6;20131:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20076:110;19411:782;;;;;:::o;24445:598::-;24533:27;24541:5;24533:25;;;:27::i;:::-;24525:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24670:12;24684:23;24719:5;24711:19;;24731:4;24711:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24669:67;;;;24755:7;24747:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;24836:1;24816:10;:17;:21;24812:224;;;24958:10;24947:30;;;;;;;;;;;;:::i;:::-;24939:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;24812:224;24445:598;;;;:::o;14705:533::-;14845:1;14827:20;;:6;:20;;;;14819:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14925:1;14904:23;;:9;:23;;;;14896:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14976:47;14997:6;15005:9;15016:6;14976:20;:47::i;:::-;15052:71;15074:6;15052:71;;;;;;;;;;;;;;;;;:9;:17;15062:6;15052:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;15032:9;:17;15042:6;15032:17;;;;;;;;;;;;;;;:91;;;;15153:32;15178:6;15153:9;:20;15163:9;15153:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;15130:9;:20;15140:9;15130:20;;;;;;;;;;;;;;;:55;;;;15214:9;15197:35;;15206:6;15197:35;;;15225:6;15197:35;;;;;;:::i;:::-;;;;;;;;14705:533;;;:::o;34320:722::-;34492:7;34541:1;34520:17;:22;:50;;;;34569:1;34553:12;:17;34520:50;:99;;;;34604:15;34581:19;:38;;;34520:99;:149;;;;34653:16;34630:19;:39;;;;34520:149;34508:205;;;34693:12;34686:19;;;;34508:205;34721:24;34766:16;34748:15;:34;:85;;34818:15;34748:85;;;34792:16;34748:85;34721:112;;34840:17;34860:41;34881:19;34860:41;;:16;:20;;:41;;;;:::i;:::-;34840:61;;34922:114;35015:12;34922:78;34987:12;34922:60;27921:2;34963:18;;34959:2;:22;34922:32;34944:9;34922:17;:21;;:32;;;;:::i;:::-;:36;;:60;;;;:::i;:::-;:64;;:78;;;;:::i;:::-;:82;;:114;;;;:::i;:::-;34908:128;;;;34320:722;;;;;;;:::o;33612:245::-;33747:7;33770:81;27921:2;33832:18;;33828:2;:22;33770:53;33795:27;33812:9;33795:12;:16;;:27;;;;:::i;:::-;33770:20;:24;;:53;;;;:::i;:::-;:57;;:81;;;;:::i;:::-;33763:88;;33612:245;;;;;:::o;8683:379::-;8803:7;8902:1;8898;:5;8905:12;8890:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8929:9;8945:1;8941;:5;;;;;;8929:17;;9053:1;9046:8;;;8683:379;;;;;:::o;18232:801::-;18335:20;18366:12;18335:44;;18392:29;18424:16;:23;18441:5;18424:23;;;;;;;;;;;;;;;;18392:55;;18458:52;18513:10;:17;18524:5;18513:17;;;;;;;;;;;;;;;18458:72;;18628:1;18603:21;:26;;:102;;;;;18693:12;18633:72;;:14;:44;18648:28;18674:1;18648:21;:25;;:28;;;;:::i;:::-;18633:44;;;;;;;;;;;:56;;;;;;;;;;;;:72;;;18603:102;18599:370;;;18775:8;18722:14;:44;18737:28;18763:1;18737:21;:25;;:28;;;;:::i;:::-;18722:44;;;;;;;;;;;:50;;;:61;;;;;;;;;;;;;;;;;;18599:370;;;18856:32;;;;;;;;18865:12;18856:32;;;;;;18879:8;18856:32;;;;;18816:14;:37;18831:21;18816:37;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18929:28;18955:1;18929:21;:25;;:28;;;;:::i;:::-;18903:16;:23;18920:5;18903:23;;;;;;;;;;;;;;;:54;;;;18599:370;18986:39;18999:5;19006:8;19016;18986:39;;;;;;;;:::i;:::-;;;;;;;;18232:801;;;;;;:::o;21012:641::-;21072:4;21334:16;21361:19;21383:66;21361:88;;;;21565:7;21553:20;21541:32;;21614:11;21602:8;:23;;:42;;;;;21641:3;21629:15;;:8;:15;;21602:42;21594:51;;;;21012:641;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;194:388::-;;;360:3;353:4;345:6;341:17;337:27;327:2;;378:1;375;368:12;327:2;411:6;398:20;388:30;;438:18;430:6;427:30;424:2;;;470:1;467;460:12;424:2;504:4;496:6;492:17;480:29;;555:3;547:4;539:6;535:17;525:8;521:32;518:41;515:2;;;572:1;569;562:12;515:2;320:262;;;;;:::o;590:128::-;;671:6;665:13;656:22;;683:30;707:5;683:30;:::i;:::-;650:68;;;;:::o;725:172::-;;826:6;813:20;804:29;;838:54;886:5;838:54;:::i;:::-;798:99;;;;:::o;919:337::-;;;1034:3;1027:4;1019:6;1015:17;1011:27;1001:2;;1052:1;1049;1042:12;1001:2;1085:6;1072:20;1062:30;;1112:18;1104:6;1101:30;1098:2;;;1144:1;1141;1134:12;1098:2;1178:4;1170:6;1166:17;1154:29;;1229:3;1221:4;1213:6;1209:17;1199:8;1195:32;1192:41;1189:2;;;1246:1;1243;1236:12;1189:2;994:262;;;;;:::o;1264:130::-;;1344:6;1331:20;1322:29;;1356:33;1383:5;1356:33;:::i;:::-;1316:78;;;;:::o;1401:130::-;;1481:6;1468:20;1459:29;;1493:33;1520:5;1493:33;:::i;:::-;1453:78;;;;:::o;1538:126::-;;1616:6;1603:20;1594:29;;1628:31;1653:5;1628:31;:::i;:::-;1588:76;;;;:::o;1671:241::-;;1775:2;1763:9;1754:7;1750:23;1746:32;1743:2;;;1791:1;1788;1781:12;1743:2;1826:1;1843:53;1888:7;1879:6;1868:9;1864:22;1843:53;:::i;:::-;1833:63;;1805:97;1737:175;;;;:::o;1919:366::-;;;2040:2;2028:9;2019:7;2015:23;2011:32;2008:2;;;2056:1;2053;2046:12;2008:2;2091:1;2108:53;2153:7;2144:6;2133:9;2129:22;2108:53;:::i;:::-;2098:63;;2070:97;2198:2;2216:53;2261:7;2252:6;2241:9;2237:22;2216:53;:::i;:::-;2206:63;;2177:98;2002:283;;;;;:::o;2292:491::-;;;;2430:2;2418:9;2409:7;2405:23;2401:32;2398:2;;;2446:1;2443;2436:12;2398:2;2481:1;2498:53;2543:7;2534:6;2523:9;2519:22;2498:53;:::i;:::-;2488:63;;2460:97;2588:2;2606:53;2651:7;2642:6;2631:9;2627:22;2606:53;:::i;:::-;2596:63;;2567:98;2696:2;2714:53;2759:7;2750:6;2739:9;2735:22;2714:53;:::i;:::-;2704:63;;2675:98;2392:391;;;;;:::o;2790:366::-;;;2911:2;2899:9;2890:7;2886:23;2882:32;2879:2;;;2927:1;2924;2917:12;2879:2;2962:1;2979:53;3024:7;3015:6;3004:9;3000:22;2979:53;:::i;:::-;2969:63;;2941:97;3069:2;3087:53;3132:7;3123:6;3112:9;3108:22;3087:53;:::i;:::-;3077:63;;3048:98;2873:283;;;;;:::o;3163:469::-;;;3338:2;3326:9;3317:7;3313:23;3309:32;3306:2;;;3354:1;3351;3344:12;3306:2;3417:1;3406:9;3402:17;3389:31;3440:18;3432:6;3429:30;3426:2;;;3472:1;3469;3462:12;3426:2;3500:116;3608:7;3599:6;3588:9;3584:22;3500:116;:::i;:::-;3482:134;;;;3368:254;3300:332;;;;;:::o;3639:257::-;;3751:2;3739:9;3730:7;3726:23;3722:32;3719:2;;;3767:1;3764;3757:12;3719:2;3802:1;3819:61;3872:7;3863:6;3852:9;3848:22;3819:61;:::i;:::-;3809:71;;3781:105;3713:183;;;;:::o;3903:907::-;;;;;;;4117:3;4105:9;4096:7;4092:23;4088:33;4085:2;;;4134:1;4131;4124:12;4085:2;4169:1;4186:74;4252:7;4243:6;4232:9;4228:22;4186:74;:::i;:::-;4176:84;;4148:118;4325:2;4314:9;4310:18;4297:32;4349:18;4341:6;4338:30;4335:2;;;4381:1;4378;4371:12;4335:2;4409:65;4466:7;4457:6;4446:9;4442:22;4409:65;:::i;:::-;4391:83;;;;4276:204;4539:2;4528:9;4524:18;4511:32;4563:18;4555:6;4552:30;4549:2;;;4595:1;4592;4585:12;4549:2;4623:65;4680:7;4671:6;4660:9;4656:22;4623:65;:::i;:::-;4605:83;;;;4490:204;4725:2;4743:51;4786:7;4777:6;4766:9;4762:22;4743:51;:::i;:::-;4733:61;;4704:96;4079:731;;;;;;;;:::o;4817:241::-;;4921:2;4909:9;4900:7;4896:23;4892:32;4889:2;;;4937:1;4934;4927:12;4889:2;4972:1;4989:53;5034:7;5025:6;5014:9;5010:22;4989:53;:::i;:::-;4979:63;;4951:97;4883:175;;;;:::o;5065:617::-;;;;;5220:3;5208:9;5199:7;5195:23;5191:33;5188:2;;;5237:1;5234;5227:12;5188:2;5272:1;5289:53;5334:7;5325:6;5314:9;5310:22;5289:53;:::i;:::-;5279:63;;5251:97;5379:2;5397:53;5442:7;5433:6;5422:9;5418:22;5397:53;:::i;:::-;5387:63;;5358:98;5487:2;5505:53;5550:7;5541:6;5530:9;5526:22;5505:53;:::i;:::-;5495:63;;5466:98;5595:2;5613:53;5658:7;5649:6;5638:9;5634:22;5613:53;:::i;:::-;5603:63;;5574:98;5182:500;;;;;;;:::o;5689:113::-;5772:24;5790:5;5772:24;:::i;:::-;5767:3;5760:37;5754:48;;:::o;5809:104::-;5886:21;5901:5;5886:21;:::i;:::-;5881:3;5874:34;5868:45;;:::o;5920:356::-;;6048:38;6080:5;6048:38;:::i;:::-;6098:88;6179:6;6174:3;6098:88;:::i;:::-;6091:95;;6191:52;6236:6;6231:3;6224:4;6217:5;6213:16;6191:52;:::i;:::-;6264:6;6259:3;6255:16;6248:23;;6028:248;;;;;:::o;6283:152::-;6379:50;6423:5;6379:50;:::i;:::-;6374:3;6367:63;6361:74;;:::o;6442:168::-;6546:58;6598:5;6546:58;:::i;:::-;6541:3;6534:71;6528:82;;:::o;6617:347::-;;6729:39;6762:5;6729:39;:::i;:::-;6780:71;6844:6;6839:3;6780:71;:::i;:::-;6773:78;;6856:52;6901:6;6896:3;6889:4;6882:5;6878:16;6856:52;:::i;:::-;6929:29;6951:6;6929:29;:::i;:::-;6924:3;6920:39;6913:46;;6709:255;;;;;:::o;6972:372::-;;7132:67;7196:2;7191:3;7132:67;:::i;:::-;7125:74;;7232:34;7228:1;7223:3;7219:11;7212:55;7301:5;7296:2;7291:3;7287:12;7280:27;7335:2;7330:3;7326:12;7319:19;;7118:226;;;:::o;7353:371::-;;7513:67;7577:2;7572:3;7513:67;:::i;:::-;7506:74;;7613:34;7609:1;7604:3;7600:11;7593:55;7682:4;7677:2;7672:3;7668:12;7661:26;7715:2;7710:3;7706:12;7699:19;;7499:225;;;:::o;7733:327::-;;7893:67;7957:2;7952:3;7893:67;:::i;:::-;7886:74;;7993:29;7989:1;7984:3;7980:11;7973:50;8051:2;8046:3;8042:12;8035:19;;7879:181;;;:::o;8069:319::-;;8229:67;8293:2;8288:3;8229:67;:::i;:::-;8222:74;;8329:21;8325:1;8320:3;8316:11;8309:42;8379:2;8374:3;8370:12;8363:19;;8215:173;;;:::o;8397:332::-;;8557:67;8621:2;8616:3;8557:67;:::i;:::-;8550:74;;8657:34;8653:1;8648:3;8644:11;8637:55;8720:2;8715:3;8711:12;8704:19;;8543:186;;;:::o;8738:321::-;;8898:67;8962:2;8957:3;8898:67;:::i;:::-;8891:74;;8998:23;8994:1;8989:3;8985:11;8978:44;9050:2;9045:3;9041:12;9034:19;;8884:175;;;:::o;9068:370::-;;9228:67;9292:2;9287:3;9228:67;:::i;:::-;9221:74;;9328:34;9324:1;9319:3;9315:11;9308:55;9397:3;9392:2;9387:3;9383:12;9376:25;9429:2;9424:3;9420:12;9413:19;;9214:224;;;:::o;9447:383::-;;9607:67;9671:2;9666:3;9607:67;:::i;:::-;9600:74;;9707:34;9703:1;9698:3;9694:11;9687:55;9776:16;9771:2;9766:3;9762:12;9755:38;9821:2;9816:3;9812:12;9805:19;;9593:237;;;:::o;9839:321::-;;9999:67;10063:2;10058:3;9999:67;:::i;:::-;9992:74;;10099:23;10095:1;10090:3;10086:11;10079:44;10151:2;10146:3;10142:12;10135:19;;9985:175;;;:::o;10169:370::-;;10329:67;10393:2;10388:3;10329:67;:::i;:::-;10322:74;;10429:34;10425:1;10420:3;10416:11;10409:55;10498:3;10493:2;10488:3;10484:12;10477:25;10530:2;10525:3;10521:12;10514:19;;10315:224;;;:::o;10548:374::-;;10708:67;10772:2;10767:3;10708:67;:::i;:::-;10701:74;;10808:34;10804:1;10799:3;10795:11;10788:55;10877:7;10872:2;10867:3;10863:12;10856:29;10913:2;10908:3;10904:12;10897:19;;10694:228;;;:::o;10931:323::-;;11091:67;11155:2;11150:3;11091:67;:::i;:::-;11084:74;;11191:25;11187:1;11182:3;11178:11;11171:46;11245:2;11240:3;11236:12;11229:19;;11077:177;;;:::o;11263:373::-;;11423:67;11487:2;11482:3;11423:67;:::i;:::-;11416:74;;11523:34;11519:1;11514:3;11510:11;11503:55;11592:6;11587:2;11582:3;11578:12;11571:28;11627:2;11622:3;11618:12;11611:19;;11409:227;;;:::o;11645:379::-;;11805:67;11869:2;11864:3;11805:67;:::i;:::-;11798:74;;11905:34;11901:1;11896:3;11892:11;11885:55;11974:12;11969:2;11964:3;11960:12;11953:34;12015:2;12010:3;12006:12;11999:19;;11791:233;;;:::o;12033:327::-;;12193:67;12257:2;12252:3;12193:67;:::i;:::-;12186:74;;12293:29;12289:1;12284:3;12280:11;12273:50;12351:2;12346:3;12342:12;12335:19;;12179:181;;;:::o;12369:331::-;;12529:67;12593:2;12588:3;12529:67;:::i;:::-;12522:74;;12629:33;12625:1;12620:3;12616:11;12609:54;12691:2;12686:3;12682:12;12675:19;;12515:185;;;:::o;12709:331::-;;12869:67;12933:2;12928:3;12869:67;:::i;:::-;12862:74;;12969:33;12965:1;12960:3;12956:11;12949:54;13031:2;13026:3;13022:12;13015:19;;12855:185;;;:::o;13048:113::-;13131:24;13149:5;13131:24;:::i;:::-;13126:3;13119:37;13113:48;;:::o;13168:126::-;13251:37;13282:5;13251:37;:::i;:::-;13246:3;13239:50;13233:61;;:::o;13301:113::-;13384:24;13402:5;13384:24;:::i;:::-;13379:3;13372:37;13366:48;;:::o;13421:107::-;13500:22;13516:5;13500:22;:::i;:::-;13495:3;13488:35;13482:46;;:::o;13535:271::-;;13688:93;13777:3;13768:6;13688:93;:::i;:::-;13681:100;;13798:3;13791:10;;13669:137;;;;:::o;13813:222::-;;13940:2;13929:9;13925:18;13917:26;;13954:71;14022:1;14011:9;14007:17;13998:6;13954:71;:::i;:::-;13911:124;;;;:::o;14042:444::-;;14225:2;14214:9;14210:18;14202:26;;14239:71;14307:1;14296:9;14292:17;14283:6;14239:71;:::i;:::-;14321:72;14389:2;14378:9;14374:18;14365:6;14321:72;:::i;:::-;14404;14472:2;14461:9;14457:18;14448:6;14404:72;:::i;:::-;14196:290;;;;;;:::o;14493:444::-;;14676:2;14665:9;14661:18;14653:26;;14690:71;14758:1;14747:9;14743:17;14734:6;14690:71;:::i;:::-;14772:72;14840:2;14829:9;14825:18;14816:6;14772:72;:::i;:::-;14855;14923:2;14912:9;14908:18;14899:6;14855:72;:::i;:::-;14647:290;;;;;;:::o;14944:333::-;;15099:2;15088:9;15084:18;15076:26;;15113:71;15181:1;15170:9;15166:17;15157:6;15113:71;:::i;:::-;15195:72;15263:2;15252:9;15248:18;15239:6;15195:72;:::i;:::-;15070:207;;;;;:::o;15284:210::-;;15405:2;15394:9;15390:18;15382:26;;15419:65;15481:1;15470:9;15466:17;15457:6;15419:65;:::i;:::-;15376:118;;;;:::o;15501:248::-;;15641:2;15630:9;15626:18;15618:26;;15655:84;15736:1;15725:9;15721:17;15712:6;15655:84;:::i;:::-;15612:137;;;;:::o;15756:264::-;;15904:2;15893:9;15889:18;15881:26;;15918:92;16007:1;15996:9;15992:17;15983:6;15918:92;:::i;:::-;15875:145;;;;:::o;16027:310::-;;16174:2;16163:9;16159:18;16151:26;;16224:9;16218:4;16214:20;16210:1;16199:9;16195:17;16188:47;16249:78;16322:4;16313:6;16249:78;:::i;:::-;16241:86;;16145:192;;;;:::o;16344:416::-;;16544:2;16533:9;16529:18;16521:26;;16594:9;16588:4;16584:20;16580:1;16569:9;16565:17;16558:47;16619:131;16745:4;16619:131;:::i;:::-;16611:139;;16515:245;;;:::o;16767:416::-;;16967:2;16956:9;16952:18;16944:26;;17017:9;17011:4;17007:20;17003:1;16992:9;16988:17;16981:47;17042:131;17168:4;17042:131;:::i;:::-;17034:139;;16938:245;;;:::o;17190:416::-;;17390:2;17379:9;17375:18;17367:26;;17440:9;17434:4;17430:20;17426:1;17415:9;17411:17;17404:47;17465:131;17591:4;17465:131;:::i;:::-;17457:139;;17361:245;;;:::o;17613:416::-;;17813:2;17802:9;17798:18;17790:26;;17863:9;17857:4;17853:20;17849:1;17838:9;17834:17;17827:47;17888:131;18014:4;17888:131;:::i;:::-;17880:139;;17784:245;;;:::o;18036:416::-;;18236:2;18225:9;18221:18;18213:26;;18286:9;18280:4;18276:20;18272:1;18261:9;18257:17;18250:47;18311:131;18437:4;18311:131;:::i;:::-;18303:139;;18207:245;;;:::o;18459:416::-;;18659:2;18648:9;18644:18;18636:26;;18709:9;18703:4;18699:20;18695:1;18684:9;18680:17;18673:47;18734:131;18860:4;18734:131;:::i;:::-;18726:139;;18630:245;;;:::o;18882:416::-;;19082:2;19071:9;19067:18;19059:26;;19132:9;19126:4;19122:20;19118:1;19107:9;19103:17;19096:47;19157:131;19283:4;19157:131;:::i;:::-;19149:139;;19053:245;;;:::o;19305:416::-;;19505:2;19494:9;19490:18;19482:26;;19555:9;19549:4;19545:20;19541:1;19530:9;19526:17;19519:47;19580:131;19706:4;19580:131;:::i;:::-;19572:139;;19476:245;;;:::o;19728:416::-;;19928:2;19917:9;19913:18;19905:26;;19978:9;19972:4;19968:20;19964:1;19953:9;19949:17;19942:47;20003:131;20129:4;20003:131;:::i;:::-;19995:139;;19899:245;;;:::o;20151:416::-;;20351:2;20340:9;20336:18;20328:26;;20401:9;20395:4;20391:20;20387:1;20376:9;20372:17;20365:47;20426:131;20552:4;20426:131;:::i;:::-;20418:139;;20322:245;;;:::o;20574:416::-;;20774:2;20763:9;20759:18;20751:26;;20824:9;20818:4;20814:20;20810:1;20799:9;20795:17;20788:47;20849:131;20975:4;20849:131;:::i;:::-;20841:139;;20745:245;;;:::o;20997:416::-;;21197:2;21186:9;21182:18;21174:26;;21247:9;21241:4;21237:20;21233:1;21222:9;21218:17;21211:47;21272:131;21398:4;21272:131;:::i;:::-;21264:139;;21168:245;;;:::o;21420:416::-;;21620:2;21609:9;21605:18;21597:26;;21670:9;21664:4;21660:20;21656:1;21645:9;21641:17;21634:47;21695:131;21821:4;21695:131;:::i;:::-;21687:139;;21591:245;;;:::o;21843:416::-;;22043:2;22032:9;22028:18;22020:26;;22093:9;22087:4;22083:20;22079:1;22068:9;22064:17;22057:47;22118:131;22244:4;22118:131;:::i;:::-;22110:139;;22014:245;;;:::o;22266:416::-;;22466:2;22455:9;22451:18;22443:26;;22516:9;22510:4;22506:20;22502:1;22491:9;22487:17;22480:47;22541:131;22667:4;22541:131;:::i;:::-;22533:139;;22437:245;;;:::o;22689:416::-;;22889:2;22878:9;22874:18;22866:26;;22939:9;22933:4;22929:20;22925:1;22914:9;22910:17;22903:47;22964:131;23090:4;22964:131;:::i;:::-;22956:139;;22860:245;;;:::o;23112:416::-;;23312:2;23301:9;23297:18;23289:26;;23362:9;23356:4;23352:20;23348:1;23337:9;23333:17;23326:47;23387:131;23513:4;23387:131;:::i;:::-;23379:139;;23283:245;;;:::o;23535:222::-;;23662:2;23651:9;23647:18;23639:26;;23676:71;23744:1;23733:9;23729:17;23720:6;23676:71;:::i;:::-;23633:124;;;;:::o;23764:333::-;;23919:2;23908:9;23904:18;23896:26;;23933:71;24001:1;23990:9;23986:17;23977:6;23933:71;:::i;:::-;24015:72;24083:2;24072:9;24068:18;24059:6;24015:72;:::i;:::-;23890:207;;;;;:::o;24104:444::-;;24287:2;24276:9;24272:18;24264:26;;24301:71;24369:1;24358:9;24354:17;24345:6;24301:71;:::i;:::-;24383:72;24451:2;24440:9;24436:18;24427:6;24383:72;:::i;:::-;24466;24534:2;24523:9;24519:18;24510:6;24466:72;:::i;:::-;24258:290;;;;;;:::o;24555:222::-;;24682:2;24671:9;24667:18;24659:26;;24696:71;24764:1;24753:9;24749:17;24740:6;24696:71;:::i;:::-;24653:124;;;;:::o;24784:214::-;;24907:2;24896:9;24892:18;24884:26;;24921:67;24985:1;24974:9;24970:17;24961:6;24921:67;:::i;:::-;24878:120;;;;:::o;25005:121::-;;25098:5;25092:12;25082:22;;25063:63;;;:::o;25133:122::-;;25227:5;25221:12;25211:22;;25192:63;;;:::o;25263:144::-;;25398:3;25383:18;;25376:31;;;;:::o;25416:163::-;;25531:6;25526:3;25519:19;25568:4;25563:3;25559:14;25544:29;;25512:67;;;;:::o;25587:91::-;;25649:24;25667:5;25649:24;:::i;:::-;25638:35;;25632:46;;;:::o;25685:85::-;;25758:5;25751:13;25744:21;25733:32;;25727:43;;;:::o;25777:112::-;;25860:24;25878:5;25860:24;:::i;:::-;25849:35;;25843:46;;;:::o;25896:113::-;;25969:34;25962:5;25958:46;25947:57;;25941:68;;;:::o;26016:121::-;;26089:42;26082:5;26078:54;26067:65;;26061:76;;;:::o;26144:72::-;;26206:5;26195:16;;26189:27;;;:::o;26223:81::-;;26294:4;26287:5;26283:16;26272:27;;26266:38;;;:::o;26311:147::-;;26403:50;26447:5;26403:50;:::i;:::-;26390:63;;26384:74;;;:::o;26465:121::-;;26557:24;26575:5;26557:24;:::i;:::-;26544:37;;26538:48;;;:::o;26593:163::-;;26693:58;26745:5;26693:58;:::i;:::-;26680:71;;26674:82;;;:::o;26763:129::-;;26863:24;26881:5;26863:24;:::i;:::-;26850:37;;26844:48;;;:::o;26899:108::-;;26978:24;26996:5;26978:24;:::i;:::-;26965:37;;26959:48;;;:::o;27015:268::-;27080:1;27087:101;27101:6;27098:1;27095:13;27087:101;;;27177:1;27172:3;27168:11;27162:18;27158:1;27153:3;27149:11;27142:39;27123:2;27120:1;27116:10;27111:15;;27087:101;;;27203:6;27200:1;27197:13;27194:2;;;27268:1;27259:6;27254:3;27250:16;27243:27;27194:2;27064:219;;;;:::o;27291:97::-;;27379:2;27375:7;27370:2;27363:5;27359:14;27355:28;27345:38;;27339:49;;;:::o;27396:117::-;27465:24;27483:5;27465:24;:::i;:::-;27458:5;27455:35;27445:2;;27504:1;27501;27494:12;27445:2;27439:74;:::o;27520:111::-;27586:21;27601:5;27586:21;:::i;:::-;27579:5;27576:32;27566:2;;27622:1;27619;27612:12;27566:2;27560:71;:::o;27638:159::-;27728:45;27767:5;27728:45;:::i;:::-;27721:5;27718:56;27708:2;;27788:1;27785;27778:12;27708:2;27702:95;:::o;27804:117::-;27873:24;27891:5;27873:24;:::i;:::-;27866:5;27863:35;27853:2;;27912:1;27909;27902:12;27853:2;27847:74;:::o;27928:117::-;27997:24;28015:5;27997:24;:::i;:::-;27990:5;27987:35;27977:2;;28036:1;28033;28026:12;27977:2;27971:74;:::o;28052:113::-;28119:22;28135:5;28119:22;:::i;:::-;28112:5;28109:33;28099:2;;28156:1;28153;28146:12;28099:2;28093:72;:::o

Swarm Source

ipfs://d0222cbbb11baf42f390151b68378afa5067f6895a8d8ab0fdd0fe717c9f608b
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading