ETH Price: $2,869.48 (-10.40%)
Gas: 16 Gwei

Token

The Family Mooks Pre-Sale (MOOK)
 

Overview

Max Total Supply

2,206 MOOK

Holders

141

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
jfellz.eth
Balance
2 MOOK

Value
$0.00
0xb5696e4057b9ba76616cecb5a537eaca7b3cdf54
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:
Presale

Compiler Version
v0.8.0+commit.c7dfd78e

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-19
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**************************************************************************************/
// Address.sol
// File: @openzeppelin/contracts/utils/Address.sol

/**
 * @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) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/**************************************************************************************/
// Context.sol
// File: @openzeppelin/contracts/utils/Context.sol

/**
 * @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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


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

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


/**************************************************************************************/
// IERC20Metadata.sol
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


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

/**
 * @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 Contracts guidelines: functions revert
 * instead 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, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        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] + 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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `account` 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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This 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 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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


/**************************************************************************************/
// Migrations.sol

contract Migrations {
  address public owner = msg.sender;
  uint public last_completed_migration;

  modifier restricted() {
    require(
      msg.sender == owner,
      "This function is restricted to the contract's owner"
    );
    _;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }
}

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

/**
 * @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.
 */
abstract 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() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**************************************************************************************/
// SafeMath.sol
// File @openzeppelin/contracts/utils/math/SafeMath.sol

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

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

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


/**************************************************************************************/
// Presale.sol

contract Presale is ERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    uint256 ETHER_DECIMALS = 1000000000000000000;

    uint256 public _price;
    uint256 public _purchaseLimit;
    bool public _isOpen = false;
    mapping(address => bool) public _whitelisted;
    mapping(address => uint256) public _mintCount;

    event Whitelisted(address account);
    event Delisted(address account);
    event Price(uint256 price);
    event PurchaseLimit(uint256 limit);
    event Open(bool isOpen);
    event Create(uint256 amount);
    event Destroy(uint256 amount);

    constructor(
        string memory name,
        string memory symbol,
        uint256 price,
        uint256 purchaseLimit
    ) ERC20(name, symbol) {
        _price = price;
        _purchaseLimit = purchaseLimit;
    }

    modifier onlyOpened() {
        require(_isOpen, "sale not open");
        _;
    }

    modifier onlyWhitelisted() {
        require(_whitelisted[msg.sender], "only whitelisted");
        _;
    }

    function addWhitelist(address[] memory accounts) external onlyOwner {
        for (uint i = 0; i < accounts.length; i++) {
            _whitelisted[accounts[i]] = true;
            emit Whitelisted(accounts[i]);
        }
    }

    function removeWhitelist(address[] memory accounts) external onlyOwner {
        for (uint i = 0; i < accounts.length; i++) {
            _whitelisted[accounts[i]] = false;
            emit Delisted(accounts[i]);
        }
    }

    function changePrice(uint256 price) external onlyOwner {
        _price = price;
        emit Price(price);
    }

    function changePurchaseLimit(uint256 purchaseLimit) external onlyOwner {
        _purchaseLimit = purchaseLimit;
        emit PurchaseLimit(purchaseLimit);
    }

    function emptyETHBalance() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function open() external onlyOwner {
        _isOpen = !_isOpen;
        emit Open(_isOpen);
    }

    function create(uint256 amount) external payable onlyOpened onlyWhitelisted {
        require(msg.value == _price.mul(amount), 'incorrect amount sent');
        require(_purchaseLimit >= _mintCount[msg.sender] + amount,
            'account already has created the maximum amount of allowed tokens');

        // mint new token
        _mint(msg.sender, amount.mul(ETHER_DECIMALS));
        _mintCount[msg.sender] = _mintCount[msg.sender] + amount;
        emit Create(amount);

        // forward ETH to owner
        payable(owner()).transfer(address(this).balance);
    }

    function destroy(uint256 amount) external onlyOwner {
        _burn(msg.sender, amount);
        emit Destroy(amount);
    }
}

/**************************************************************************************/

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"purchaseLimit","type":"uint256"}],"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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Create","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Delisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Destroy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isOpen","type":"bool"}],"name":"Open","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":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Price","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"PurchaseLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Whitelisted","type":"event"},{"inputs":[],"name":"_isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_purchaseLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addWhitelist","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":"price","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"purchaseLimit","type":"uint256"}],"name":"changePurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"create","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emptyETHBalance","outputs":[],"stateMutability":"nonpayable","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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"}]

6080604052670de0b6b3a76400006006556000600960006101000a81548160ff0219169083151502179055503480156200003857600080fd5b50604051620032f3380380620032f383398181016040528101906200005e9190620002d3565b83838160039080519060200190620000789291906200019a565b508060049080519060200190620000919291906200019a565b505050620000b4620000a8620000cc60201b60201c565b620000d460201b60201c565b816007819055508060088190555050505050620004c6565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001a89062000418565b90600052602060002090601f016020900481019282620001cc576000855562000218565b82601f10620001e757805160ff191683800117855562000218565b8280016001018555821562000218579182015b8281111562000217578251825591602001919060010190620001fa565b5b5090506200022791906200022b565b5090565b5b80821115620002465760008160009055506001016200022c565b5090565b6000620002616200025b84620003a5565b62000371565b9050828152602081018484840111156200027a57600080fd5b62000287848285620003e2565b509392505050565b600082601f830112620002a157600080fd5b8151620002b38482602086016200024a565b91505092915050565b600081519050620002cd81620004ac565b92915050565b60008060008060808587031215620002ea57600080fd5b600085015167ffffffffffffffff8111156200030557600080fd5b62000313878288016200028f565b945050602085015167ffffffffffffffff8111156200033157600080fd5b6200033f878288016200028f565b93505060406200035287828801620002bc565b92505060606200036587828801620002bc565b91505092959194509250565b6000604051905081810181811067ffffffffffffffff821117156200039b576200039a6200047d565b5b8060405250919050565b600067ffffffffffffffff821115620003c357620003c26200047d565b5b601f19601f8301169050602081019050919050565b6000819050919050565b60005b8381101562000402578082015181840152602081019050620003e5565b8381111562000412576000848401525b50505050565b600060028204905060018216806200043157607f821691505b602082108114156200044857620004476200044e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004b781620003d8565b8114620004c357600080fd5b50565b612e1d80620004d66000396000f3fe60806040526004361061019c5760003560e01c806370a08231116100ec578063a457c2d71161008a578063edac985b11610064578063edac985b146105e1578063f2fde38b1461060a578063fcfff16f14610633578063fed42f401461064a5761019c565b8063a457c2d71461052a578063a9059cbb14610567578063dd62ed3e146105a45761019c565b80638da5cb5b116100c65780638da5cb5b1461048257806395d89b41146104ad5780639d118770146104d8578063a2b40d19146105015761019c565b806370a0823114610412578063715018a61461044f578063780900dc146104665761019c565b806323b872dd116101595780633950935111610133578063395093511461036a57806340146353146103a75780634541d4cf146103d057806350300120146103fb5761019c565b806323b872dd146102c5578063288ee64614610302578063313ce5671461033f5761019c565b806301c4b316146101a157806306fdde03146101de578063095ea7b31461020957806318160ddd146102465780632324521614610271578063235b6ea11461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906120bc565b610675565b6040516101d59190612848565b60405180910390f35b3480156101ea57600080fd5b506101f3610695565b6040516102009190612863565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612170565b610727565b60405161023d9190612848565b60405180910390f35b34801561025257600080fd5b5061025b610745565b6040516102689190612a85565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906121ac565b61074f565b005b3480156102a657600080fd5b506102af6108fd565b6040516102bc9190612a85565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612121565b610903565b6040516102f99190612848565b60405180910390f35b34801561030e57600080fd5b50610329600480360381019061032491906120bc565b6109fb565b6040516103369190612a85565b60405180910390f35b34801561034b57600080fd5b50610354610a13565b6040516103619190612aa0565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c9190612170565b610a1c565b60405161039e9190612848565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c991906121ed565b610ac8565b005b3480156103dc57600080fd5b506103e5610b85565b6040516103f29190612a85565b60405180910390f35b34801561040757600080fd5b50610410610b8b565b005b34801561041e57600080fd5b50610439600480360381019061043491906120bc565b610c57565b6040516104469190612a85565b60405180910390f35b34801561045b57600080fd5b50610464610c9f565b005b610480600480360381019061047b91906121ed565b610d27565b005b34801561048e57600080fd5b5061049761101b565b6040516104a4919061282d565b60405180910390f35b3480156104b957600080fd5b506104c2611045565b6040516104cf9190612863565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa91906121ed565b6110d7565b005b34801561050d57600080fd5b50610528600480360381019061052391906121ed565b611197565b005b34801561053657600080fd5b50610551600480360381019061054c9190612170565b611254565b60405161055e9190612848565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190612170565b61133f565b60405161059b9190612848565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c691906120e5565b61135d565b6040516105d89190612a85565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906121ac565b6113e4565b005b34801561061657600080fd5b50610631600480360381019061062c91906120bc565b611592565b005b34801561063f57600080fd5b5061064861168a565b005b34801561065657600080fd5b5061065f611778565b60405161066c9190612848565b60405180910390f35b600a6020528060005260406000206000915054906101000a900460ff1681565b6060600380546106a490612ca0565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090612ca0565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b5050505050905090565b600061073b61073461178b565b8484611793565b6001905092915050565b6000600254905090565b61075761178b565b73ffffffffffffffffffffffffffffffffffffffff1661077561101b565b73ffffffffffffffffffffffffffffffffffffffff16146107cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c290612985565b60405180910390fd5b60005b81518110156108f9576000600a6000848481518110610816577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f7e1dd2258a1fa02a8360869a16fa4e1d4649c796d79a8d520f03a1dd8ae41af08282815181106108c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040516108de919061282d565b60405180910390a180806108f190612cd2565b9150506107ce565b5050565b60075481565b600061091084848461195e565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061095b61178b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d290612965565b60405180910390fd5b6109ef856109e761178b565b858403611793565b60019150509392505050565b600b6020528060005260406000206000915090505481565b60006012905090565b6000610abe610a2961178b565b848460016000610a3761178b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ab99190612b34565b611793565b6001905092915050565b610ad061178b565b73ffffffffffffffffffffffffffffffffffffffff16610aee61101b565b73ffffffffffffffffffffffffffffffffffffffff1614610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90612985565b60405180910390fd5b806008819055507fb1f2d94ed945d66aeffbcc0dfe1ff08e3307bc9d78c3a61187e1320d5cfe892e81604051610b7a9190612a85565b60405180910390a150565b60085481565b610b9361178b565b73ffffffffffffffffffffffffffffffffffffffff16610bb161101b565b73ffffffffffffffffffffffffffffffffffffffff1614610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90612985565b60405180910390fd5b610c0f61101b565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c54573d6000803e3d6000fd5b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ca761178b565b73ffffffffffffffffffffffffffffffffffffffff16610cc561101b565b73ffffffffffffffffffffffffffffffffffffffff1614610d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1290612985565b60405180910390fd5b610d256000611bdf565b565b600960009054906101000a900460ff16610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d906129a5565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990612945565b60405180910390fd5b610e1781600754611ca590919063ffffffff16565b3414610e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4f90612a45565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ea39190612b34565b6008541015610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede906128a5565b60405180910390fd5b610f0533610f0060065484611ca590919063ffffffff16565b611cbb565b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f509190612b34565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f07eac9a0695a188fe9d6fd680bcbbbe39041fb114d5d7ac11252401391f7930781604051610fc29190612a85565b60405180910390a1610fd261101b565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611017573d6000803e3d6000fd5b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461105490612ca0565b80601f016020809104026020016040519081016040528092919081815260200182805461108090612ca0565b80156110cd5780601f106110a2576101008083540402835291602001916110cd565b820191906000526020600020905b8154815290600101906020018083116110b057829003601f168201915b5050505050905090565b6110df61178b565b73ffffffffffffffffffffffffffffffffffffffff166110fd61101b565b73ffffffffffffffffffffffffffffffffffffffff1614611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a90612985565b60405180910390fd5b61115d3382611e1b565b7fd3f5559c9fe2c1b988daa9f5520155e1a89d750e0a7b2ee17afcd4b76dd95bcd8160405161118c9190612a85565b60405180910390a150565b61119f61178b565b73ffffffffffffffffffffffffffffffffffffffff166111bd61101b565b73ffffffffffffffffffffffffffffffffffffffff1614611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90612985565b60405180910390fd5b806007819055507f63f32f63810afda7c9be9643f9fa73ee3f39a9fd8bb35775a2b0d73e48ed9bed816040516112499190612a85565b60405180910390a150565b6000806001600061126361178b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790612a25565b60405180910390fd5b61133461132b61178b565b85858403611793565b600191505092915050565b600061135361134c61178b565b848461195e565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113ec61178b565b73ffffffffffffffffffffffffffffffffffffffff1661140a61101b565b73ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790612985565b60405180910390fd5b60005b815181101561158e576001600a60008484815181106114ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a5482828151811061155e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604051611573919061282d565b60405180910390a1808061158690612cd2565b915050611463565b5050565b61159a61178b565b73ffffffffffffffffffffffffffffffffffffffff166115b861101b565b73ffffffffffffffffffffffffffffffffffffffff161461160e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160590612985565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561167e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611675906128e5565b60405180910390fd5b61168781611bdf565b50565b61169261178b565b73ffffffffffffffffffffffffffffffffffffffff166116b061101b565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90612985565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff0219169083151502179055507fc15f25c4eb6ac5b9dc23661b850cbdb3ee36aebed198ad870ab929bae77142de600960009054906101000a900460ff1660405161176e9190612848565b60405180910390a1565b600960009054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90612a05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186a90612905565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516119519190612a85565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c5906129e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590612885565b60405180910390fd5b611a49838383611ff2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690612925565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b629190612b34565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611bc69190612a85565b60405180910390a3611bd9848484611ff7565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611cb39190612b8a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2290612a65565b60405180910390fd5b611d3760008383611ff2565b8060026000828254611d499190612b34565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d9e9190612b34565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611e039190612a85565b60405180910390a3611e1760008383611ff7565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e82906129c5565b60405180910390fd5b611e9782600083611ff2565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f14906128c5565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611f749190612be4565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611fd99190612a85565b60405180910390a3611fed83600084611ff7565b505050565b505050565b505050565b600061200f61200a84612aec565b612abb565b9050808382526020820190508285602086028201111561202e57600080fd5b60005b8581101561205e57816120448882612068565b845260208401935060208301925050600181019050612031565b5050509392505050565b60008135905061207781612db9565b92915050565b600082601f83011261208e57600080fd5b813561209e848260208601611ffc565b91505092915050565b6000813590506120b681612dd0565b92915050565b6000602082840312156120ce57600080fd5b60006120dc84828501612068565b91505092915050565b600080604083850312156120f857600080fd5b600061210685828601612068565b925050602061211785828601612068565b9150509250929050565b60008060006060848603121561213657600080fd5b600061214486828701612068565b935050602061215586828701612068565b9250506040612166868287016120a7565b9150509250925092565b6000806040838503121561218357600080fd5b600061219185828601612068565b92505060206121a2858286016120a7565b9150509250929050565b6000602082840312156121be57600080fd5b600082013567ffffffffffffffff8111156121d857600080fd5b6121e48482850161207d565b91505092915050565b6000602082840312156121ff57600080fd5b600061220d848285016120a7565b91505092915050565b61221f81612c18565b82525050565b61222e81612c2a565b82525050565b600061223f82612b18565b6122498185612b23565b9350612259818560208601612c6d565b61226281612da8565b840191505092915050565b600061227a602383612b23565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122e0604083612b23565b91507f6163636f756e7420616c7265616479206861732063726561746564207468652060008301527f6d6178696d756d20616d6f756e74206f6620616c6c6f77656420746f6b656e736020830152604082019050919050565b6000612346602283612b23565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123ac602683612b23565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612412602283612b23565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612478602683612b23565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006124de601083612b23565b91507f6f6e6c792077686974656c6973746564000000000000000000000000000000006000830152602082019050919050565b600061251e602883612b23565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612584602083612b23565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006125c4600d83612b23565b91507f73616c65206e6f74206f70656e000000000000000000000000000000000000006000830152602082019050919050565b6000612604602183612b23565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061266a602583612b23565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006126d0602483612b23565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612736602583612b23565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061279c601583612b23565b91507f696e636f727265637420616d6f756e742073656e7400000000000000000000006000830152602082019050919050565b60006127dc601f83612b23565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b61281881612c56565b82525050565b61282781612c60565b82525050565b60006020820190506128426000830184612216565b92915050565b600060208201905061285d6000830184612225565b92915050565b6000602082019050818103600083015261287d8184612234565b905092915050565b6000602082019050818103600083015261289e8161226d565b9050919050565b600060208201905081810360008301526128be816122d3565b9050919050565b600060208201905081810360008301526128de81612339565b9050919050565b600060208201905081810360008301526128fe8161239f565b9050919050565b6000602082019050818103600083015261291e81612405565b9050919050565b6000602082019050818103600083015261293e8161246b565b9050919050565b6000602082019050818103600083015261295e816124d1565b9050919050565b6000602082019050818103600083015261297e81612511565b9050919050565b6000602082019050818103600083015261299e81612577565b9050919050565b600060208201905081810360008301526129be816125b7565b9050919050565b600060208201905081810360008301526129de816125f7565b9050919050565b600060208201905081810360008301526129fe8161265d565b9050919050565b60006020820190508181036000830152612a1e816126c3565b9050919050565b60006020820190508181036000830152612a3e81612729565b9050919050565b60006020820190508181036000830152612a5e8161278f565b9050919050565b60006020820190508181036000830152612a7e816127cf565b9050919050565b6000602082019050612a9a600083018461280f565b92915050565b6000602082019050612ab5600083018461281e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715612ae257612ae1612d79565b5b8060405250919050565b600067ffffffffffffffff821115612b0757612b06612d79565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b6000612b3f82612c56565b9150612b4a83612c56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b7f57612b7e612d1b565b5b828201905092915050565b6000612b9582612c56565b9150612ba083612c56565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bd957612bd8612d1b565b5b828202905092915050565b6000612bef82612c56565b9150612bfa83612c56565b925082821015612c0d57612c0c612d1b565b5b828203905092915050565b6000612c2382612c36565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612c8b578082015181840152602081019050612c70565b83811115612c9a576000848401525b50505050565b60006002820490506001821680612cb857607f821691505b60208210811415612ccc57612ccb612d4a565b5b50919050565b6000612cdd82612c56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d1057612d0f612d1b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b612dc281612c18565b8114612dcd57600080fd5b50565b612dd981612c56565b8114612de457600080fd5b5056fea26469706673582212204a32cb2c2a2d76679b2dab61e6b42559530053da48e131717b3366a60e9b6f3b64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000001a5468652046616d696c79204d6f6f6b7320205072652d53616c6500000000000000000000000000000000000000000000000000000000000000000000000000044d4f4f4b00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061019c5760003560e01c806370a08231116100ec578063a457c2d71161008a578063edac985b11610064578063edac985b146105e1578063f2fde38b1461060a578063fcfff16f14610633578063fed42f401461064a5761019c565b8063a457c2d71461052a578063a9059cbb14610567578063dd62ed3e146105a45761019c565b80638da5cb5b116100c65780638da5cb5b1461048257806395d89b41146104ad5780639d118770146104d8578063a2b40d19146105015761019c565b806370a0823114610412578063715018a61461044f578063780900dc146104665761019c565b806323b872dd116101595780633950935111610133578063395093511461036a57806340146353146103a75780634541d4cf146103d057806350300120146103fb5761019c565b806323b872dd146102c5578063288ee64614610302578063313ce5671461033f5761019c565b806301c4b316146101a157806306fdde03146101de578063095ea7b31461020957806318160ddd146102465780632324521614610271578063235b6ea11461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906120bc565b610675565b6040516101d59190612848565b60405180910390f35b3480156101ea57600080fd5b506101f3610695565b6040516102009190612863565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612170565b610727565b60405161023d9190612848565b60405180910390f35b34801561025257600080fd5b5061025b610745565b6040516102689190612a85565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906121ac565b61074f565b005b3480156102a657600080fd5b506102af6108fd565b6040516102bc9190612a85565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190612121565b610903565b6040516102f99190612848565b60405180910390f35b34801561030e57600080fd5b50610329600480360381019061032491906120bc565b6109fb565b6040516103369190612a85565b60405180910390f35b34801561034b57600080fd5b50610354610a13565b6040516103619190612aa0565b60405180910390f35b34801561037657600080fd5b50610391600480360381019061038c9190612170565b610a1c565b60405161039e9190612848565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c991906121ed565b610ac8565b005b3480156103dc57600080fd5b506103e5610b85565b6040516103f29190612a85565b60405180910390f35b34801561040757600080fd5b50610410610b8b565b005b34801561041e57600080fd5b50610439600480360381019061043491906120bc565b610c57565b6040516104469190612a85565b60405180910390f35b34801561045b57600080fd5b50610464610c9f565b005b610480600480360381019061047b91906121ed565b610d27565b005b34801561048e57600080fd5b5061049761101b565b6040516104a4919061282d565b60405180910390f35b3480156104b957600080fd5b506104c2611045565b6040516104cf9190612863565b60405180910390f35b3480156104e457600080fd5b506104ff60048036038101906104fa91906121ed565b6110d7565b005b34801561050d57600080fd5b50610528600480360381019061052391906121ed565b611197565b005b34801561053657600080fd5b50610551600480360381019061054c9190612170565b611254565b60405161055e9190612848565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190612170565b61133f565b60405161059b9190612848565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c691906120e5565b61135d565b6040516105d89190612a85565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906121ac565b6113e4565b005b34801561061657600080fd5b50610631600480360381019061062c91906120bc565b611592565b005b34801561063f57600080fd5b5061064861168a565b005b34801561065657600080fd5b5061065f611778565b60405161066c9190612848565b60405180910390f35b600a6020528060005260406000206000915054906101000a900460ff1681565b6060600380546106a490612ca0565b80601f01602080910402602001604051908101604052809291908181526020018280546106d090612ca0565b801561071d5780601f106106f25761010080835404028352916020019161071d565b820191906000526020600020905b81548152906001019060200180831161070057829003601f168201915b5050505050905090565b600061073b61073461178b565b8484611793565b6001905092915050565b6000600254905090565b61075761178b565b73ffffffffffffffffffffffffffffffffffffffff1661077561101b565b73ffffffffffffffffffffffffffffffffffffffff16146107cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c290612985565b60405180910390fd5b60005b81518110156108f9576000600a6000848481518110610816577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f7e1dd2258a1fa02a8360869a16fa4e1d4649c796d79a8d520f03a1dd8ae41af08282815181106108c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040516108de919061282d565b60405180910390a180806108f190612cd2565b9150506107ce565b5050565b60075481565b600061091084848461195e565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061095b61178b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d290612965565b60405180910390fd5b6109ef856109e761178b565b858403611793565b60019150509392505050565b600b6020528060005260406000206000915090505481565b60006012905090565b6000610abe610a2961178b565b848460016000610a3761178b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ab99190612b34565b611793565b6001905092915050565b610ad061178b565b73ffffffffffffffffffffffffffffffffffffffff16610aee61101b565b73ffffffffffffffffffffffffffffffffffffffff1614610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90612985565b60405180910390fd5b806008819055507fb1f2d94ed945d66aeffbcc0dfe1ff08e3307bc9d78c3a61187e1320d5cfe892e81604051610b7a9190612a85565b60405180910390a150565b60085481565b610b9361178b565b73ffffffffffffffffffffffffffffffffffffffff16610bb161101b565b73ffffffffffffffffffffffffffffffffffffffff1614610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90612985565b60405180910390fd5b610c0f61101b565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c54573d6000803e3d6000fd5b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ca761178b565b73ffffffffffffffffffffffffffffffffffffffff16610cc561101b565b73ffffffffffffffffffffffffffffffffffffffff1614610d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1290612985565b60405180910390fd5b610d256000611bdf565b565b600960009054906101000a900460ff16610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d906129a5565b60405180910390fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df990612945565b60405180910390fd5b610e1781600754611ca590919063ffffffff16565b3414610e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4f90612a45565b60405180910390fd5b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ea39190612b34565b6008541015610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede906128a5565b60405180910390fd5b610f0533610f0060065484611ca590919063ffffffff16565b611cbb565b80600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f509190612b34565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f07eac9a0695a188fe9d6fd680bcbbbe39041fb114d5d7ac11252401391f7930781604051610fc29190612a85565b60405180910390a1610fd261101b565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611017573d6000803e3d6000fd5b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461105490612ca0565b80601f016020809104026020016040519081016040528092919081815260200182805461108090612ca0565b80156110cd5780601f106110a2576101008083540402835291602001916110cd565b820191906000526020600020905b8154815290600101906020018083116110b057829003601f168201915b5050505050905090565b6110df61178b565b73ffffffffffffffffffffffffffffffffffffffff166110fd61101b565b73ffffffffffffffffffffffffffffffffffffffff1614611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a90612985565b60405180910390fd5b61115d3382611e1b565b7fd3f5559c9fe2c1b988daa9f5520155e1a89d750e0a7b2ee17afcd4b76dd95bcd8160405161118c9190612a85565b60405180910390a150565b61119f61178b565b73ffffffffffffffffffffffffffffffffffffffff166111bd61101b565b73ffffffffffffffffffffffffffffffffffffffff1614611213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120a90612985565b60405180910390fd5b806007819055507f63f32f63810afda7c9be9643f9fa73ee3f39a9fd8bb35775a2b0d73e48ed9bed816040516112499190612a85565b60405180910390a150565b6000806001600061126361178b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131790612a25565b60405180910390fd5b61133461132b61178b565b85858403611793565b600191505092915050565b600061135361134c61178b565b848461195e565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113ec61178b565b73ffffffffffffffffffffffffffffffffffffffff1661140a61101b565b73ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790612985565b60405180910390fd5b60005b815181101561158e576001600a60008484815181106114ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507faab7954e9d246b167ef88aeddad35209ca2489d95a8aeb59e288d9b19fae5a5482828151811061155e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604051611573919061282d565b60405180910390a1808061158690612cd2565b915050611463565b5050565b61159a61178b565b73ffffffffffffffffffffffffffffffffffffffff166115b861101b565b73ffffffffffffffffffffffffffffffffffffffff161461160e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160590612985565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561167e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611675906128e5565b60405180910390fd5b61168781611bdf565b50565b61169261178b565b73ffffffffffffffffffffffffffffffffffffffff166116b061101b565b73ffffffffffffffffffffffffffffffffffffffff1614611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90612985565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff0219169083151502179055507fc15f25c4eb6ac5b9dc23661b850cbdb3ee36aebed198ad870ab929bae77142de600960009054906101000a900460ff1660405161176e9190612848565b60405180910390a1565b600960009054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90612a05565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186a90612905565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516119519190612a85565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c5906129e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3590612885565b60405180910390fd5b611a49838383611ff2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690612925565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b629190612b34565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611bc69190612a85565b60405180910390a3611bd9848484611ff7565b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183611cb39190612b8a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2290612a65565b60405180910390fd5b611d3760008383611ff2565b8060026000828254611d499190612b34565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d9e9190612b34565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611e039190612a85565b60405180910390a3611e1760008383611ff7565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e82906129c5565b60405180910390fd5b611e9782600083611ff2565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f14906128c5565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254611f749190612be4565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611fd99190612a85565b60405180910390a3611fed83600084611ff7565b505050565b505050565b505050565b600061200f61200a84612aec565b612abb565b9050808382526020820190508285602086028201111561202e57600080fd5b60005b8581101561205e57816120448882612068565b845260208401935060208301925050600181019050612031565b5050509392505050565b60008135905061207781612db9565b92915050565b600082601f83011261208e57600080fd5b813561209e848260208601611ffc565b91505092915050565b6000813590506120b681612dd0565b92915050565b6000602082840312156120ce57600080fd5b60006120dc84828501612068565b91505092915050565b600080604083850312156120f857600080fd5b600061210685828601612068565b925050602061211785828601612068565b9150509250929050565b60008060006060848603121561213657600080fd5b600061214486828701612068565b935050602061215586828701612068565b9250506040612166868287016120a7565b9150509250925092565b6000806040838503121561218357600080fd5b600061219185828601612068565b92505060206121a2858286016120a7565b9150509250929050565b6000602082840312156121be57600080fd5b600082013567ffffffffffffffff8111156121d857600080fd5b6121e48482850161207d565b91505092915050565b6000602082840312156121ff57600080fd5b600061220d848285016120a7565b91505092915050565b61221f81612c18565b82525050565b61222e81612c2a565b82525050565b600061223f82612b18565b6122498185612b23565b9350612259818560208601612c6d565b61226281612da8565b840191505092915050565b600061227a602383612b23565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006122e0604083612b23565b91507f6163636f756e7420616c7265616479206861732063726561746564207468652060008301527f6d6178696d756d20616d6f756e74206f6620616c6c6f77656420746f6b656e736020830152604082019050919050565b6000612346602283612b23565b91507f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008301527f63650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123ac602683612b23565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612412602283612b23565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612478602683612b23565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006124de601083612b23565b91507f6f6e6c792077686974656c6973746564000000000000000000000000000000006000830152602082019050919050565b600061251e602883612b23565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206160008301527f6c6c6f77616e63650000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612584602083612b23565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006125c4600d83612b23565b91507f73616c65206e6f74206f70656e000000000000000000000000000000000000006000830152602082019050919050565b6000612604602183612b23565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061266a602583612b23565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006126d0602483612b23565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612736602583612b23565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061279c601583612b23565b91507f696e636f727265637420616d6f756e742073656e7400000000000000000000006000830152602082019050919050565b60006127dc601f83612b23565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b61281881612c56565b82525050565b61282781612c60565b82525050565b60006020820190506128426000830184612216565b92915050565b600060208201905061285d6000830184612225565b92915050565b6000602082019050818103600083015261287d8184612234565b905092915050565b6000602082019050818103600083015261289e8161226d565b9050919050565b600060208201905081810360008301526128be816122d3565b9050919050565b600060208201905081810360008301526128de81612339565b9050919050565b600060208201905081810360008301526128fe8161239f565b9050919050565b6000602082019050818103600083015261291e81612405565b9050919050565b6000602082019050818103600083015261293e8161246b565b9050919050565b6000602082019050818103600083015261295e816124d1565b9050919050565b6000602082019050818103600083015261297e81612511565b9050919050565b6000602082019050818103600083015261299e81612577565b9050919050565b600060208201905081810360008301526129be816125b7565b9050919050565b600060208201905081810360008301526129de816125f7565b9050919050565b600060208201905081810360008301526129fe8161265d565b9050919050565b60006020820190508181036000830152612a1e816126c3565b9050919050565b60006020820190508181036000830152612a3e81612729565b9050919050565b60006020820190508181036000830152612a5e8161278f565b9050919050565b60006020820190508181036000830152612a7e816127cf565b9050919050565b6000602082019050612a9a600083018461280f565b92915050565b6000602082019050612ab5600083018461281e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715612ae257612ae1612d79565b5b8060405250919050565b600067ffffffffffffffff821115612b0757612b06612d79565b5b602082029050602081019050919050565b600081519050919050565b600082825260208201905092915050565b6000612b3f82612c56565b9150612b4a83612c56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b7f57612b7e612d1b565b5b828201905092915050565b6000612b9582612c56565b9150612ba083612c56565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bd957612bd8612d1b565b5b828202905092915050565b6000612bef82612c56565b9150612bfa83612c56565b925082821015612c0d57612c0c612d1b565b5b828203905092915050565b6000612c2382612c36565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015612c8b578082015181840152602081019050612c70565b83811115612c9a576000848401525b50505050565b60006002820490506001821680612cb857607f821691505b60208210811415612ccc57612ccb612d4a565b5b50919050565b6000612cdd82612c56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d1057612d0f612d1b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b612dc281612c18565b8114612dcd57600080fd5b50565b612dd981612c56565b8114612de457600080fd5b5056fea26469706673582212204a32cb2c2a2d76679b2dab61e6b42559530053da48e131717b3366a60e9b6f3b64736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000174876e80000000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000001a5468652046616d696c79204d6f6f6b7320205072652d53616c6500000000000000000000000000000000000000000000000000000000000000000000000000044d4f4f4b00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): The Family Mooks Pre-Sale
Arg [1] : symbol (string): MOOK
Arg [2] : price (uint256): 100000000000
Arg [3] : purchaseLimit (uint256): 250

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000000000000000000000000000000000174876e800
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [4] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [5] : 5468652046616d696c79204d6f6f6b7320205072652d53616c65000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4d4f4f4b00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

34531:2802:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34791:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14943:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17110:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16063:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35842:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34693:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17761:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34842:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15905:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18662:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36207:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34721:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36379:113;;;;;;;;;;;;;:::i;:::-;;16234:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27110:94;;;;;;;;;;;;;:::i;:::-;;36609:586;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26459:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15162:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37203:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36083:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19380:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16574:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16812:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35602:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27359:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36500:101;;;;;;;;;;;;;:::i;:::-;;34757:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34791:44;;;;;;;;;;;;;;;;;;;;;;:::o;14943:100::-;14997:13;15030:5;15023:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14943:100;:::o;17110:169::-;17193:4;17210:39;17219:12;:10;:12::i;:::-;17233:7;17242:6;17210:8;:39::i;:::-;17267:4;17260:11;;17110:169;;;;:::o;16063:108::-;16124:7;16151:12;;16144:19;;16063:108;:::o;35842:233::-;26690:12;:10;:12::i;:::-;26679:23;;:7;:5;:7::i;:::-;:23;;;26671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35929:6:::1;35924:144;35945:8;:15;35941:1;:19;35924:144;;;36010:5;35982:12;:25;35995:8;36004:1;35995:11;;;;;;;;;;;;;;;;;;;;;;35982:25;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;36035:21;36044:8;36053:1;36044:11;;;;;;;;;;;;;;;;;;;;;;36035:21;;;;;;:::i;:::-;;;;;;;;35962:3;;;;;:::i;:::-;;;;35924:144;;;;35842:233:::0;:::o;34693:21::-;;;;:::o;17761:492::-;17901:4;17918:36;17928:6;17936:9;17947:6;17918:9;:36::i;:::-;17967:24;17994:11;:19;18006:6;17994:19;;;;;;;;;;;;;;;:33;18014:12;:10;:12::i;:::-;17994:33;;;;;;;;;;;;;;;;17967:60;;18066:6;18046:16;:26;;18038:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;18153:57;18162:6;18170:12;:10;:12::i;:::-;18203:6;18184:16;:25;18153:8;:57::i;:::-;18241:4;18234:11;;;17761:492;;;;;:::o;34842:45::-;;;;;;;;;;;;;;;;;:::o;15905:93::-;15963:5;15988:2;15981:9;;15905:93;:::o;18662:215::-;18750:4;18767:80;18776:12;:10;:12::i;:::-;18790:7;18836:10;18799:11;:25;18811:12;:10;:12::i;:::-;18799:25;;;;;;;;;;;;;;;:34;18825:7;18799:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;18767:8;:80::i;:::-;18865:4;18858:11;;18662:215;;;;:::o;36207:164::-;26690:12;:10;:12::i;:::-;26679:23;;:7;:5;:7::i;:::-;:23;;;26671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36306:13:::1;36289:14;:30;;;;36335:28;36349:13;36335:28;;;;;;:::i;:::-;;;;;;;;36207:164:::0;:::o;34721:29::-;;;;:::o;36379:113::-;26690:12;:10;:12::i;:::-;26679:23;;:7;:5;:7::i;:::-;:23;;;26671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36444:7:::1;:5;:7::i;:::-;36436:25;;:48;36462:21;36436:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;36379:113::o:0;16234:127::-;16308:7;16335:9;:18;16345:7;16335:18;;;;;;;;;;;;;;;;16328:25;;16234:127;;;:::o;27110:94::-;26690:12;:10;:12::i;:::-;26679:23;;:7;:5;:7::i;:::-;:23;;;26671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27175:21:::1;27193:1;27175:9;:21::i;:::-;27110:94::o:0;36609:586::-;35430:7;;;;;;;;;;;35422:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;35529:12:::1;:24;35542:10;35529:24;;;;;;;;;;;;;;;;;;;;;;;;;35521:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36717:18:::2;36728:6;36717;;:10;;:18;;;;:::i;:::-;36704:9;:31;36696:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36823:6;36798:10;:22;36809:10;36798:22;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;36780:14;;:49;;36772:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;36951:45;36957:10;36969:26;36980:14;;36969:6;:10;;:26;;;;:::i;:::-;36951:5;:45::i;:::-;37057:6;37032:10;:22;37043:10;37032:22;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;37007:10;:22;37018:10;37007:22;;;;;;;;;;;;;;;:56;;;;37079:14;37086:6;37079:14;;;;;;:::i;:::-;;;;;;;;37147:7;:5;:7::i;:::-;37139:25;;:48;37165:21;37139:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;36609:586:::0;:::o;26459:87::-;26505:7;26532:6;;;;;;;;;;;26525:13;;26459:87;:::o;15162:104::-;15218:13;15251:7;15244:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15162:104;:::o;37203:127::-;26690:12;:10;:12::i;:::-;26679:23;;:7;:5;:7::i;:::-;:23;;;26671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37266:25:::1;37272:10;37284:6;37266:5;:25::i;:::-;37307:15;37315:6;37307:15;;;;;;:::i;:::-;;;;;;;;37203:127:::0;:::o;36083:116::-;26690:12;:10;:12::i;:::-;26679:23;;:7;:5;:7::i;:::-;:23;;;26671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36158:5:::1;36149:6;:14;;;;36179:12;36185:5;36179:12;;;;;;:::i;:::-;;;;;;;;36083:116:::0;:::o;19380:413::-;19473:4;19490:24;19517:11;:25;19529:12;:10;:12::i;:::-;19517:25;;;;;;;;;;;;;;;:34;19543:7;19517:34;;;;;;;;;;;;;;;;19490:61;;19590:15;19570:16;:35;;19562:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;19683:67;19692:12;:10;:12::i;:::-;19706:7;19734:15;19715:16;:34;19683:8;:67::i;:::-;19781:4;19774:11;;;19380:413;;;;:::o;16574:175::-;16660:4;16677:42;16687:12;:10;:12::i;:::-;16701:9;16712:6;16677:9;:42::i;:::-;16737:4;16730:11;;16574:175;;;;:::o;16812:151::-;16901:7;16928:11;:18;16940:5;16928:18;;;;;;;;;;;;;;;:27;16947:7;16928:27;;;;;;;;;;;;;;;;16921:34;;16812:151;;;;:::o;35602:232::-;26690:12;:10;:12::i;:::-;26679:23;;:7;:5;:7::i;:::-;:23;;;26671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35686:6:::1;35681:146;35702:8;:15;35698:1;:19;35681:146;;;35767:4;35739:12;:25;35752:8;35761:1;35752:11;;;;;;;;;;;;;;;;;;;;;;35739:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;35791:24;35803:8;35812:1;35803:11;;;;;;;;;;;;;;;;;;;;;;35791:24;;;;;;:::i;:::-;;;;;;;;35719:3;;;;;:::i;:::-;;;;35681:146;;;;35602:232:::0;:::o;27359:192::-;26690:12;:10;:12::i;:::-;26679:23;;:7;:5;:7::i;:::-;:23;;;26671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27468:1:::1;27448:22;;:8;:22;;;;27440:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27524:19;27534:8;27524:9;:19::i;:::-;27359:192:::0;:::o;36500:101::-;26690:12;:10;:12::i;:::-;26679:23;;:7;:5;:7::i;:::-;:23;;;26671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36557:7:::1;;;;;;;;;;;36556:8;36546:7;;:18;;;;;;;;;;;;;;;;;;36580:13;36585:7;;;;;;;;;;;36580:13;;;;;;:::i;:::-;;;;;;;;36500:101::o:0;34757:27::-;;;;;;;;;;;;;:::o;8934:98::-;8987:7;9014:10;9007:17;;8934:98;:::o;23064:380::-;23217:1;23200:19;;:5;:19;;;;23192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23298:1;23279:21;;:7;:21;;;;23271:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23382:6;23352:11;:18;23364:5;23352:18;;;;;;;;;;;;;;;:27;23371:7;23352:27;;;;;;;;;;;;;;;:36;;;;23420:7;23404:32;;23413:5;23404:32;;;23429:6;23404:32;;;;;;:::i;:::-;;;;;;;;23064:380;;;:::o;20283:733::-;20441:1;20423:20;;:6;:20;;;;20415:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;20525:1;20504:23;;:9;:23;;;;20496:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;20580:47;20601:6;20609:9;20620:6;20580:20;:47::i;:::-;20640:21;20664:9;:17;20674:6;20664:17;;;;;;;;;;;;;;;;20640:41;;20717:6;20700:13;:23;;20692:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20838:6;20822:13;:22;20802:9;:17;20812:6;20802:17;;;;;;;;;;;;;;;:42;;;;20890:6;20866:9;:20;20876:9;20866:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;20931:9;20914:35;;20923:6;20914:35;;;20942:6;20914:35;;;;;;:::i;:::-;;;;;;;;20962:46;20982:6;20990:9;21001:6;20962:19;:46::i;:::-;20283:733;;;;:::o;27559:173::-;27615:16;27634:6;;;;;;;;;;;27615:25;;27660:8;27651:6;;:17;;;;;;;;;;;;;;;;;;27715:8;27684:40;;27705:8;27684:40;;;;;;;;;;;;27559:173;;:::o;30994:98::-;31052:7;31083:1;31079;:5;;;;:::i;:::-;31072:12;;30994:98;;;;:::o;21303:399::-;21406:1;21387:21;;:7;:21;;;;21379:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;21457:49;21486:1;21490:7;21499:6;21457:20;:49::i;:::-;21535:6;21519:12;;:22;;;;;;;:::i;:::-;;;;;;;;21574:6;21552:9;:18;21562:7;21552:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;21617:7;21596:37;;21613:1;21596:37;;;21626:6;21596:37;;;;;;:::i;:::-;;;;;;;;21646:48;21674:1;21678:7;21687:6;21646:19;:48::i;:::-;21303:399;;:::o;22035:591::-;22138:1;22119:21;;:7;:21;;;;22111:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22191:49;22212:7;22229:1;22233:6;22191:20;:49::i;:::-;22253:22;22278:9;:18;22288:7;22278:18;;;;;;;;;;;;;;;;22253:43;;22333:6;22315:14;:24;;22307:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;22452:6;22435:14;:23;22414:9;:18;22424:7;22414:18;;;;;;;;;;;;;;;:44;;;;22496:6;22480:12;;:22;;;;;;;:::i;:::-;;;;;;;;22546:1;22520:37;;22529:7;22520:37;;;22550:6;22520:37;;;;;;:::i;:::-;;;;;;;;22570:48;22590:7;22607:1;22611:6;22570:19;:48::i;:::-;22035:591;;;:::o;24044:125::-;;;;:::o;24773:124::-;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:139::-;;736:6;723:20;714:29;;752:33;779:5;752:33;:::i;:::-;704:87;;;;:::o;814:303::-;;934:3;927:4;919:6;915:17;911:27;901:2;;952:1;949;942:12;901:2;992:6;979:20;1017:94;1107:3;1099:6;1092:4;1084:6;1080:17;1017:94;:::i;:::-;1008:103;;891:226;;;;;:::o;1123:139::-;;1207:6;1194:20;1185:29;;1223:33;1250:5;1223:33;:::i;:::-;1175:87;;;;:::o;1268:262::-;;1376:2;1364:9;1355:7;1351:23;1347:32;1344:2;;;1392:1;1389;1382:12;1344:2;1435:1;1460:53;1505:7;1496:6;1485:9;1481:22;1460:53;:::i;:::-;1450:63;;1406:117;1334:196;;;;:::o;1536:407::-;;;1661:2;1649:9;1640:7;1636:23;1632:32;1629:2;;;1677:1;1674;1667:12;1629:2;1720:1;1745:53;1790:7;1781:6;1770:9;1766:22;1745:53;:::i;:::-;1735:63;;1691:117;1847:2;1873:53;1918:7;1909:6;1898:9;1894:22;1873:53;:::i;:::-;1863:63;;1818:118;1619:324;;;;;:::o;1949:552::-;;;;2091:2;2079:9;2070:7;2066:23;2062:32;2059:2;;;2107:1;2104;2097:12;2059:2;2150:1;2175:53;2220:7;2211:6;2200:9;2196:22;2175:53;:::i;:::-;2165:63;;2121:117;2277:2;2303:53;2348:7;2339:6;2328:9;2324:22;2303:53;:::i;:::-;2293:63;;2248:118;2405:2;2431:53;2476:7;2467:6;2456:9;2452:22;2431:53;:::i;:::-;2421:63;;2376:118;2049:452;;;;;:::o;2507:407::-;;;2632:2;2620:9;2611:7;2607:23;2603:32;2600:2;;;2648:1;2645;2638:12;2600:2;2691:1;2716:53;2761:7;2752:6;2741:9;2737:22;2716:53;:::i;:::-;2706:63;;2662:117;2818:2;2844:53;2889:7;2880:6;2869:9;2865:22;2844:53;:::i;:::-;2834:63;;2789:118;2590:324;;;;;:::o;2920:405::-;;3053:2;3041:9;3032:7;3028:23;3024:32;3021:2;;;3069:1;3066;3059:12;3021:2;3140:1;3129:9;3125:17;3112:31;3170:18;3162:6;3159:30;3156:2;;;3202:1;3199;3192:12;3156:2;3230:78;3300:7;3291:6;3280:9;3276:22;3230:78;:::i;:::-;3220:88;;3083:235;3011:314;;;;:::o;3331:262::-;;3439:2;3427:9;3418:7;3414:23;3410:32;3407:2;;;3455:1;3452;3445:12;3407:2;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3397:196;;;;:::o;3599:118::-;3686:24;3704:5;3686:24;:::i;:::-;3681:3;3674:37;3664:53;;:::o;3723:109::-;3804:21;3819:5;3804:21;:::i;:::-;3799:3;3792:34;3782:50;;:::o;3838:364::-;;3954:39;3987:5;3954:39;:::i;:::-;4009:71;4073:6;4068:3;4009:71;:::i;:::-;4002:78;;4089:52;4134:6;4129:3;4122:4;4115:5;4111:16;4089:52;:::i;:::-;4166:29;4188:6;4166:29;:::i;:::-;4161:3;4157:39;4150:46;;3930:272;;;;;:::o;4208:367::-;;4371:67;4435:2;4430:3;4371:67;:::i;:::-;4364:74;;4468:34;4464:1;4459:3;4455:11;4448:55;4534:5;4529:2;4524:3;4520:12;4513:27;4566:2;4561:3;4557:12;4550:19;;4354:221;;;:::o;4581:396::-;;4744:67;4808:2;4803:3;4744:67;:::i;:::-;4737:74;;4841:34;4837:1;4832:3;4828:11;4821:55;4907:34;4902:2;4897:3;4893:12;4886:56;4968:2;4963:3;4959:12;4952:19;;4727:250;;;:::o;4983:366::-;;5146:67;5210:2;5205:3;5146:67;:::i;:::-;5139:74;;5243:34;5239:1;5234:3;5230:11;5223:55;5309:4;5304:2;5299:3;5295:12;5288:26;5340:2;5335:3;5331:12;5324:19;;5129:220;;;:::o;5355:370::-;;5518:67;5582:2;5577:3;5518:67;:::i;:::-;5511:74;;5615:34;5611:1;5606:3;5602:11;5595:55;5681:8;5676:2;5671:3;5667:12;5660:30;5716:2;5711:3;5707:12;5700:19;;5501:224;;;:::o;5731:366::-;;5894:67;5958:2;5953:3;5894:67;:::i;:::-;5887:74;;5991:34;5987:1;5982:3;5978:11;5971:55;6057:4;6052:2;6047:3;6043:12;6036:26;6088:2;6083:3;6079:12;6072:19;;5877:220;;;:::o;6103:370::-;;6266:67;6330:2;6325:3;6266:67;:::i;:::-;6259:74;;6363:34;6359:1;6354:3;6350:11;6343:55;6429:8;6424:2;6419:3;6415:12;6408:30;6464:2;6459:3;6455:12;6448:19;;6249:224;;;:::o;6479:314::-;;6642:67;6706:2;6701:3;6642:67;:::i;:::-;6635:74;;6739:18;6735:1;6730:3;6726:11;6719:39;6784:2;6779:3;6775:12;6768:19;;6625:168;;;:::o;6799:372::-;;6962:67;7026:2;7021:3;6962:67;:::i;:::-;6955:74;;7059:34;7055:1;7050:3;7046:11;7039:55;7125:10;7120:2;7115:3;7111:12;7104:32;7162:2;7157:3;7153:12;7146:19;;6945:226;;;:::o;7177:330::-;;7340:67;7404:2;7399:3;7340:67;:::i;:::-;7333:74;;7437:34;7433:1;7428:3;7424:11;7417:55;7498:2;7493:3;7489:12;7482:19;;7323:184;;;:::o;7513:311::-;;7676:67;7740:2;7735:3;7676:67;:::i;:::-;7669:74;;7773:15;7769:1;7764:3;7760:11;7753:36;7815:2;7810:3;7806:12;7799:19;;7659:165;;;:::o;7830:365::-;;7993:67;8057:2;8052:3;7993:67;:::i;:::-;7986:74;;8090:34;8086:1;8081:3;8077:11;8070:55;8156:3;8151:2;8146:3;8142:12;8135:25;8186:2;8181:3;8177:12;8170:19;;7976:219;;;:::o;8201:369::-;;8364:67;8428:2;8423:3;8364:67;:::i;:::-;8357:74;;8461:34;8457:1;8452:3;8448:11;8441:55;8527:7;8522:2;8517:3;8513:12;8506:29;8561:2;8556:3;8552:12;8545:19;;8347:223;;;:::o;8576:368::-;;8739:67;8803:2;8798:3;8739:67;:::i;:::-;8732:74;;8836:34;8832:1;8827:3;8823:11;8816:55;8902:6;8897:2;8892:3;8888:12;8881:28;8935:2;8930:3;8926:12;8919:19;;8722:222;;;:::o;8950:369::-;;9113:67;9177:2;9172:3;9113:67;:::i;:::-;9106:74;;9210:34;9206:1;9201:3;9197:11;9190:55;9276:7;9271:2;9266:3;9262:12;9255:29;9310:2;9305:3;9301:12;9294:19;;9096:223;;;:::o;9325:319::-;;9488:67;9552:2;9547:3;9488:67;:::i;:::-;9481:74;;9585:23;9581:1;9576:3;9572:11;9565:44;9635:2;9630:3;9626:12;9619:19;;9471:173;;;:::o;9650:329::-;;9813:67;9877:2;9872:3;9813:67;:::i;:::-;9806:74;;9910:33;9906:1;9901:3;9897:11;9890:54;9970:2;9965:3;9961:12;9954:19;;9796:183;;;:::o;9985:118::-;10072:24;10090:5;10072:24;:::i;:::-;10067:3;10060:37;10050:53;;:::o;10109:112::-;10192:22;10208:5;10192:22;:::i;:::-;10187:3;10180:35;10170:51;;:::o;10227:222::-;;10358:2;10347:9;10343:18;10335:26;;10371:71;10439:1;10428:9;10424:17;10415:6;10371:71;:::i;:::-;10325:124;;;;:::o;10455:210::-;;10580:2;10569:9;10565:18;10557:26;;10593:65;10655:1;10644:9;10640:17;10631:6;10593:65;:::i;:::-;10547:118;;;;:::o;10671:313::-;;10822:2;10811:9;10807:18;10799:26;;10871:9;10865:4;10861:20;10857:1;10846:9;10842:17;10835:47;10899:78;10972:4;10963:6;10899:78;:::i;:::-;10891:86;;10789:195;;;;:::o;10990:419::-;;11194:2;11183:9;11179:18;11171:26;;11243:9;11237:4;11233:20;11229:1;11218:9;11214:17;11207:47;11271:131;11397:4;11271:131;:::i;:::-;11263:139;;11161:248;;;:::o;11415:419::-;;11619:2;11608:9;11604:18;11596:26;;11668:9;11662:4;11658:20;11654:1;11643:9;11639:17;11632:47;11696:131;11822:4;11696:131;:::i;:::-;11688:139;;11586:248;;;:::o;11840:419::-;;12044:2;12033:9;12029:18;12021:26;;12093:9;12087:4;12083:20;12079:1;12068:9;12064:17;12057:47;12121:131;12247:4;12121:131;:::i;:::-;12113:139;;12011:248;;;:::o;12265:419::-;;12469:2;12458:9;12454:18;12446:26;;12518:9;12512:4;12508:20;12504:1;12493:9;12489:17;12482:47;12546:131;12672:4;12546:131;:::i;:::-;12538:139;;12436:248;;;:::o;12690:419::-;;12894:2;12883:9;12879:18;12871:26;;12943:9;12937:4;12933:20;12929:1;12918:9;12914:17;12907:47;12971:131;13097:4;12971:131;:::i;:::-;12963:139;;12861:248;;;:::o;13115:419::-;;13319:2;13308:9;13304:18;13296:26;;13368:9;13362:4;13358:20;13354:1;13343:9;13339:17;13332:47;13396:131;13522:4;13396:131;:::i;:::-;13388:139;;13286:248;;;:::o;13540:419::-;;13744:2;13733:9;13729:18;13721:26;;13793:9;13787:4;13783:20;13779:1;13768:9;13764:17;13757:47;13821:131;13947:4;13821:131;:::i;:::-;13813:139;;13711:248;;;:::o;13965:419::-;;14169:2;14158:9;14154:18;14146:26;;14218:9;14212:4;14208:20;14204:1;14193:9;14189:17;14182:47;14246:131;14372:4;14246:131;:::i;:::-;14238:139;;14136:248;;;:::o;14390:419::-;;14594:2;14583:9;14579:18;14571:26;;14643:9;14637:4;14633:20;14629:1;14618:9;14614:17;14607:47;14671:131;14797:4;14671:131;:::i;:::-;14663:139;;14561:248;;;:::o;14815:419::-;;15019:2;15008:9;15004:18;14996:26;;15068:9;15062:4;15058:20;15054:1;15043:9;15039:17;15032:47;15096:131;15222:4;15096:131;:::i;:::-;15088:139;;14986:248;;;:::o;15240:419::-;;15444:2;15433:9;15429:18;15421:26;;15493:9;15487:4;15483:20;15479:1;15468:9;15464:17;15457:47;15521:131;15647:4;15521:131;:::i;:::-;15513:139;;15411:248;;;:::o;15665:419::-;;15869:2;15858:9;15854:18;15846:26;;15918:9;15912:4;15908:20;15904:1;15893:9;15889:17;15882:47;15946:131;16072:4;15946:131;:::i;:::-;15938:139;;15836:248;;;:::o;16090:419::-;;16294:2;16283:9;16279:18;16271:26;;16343:9;16337:4;16333:20;16329:1;16318:9;16314:17;16307:47;16371:131;16497:4;16371:131;:::i;:::-;16363:139;;16261:248;;;:::o;16515:419::-;;16719:2;16708:9;16704:18;16696:26;;16768:9;16762:4;16758:20;16754:1;16743:9;16739:17;16732:47;16796:131;16922:4;16796:131;:::i;:::-;16788:139;;16686:248;;;:::o;16940:419::-;;17144:2;17133:9;17129:18;17121:26;;17193:9;17187:4;17183:20;17179:1;17168:9;17164:17;17157:47;17221:131;17347:4;17221:131;:::i;:::-;17213:139;;17111:248;;;:::o;17365:419::-;;17569:2;17558:9;17554:18;17546:26;;17618:9;17612:4;17608:20;17604:1;17593:9;17589:17;17582:47;17646:131;17772:4;17646:131;:::i;:::-;17638:139;;17536:248;;;:::o;17790:222::-;;17921:2;17910:9;17906:18;17898:26;;17934:71;18002:1;17991:9;17987:17;17978:6;17934:71;:::i;:::-;17888:124;;;;:::o;18018:214::-;;18145:2;18134:9;18130:18;18122:26;;18158:67;18222:1;18211:9;18207:17;18198:6;18158:67;:::i;:::-;18112:120;;;;:::o;18238:283::-;;18304:2;18298:9;18288:19;;18346:4;18338:6;18334:17;18453:6;18441:10;18438:22;18417:18;18405:10;18402:34;18399:62;18396:2;;;18464:18;;:::i;:::-;18396:2;18504:10;18500:2;18493:22;18278:243;;;;:::o;18527:311::-;;18694:18;18686:6;18683:30;18680:2;;;18716:18;;:::i;:::-;18680:2;18766:4;18758:6;18754:17;18746:25;;18826:4;18820;18816:15;18808:23;;18609:229;;;:::o;18844:99::-;;18930:5;18924:12;18914:22;;18903:40;;;:::o;18949:169::-;;19067:6;19062:3;19055:19;19107:4;19102:3;19098:14;19083:29;;19045:73;;;;:::o;19124:305::-;;19183:20;19201:1;19183:20;:::i;:::-;19178:25;;19217:20;19235:1;19217:20;:::i;:::-;19212:25;;19371:1;19303:66;19299:74;19296:1;19293:81;19290:2;;;19377:18;;:::i;:::-;19290:2;19421:1;19418;19414:9;19407:16;;19168:261;;;;:::o;19435:348::-;;19498:20;19516:1;19498:20;:::i;:::-;19493:25;;19532:20;19550:1;19532:20;:::i;:::-;19527:25;;19720:1;19652:66;19648:74;19645:1;19642:81;19637:1;19630:9;19623:17;19619:105;19616:2;;;19727:18;;:::i;:::-;19616:2;19775:1;19772;19768:9;19757:20;;19483:300;;;;:::o;19789:191::-;;19849:20;19867:1;19849:20;:::i;:::-;19844:25;;19883:20;19901:1;19883:20;:::i;:::-;19878:25;;19922:1;19919;19916:8;19913:2;;;19927:18;;:::i;:::-;19913:2;19972:1;19969;19965:9;19957:17;;19834:146;;;;:::o;19986:96::-;;20052:24;20070:5;20052:24;:::i;:::-;20041:35;;20031:51;;;:::o;20088:90::-;;20165:5;20158:13;20151:21;20140:32;;20130:48;;;:::o;20184:126::-;;20261:42;20254:5;20250:54;20239:65;;20229:81;;;:::o;20316:77::-;;20382:5;20371:16;;20361:32;;;:::o;20399:86::-;;20474:4;20467:5;20463:16;20452:27;;20442:43;;;:::o;20491:307::-;20559:1;20569:113;20583:6;20580:1;20577:13;20569:113;;;20668:1;20663:3;20659:11;20653:18;20649:1;20644:3;20640:11;20633:39;20605:2;20602:1;20598:10;20593:15;;20569:113;;;20700:6;20697:1;20694:13;20691:2;;;20780:1;20771:6;20766:3;20762:16;20755:27;20691:2;20540:258;;;;:::o;20804:320::-;;20885:1;20879:4;20875:12;20865:22;;20932:1;20926:4;20922:12;20953:18;20943:2;;21009:4;21001:6;20997:17;20987:27;;20943:2;21071;21063:6;21060:14;21040:18;21037:38;21034:2;;;21090:18;;:::i;:::-;21034:2;20855:269;;;;:::o;21130:233::-;;21192:24;21210:5;21192:24;:::i;:::-;21183:33;;21238:66;21231:5;21228:77;21225:2;;;21308:18;;:::i;:::-;21225:2;21355:1;21348:5;21344:13;21337:20;;21173:190;;;:::o;21369:180::-;21417:77;21414:1;21407:88;21514:4;21511:1;21504:15;21538:4;21535:1;21528:15;21555:180;21603:77;21600:1;21593:88;21700:4;21697:1;21690:15;21724:4;21721:1;21714:15;21741:180;21789:77;21786:1;21779:88;21886:4;21883:1;21876:15;21910:4;21907:1;21900:15;21927:102;;22019:2;22015:7;22010:2;22003:5;21999:14;21995:28;21985:38;;21975:54;;;:::o;22035:122::-;22108:24;22126:5;22108:24;:::i;:::-;22101:5;22098:35;22088:2;;22147:1;22144;22137:12;22088:2;22078:79;:::o;22163:122::-;22236:24;22254:5;22236:24;:::i;:::-;22229:5;22226:35;22216:2;;22275:1;22272;22265:12;22216:2;22206:79;:::o

Swarm Source

ipfs://4a32cb2c2a2d76679b2dab61e6b42559530053da48e131717b3366a60e9b6f3b
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.