ETH Price: $3,503.46 (-0.17%)
Gas: 2 Gwei

Token

xBMF (XBMF)
 

Overview

Max Total Supply

2,376,835,454.098958333333332793 XBMF

Holders

317

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
craigpaton.eth
Balance
10,000 XBMF

Value
$0.00
0x42cf62449008fb43d086e1f7e31c95cbbbfc2a8a
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
XBMF

Compiler Version
v0.6.2+commit.bacdbe57

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.6.2;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.6.2;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/math/SafeMath.sol



pragma solidity ^0.6.2;

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

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    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) {
        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: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
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");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity ^0.6.2;


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

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

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

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

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

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

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

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal 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);
    }

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal 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);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.6.2;

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// IERC165.sol

pragma solidity ^0.6.2;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// IERC721.sol

pragma solidity ^0.6.2;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
      * - `from` cannot be the zero address.
      * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

interface IBlootMF is  IERC721 {
    function isDiamond(address diamond) external view returns (bool);
    function isFounder(address founder) external view returns (bool);
}

// File: contracts/XBMF.sol

pragma solidity 0.6.2;

contract XBMF is ERC20("xBMF", "XBMF"), Ownable {
    
    uint256 constant private MAX_SUPPLY = 3000000000 ether;
    uint256 constant private INITIAL_NFT_REWARD = 10000 ether;
    uint256 constant private INITIAL_DIAMOND_REWARD = 50000 ether;
    uint256 constant private INITIAL_FOUNDER_REWARD = 250000 ether;
    uint256 constant private REWARD_PER_DAY = 10 ether;
    uint256 constant private REWARD_PER_DAY_FOR_LEVEL_ONE = 13 ether;
    uint256 constant private REWARD_PER_DAY_FOR_LEVEL_TWO = 17 ether;
    uint256 constant private REWARD_PER_DAY_FOR_LEVEL_THREE = 25 ether;
    uint256 constant private SECS_IN_DAY = 86400;
    uint256 constant private REWARD_DENOMINATOR = 1000000000000000000;
    
    address constant private BLOOTMF_ADDRESS = 0xff006C70Ccfe8552E344B299d28AA84CEfda8B11;
    uint256 private contractBirthTime;
    uint256 private accClaimCounter;
    uint256 private nftRewardCounter;
    uint256 private diamondRewardCounter;
    uint256 private founderRewardCounter;
    address private minter;

    mapping(uint256 => uint256) private rewards;
    mapping(uint256 => uint256) private lastUpdate;
    mapping(uint256 => uint256) private stakeBoosterLevel;
    mapping(uint256 => uint256) private rewardForLevel;
    mapping(address => bool) private founderClaims;
    mapping(address => bool) private diamondClaims;
    mapping(uint => bool) private blootMFClaims;
    
    IBlootMF BlootMF = IBlootMF(BLOOTMF_ADDRESS);
    
    modifier onlyMinter {
        if (msg.sender != minter) revert();
        _;
    }
    
    constructor() public {
        contractBirthTime = now;
        rewardForLevel[0] = REWARD_PER_DAY;
        rewardForLevel[1] = REWARD_PER_DAY_FOR_LEVEL_ONE;
        rewardForLevel[2] = REWARD_PER_DAY_FOR_LEVEL_TWO;
        rewardForLevel[3] = REWARD_PER_DAY_FOR_LEVEL_THREE;
    }
    
    function hasClaimedFounderInitialReward(address founder) public view returns (bool) {
        return founderClaims[founder];
    }
    
    function hasClaimedDiamondInitialReward(address diamond) public view returns (bool) {
        return diamondClaims[diamond];
    }
    
    function hasClaimedBlootMFInitialReward(uint256 nftId) public view returns (bool) {
        return blootMFClaims[nftId];
    }
    
    function claimFounderInitialReward() public {
        require(BlootMF.isFounder(msg.sender) == true, "Your account isn't a Founder");
        require(founderClaims[msg.sender] == false, "You have already claimed this reward");
        founderClaims[msg.sender] = true;
        founderRewardCounter += 1;
        _mint(msg.sender,INITIAL_FOUNDER_REWARD);
    }
    
    function claimDiamondInitialReward() public {
        require(BlootMF.isDiamond(msg.sender) == true, "Your account isn't a Diamond");
        require(diamondClaims[msg.sender] == false, "You have already claimed this reward");
        diamondClaims[msg.sender] = true;
        diamondRewardCounter += 1;
        _mint(msg.sender, INITIAL_DIAMOND_REWARD);
    }
    
    function claimBlootMFInitialReward(uint256 nftId) public {
        require(BlootMF.ownerOf(nftId) ==  msg.sender, "You don't hold this NFT in your wallet");
        require(blootMFClaims[nftId] == false, "You have already claimed this reward");
        blootMFClaims[nftId] = true;
        nftRewardCounter += 1;
        _mint(msg.sender, INITIAL_NFT_REWARD);
    }
    
    function getDiamondRewardCount() public view returns (uint256) {
        return diamondRewardCounter;
    }
    
    function getFounderRewardCount() public view returns (uint256) {
        return founderRewardCounter;
    }
    
    function getNftRewardCount() public view returns (uint256) {
        return nftRewardCounter;
    }
    
    function viewAccumulatedDecimalRewards(uint256 nftId) public view returns (uint256[2] memory) {
        uint256 time = block.timestamp;
        uint256 lastTime = lastUpdate[nftId];
        if (lastTime == 0) {
            lastTime = contractBirthTime;
        }
        uint256 level = stakeBoosterLevel[nftId];
        uint256 dailyReward = rewardForLevel[level];
        uint256 timePassed = time.sub(lastTime);
        uint256 additionalRewards = dailyReward.mul(timePassed).div(SECS_IN_DAY);
        uint256[2] memory res =  [rewards[nftId].add(additionalRewards), REWARD_DENOMINATOR];
        return res;
    }
    
    function viewAccumulatedFullTokenRewards(uint256 nftId) public view returns (uint256) {
        uint256 time = block.timestamp;
        uint256 lastTime = lastUpdate[nftId];
        if (lastTime == 0) {
            lastTime = contractBirthTime;
        }
        uint256 level = stakeBoosterLevel[nftId];
        uint256 dailyReward = rewardForLevel[level];
        uint256 timePassed = time.sub(lastTime);
        uint256 additionalRewards = dailyReward.mul(timePassed).div(SECS_IN_DAY);
        return rewards[nftId].add(additionalRewards).div(REWARD_DENOMINATOR);
    }
    
    function claimAccumulatedRewards(uint256 nftId) public {
        require(BlootMF.ownerOf(nftId) ==  msg.sender, "You don't own this NFT");
        require(totalSupply() <= MAX_SUPPLY, "Mint can't exceed max supply");
        uint256 level = stakeBoosterLevel[nftId];
        uint256 dailyReward = rewardForLevel[level];
        
        uint256 time = block.timestamp;
        uint256 lastTime = lastUpdate[nftId];
        if (lastTime == 0) {
            lastTime = contractBirthTime;
        }
        
        uint256 timePassed = time.sub(lastTime);
        uint256 additionalRewards = dailyReward.mul(timePassed).div(SECS_IN_DAY);
        rewards[nftId] = rewards[nftId].add(additionalRewards);

        lastUpdate[nftId] = time;
        uint256 payout = rewards[nftId];
        
        rewards[nftId] = 0;
        accClaimCounter += 1;
        _mint(msg.sender, payout);
    }
    
    function addLevel(uint256[] memory nftIds, uint256 level) public onlyOwner {
        for (uint i=0; i < nftIds.length; i++) {
            uint256 nftId = nftIds[i];
            stakeBoosterLevel[nftId] = level;
        }
    }
    
    function isFounder(address founder) public view returns (bool) {
        return BlootMF.isFounder(founder);
    }
    
    function isDiamond(address diamond) public view returns (bool) {
        return BlootMF.isDiamond(diamond);
    }
    
    function getTotalAccClaimCount() public view returns (uint256) {
        return accClaimCounter;
    }
    
    function getContractBirthTime() public view returns (uint256) {
        return contractBirthTime;
    }
    
    function getTimeSinceContractBirth() public view returns (uint256) {
        return now - contractBirthTime;
    }
    
    function getMaxSupply() public pure returns (uint256) {
        return MAX_SUPPLY;
    }
    
    function setMinter(address _minter) public onlyOwner {
        minter = _minter;
    }
    
    function getMinter() public view returns (address) {
        return minter;
    }
    
    function ownerMint(address _to, uint256 _amount) public onlyOwner {
        require(totalSupply().add(_amount) <= MAX_SUPPLY, "Mint can't exceed max supply");
        _mint(_to, _amount);
    }
    
    function minterMint(address _to, uint256 _amount) external onlyMinter {
        require(totalSupply().add(_amount) <= MAX_SUPPLY, "Mint can't exceed max supply");
        _mint(_to, _amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"addLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"claimAccumulatedRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"claimBlootMFInitialReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimDiamondInitialReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFounderInitialReward","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":[],"name":"getContractBirthTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDiamondRewardCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFounderRewardCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNftRewardCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTimeSinceContractBirth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalAccClaimCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"hasClaimedBlootMFInitialReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"diamond","type":"address"}],"name":"hasClaimedDiamondInitialReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"founder","type":"address"}],"name":"hasClaimedFounderInitialReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"diamond","type":"address"}],"name":"isDiamond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"founder","type":"address"}],"name":"isFounder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"minterMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"viewAccumulatedDecimalRewards","outputs":[{"internalType":"uint256[2]","name":"","type":"uint256[2]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"viewAccumulatedFullTokenRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405273ff006c70ccfe8552e344b299d28aa84cefda8b11601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600481526020017f78424d46000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f58424d46000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000eb9291906200026d565b508060049080519060200190620001049291906200026d565b506012600560006101000a81548160ff021916908360ff16021790555050506000620001356200026560201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35042600681905550678ac7230489e80000600f60008081526020019081526020016000208190555067b469471f80140000600f6000600181526020019081526020016000208190555067ebec21ee1da40000600f6000600281526020019081526020016000208190555068015af1d78b58c40000600f600060038152602001908152602001600020819055506200031c565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002b057805160ff1916838001178555620002e1565b82800160010185558215620002e1579182015b82811115620002e0578251825591602001919060010190620002c3565b5b509050620002f09190620002f4565b5090565b6200031991905b8082111562000315576000816000905550600101620002fb565b5090565b90565b613476806200032c6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80636c1178af11610130578063a9059cbb116100b8578063db9844d71161007c578063db9844d714610ae4578063dd62ed3e14610b40578063f2fde38b14610bb8578063f366751714610bfc578063fca3b5aa14610c4657610227565b8063a9059cbb14610924578063ae0817681461098a578063b728402a146109a8578063c4f21231146109c6578063c7b5784114610a8857610227565b80638408763c116100ff5780638408763c146107a15780638da5cb5b146107e757806391ffec581461083157806395d89b411461083b578063a457c2d7146108be57610227565b80636c1178af146106c557806370a08231146106e3578063715018a61461073b5780637fd65a3c1461074557610227565b8063313ce567116101b3578063484b973c11610182578063484b973c146105ff5780634c0f38c21461064d57806352382cb41461066b5780636058a9f41461068957806361120201146106a757610227565b8063313ce56714610529578063395093511461054d5780633a0c0907146105b357806343a5aae8146105bd57610227565b806318160ddd116101fa57806318160ddd146103ad5780631e20e752146103cb57806321f314ca14610427578063224014051461047557806323b872dd146104a357610227565b8063037c36ce1461022c57806306fdde031461025a578063095ea7b3146102dd5780630e58339f14610343575b600080fd5b6102586004803603602081101561024257600080fd5b8101908080359060200190929190505050610c8a565b005b610262610e8c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a2578082015181840152602081019050610287565b50505050905090810190601f1680156102cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610329600480360360408110156102f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f2e565b604051808215151515815260200191505060405180910390f35b61036f6004803603602081101561035957600080fd5b8101908080359060200190929190505050610f4c565b6040518082600260200280838360005b8381101561039a57808201518184015260208101905061037f565b5050505090500191505060405180910390f35b6103b561104e565b6040518082815260200191505060405180910390f35b61040d600480360360208110156103e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611058565b604051808215151515815260200191505060405180910390f35b6104736004803603604081101561043d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110ae565b005b6104a16004803603602081101561048b57600080fd5b81019080803590602001909291905050506111b1565b005b61050f600480360360608110156104b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114d2565b604051808215151515815260200191505060405180910390f35b6105316115ab565b604051808260ff1660ff16815260200191505060405180910390f35b6105996004803603604081101561056357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115c2565b604051808215151515815260200191505060405180910390f35b6105bb611675565b005b6105e9600480360360208110156105d357600080fd5b81019080803590602001909291905050506118f0565b6040518082815260200191505060405180910390f35b61064b6004803603604081101561061557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119dd565b005b610655611b50565b6040518082815260200191505060405180910390f35b610673611b64565b6040518082815260200191505060405180910390f35b610691611b6e565b6040518082815260200191505060405180910390f35b6106af611b7a565b6040518082815260200191505060405180910390f35b6106cd611b84565b6040518082815260200191505060405180910390f35b610725600480360360208110156106f957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b8e565b6040518082815260200191505060405180910390f35b610743611bd6565b005b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d61565b604051808215151515815260200191505060405180910390f35b6107cd600480360360208110156107b757600080fd5b8101908080359060200190929190505050611db7565b604051808215151515815260200191505060405180910390f35b6107ef611de1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610839611e0b565b005b610843612086565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610883578082015181840152602081019050610868565b50505050905090810190601f1680156108b05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61090a600480360360408110156108d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612128565b604051808215151515815260200191505060405180910390f35b6109706004803603604081101561093a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506121f5565b604051808215151515815260200191505060405180910390f35b610992612213565b6040518082815260200191505060405180910390f35b6109b061221d565b6040518082815260200191505060405180910390f35b610a86600480360360408110156109dc57600080fd5b81019080803590602001906401000000008111156109f957600080fd5b820183602082011115610a0b57600080fd5b80359060200191846020830284011164010000000083111715610a2d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050612227565b005b610aca60048036036020811015610a9e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612343565b604051808215151515815260200191505060405180910390f35b610b2660048036036020811015610afa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612426565b604051808215151515815260200191505060405180910390f35b610ba260048036036040811015610b5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612509565b6040518082815260200191505060405180910390f35b610bfa60048036036020811015610bce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612590565b005b610c046127a0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610c8860048036036020811015610c5c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127ca565b005b3373ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610d1457600080fd5b505afa158015610d28573d6000803e3d6000fd5b505050506040513d6020811015610d3e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610dbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133646026913960400191505060405180910390fd5b600015156012600083815260200190815260200160002060009054906101000a900460ff16151514610e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806132d26024913960400191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860008282540192505081905550610e893369021e19e0c9bab24000006128d8565b50565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f245780601f10610ef957610100808354040283529160200191610f24565b820191906000526020600020905b815481529060010190602001808311610f0757829003601f168201915b5050505050905090565b6000610f42610f3b612a9f565b8484612aa7565b6001905092915050565b610f5461328c565b60004290506000600d60008581526020019081526020016000205490506000811415610f805760065490505b6000600e60008681526020019081526020016000205490506000600f60008381526020019081526020016000205490506000610fc58486612c9e90919063ffffffff16565b90506000610ff162015180610fe38486612ce890919063ffffffff16565b612d6e90919063ffffffff16565b9050610ffb61328c565b604051806040016040528061102c84600c60008e815260200190815260200160002054612db890919063ffffffff16565b8152602001670de0b6b3a7640000815250905080975050505050505050919050565b6000600254905090565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461110857600080fd5b6b09b18ab5df7180b6b800000061112f8261112161104e565b612db890919063ffffffff16565b11156111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d696e742063616e277420657863656564206d617820737570706c790000000081525060200191505060405180910390fd5b6111ad82826128d8565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561123b57600080fd5b505afa15801561124f573d6000803e3d6000fd5b505050506040513d602081101561126557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f596f7520646f6e2774206f776e2074686973204e46540000000000000000000081525060200191505060405180910390fd5b6b09b18ab5df7180b6b800000061131461104e565b1115611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d696e742063616e277420657863656564206d617820737570706c790000000081525060200191505060405180910390fd5b6000600e60008381526020019081526020016000205490506000600f600083815260200190815260200160002054905060004290506000600d600086815260200190815260200160002054905060008114156113e45760065490505b60006113f98284612c9e90919063ffffffff16565b90506000611425620151806114178488612ce890919063ffffffff16565b612d6e90919063ffffffff16565b905061144d81600c60008a815260200190815260200160002054612db890919063ffffffff16565b600c60008981526020019081526020016000208190555083600d6000898152602001908152602001600020819055506000600c60008981526020019081526020016000205490506000600c60008a81526020019081526020016000208190555060016007600082825401925050819055506114c833826128d8565b5050505050505050565b60006114df848484612e40565b6115a0846114eb612a9f565b61159b856040518060600160405280602881526020016133ab60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611551612a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131019092919063ffffffff16565b612aa7565b600190509392505050565b6000600560009054906101000a900460ff16905090565b600061166b6115cf612a9f565b8461166685600160006115e0612a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db890919063ffffffff16565b612aa7565b6001905092915050565b60011515601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7b57841336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561171857600080fd5b505afa15801561172c573d6000803e3d6000fd5b505050506040513d602081101561174257600080fd5b81019080805190602001909291905050501515146117c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f596f7572206163636f756e742069736e2774206120466f756e6465720000000081525060200191505060405180910390fd5b60001515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611871576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806132d26024913960400191505060405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a600082825401925050819055506118ee336934f086f3b33b684000006128d8565b565b6000804290506000600d6000858152602001908152602001600020549050600081141561191d5760065490505b6000600e60008681526020019081526020016000205490506000600f600083815260200190815260200160002054905060006119628486612c9e90919063ffffffff16565b9050600061198e620151806119808486612ce890919063ffffffff16565b612d6e90919063ffffffff16565b90506119d0670de0b6b3a76400006119c283600c60008d815260200190815260200160002054612db890919063ffffffff16565b612d6e90919063ffffffff16565b9650505050505050919050565b6119e5612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611aa7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6b09b18ab5df7180b6b8000000611ace82611ac061104e565b612db890919063ffffffff16565b1115611b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d696e742063616e277420657863656564206d617820737570706c790000000081525060200191505060405180910390fd5b611b4c82826128d8565b5050565b60006b09b18ab5df7180b6b8000000905090565b6000600a54905090565b60006006544203905090565b6000600954905090565b6000600854905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bde612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ca0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60011515601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db9844d7336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611eae57600080fd5b505afa158015611ec2573d6000803e3d6000fd5b505050506040513d6020811015611ed857600080fd5b8101908080519060200190929190505050151514611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f596f7572206163636f756e742069736e27742061204469616d6f6e640000000081525060200191505060405180910390fd5b60001515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612007576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806132d26024913960400191505060405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000828254019250508190555061208433690a968163f0a57b4000006128d8565b565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561211e5780601f106120f35761010080835404028352916020019161211e565b820191906000526020600020905b81548152906001019060200180831161210157829003601f168201915b5050505050905090565b60006121eb612135612a9f565b846121e68560405180606001604052806025815260200161341c602591396001600061215f612a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131019092919063ffffffff16565b612aa7565b6001905092915050565b6000612209612202612a9f565b8484612e40565b6001905092915050565b6000600754905090565b6000600654905090565b61222f612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008090505b825181101561233e57600083828151811061230e57fe5b6020026020010151905082600e6000838152602001908152602001600020819055505080806001019150506122f7565b505050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7b57841836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156123e457600080fd5b505afa1580156123f8573d6000803e3d6000fd5b505050506040513d602081101561240e57600080fd5b81019080805190602001909291905050509050919050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db9844d7836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156124c757600080fd5b505afa1580156124db573d6000803e3d6000fd5b505050506040513d60208110156124f157600080fd5b81019080805190602001909291905050509050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612598612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461265a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806132f66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6127d2612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612894576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561297b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b612987600083836131c1565b61299c81600254612db890919063ffffffff16565b6002819055506129f3816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806133f86024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061331c6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000612ce083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613101565b905092915050565b600080831415612cfb5760009050612d68565b6000828402905082848281612d0c57fe5b0414612d63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061338a6021913960400191505060405180910390fd5b809150505b92915050565b6000612db083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131c6565b905092915050565b600080828401905083811015612e36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ec6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806133d36025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806132af6023913960400191505060405180910390fd5b612f578383836131c1565b612fc28160405180606001604052806026815260200161333e602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131019092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613055816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008383111582906131ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613173578082015181840152602081019050613158565b50505050905090810190601f1680156131a05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b505050565b60008083118290613272576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561323757808201518184015260208101905061321c565b50505050905090810190601f1680156132645780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161327e57fe5b049050809150509392505050565b604051806040016040528060029060208202803883398082019150509050509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373596f75206861766520616c726561647920636c61696d65642074686973207265776172644f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365596f7520646f6e277420686f6c642074686973204e465420696e20796f75722077616c6c6574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b3a5ed07e0eb4d0d91f106247f317ad59f19a7e83dac360363b6a0bd60ea731164736f6c63430006020033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c80636c1178af11610130578063a9059cbb116100b8578063db9844d71161007c578063db9844d714610ae4578063dd62ed3e14610b40578063f2fde38b14610bb8578063f366751714610bfc578063fca3b5aa14610c4657610227565b8063a9059cbb14610924578063ae0817681461098a578063b728402a146109a8578063c4f21231146109c6578063c7b5784114610a8857610227565b80638408763c116100ff5780638408763c146107a15780638da5cb5b146107e757806391ffec581461083157806395d89b411461083b578063a457c2d7146108be57610227565b80636c1178af146106c557806370a08231146106e3578063715018a61461073b5780637fd65a3c1461074557610227565b8063313ce567116101b3578063484b973c11610182578063484b973c146105ff5780634c0f38c21461064d57806352382cb41461066b5780636058a9f41461068957806361120201146106a757610227565b8063313ce56714610529578063395093511461054d5780633a0c0907146105b357806343a5aae8146105bd57610227565b806318160ddd116101fa57806318160ddd146103ad5780631e20e752146103cb57806321f314ca14610427578063224014051461047557806323b872dd146104a357610227565b8063037c36ce1461022c57806306fdde031461025a578063095ea7b3146102dd5780630e58339f14610343575b600080fd5b6102586004803603602081101561024257600080fd5b8101908080359060200190929190505050610c8a565b005b610262610e8c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a2578082015181840152602081019050610287565b50505050905090810190601f1680156102cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610329600480360360408110156102f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f2e565b604051808215151515815260200191505060405180910390f35b61036f6004803603602081101561035957600080fd5b8101908080359060200190929190505050610f4c565b6040518082600260200280838360005b8381101561039a57808201518184015260208101905061037f565b5050505090500191505060405180910390f35b6103b561104e565b6040518082815260200191505060405180910390f35b61040d600480360360208110156103e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611058565b604051808215151515815260200191505060405180910390f35b6104736004803603604081101561043d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110ae565b005b6104a16004803603602081101561048b57600080fd5b81019080803590602001909291905050506111b1565b005b61050f600480360360608110156104b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114d2565b604051808215151515815260200191505060405180910390f35b6105316115ab565b604051808260ff1660ff16815260200191505060405180910390f35b6105996004803603604081101561056357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115c2565b604051808215151515815260200191505060405180910390f35b6105bb611675565b005b6105e9600480360360208110156105d357600080fd5b81019080803590602001909291905050506118f0565b6040518082815260200191505060405180910390f35b61064b6004803603604081101561061557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119dd565b005b610655611b50565b6040518082815260200191505060405180910390f35b610673611b64565b6040518082815260200191505060405180910390f35b610691611b6e565b6040518082815260200191505060405180910390f35b6106af611b7a565b6040518082815260200191505060405180910390f35b6106cd611b84565b6040518082815260200191505060405180910390f35b610725600480360360208110156106f957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b8e565b6040518082815260200191505060405180910390f35b610743611bd6565b005b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d61565b604051808215151515815260200191505060405180910390f35b6107cd600480360360208110156107b757600080fd5b8101908080359060200190929190505050611db7565b604051808215151515815260200191505060405180910390f35b6107ef611de1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610839611e0b565b005b610843612086565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610883578082015181840152602081019050610868565b50505050905090810190601f1680156108b05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61090a600480360360408110156108d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612128565b604051808215151515815260200191505060405180910390f35b6109706004803603604081101561093a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506121f5565b604051808215151515815260200191505060405180910390f35b610992612213565b6040518082815260200191505060405180910390f35b6109b061221d565b6040518082815260200191505060405180910390f35b610a86600480360360408110156109dc57600080fd5b81019080803590602001906401000000008111156109f957600080fd5b820183602082011115610a0b57600080fd5b80359060200191846020830284011164010000000083111715610a2d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050612227565b005b610aca60048036036020811015610a9e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612343565b604051808215151515815260200191505060405180910390f35b610b2660048036036020811015610afa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612426565b604051808215151515815260200191505060405180910390f35b610ba260048036036040811015610b5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612509565b6040518082815260200191505060405180910390f35b610bfa60048036036020811015610bce57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612590565b005b610c046127a0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610c8860048036036020811015610c5c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127ca565b005b3373ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610d1457600080fd5b505afa158015610d28573d6000803e3d6000fd5b505050506040513d6020811015610d3e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610dbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133646026913960400191505060405180910390fd5b600015156012600083815260200190815260200160002060009054906101000a900460ff16151514610e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806132d26024913960400191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860008282540192505081905550610e893369021e19e0c9bab24000006128d8565b50565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f245780601f10610ef957610100808354040283529160200191610f24565b820191906000526020600020905b815481529060010190602001808311610f0757829003601f168201915b5050505050905090565b6000610f42610f3b612a9f565b8484612aa7565b6001905092915050565b610f5461328c565b60004290506000600d60008581526020019081526020016000205490506000811415610f805760065490505b6000600e60008681526020019081526020016000205490506000600f60008381526020019081526020016000205490506000610fc58486612c9e90919063ffffffff16565b90506000610ff162015180610fe38486612ce890919063ffffffff16565b612d6e90919063ffffffff16565b9050610ffb61328c565b604051806040016040528061102c84600c60008e815260200190815260200160002054612db890919063ffffffff16565b8152602001670de0b6b3a7640000815250905080975050505050505050919050565b6000600254905090565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461110857600080fd5b6b09b18ab5df7180b6b800000061112f8261112161104e565b612db890919063ffffffff16565b11156111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d696e742063616e277420657863656564206d617820737570706c790000000081525060200191505060405180910390fd5b6111ad82826128d8565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561123b57600080fd5b505afa15801561124f573d6000803e3d6000fd5b505050506040513d602081101561126557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f596f7520646f6e2774206f776e2074686973204e46540000000000000000000081525060200191505060405180910390fd5b6b09b18ab5df7180b6b800000061131461104e565b1115611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d696e742063616e277420657863656564206d617820737570706c790000000081525060200191505060405180910390fd5b6000600e60008381526020019081526020016000205490506000600f600083815260200190815260200160002054905060004290506000600d600086815260200190815260200160002054905060008114156113e45760065490505b60006113f98284612c9e90919063ffffffff16565b90506000611425620151806114178488612ce890919063ffffffff16565b612d6e90919063ffffffff16565b905061144d81600c60008a815260200190815260200160002054612db890919063ffffffff16565b600c60008981526020019081526020016000208190555083600d6000898152602001908152602001600020819055506000600c60008981526020019081526020016000205490506000600c60008a81526020019081526020016000208190555060016007600082825401925050819055506114c833826128d8565b5050505050505050565b60006114df848484612e40565b6115a0846114eb612a9f565b61159b856040518060600160405280602881526020016133ab60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611551612a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131019092919063ffffffff16565b612aa7565b600190509392505050565b6000600560009054906101000a900460ff16905090565b600061166b6115cf612a9f565b8461166685600160006115e0612a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db890919063ffffffff16565b612aa7565b6001905092915050565b60011515601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7b57841336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561171857600080fd5b505afa15801561172c573d6000803e3d6000fd5b505050506040513d602081101561174257600080fd5b81019080805190602001909291905050501515146117c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f596f7572206163636f756e742069736e2774206120466f756e6465720000000081525060200191505060405180910390fd5b60001515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611871576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806132d26024913960400191505060405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600a600082825401925050819055506118ee336934f086f3b33b684000006128d8565b565b6000804290506000600d6000858152602001908152602001600020549050600081141561191d5760065490505b6000600e60008681526020019081526020016000205490506000600f600083815260200190815260200160002054905060006119628486612c9e90919063ffffffff16565b9050600061198e620151806119808486612ce890919063ffffffff16565b612d6e90919063ffffffff16565b90506119d0670de0b6b3a76400006119c283600c60008d815260200190815260200160002054612db890919063ffffffff16565b612d6e90919063ffffffff16565b9650505050505050919050565b6119e5612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611aa7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6b09b18ab5df7180b6b8000000611ace82611ac061104e565b612db890919063ffffffff16565b1115611b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4d696e742063616e277420657863656564206d617820737570706c790000000081525060200191505060405180910390fd5b611b4c82826128d8565b5050565b60006b09b18ab5df7180b6b8000000905090565b6000600a54905090565b60006006544203905090565b6000600954905090565b6000600854905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bde612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ca0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006012600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60011515601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db9844d7336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611eae57600080fd5b505afa158015611ec2573d6000803e3d6000fd5b505050506040513d6020811015611ed857600080fd5b8101908080519060200190929190505050151514611f5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f596f7572206163636f756e742069736e27742061204469616d6f6e640000000081525060200191505060405180910390fd5b60001515601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612007576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806132d26024913960400191505060405180910390fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160096000828254019250508190555061208433690a968163f0a57b4000006128d8565b565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561211e5780601f106120f35761010080835404028352916020019161211e565b820191906000526020600020905b81548152906001019060200180831161210157829003601f168201915b5050505050905090565b60006121eb612135612a9f565b846121e68560405180606001604052806025815260200161341c602591396001600061215f612a9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131019092919063ffffffff16565b612aa7565b6001905092915050565b6000612209612202612a9f565b8484612e40565b6001905092915050565b6000600754905090565b6000600654905090565b61222f612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008090505b825181101561233e57600083828151811061230e57fe5b6020026020010151905082600e6000838152602001908152602001600020819055505080806001019150506122f7565b505050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7b57841836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156123e457600080fd5b505afa1580156123f8573d6000803e3d6000fd5b505050506040513d602081101561240e57600080fd5b81019080805190602001909291905050509050919050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db9844d7836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156124c757600080fd5b505afa1580156124db573d6000803e3d6000fd5b505050506040513d60208110156124f157600080fd5b81019080805190602001909291905050509050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612598612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461265a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806132f66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6127d2612a9f565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612894576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561297b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b612987600083836131c1565b61299c81600254612db890919063ffffffff16565b6002819055506129f3816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806133f86024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061331c6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000612ce083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613101565b905092915050565b600080831415612cfb5760009050612d68565b6000828402905082848281612d0c57fe5b0414612d63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061338a6021913960400191505060405180910390fd5b809150505b92915050565b6000612db083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131c6565b905092915050565b600080828401905083811015612e36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ec6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806133d36025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806132af6023913960400191505060405180910390fd5b612f578383836131c1565b612fc28160405180606001604052806026815260200161333e602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131019092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613055816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612db890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008383111582906131ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613173578082015181840152602081019050613158565b50505050905090810190601f1680156131a05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b505050565b60008083118290613272576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561323757808201518184015260208101905061321c565b50505050905090810190601f1680156132645780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161327e57fe5b049050809150509392505050565b604051806040016040528060029060208202803883398082019150509050509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373596f75206861766520616c726561647920636c61696d65642074686973207265776172644f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365596f7520646f6e277420686f6c642074686973204e465420696e20796f75722077616c6c6574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b3a5ed07e0eb4d0d91f106247f317ad59f19a7e83dac360363b6a0bd60ea731164736f6c63430006020033

Deployed Bytecode Sourcemap

34420:7524:0:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34420:7524:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37488:371;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37488:371:0;;;;;;;;;;;;;;;;;:::i;:::-;;17627:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17627:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19733:169;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19733:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38226:628;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38226:628:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;38226:628:0;;;;;;;;;;;;;;;;18702:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36449:132;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36449:132:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41741:200;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41741:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39461:905;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39461:905:0;;;;;;;;;;;;;;;;;:::i;:::-;;20376:321;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20376:321:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18554:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21106:218;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21106:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36733:365;;;:::i;:::-;;38866:583;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38866:583:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41533:196;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41533:196:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41236:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37992:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41108:116;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37871:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38113:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18865:119;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18865:119:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28180:148;;;:::i;:::-;;36305:132;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36305:132:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36593:128;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36593:128:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27538:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37110:366;;;:::i;:::-;;17829:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17829:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21827:269;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21827:269:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19197:175;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19197:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40875:104;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40991:105;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40378:231;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40378:231:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;40378:231:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40378:231:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40378:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;40378:231:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40621:115;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40621:115:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40748;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40748:115:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19435:151;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19435:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28483:244;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28483:244:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;41438:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41338:88;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41338:88:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;37488:371;37591:10;37564:37;;:7;;;;;;;;;;;:15;;;37580:5;37564:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37564:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37564:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37564:22:0;;;;;;;;;;;;;;;;:37;;;37556:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37687:5;37663:29;;:13;:20;37677:5;37663:20;;;;;;;;;;;;;;;;;;;;;:29;;;37655:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37767:4;37744:13;:20;37758:5;37744:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;37802:1;37782:16;;:21;;;;;;;;;;;37814:37;37820:10;34588:11;37814:5;:37::i;:::-;37488:371;:::o;17627:83::-;17664:13;17697:5;17690:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17627:83;:::o;19733:169::-;19816:4;19833:39;19842:12;:10;:12::i;:::-;19856:7;19865:6;19833:8;:39::i;:::-;19890:4;19883:11;;19733:169;;;;:::o;38226:628::-;38301:17;;:::i;:::-;38331:12;38346:15;38331:30;;38372:16;38391:10;:17;38402:5;38391:17;;;;;;;;;;;;38372:36;;38435:1;38423:8;:13;38419:74;;;38464:17;;38453:28;;38419:74;38503:13;38519:17;:24;38537:5;38519:24;;;;;;;;;;;;38503:40;;38554:19;38576:14;:21;38591:5;38576:21;;;;;;;;;;;;38554:43;;38608:18;38629;38638:8;38629:4;:8;;:18;;;;:::i;:::-;38608:39;;38658:25;38686:44;35054:5;38686:27;38702:10;38686:11;:15;;:27;;;;:::i;:::-;:31;;:44;;;;:::i;:::-;38658:72;;38741:21;;:::i;:::-;:84;;;;;;;;38767:37;38786:17;38767:7;:14;38775:5;38767:14;;;;;;;;;;;;:18;;:37;;;;:::i;:::-;38741:84;;;;35112:19;38741:84;;;;;38843:3;38836:10;;;;;;;;;38226:628;;;:::o;18702:100::-;18755:7;18782:12;;18775:19;;18702:100;:::o;36449:132::-;36527:4;36551:13;:22;36565:7;36551:22;;;;;;;;;;;;;;;;;;;;;;;;;36544:29;;36449:132;;;:::o;41741:200::-;35958:6;;;;;;;;;;;35944:20;;:10;:20;;;35940:34;;35966:8;;;35940:34;34519:16:::1;41830:26;41848:7;41830:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:40;;41822:81;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41914:19;41920:3;41925:7;41914:5;:19::i;:::-;41741:200:::0;;:::o;39461:905::-;39562:10;39535:37;;:7;;;;;;;;;;;:15;;;39551:5;39535:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39535:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39535:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39535:22:0;;;;;;;;;;;;;;;;:37;;;39527:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34519:16;39618:13;:11;:13::i;:::-;:27;;39610:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39689:13;39705:17;:24;39723:5;39705:24;;;;;;;;;;;;39689:40;;39740:19;39762:14;:21;39777:5;39762:21;;;;;;;;;;;;39740:43;;39804:12;39819:15;39804:30;;39845:16;39864:10;:17;39875:5;39864:17;;;;;;;;;;;;39845:36;;39908:1;39896:8;:13;39892:74;;;39937:17;;39926:28;;39892:74;39986:18;40007;40016:8;40007:4;:8;;:18;;;;:::i;:::-;39986:39;;40036:25;40064:44;35054:5;40064:27;40080:10;40064:11;:15;;:27;;;;:::i;:::-;:31;;:44;;;;:::i;:::-;40036:72;;40136:37;40155:17;40136:7;:14;40144:5;40136:14;;;;;;;;;;;;:18;;:37;;;;:::i;:::-;40119:7;:14;40127:5;40119:14;;;;;;;;;;;:54;;;;40206:4;40186:10;:17;40197:5;40186:17;;;;;;;;;;;:24;;;;40221:14;40238:7;:14;40246:5;40238:14;;;;;;;;;;;;40221:31;;40290:1;40273:7;:14;40281:5;40273:14;;;;;;;;;;;:18;;;;40321:1;40302:15;;:20;;;;;;;;;;;40333:25;40339:10;40351:6;40333:5;:25::i;:::-;39461:905;;;;;;;;:::o;20376:321::-;20482:4;20499:36;20509:6;20517:9;20528:6;20499:9;:36::i;:::-;20546:121;20555:6;20563:12;:10;:12::i;:::-;20577:89;20615:6;20577:89;;;;;;;;;;;;;;;;;:11;:19;20589:6;20577:19;;;;;;;;;;;;;;;:33;20597:12;:10;:12::i;:::-;20577:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;20546:8;:121::i;:::-;20685:4;20678:11;;20376:321;;;;;:::o;18554:83::-;18595:5;18620:9;;;;;;;;;;;18613:16;;18554:83;:::o;21106:218::-;21194:4;21211:83;21220:12;:10;:12::i;:::-;21234:7;21243:50;21282:10;21243:11;:25;21255:12;:10;:12::i;:::-;21243:25;;;;;;;;;;;;;;;:34;21269:7;21243:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;21211:8;:83::i;:::-;21312:4;21305:11;;21106:218;;;;:::o;36733:365::-;36829:4;36796:37;;:7;;;;;;;;;;;:17;;;36814:10;36796:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36796:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36796:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36796:29:0;;;;;;;;;;;;;;;;:37;;;36788:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36914:5;36885:34;;:13;:25;36899:10;36885:25;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;36877:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36999:4;36971:13;:25;36985:10;36971:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;37038:1;37014:20;;:25;;;;;;;;;;;37050:40;37056:10;34724:12;37050:5;:40::i;:::-;36733:365::o;38866:583::-;38943:7;38963:12;38978:15;38963:30;;39004:16;39023:10;:17;39034:5;39023:17;;;;;;;;;;;;39004:36;;39067:1;39055:8;:13;39051:74;;;39096:17;;39085:28;;39051:74;39135:13;39151:17;:24;39169:5;39151:24;;;;;;;;;;;;39135:40;;39186:19;39208:14;:21;39223:5;39208:21;;;;;;;;;;;;39186:43;;39240:18;39261;39270:8;39261:4;:8;;:18;;;;:::i;:::-;39240:39;;39290:25;39318:44;35054:5;39318:27;39334:10;39318:11;:15;;:27;;;;:::i;:::-;:31;;:44;;;;:::i;:::-;39290:72;;39380:61;35112:19;39380:37;39399:17;39380:7;:14;39388:5;39380:14;;;;;;;;;;;;:18;;:37;;;;:::i;:::-;:41;;:61;;;;:::i;:::-;39373:68;;;;;;;;38866:583;;;:::o;41533:196::-;27760:12;:10;:12::i;:::-;27750:22;;:6;;;;;;;;;;;:22;;;27742:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34519:16:::1;41618:26;41636:7;41618:13;:11;:13::i;:::-;:17;;:26;;;;:::i;:::-;:40;;41610:81;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41702:19;41708:3;41713:7;41702:5;:19::i;:::-;41533:196:::0;;:::o;41236:90::-;41281:7;34519:16;41301:17;;41236:90;:::o;37992:109::-;38046:7;38073:20;;38066:27;;37992:109;:::o;41108:116::-;41166:7;41199:17;;41193:3;:23;41186:30;;41108:116;:::o;37871:109::-;37925:7;37952:20;;37945:27;;37871:109;:::o;38113:101::-;38163:7;38190:16;;38183:23;;38113:101;:::o;18865:119::-;18931:7;18958:9;:18;18968:7;18958:18;;;;;;;;;;;;;;;;18951:25;;18865:119;;;:::o;28180:148::-;27760:12;:10;:12::i;:::-;27750:22;;:6;;;;;;;;;;;:22;;;27742:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28287:1:::1;28250:40;;28271:6;;;;;;;;;;;28250:40;;;;;;;;;;;;28318:1;28301:6;;:19;;;;;;;;;;;;;;;;;;28180:148::o:0;36305:132::-;36383:4;36407:13;:22;36421:7;36407:22;;;;;;;;;;;;;;;;;;;;;;;;;36400:29;;36305:132;;;:::o;36593:128::-;36669:4;36693:13;:20;36707:5;36693:20;;;;;;;;;;;;;;;;;;;;;36686:27;;36593:128;;;:::o;27538:79::-;27576:7;27603:6;;;;;;;;;;;27596:13;;27538:79;:::o;37110:366::-;37206:4;37173:37;;:7;;;;;;;;;;;:17;;;37191:10;37173:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37173:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37173:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37173:29:0;;;;;;;;;;;;;;;;:37;;;37165:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37291:5;37262:34;;:13;:25;37276:10;37262:25;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;37254:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37376:4;37348:13;:25;37362:10;37348:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;37415:1;37391:20;;:25;;;;;;;;;;;37427:41;37433:10;34656:11;37427:5;:41::i;:::-;37110:366::o;17829:87::-;17868:13;17901:7;17894:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17829:87;:::o;21827:269::-;21920:4;21937:129;21946:12;:10;:12::i;:::-;21960:7;21969:96;22008:15;21969:96;;;;;;;;;;;;;;;;;:11;:25;21981:12;:10;:12::i;:::-;21969:25;;;;;;;;;;;;;;;:34;21995:7;21969:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;21937:8;:129::i;:::-;22084:4;22077:11;;21827:269;;;;:::o;19197:175::-;19283:4;19300:42;19310:12;:10;:12::i;:::-;19324:9;19335:6;19300:9;:42::i;:::-;19360:4;19353:11;;19197:175;;;;:::o;40875:104::-;40929:7;40956:15;;40949:22;;40875:104;:::o;40991:105::-;41044:7;41071:17;;41064:24;;40991:105;:::o;40378:231::-;27760:12;:10;:12::i;:::-;27750:22;;:6;;;;;;;;;;;:22;;;27742:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40469:6:::1;40476:1:::0;40469:8:::1;;40464:138;40483:6;:13;40479:1;:17;40464:138;;;40518:13;40534:6;40541:1;40534:9;;;;;;;;;;;;;;40518:25;;40585:5;40558:17;:24;40576:5;40558:24;;;;;;;;;;;:32;;;;40464:138;40498:3;;;;;;;40464:138;;;;40378:231:::0;;:::o;40621:115::-;40678:4;40702:7;;;;;;;;;;;:17;;;40720:7;40702:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40702:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40702:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40702:26:0;;;;;;;;;;;;;;;;40695:33;;40621:115;;;:::o;40748:::-;40805:4;40829:7;;;;;;;;;;;:17;;;40847:7;40829:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40829:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40829:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40829:26:0;;;;;;;;;;;;;;;;40822:33;;40748:115;;;:::o;19435:151::-;19524:7;19551:11;:18;19563:5;19551:18;;;;;;;;;;;;;;;:27;19570:7;19551:27;;;;;;;;;;;;;;;;19544:34;;19435:151;;;;:::o;28483:244::-;27760:12;:10;:12::i;:::-;27750:22;;:6;;;;;;;;;;;:22;;;27742:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28592:1:::1;28572:22;;:8;:22;;;;28564:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28682:8;28653:38;;28674:6;;;;;;;;;;;28653:38;;;;;;;;;;;;28711:8;28702:6;;:17;;;;;;;;;;;;;;;;;;28483:244:::0;:::o;41438:83::-;41480:7;41507:6;;;;;;;;;;;41500:13;;41438:83;:::o;41338:88::-;27760:12;:10;:12::i;:::-;27750:22;;:6;;;;;;;;;;;:22;;;27742:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41411:7:::1;41402:6;;:16;;;;;;;;;;;;;;;;;;41338:88:::0;:::o;23406:378::-;23509:1;23490:21;;:7;:21;;;;23482:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23560:49;23589:1;23593:7;23602:6;23560:20;:49::i;:::-;23637:24;23654:6;23637:12;;:16;;:24;;;;:::i;:::-;23622:12;:39;;;;23693:30;23716:6;23693:9;:18;23703:7;23693:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;23672:9;:18;23682:7;23672:18;;;;;;;;;;;;;;;:51;;;;23760:7;23739:37;;23756:1;23739:37;;;23769:6;23739:37;;;;;;;;;;;;;;;;;;23406:378;;:::o;657:106::-;710:15;745:10;738:17;;657:106;:::o;24974:346::-;25093:1;25076:19;;:5;:19;;;;25068:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25174:1;25155:21;;:7;:21;;;;25147:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25258:6;25228:11;:18;25240:5;25228:18;;;;;;;;;;;;;;;:27;25247:7;25228:27;;;;;;;;;;;;;;;:36;;;;25296:7;25280:32;;25289:5;25280:32;;;25305:6;25280:32;;;;;;;;;;;;;;;;;;24974:346;;;:::o;5203:136::-;5261:7;5288:43;5292:1;5295;5288:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5281:50;;5203:136;;;;:::o;6093:471::-;6151:7;6401:1;6396;:6;6392:47;;;6426:1;6419:8;;;;6392:47;6451:9;6467:1;6463;:5;6451:17;;6496:1;6491;6487;:5;;;;;;:10;6479:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6555:1;6548:8;;;6093:471;;;;;:::o;7040:132::-;7098:7;7125:39;7129:1;7132;7125:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7118:46;;7040:132;;;;:::o;4739:181::-;4797:7;4817:9;4833:1;4829;:5;4817:17;;4858:1;4853;:6;;4845:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4911:1;4904:8;;;4739:181;;;;:::o;22586:539::-;22710:1;22692:20;;:6;:20;;;;22684:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22794:1;22773:23;;:9;:23;;;;22765:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22849:47;22870:6;22878:9;22889:6;22849:20;:47::i;:::-;22929:71;22951:6;22929:71;;;;;;;;;;;;;;;;;:9;:17;22939:6;22929:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;22909:9;:17;22919:6;22909:17;;;;;;;;;;;;;;;:91;;;;23034:32;23059:6;23034:9;:20;23044:9;23034:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;23011:9;:20;23021:9;23011:20;;;;;;;;;;;;;;;:55;;;;23099:9;23082:35;;23091:6;23082:35;;;23110:6;23082:35;;;;;;;;;;;;;;;;;;22586:539;;;:::o;5642:192::-;5728:7;5761:1;5756;:6;;5764:12;5748:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5748:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5788:9;5804:1;5800;:5;5788:17;;5825:1;5818:8;;;5642:192;;;;;:::o;26345:92::-;;;;:::o;7668:278::-;7754:7;7786:1;7782;:5;7789:12;7774:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7774:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7813:9;7829:1;7825;:5;;;;;;7813:17;;7937:1;7930:8;;;7668:278;;;;;:::o;34420:7524::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;34420:7524:0;;;;:::o

Swarm Source

ipfs://b3a5ed07e0eb4d0d91f106247f317ad59f19a7e83dac360363b6a0bd60ea7311
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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