ETH Price: $3,513.94 (+5.03%)

Token

MEE6 Avatars (MAVA)
 

Overview

Max Total Supply

0 MAVA

Holders

2,351

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
linkielink.eth
Balance
2 MAVA
0xa6dab77b720ba09171949a5662630def698c22ac
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:
MEE6Avatars

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-08
*/

// File: @chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol


pragma solidity ^0.8.4;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ.
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomWords the VRF output expanded to the requested number of words
   */
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}

// File: @chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol


pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {

  /**
   * @notice Returns the global config that applies to all VRF requests.
   * @return minimumRequestBlockConfirmations - A minimum number of confirmation
   * blocks on VRF requests before oracles should respond.
   * @return fulfillmentFlatFeeLinkPPM - The charge per request on top of the gas fees.
   * Its flat fee specified in millionths of LINK.
   * @return maxGasLimit - The maximum gas limit supported for a fulfillRandomWords callback.
   * @return stalenessSeconds - How long we wait until we consider the ETH/LINK price
   * (used for converting gas costs to LINK) is stale and use `fallbackWeiPerUnitLink`
   * @return gasAfterPaymentCalculation - How much gas is used outside of the payment calculation,
   * i.e. the gas overhead of actually making the payment to oracles.
   * @return minimumSubscriptionBalance - The minimum subscription balance required to make a request. Its set to be about 300%
   * of the cost of a single request to handle in ETH/LINK price between request and fulfillment time.
   * @return fallbackWeiPerUnitLink - fallback ETH/LINK price in the case of a stale feed.
   */
  function getConfig()
  external
  view
  returns (
    uint16 minimumRequestBlockConfirmations,
    uint32 fulfillmentFlatFeeLinkPPM,
    uint32 maxGasLimit,
    uint32 stalenessSeconds,
    uint32 gasAfterPaymentCalculation,
    uint96 minimumSubscriptionBalance,
    int256 fallbackWeiPerUnitLink
  );

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with at least minimumSubscriptionBalance (see getConfig) LINK
   * before making a request.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [5000, maxGasLimit].
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64  subId,
    uint16  minimumRequestConfirmations,
    uint32  callbackGasLimit,
    uint32  numWords
  )
    external
    returns (
      uint256 requestId
    );

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription()
    external
    returns (
      uint64 subId
    );

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return owner - Owner of the subscription
   * @return consumers - List of consumer address which are able to use this subscription.
   */
  function getSubscription(
    uint64 subId
  )
    external
    view
    returns (
      uint96 balance,
      address owner,
      address[] memory consumers
    );

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(
    uint64 subId,
    address newOwner
  )
    external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(
    uint64 subId
  )
    external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(
    uint64 subId,
    address consumer
  )
    external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(
    uint64 subId,
    address consumer
  )
    external;

  /**
   * @notice Withdraw funds from a VRF subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the withdrawn LINK to
   * @param amount - How much to withdraw in juels
   */
  function defundSubscription(
    uint64 subId,
    address to,
    uint96 amount
  )
    external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(
    uint64 subId,
    address to
  )
    external;
}

// File: @openzeppelin/contracts/utils/Counters.sol



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with 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;
    }
}

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



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * 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);
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol



pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol



pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: contracts/avatars.sol


pragma solidity ^0.8.4;








interface IAvatarMetadata {
    function tokenURI(uint256 seed, uint256 tokenId) external view returns (string memory);
}

contract MEE6Avatars is ERC721, Pausable, Ownable, ERC721Burnable, VRFConsumerBaseV2 {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    bool private _isMintAllowed;
    bool private _isGenSeedAllowed;
    bool private _isMetadataContractAddressUnlocked;
    address private _metadataContractAddress;
    string private _contractUri;
    string private _uri;
    uint256 private _seed;
    VRFCoordinatorV2Interface VRF_COORDINATOR;

    constructor(string memory name, string memory symbol, string memory baseUri, string memory contractUri, address vrfCoordinator) ERC721(name, symbol) VRFConsumerBaseV2(vrfCoordinator)  {
        _uri = baseUri;
        _contractUri = contractUri;
        _isMintAllowed = true;
        _isGenSeedAllowed = true;
        _metadataContractAddress = address(0);
        _isMetadataContractAddressUnlocked = true;
        VRF_COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator);
    }

    function _baseURI() internal view override returns (string memory) {
        return _uri;
    }

    function contractURI() public view returns (string memory) {
        return _contractUri;
    }

    function seed() public view returns (uint256) {
        return _seed;
    }

    function genSeed(uint64 subscriptionId, bytes32 keyHash, uint16 requestConfirmations, uint32 callbackGasLimit) public onlyOwner returns (uint256) {
        require(_isGenSeedAllowed);
        return VRF_COORDINATOR.requestRandomWords(
            keyHash,
            subscriptionId,
            requestConfirmations,
            callbackGasLimit,
            1
        );
    }

    function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override {
        require(_isGenSeedAllowed);
        _seed = randomWords[0];
    }

    function lockGenSeed() public onlyOwner {
        _isGenSeedAllowed = false;
    }

    function setContractURI(string memory newContractUri) public onlyOwner {
        _contractUri = newContractUri;
    }

    function setBaseURI(string memory newBaseUri) public onlyOwner {
        _uri = newBaseUri;
    }

    function setMetadataContractAddress(address addr) public onlyOwner {
        require(_isMetadataContractAddressUnlocked);
        _metadataContractAddress = addr;
    }

    function lockMetadataContractAddress() public onlyOwner {
        _isMetadataContractAddressUnlocked = false;
    }

    function lockMint() public onlyOwner {
        _isMintAllowed = false;
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function safeMint(address to) public onlyOwner {
        require(_isMintAllowed);
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
    }

    function batchMint(address[] calldata addresses) external onlyOwner {
        require(_isMintAllowed);
        for (uint256 i = 0; i < addresses.length; i++) {
            safeMint(addresses[i]);
        }
    }

    function _requireMinted(uint256 tokenId) internal view {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        _requireMinted(tokenId);
        if (_metadataContractAddress != address(0)) {
            return IAvatarMetadata(_metadataContractAddress).tokenURI(_seed, tokenId);
        } else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "/", Strings.toString(_seed), "/", Strings.toString(tokenId))) : "";
        }
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
    internal
    whenNotPaused
    override
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseUri","type":"string"},{"internalType":"string","name":"contractUri","type":"string"},{"internalType":"address","name":"vrfCoordinator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"subscriptionId","type":"uint64"},{"internalType":"bytes32","name":"keyHash","type":"bytes32"},{"internalType":"uint16","name":"requestConfirmations","type":"uint16"},{"internalType":"uint32","name":"callbackGasLimit","type":"uint32"}],"name":"genSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockGenSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMetadataContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractUri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setMetadataContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b5060405162004b0038038062004b00833981810160405281019062000037919062000405565b808585816000908051906020019062000052929190620002c0565b5080600190805190602001906200006b929190620002c0565b5050506000600660006101000a81548160ff021916908315150217905550620000a96200009d620001f260201b60201c565b620001fa60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250505082600a9080519060200190620000f9929190620002c0565b50816009908051906020019062000112929190620002c0565b506001600860006101000a81548160ff0219169083151502179055506001600860016101000a81548160ff0219169083151502179055506000600860036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600860026101000a81548160ff02191690831515021790555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050620006db565b600033905090565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002ce90620005d2565b90600052602060002090601f016020900481019282620002f257600085556200033e565b82601f106200030d57805160ff19168380011785556200033e565b828001600101855582156200033e579182015b828111156200033d57825182559160200191906001019062000320565b5b5090506200034d919062000351565b5090565b5b808211156200036c57600081600090555060010162000352565b5090565b600062000387620003818462000532565b62000509565b905082815260208101848484011115620003a657620003a5620006a1565b5b620003b38482856200059c565b509392505050565b600081519050620003cc81620006c1565b92915050565b600082601f830112620003ea57620003e96200069c565b5b8151620003fc84826020860162000370565b91505092915050565b600080600080600060a08688031215620004245762000423620006ab565b5b600086015167ffffffffffffffff811115620004455762000444620006a6565b5b6200045388828901620003d2565b955050602086015167ffffffffffffffff811115620004775762000476620006a6565b5b6200048588828901620003d2565b945050604086015167ffffffffffffffff811115620004a957620004a8620006a6565b5b620004b788828901620003d2565b935050606086015167ffffffffffffffff811115620004db57620004da620006a6565b5b620004e988828901620003d2565b9250506080620004fc88828901620003bb565b9150509295509295909350565b60006200051562000528565b905062000523828262000608565b919050565b6000604051905090565b600067ffffffffffffffff82111562000550576200054f6200066d565b5b6200055b82620006b0565b9050602081019050919050565b600062000575826200057c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620005bc5780820151818401526020810190506200059f565b83811115620005cc576000848401525b50505050565b60006002820490506001821680620005eb57607f821691505b602082108114156200060257620006016200063e565b5b50919050565b6200061382620006b0565b810181811067ffffffffffffffff821117156200063557620006346200066d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620006cc8162000568565b8114620006d857600080fd5b50565b60805160601c6143ff62000701600039600081816108b4015261090801526143ff6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063b88d4fde116100a2578063e8a3d48511610071578063e8a3d48514610507578063e985e9c514610525578063edfdc23814610555578063f2fde38b14610585576101f0565b8063b88d4fde14610495578063c87b56dd146104b1578063d67b06c1146104e1578063e0b6bb67146104fd576101f0565b8063938e3d7b116100de578063938e3d7b1461043557806395d89b4114610451578063a22cb4651461046f578063b1f098901461048b576101f0565b8063715018a6146103e55780637d94792a146103ef5780638456cb591461040d5780638da5cb5b14610417576101f0565b806342842e0e1161018757806355f804b31161015657806355f804b31461034b5780635c975abb146103675780636352211e1461038557806370a08231146103b5576101f0565b806342842e0e146102ed57806342966c6814610309578063493c956b146103255780634d74d3b41461032f576101f0565b80631fe543e3116101c35780631fe543e31461028f57806323b872dd146102ab5780633f4ba83a146102c757806340d097c3146102d1576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612f7e565b6105a1565b60405161021c9190613635565b60405180910390f35b61022d610683565b60405161023a91906136a3565b60405180910390f35b61025d6004803603810190610258919061306a565b610715565b60405161026a91906135a5565b60405180910390f35b61028d60048036038101906102889190612ef1565b61079a565b005b6102a960048036038101906102a491906130c4565b6108b2565b005b6102c560048036038101906102c09190612ddb565b610972565b005b6102cf6109d2565b005b6102eb60048036038101906102e69190612d6e565b610a58565b005b61030760048036038101906103029190612ddb565b610b13565b005b610323600480360381019061031e919061306a565b610b33565b005b61032d610b8f565b005b61034960048036038101906103449190612d6e565b610c28565b005b61036560048036038101906103609190612fd8565b610d01565b005b61036f610d97565b60405161037c9190613635565b60405180910390f35b61039f600480360381019061039a919061306a565b610dae565b6040516103ac91906135a5565b60405180910390f35b6103cf60048036038101906103ca9190612d6e565b610e60565b6040516103dc9190613925565b60405180910390f35b6103ed610f18565b005b6103f7610fa0565b6040516104049190613925565b60405180910390f35b610415610faa565b005b61041f611030565b60405161042c91906135a5565b60405180910390f35b61044f600480360381019061044a9190612fd8565b61105a565b005b6104596110f0565b60405161046691906136a3565b60405180910390f35b61048960048036038101906104849190612eb1565b611182565b005b610493611303565b005b6104af60048036038101906104aa9190612e2e565b61139c565b005b6104cb60048036038101906104c6919061306a565b6113fe565b6040516104d891906136a3565b60405180910390f35b6104fb60048036038101906104f69190612f31565b611584565b005b61050561166f565b005b61050f611708565b60405161051c91906136a3565b60405180910390f35b61053f600480360381019061053a9190612d9b565b61179a565b60405161054c9190613635565b60405180910390f35b61056f600480360381019061056a9190613120565b61182e565b60405161057c9190613925565b60405180910390f35b61059f600480360381019061059a9190612d6e565b611985565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061067c575061067b82611a7d565b5b9050919050565b60606000805461069290613c1e565b80601f01602080910402602001604051908101604052809291908181526020018280546106be90613c1e565b801561070b5780601f106106e05761010080835404028352916020019161070b565b820191906000526020600020905b8154815290600101906020018083116106ee57829003601f168201915b5050505050905090565b600061072082611ae7565b61075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075690613845565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107a582610dae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080d906138c5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610835611b53565b73ffffffffffffffffffffffffffffffffffffffff16148061086457506108638161085e611b53565b61179a565b5b6108a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089a906137c5565b60405180910390fd5b6108ad8383611b5b565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096457337f00000000000000000000000000000000000000000000000000000000000000006040517f1cf993f400000000000000000000000000000000000000000000000000000000815260040161095b9291906135c0565b60405180910390fd5b61096e8282611c14565b5050565b61098361097d611b53565b82611c53565b6109c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b9906138e5565b60405180910390fd5b6109cd838383611d31565b505050565b6109da611b53565b73ffffffffffffffffffffffffffffffffffffffff166109f8611030565b73ffffffffffffffffffffffffffffffffffffffff1614610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4590613865565b60405180910390fd5b610a56611f8d565b565b610a60611b53565b73ffffffffffffffffffffffffffffffffffffffff16610a7e611030565b73ffffffffffffffffffffffffffffffffffffffff1614610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb90613865565b60405180910390fd5b600860009054906101000a900460ff16610aed57600080fd5b6000610af9600761202f565b9050610b05600761203d565b610b0f8282612053565b5050565b610b2e8383836040518060200160405280600081525061139c565b505050565b610b44610b3e611b53565b82611c53565b610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613905565b60405180910390fd5b610b8c81612071565b50565b610b97611b53565b73ffffffffffffffffffffffffffffffffffffffff16610bb5611030565b73ffffffffffffffffffffffffffffffffffffffff1614610c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0290613865565b60405180910390fd5b6000600860016101000a81548160ff021916908315150217905550565b610c30611b53565b73ffffffffffffffffffffffffffffffffffffffff16610c4e611030565b73ffffffffffffffffffffffffffffffffffffffff1614610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613865565b60405180910390fd5b600860029054906101000a900460ff16610cbd57600080fd5b80600860036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610d09611b53565b73ffffffffffffffffffffffffffffffffffffffff16610d27611030565b73ffffffffffffffffffffffffffffffffffffffff1614610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7490613865565b60405180910390fd5b80600a9080519060200190610d939291906129b5565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e90613805565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec8906137e5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f20611b53565b73ffffffffffffffffffffffffffffffffffffffff16610f3e611030565b73ffffffffffffffffffffffffffffffffffffffff1614610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90613865565b60405180910390fd5b610f9e6000612182565b565b6000600b54905090565b610fb2611b53565b73ffffffffffffffffffffffffffffffffffffffff16610fd0611030565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90613865565b60405180910390fd5b61102e612248565b565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611062611b53565b73ffffffffffffffffffffffffffffffffffffffff16611080611030565b73ffffffffffffffffffffffffffffffffffffffff16146110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90613865565b60405180910390fd5b80600990805190602001906110ec9291906129b5565b5050565b6060600180546110ff90613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461112b90613c1e565b80156111785780601f1061114d57610100808354040283529160200191611178565b820191906000526020600020905b81548152906001019060200180831161115b57829003601f168201915b5050505050905090565b61118a611b53565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90613765565b60405180910390fd5b8060056000611205611b53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b2611b53565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112f79190613635565b60405180910390a35050565b61130b611b53565b73ffffffffffffffffffffffffffffffffffffffff16611329611030565b73ffffffffffffffffffffffffffffffffffffffff161461137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690613865565b60405180910390fd5b6000600860026101000a81548160ff021916908315150217905550565b6113ad6113a7611b53565b83611c53565b6113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e3906138e5565b60405180910390fd5b6113f8848484846122eb565b50505050565b606061140982612347565b600073ffffffffffffffffffffffffffffffffffffffff16600860039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461151a57600860039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166392cb829d600b54846040518363ffffffff1660e01b81526004016114be929190613940565b60006040518083038186803b1580156114d657600080fd5b505afa1580156114ea573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115139190613021565b905061157f565b6000611524612392565b90506000815111611544576040518060200160405280600081525061157b565b80611550600b54612424565b61155985612424565b60405160200161156b9392919061355e565b6040516020818303038152906040525b9150505b919050565b61158c611b53565b73ffffffffffffffffffffffffffffffffffffffff166115aa611030565b73ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790613865565b60405180910390fd5b600860009054906101000a900460ff1661161957600080fd5b60005b8282905081101561166a5761165783838381811061163d5761163c613d88565b5b90506020020160208101906116529190612d6e565b610a58565b808061166290613c81565b91505061161c565b505050565b611677611b53565b73ffffffffffffffffffffffffffffffffffffffff16611695611030565b73ffffffffffffffffffffffffffffffffffffffff16146116eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e290613865565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b60606009805461171790613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461174390613c1e565b80156117905780601f1061176557610100808354040283529160200191611790565b820191906000526020600020905b81548152906001019060200180831161177357829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611838611b53565b73ffffffffffffffffffffffffffffffffffffffff16611856611030565b73ffffffffffffffffffffffffffffffffffffffff16146118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a390613865565b60405180910390fd5b600860019054906101000a900460ff166118c557600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d308587868660016040518663ffffffff1660e01b8152600401611929959493929190613650565b602060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b9190613097565b9050949350505050565b61198d611b53565b73ffffffffffffffffffffffffffffffffffffffff166119ab611030565b73ffffffffffffffffffffffffffffffffffffffff1614611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890613865565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613705565b60405180910390fd5b611a7a81612182565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bce83610dae565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600860019054906101000a900460ff16611c2d57600080fd5b80600081518110611c4157611c40613d88565b5b6020026020010151600b819055505050565b6000611c5e82611ae7565b611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490613785565b60405180910390fd5b6000611ca883610dae565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d1757508373ffffffffffffffffffffffffffffffffffffffff16611cff84610715565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d285750611d27818561179a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d5182610dae565b73ffffffffffffffffffffffffffffffffffffffff1614611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90613885565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e90613745565b60405180910390fd5b611e22838383612585565b611e2d600082611b5b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e7d9190613ae6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed49190613a5f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f95610d97565b611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb906136c5565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612018611b53565b60405161202591906135a5565b60405180910390a1565b600081600001549050919050565b6001816000016000828254019250508190555050565b61206d8282604051806020016040528060008152506125dd565b5050565b600061207c82610dae565b905061208a81600084612585565b612095600083611b5b565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e59190613ae6565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612250610d97565b15612290576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612287906137a5565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122d4611b53565b6040516122e191906135a5565b60405180910390a1565b6122f6848484611d31565b61230284848484612638565b612341576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612338906136e5565b60405180910390fd5b50505050565b61235081611ae7565b61238f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612386906138a5565b60405180910390fd5b50565b6060600a80546123a190613c1e565b80601f01602080910402602001604051908101604052809291908181526020018280546123cd90613c1e565b801561241a5780601f106123ef5761010080835404028352916020019161241a565b820191906000526020600020905b8154815290600101906020018083116123fd57829003601f168201915b5050505050905090565b6060600082141561246c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612580565b600082905060005b6000821461249e57808061248790613c81565b915050600a826124979190613ab5565b9150612474565b60008167ffffffffffffffff8111156124ba576124b9613db7565b5b6040519080825280601f01601f1916602001820160405280156124ec5781602001600182028036833780820191505090505b5090505b60008514612579576001826125059190613ae6565b9150600a856125149190613cca565b60306125209190613a5f565b60f81b81838151811061253657612535613d88565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125729190613ab5565b94506124f0565b8093505050505b919050565b61258d610d97565b156125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c4906137a5565b60405180910390fd5b6125d88383836127cf565b505050565b6125e783836127d4565b6125f46000848484612638565b612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a906136e5565b60405180910390fd5b505050565b60006126598473ffffffffffffffffffffffffffffffffffffffff166129a2565b156127c2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612682611b53565b8786866040518563ffffffff1660e01b81526004016126a494939291906135e9565b602060405180830381600087803b1580156126be57600080fd5b505af19250505080156126ef57506040513d601f19601f820116820180604052508101906126ec9190612fab565b60015b612772573d806000811461271f576040519150601f19603f3d011682016040523d82523d6000602084013e612724565b606091505b5060008151141561276a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612761906136e5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127c7565b600190505b949350505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283b90613825565b60405180910390fd5b61284d81611ae7565b1561288d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288490613725565b60405180910390fd5b61289960008383612585565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e99190613a5f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546129c190613c1e565b90600052602060002090601f0160209004810192826129e35760008555612a2a565b82601f106129fc57805160ff1916838001178555612a2a565b82800160010185558215612a2a579182015b82811115612a29578251825591602001919060010190612a0e565b5b509050612a379190612a3b565b5090565b5b80821115612a54576000816000905550600101612a3c565b5090565b6000612a6b612a668461398e565b613969565b90508083825260208201905082856020860282011115612a8e57612a8d613df0565b5b60005b85811015612abe5781612aa48882612d1a565b845260208401935060208301925050600181019050612a91565b5050509392505050565b6000612adb612ad6846139ba565b613969565b905082815260208101848484011115612af757612af6613df5565b5b612b02848285613bdc565b509392505050565b6000612b1d612b18846139eb565b613969565b905082815260208101848484011115612b3957612b38613df5565b5b612b44848285613bdc565b509392505050565b6000612b5f612b5a846139eb565b613969565b905082815260208101848484011115612b7b57612b7a613df5565b5b612b86848285613beb565b509392505050565b600081359050612b9d81614311565b92915050565b60008083601f840112612bb957612bb8613deb565b5b8235905067ffffffffffffffff811115612bd657612bd5613de6565b5b602083019150836020820283011115612bf257612bf1613df0565b5b9250929050565b600082601f830112612c0e57612c0d613deb565b5b8135612c1e848260208601612a58565b91505092915050565b600081359050612c3681614328565b92915050565b600081359050612c4b8161433f565b92915050565b600081359050612c6081614356565b92915050565b600081519050612c7581614356565b92915050565b600082601f830112612c9057612c8f613deb565b5b8135612ca0848260208601612ac8565b91505092915050565b600082601f830112612cbe57612cbd613deb565b5b8135612cce848260208601612b0a565b91505092915050565b600082601f830112612cec57612ceb613deb565b5b8151612cfc848260208601612b4c565b91505092915050565b600081359050612d148161436d565b92915050565b600081359050612d2981614384565b92915050565b600081519050612d3e81614384565b92915050565b600081359050612d538161439b565b92915050565b600081359050612d68816143b2565b92915050565b600060208284031215612d8457612d83613dff565b5b6000612d9284828501612b8e565b91505092915050565b60008060408385031215612db257612db1613dff565b5b6000612dc085828601612b8e565b9250506020612dd185828601612b8e565b9150509250929050565b600080600060608486031215612df457612df3613dff565b5b6000612e0286828701612b8e565b9350506020612e1386828701612b8e565b9250506040612e2486828701612d1a565b9150509250925092565b60008060008060808587031215612e4857612e47613dff565b5b6000612e5687828801612b8e565b9450506020612e6787828801612b8e565b9350506040612e7887828801612d1a565b925050606085013567ffffffffffffffff811115612e9957612e98613dfa565b5b612ea587828801612c7b565b91505092959194509250565b60008060408385031215612ec857612ec7613dff565b5b6000612ed685828601612b8e565b9250506020612ee785828601612c27565b9150509250929050565b60008060408385031215612f0857612f07613dff565b5b6000612f1685828601612b8e565b9250506020612f2785828601612d1a565b9150509250929050565b60008060208385031215612f4857612f47613dff565b5b600083013567ffffffffffffffff811115612f6657612f65613dfa565b5b612f7285828601612ba3565b92509250509250929050565b600060208284031215612f9457612f93613dff565b5b6000612fa284828501612c51565b91505092915050565b600060208284031215612fc157612fc0613dff565b5b6000612fcf84828501612c66565b91505092915050565b600060208284031215612fee57612fed613dff565b5b600082013567ffffffffffffffff81111561300c5761300b613dfa565b5b61301884828501612ca9565b91505092915050565b60006020828403121561303757613036613dff565b5b600082015167ffffffffffffffff81111561305557613054613dfa565b5b61306184828501612cd7565b91505092915050565b6000602082840312156130805761307f613dff565b5b600061308e84828501612d1a565b91505092915050565b6000602082840312156130ad576130ac613dff565b5b60006130bb84828501612d2f565b91505092915050565b600080604083850312156130db576130da613dff565b5b60006130e985828601612d1a565b925050602083013567ffffffffffffffff81111561310a57613109613dfa565b5b61311685828601612bf9565b9150509250929050565b6000806000806080858703121561313a57613139613dff565b5b600061314887828801612d59565b945050602061315987828801612c3c565b935050604061316a87828801612d05565b925050606061317b87828801612d44565b91505092959194509250565b61319081613b1a565b82525050565b61319f81613b2c565b82525050565b6131ae81613b38565b82525050565b60006131bf82613a1c565b6131c98185613a32565b93506131d9818560208601613beb565b6131e281613e04565b840191505092915050565b6131f681613bca565b82525050565b600061320782613a27565b6132118185613a43565b9350613221818560208601613beb565b61322a81613e04565b840191505092915050565b600061324082613a27565b61324a8185613a54565b935061325a818560208601613beb565b80840191505092915050565b6000613273601483613a43565b915061327e82613e15565b602082019050919050565b6000613296603283613a43565b91506132a182613e3e565b604082019050919050565b60006132b9602683613a43565b91506132c482613e8d565b604082019050919050565b60006132dc601c83613a43565b91506132e782613edc565b602082019050919050565b60006132ff602483613a43565b915061330a82613f05565b604082019050919050565b6000613322601983613a43565b915061332d82613f54565b602082019050919050565b6000613345602c83613a43565b915061335082613f7d565b604082019050919050565b6000613368601083613a43565b915061337382613fcc565b602082019050919050565b600061338b603883613a43565b915061339682613ff5565b604082019050919050565b60006133ae602a83613a43565b91506133b982614044565b604082019050919050565b60006133d1602983613a43565b91506133dc82614093565b604082019050919050565b60006133f4602083613a43565b91506133ff826140e2565b602082019050919050565b6000613417602c83613a43565b91506134228261410b565b604082019050919050565b600061343a602083613a43565b91506134458261415a565b602082019050919050565b600061345d602983613a43565b915061346882614183565b604082019050919050565b6000613480601883613a43565b915061348b826141d2565b602082019050919050565b60006134a3602183613a43565b91506134ae826141fb565b604082019050919050565b60006134c6603183613a43565b91506134d18261424a565b604082019050919050565b60006134e9603083613a43565b91506134f482614299565b604082019050919050565b600061350c600183613a54565b9150613517826142e8565b600182019050919050565b61352b81613b6e565b82525050565b61353a81613b9c565b82525050565b61354981613ba6565b82525050565b61355881613bb6565b82525050565b600061356a8286613235565b9150613575826134ff565b91506135818285613235565b915061358c826134ff565b91506135988284613235565b9150819050949350505050565b60006020820190506135ba6000830184613187565b92915050565b60006040820190506135d56000830185613187565b6135e26020830184613187565b9392505050565b60006080820190506135fe6000830187613187565b61360b6020830186613187565b6136186040830185613531565b818103606083015261362a81846131b4565b905095945050505050565b600060208201905061364a6000830184613196565b92915050565b600060a08201905061366560008301886131a5565b613672602083018761354f565b61367f6040830186613522565b61368c6060830185613540565b61369960808301846131ed565b9695505050505050565b600060208201905081810360008301526136bd81846131fc565b905092915050565b600060208201905081810360008301526136de81613266565b9050919050565b600060208201905081810360008301526136fe81613289565b9050919050565b6000602082019050818103600083015261371e816132ac565b9050919050565b6000602082019050818103600083015261373e816132cf565b9050919050565b6000602082019050818103600083015261375e816132f2565b9050919050565b6000602082019050818103600083015261377e81613315565b9050919050565b6000602082019050818103600083015261379e81613338565b9050919050565b600060208201905081810360008301526137be8161335b565b9050919050565b600060208201905081810360008301526137de8161337e565b9050919050565b600060208201905081810360008301526137fe816133a1565b9050919050565b6000602082019050818103600083015261381e816133c4565b9050919050565b6000602082019050818103600083015261383e816133e7565b9050919050565b6000602082019050818103600083015261385e8161340a565b9050919050565b6000602082019050818103600083015261387e8161342d565b9050919050565b6000602082019050818103600083015261389e81613450565b9050919050565b600060208201905081810360008301526138be81613473565b9050919050565b600060208201905081810360008301526138de81613496565b9050919050565b600060208201905081810360008301526138fe816134b9565b9050919050565b6000602082019050818103600083015261391e816134dc565b9050919050565b600060208201905061393a6000830184613531565b92915050565b60006040820190506139556000830185613531565b6139626020830184613531565b9392505050565b6000613973613984565b905061397f8282613c50565b919050565b6000604051905090565b600067ffffffffffffffff8211156139a9576139a8613db7565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156139d5576139d4613db7565b5b6139de82613e04565b9050602081019050919050565b600067ffffffffffffffff821115613a0657613a05613db7565b5b613a0f82613e04565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a6a82613b9c565b9150613a7583613b9c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613aaa57613aa9613cfb565b5b828201905092915050565b6000613ac082613b9c565b9150613acb83613b9c565b925082613adb57613ada613d2a565b5b828204905092915050565b6000613af182613b9c565b9150613afc83613b9c565b925082821015613b0f57613b0e613cfb565b5b828203905092915050565b6000613b2582613b7c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b6000613bd582613ba6565b9050919050565b82818337600083830152505050565b60005b83811015613c09578082015181840152602081019050613bee565b83811115613c18576000848401525b50505050565b60006002820490506001821680613c3657607f821691505b60208210811415613c4a57613c49613d59565b5b50919050565b613c5982613e04565b810181811067ffffffffffffffff82111715613c7857613c77613db7565b5b80604052505050565b6000613c8c82613b9c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cbf57613cbe613cfb565b5b600182019050919050565b6000613cd582613b9c565b9150613ce083613b9c565b925082613cf057613cef613d2a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61431a81613b1a565b811461432557600080fd5b50565b61433181613b2c565b811461433c57600080fd5b50565b61434881613b38565b811461435357600080fd5b50565b61435f81613b42565b811461436a57600080fd5b50565b61437681613b6e565b811461438157600080fd5b50565b61438d81613b9c565b811461439857600080fd5b50565b6143a481613ba6565b81146143af57600080fd5b50565b6143bb81613bb6565b81146143c657600080fd5b5056fea264697066735822122010a9da9b6448ca3a07bca97359ce9536da2a7be2e05ccf89ea66c7e59f45b19e64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909000000000000000000000000000000000000000000000000000000000000000c4d4545362041766174617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d41564100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6d6565362e78797a2f6170692f6e66742f617661746172732f6e66742d6d6574616461746100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6d6565362e78797a2f6170692f6e66742f617661746172732f6d657461646174610000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063b88d4fde116100a2578063e8a3d48511610071578063e8a3d48514610507578063e985e9c514610525578063edfdc23814610555578063f2fde38b14610585576101f0565b8063b88d4fde14610495578063c87b56dd146104b1578063d67b06c1146104e1578063e0b6bb67146104fd576101f0565b8063938e3d7b116100de578063938e3d7b1461043557806395d89b4114610451578063a22cb4651461046f578063b1f098901461048b576101f0565b8063715018a6146103e55780637d94792a146103ef5780638456cb591461040d5780638da5cb5b14610417576101f0565b806342842e0e1161018757806355f804b31161015657806355f804b31461034b5780635c975abb146103675780636352211e1461038557806370a08231146103b5576101f0565b806342842e0e146102ed57806342966c6814610309578063493c956b146103255780634d74d3b41461032f576101f0565b80631fe543e3116101c35780631fe543e31461028f57806323b872dd146102ab5780633f4ba83a146102c757806340d097c3146102d1576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612f7e565b6105a1565b60405161021c9190613635565b60405180910390f35b61022d610683565b60405161023a91906136a3565b60405180910390f35b61025d6004803603810190610258919061306a565b610715565b60405161026a91906135a5565b60405180910390f35b61028d60048036038101906102889190612ef1565b61079a565b005b6102a960048036038101906102a491906130c4565b6108b2565b005b6102c560048036038101906102c09190612ddb565b610972565b005b6102cf6109d2565b005b6102eb60048036038101906102e69190612d6e565b610a58565b005b61030760048036038101906103029190612ddb565b610b13565b005b610323600480360381019061031e919061306a565b610b33565b005b61032d610b8f565b005b61034960048036038101906103449190612d6e565b610c28565b005b61036560048036038101906103609190612fd8565b610d01565b005b61036f610d97565b60405161037c9190613635565b60405180910390f35b61039f600480360381019061039a919061306a565b610dae565b6040516103ac91906135a5565b60405180910390f35b6103cf60048036038101906103ca9190612d6e565b610e60565b6040516103dc9190613925565b60405180910390f35b6103ed610f18565b005b6103f7610fa0565b6040516104049190613925565b60405180910390f35b610415610faa565b005b61041f611030565b60405161042c91906135a5565b60405180910390f35b61044f600480360381019061044a9190612fd8565b61105a565b005b6104596110f0565b60405161046691906136a3565b60405180910390f35b61048960048036038101906104849190612eb1565b611182565b005b610493611303565b005b6104af60048036038101906104aa9190612e2e565b61139c565b005b6104cb60048036038101906104c6919061306a565b6113fe565b6040516104d891906136a3565b60405180910390f35b6104fb60048036038101906104f69190612f31565b611584565b005b61050561166f565b005b61050f611708565b60405161051c91906136a3565b60405180910390f35b61053f600480360381019061053a9190612d9b565b61179a565b60405161054c9190613635565b60405180910390f35b61056f600480360381019061056a9190613120565b61182e565b60405161057c9190613925565b60405180910390f35b61059f600480360381019061059a9190612d6e565b611985565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061067c575061067b82611a7d565b5b9050919050565b60606000805461069290613c1e565b80601f01602080910402602001604051908101604052809291908181526020018280546106be90613c1e565b801561070b5780601f106106e05761010080835404028352916020019161070b565b820191906000526020600020905b8154815290600101906020018083116106ee57829003601f168201915b5050505050905090565b600061072082611ae7565b61075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075690613845565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107a582610dae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080d906138c5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610835611b53565b73ffffffffffffffffffffffffffffffffffffffff16148061086457506108638161085e611b53565b61179a565b5b6108a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089a906137c5565b60405180910390fd5b6108ad8383611b5b565b505050565b7f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e6990973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461096457337f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699096040517f1cf993f400000000000000000000000000000000000000000000000000000000815260040161095b9291906135c0565b60405180910390fd5b61096e8282611c14565b5050565b61098361097d611b53565b82611c53565b6109c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b9906138e5565b60405180910390fd5b6109cd838383611d31565b505050565b6109da611b53565b73ffffffffffffffffffffffffffffffffffffffff166109f8611030565b73ffffffffffffffffffffffffffffffffffffffff1614610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4590613865565b60405180910390fd5b610a56611f8d565b565b610a60611b53565b73ffffffffffffffffffffffffffffffffffffffff16610a7e611030565b73ffffffffffffffffffffffffffffffffffffffff1614610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb90613865565b60405180910390fd5b600860009054906101000a900460ff16610aed57600080fd5b6000610af9600761202f565b9050610b05600761203d565b610b0f8282612053565b5050565b610b2e8383836040518060200160405280600081525061139c565b505050565b610b44610b3e611b53565b82611c53565b610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613905565b60405180910390fd5b610b8c81612071565b50565b610b97611b53565b73ffffffffffffffffffffffffffffffffffffffff16610bb5611030565b73ffffffffffffffffffffffffffffffffffffffff1614610c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0290613865565b60405180910390fd5b6000600860016101000a81548160ff021916908315150217905550565b610c30611b53565b73ffffffffffffffffffffffffffffffffffffffff16610c4e611030565b73ffffffffffffffffffffffffffffffffffffffff1614610ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9b90613865565b60405180910390fd5b600860029054906101000a900460ff16610cbd57600080fd5b80600860036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610d09611b53565b73ffffffffffffffffffffffffffffffffffffffff16610d27611030565b73ffffffffffffffffffffffffffffffffffffffff1614610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7490613865565b60405180910390fd5b80600a9080519060200190610d939291906129b5565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4e90613805565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec8906137e5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f20611b53565b73ffffffffffffffffffffffffffffffffffffffff16610f3e611030565b73ffffffffffffffffffffffffffffffffffffffff1614610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90613865565b60405180910390fd5b610f9e6000612182565b565b6000600b54905090565b610fb2611b53565b73ffffffffffffffffffffffffffffffffffffffff16610fd0611030565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90613865565b60405180910390fd5b61102e612248565b565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611062611b53565b73ffffffffffffffffffffffffffffffffffffffff16611080611030565b73ffffffffffffffffffffffffffffffffffffffff16146110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90613865565b60405180910390fd5b80600990805190602001906110ec9291906129b5565b5050565b6060600180546110ff90613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461112b90613c1e565b80156111785780601f1061114d57610100808354040283529160200191611178565b820191906000526020600020905b81548152906001019060200180831161115b57829003601f168201915b5050505050905090565b61118a611b53565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90613765565b60405180910390fd5b8060056000611205611b53565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b2611b53565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112f79190613635565b60405180910390a35050565b61130b611b53565b73ffffffffffffffffffffffffffffffffffffffff16611329611030565b73ffffffffffffffffffffffffffffffffffffffff161461137f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137690613865565b60405180910390fd5b6000600860026101000a81548160ff021916908315150217905550565b6113ad6113a7611b53565b83611c53565b6113ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e3906138e5565b60405180910390fd5b6113f8848484846122eb565b50505050565b606061140982612347565b600073ffffffffffffffffffffffffffffffffffffffff16600860039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461151a57600860039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166392cb829d600b54846040518363ffffffff1660e01b81526004016114be929190613940565b60006040518083038186803b1580156114d657600080fd5b505afa1580156114ea573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115139190613021565b905061157f565b6000611524612392565b90506000815111611544576040518060200160405280600081525061157b565b80611550600b54612424565b61155985612424565b60405160200161156b9392919061355e565b6040516020818303038152906040525b9150505b919050565b61158c611b53565b73ffffffffffffffffffffffffffffffffffffffff166115aa611030565b73ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790613865565b60405180910390fd5b600860009054906101000a900460ff1661161957600080fd5b60005b8282905081101561166a5761165783838381811061163d5761163c613d88565b5b90506020020160208101906116529190612d6e565b610a58565b808061166290613c81565b91505061161c565b505050565b611677611b53565b73ffffffffffffffffffffffffffffffffffffffff16611695611030565b73ffffffffffffffffffffffffffffffffffffffff16146116eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e290613865565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b60606009805461171790613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461174390613c1e565b80156117905780601f1061176557610100808354040283529160200191611790565b820191906000526020600020905b81548152906001019060200180831161177357829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000611838611b53565b73ffffffffffffffffffffffffffffffffffffffff16611856611030565b73ffffffffffffffffffffffffffffffffffffffff16146118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a390613865565b60405180910390fd5b600860019054906101000a900460ff166118c557600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d308587868660016040518663ffffffff1660e01b8152600401611929959493929190613650565b602060405180830381600087803b15801561194357600080fd5b505af1158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b9190613097565b9050949350505050565b61198d611b53565b73ffffffffffffffffffffffffffffffffffffffff166119ab611030565b73ffffffffffffffffffffffffffffffffffffffff1614611a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f890613865565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613705565b60405180910390fd5b611a7a81612182565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bce83610dae565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600860019054906101000a900460ff16611c2d57600080fd5b80600081518110611c4157611c40613d88565b5b6020026020010151600b819055505050565b6000611c5e82611ae7565b611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490613785565b60405180910390fd5b6000611ca883610dae565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d1757508373ffffffffffffffffffffffffffffffffffffffff16611cff84610715565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d285750611d27818561179a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d5182610dae565b73ffffffffffffffffffffffffffffffffffffffff1614611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90613885565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0e90613745565b60405180910390fd5b611e22838383612585565b611e2d600082611b5b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e7d9190613ae6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ed49190613a5f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f95610d97565b611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb906136c5565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612018611b53565b60405161202591906135a5565b60405180910390a1565b600081600001549050919050565b6001816000016000828254019250508190555050565b61206d8282604051806020016040528060008152506125dd565b5050565b600061207c82610dae565b905061208a81600084612585565b612095600083611b5b565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e59190613ae6565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612250610d97565b15612290576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612287906137a5565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122d4611b53565b6040516122e191906135a5565b60405180910390a1565b6122f6848484611d31565b61230284848484612638565b612341576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612338906136e5565b60405180910390fd5b50505050565b61235081611ae7565b61238f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612386906138a5565b60405180910390fd5b50565b6060600a80546123a190613c1e565b80601f01602080910402602001604051908101604052809291908181526020018280546123cd90613c1e565b801561241a5780601f106123ef5761010080835404028352916020019161241a565b820191906000526020600020905b8154815290600101906020018083116123fd57829003601f168201915b5050505050905090565b6060600082141561246c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612580565b600082905060005b6000821461249e57808061248790613c81565b915050600a826124979190613ab5565b9150612474565b60008167ffffffffffffffff8111156124ba576124b9613db7565b5b6040519080825280601f01601f1916602001820160405280156124ec5781602001600182028036833780820191505090505b5090505b60008514612579576001826125059190613ae6565b9150600a856125149190613cca565b60306125209190613a5f565b60f81b81838151811061253657612535613d88565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125729190613ab5565b94506124f0565b8093505050505b919050565b61258d610d97565b156125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c4906137a5565b60405180910390fd5b6125d88383836127cf565b505050565b6125e783836127d4565b6125f46000848484612638565b612633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262a906136e5565b60405180910390fd5b505050565b60006126598473ffffffffffffffffffffffffffffffffffffffff166129a2565b156127c2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612682611b53565b8786866040518563ffffffff1660e01b81526004016126a494939291906135e9565b602060405180830381600087803b1580156126be57600080fd5b505af19250505080156126ef57506040513d601f19601f820116820180604052508101906126ec9190612fab565b60015b612772573d806000811461271f576040519150601f19603f3d011682016040523d82523d6000602084013e612724565b606091505b5060008151141561276a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612761906136e5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127c7565b600190505b949350505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283b90613825565b60405180910390fd5b61284d81611ae7565b1561288d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288490613725565b60405180910390fd5b61289960008383612585565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e99190613a5f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546129c190613c1e565b90600052602060002090601f0160209004810192826129e35760008555612a2a565b82601f106129fc57805160ff1916838001178555612a2a565b82800160010185558215612a2a579182015b82811115612a29578251825591602001919060010190612a0e565b5b509050612a379190612a3b565b5090565b5b80821115612a54576000816000905550600101612a3c565b5090565b6000612a6b612a668461398e565b613969565b90508083825260208201905082856020860282011115612a8e57612a8d613df0565b5b60005b85811015612abe5781612aa48882612d1a565b845260208401935060208301925050600181019050612a91565b5050509392505050565b6000612adb612ad6846139ba565b613969565b905082815260208101848484011115612af757612af6613df5565b5b612b02848285613bdc565b509392505050565b6000612b1d612b18846139eb565b613969565b905082815260208101848484011115612b3957612b38613df5565b5b612b44848285613bdc565b509392505050565b6000612b5f612b5a846139eb565b613969565b905082815260208101848484011115612b7b57612b7a613df5565b5b612b86848285613beb565b509392505050565b600081359050612b9d81614311565b92915050565b60008083601f840112612bb957612bb8613deb565b5b8235905067ffffffffffffffff811115612bd657612bd5613de6565b5b602083019150836020820283011115612bf257612bf1613df0565b5b9250929050565b600082601f830112612c0e57612c0d613deb565b5b8135612c1e848260208601612a58565b91505092915050565b600081359050612c3681614328565b92915050565b600081359050612c4b8161433f565b92915050565b600081359050612c6081614356565b92915050565b600081519050612c7581614356565b92915050565b600082601f830112612c9057612c8f613deb565b5b8135612ca0848260208601612ac8565b91505092915050565b600082601f830112612cbe57612cbd613deb565b5b8135612cce848260208601612b0a565b91505092915050565b600082601f830112612cec57612ceb613deb565b5b8151612cfc848260208601612b4c565b91505092915050565b600081359050612d148161436d565b92915050565b600081359050612d2981614384565b92915050565b600081519050612d3e81614384565b92915050565b600081359050612d538161439b565b92915050565b600081359050612d68816143b2565b92915050565b600060208284031215612d8457612d83613dff565b5b6000612d9284828501612b8e565b91505092915050565b60008060408385031215612db257612db1613dff565b5b6000612dc085828601612b8e565b9250506020612dd185828601612b8e565b9150509250929050565b600080600060608486031215612df457612df3613dff565b5b6000612e0286828701612b8e565b9350506020612e1386828701612b8e565b9250506040612e2486828701612d1a565b9150509250925092565b60008060008060808587031215612e4857612e47613dff565b5b6000612e5687828801612b8e565b9450506020612e6787828801612b8e565b9350506040612e7887828801612d1a565b925050606085013567ffffffffffffffff811115612e9957612e98613dfa565b5b612ea587828801612c7b565b91505092959194509250565b60008060408385031215612ec857612ec7613dff565b5b6000612ed685828601612b8e565b9250506020612ee785828601612c27565b9150509250929050565b60008060408385031215612f0857612f07613dff565b5b6000612f1685828601612b8e565b9250506020612f2785828601612d1a565b9150509250929050565b60008060208385031215612f4857612f47613dff565b5b600083013567ffffffffffffffff811115612f6657612f65613dfa565b5b612f7285828601612ba3565b92509250509250929050565b600060208284031215612f9457612f93613dff565b5b6000612fa284828501612c51565b91505092915050565b600060208284031215612fc157612fc0613dff565b5b6000612fcf84828501612c66565b91505092915050565b600060208284031215612fee57612fed613dff565b5b600082013567ffffffffffffffff81111561300c5761300b613dfa565b5b61301884828501612ca9565b91505092915050565b60006020828403121561303757613036613dff565b5b600082015167ffffffffffffffff81111561305557613054613dfa565b5b61306184828501612cd7565b91505092915050565b6000602082840312156130805761307f613dff565b5b600061308e84828501612d1a565b91505092915050565b6000602082840312156130ad576130ac613dff565b5b60006130bb84828501612d2f565b91505092915050565b600080604083850312156130db576130da613dff565b5b60006130e985828601612d1a565b925050602083013567ffffffffffffffff81111561310a57613109613dfa565b5b61311685828601612bf9565b9150509250929050565b6000806000806080858703121561313a57613139613dff565b5b600061314887828801612d59565b945050602061315987828801612c3c565b935050604061316a87828801612d05565b925050606061317b87828801612d44565b91505092959194509250565b61319081613b1a565b82525050565b61319f81613b2c565b82525050565b6131ae81613b38565b82525050565b60006131bf82613a1c565b6131c98185613a32565b93506131d9818560208601613beb565b6131e281613e04565b840191505092915050565b6131f681613bca565b82525050565b600061320782613a27565b6132118185613a43565b9350613221818560208601613beb565b61322a81613e04565b840191505092915050565b600061324082613a27565b61324a8185613a54565b935061325a818560208601613beb565b80840191505092915050565b6000613273601483613a43565b915061327e82613e15565b602082019050919050565b6000613296603283613a43565b91506132a182613e3e565b604082019050919050565b60006132b9602683613a43565b91506132c482613e8d565b604082019050919050565b60006132dc601c83613a43565b91506132e782613edc565b602082019050919050565b60006132ff602483613a43565b915061330a82613f05565b604082019050919050565b6000613322601983613a43565b915061332d82613f54565b602082019050919050565b6000613345602c83613a43565b915061335082613f7d565b604082019050919050565b6000613368601083613a43565b915061337382613fcc565b602082019050919050565b600061338b603883613a43565b915061339682613ff5565b604082019050919050565b60006133ae602a83613a43565b91506133b982614044565b604082019050919050565b60006133d1602983613a43565b91506133dc82614093565b604082019050919050565b60006133f4602083613a43565b91506133ff826140e2565b602082019050919050565b6000613417602c83613a43565b91506134228261410b565b604082019050919050565b600061343a602083613a43565b91506134458261415a565b602082019050919050565b600061345d602983613a43565b915061346882614183565b604082019050919050565b6000613480601883613a43565b915061348b826141d2565b602082019050919050565b60006134a3602183613a43565b91506134ae826141fb565b604082019050919050565b60006134c6603183613a43565b91506134d18261424a565b604082019050919050565b60006134e9603083613a43565b91506134f482614299565b604082019050919050565b600061350c600183613a54565b9150613517826142e8565b600182019050919050565b61352b81613b6e565b82525050565b61353a81613b9c565b82525050565b61354981613ba6565b82525050565b61355881613bb6565b82525050565b600061356a8286613235565b9150613575826134ff565b91506135818285613235565b915061358c826134ff565b91506135988284613235565b9150819050949350505050565b60006020820190506135ba6000830184613187565b92915050565b60006040820190506135d56000830185613187565b6135e26020830184613187565b9392505050565b60006080820190506135fe6000830187613187565b61360b6020830186613187565b6136186040830185613531565b818103606083015261362a81846131b4565b905095945050505050565b600060208201905061364a6000830184613196565b92915050565b600060a08201905061366560008301886131a5565b613672602083018761354f565b61367f6040830186613522565b61368c6060830185613540565b61369960808301846131ed565b9695505050505050565b600060208201905081810360008301526136bd81846131fc565b905092915050565b600060208201905081810360008301526136de81613266565b9050919050565b600060208201905081810360008301526136fe81613289565b9050919050565b6000602082019050818103600083015261371e816132ac565b9050919050565b6000602082019050818103600083015261373e816132cf565b9050919050565b6000602082019050818103600083015261375e816132f2565b9050919050565b6000602082019050818103600083015261377e81613315565b9050919050565b6000602082019050818103600083015261379e81613338565b9050919050565b600060208201905081810360008301526137be8161335b565b9050919050565b600060208201905081810360008301526137de8161337e565b9050919050565b600060208201905081810360008301526137fe816133a1565b9050919050565b6000602082019050818103600083015261381e816133c4565b9050919050565b6000602082019050818103600083015261383e816133e7565b9050919050565b6000602082019050818103600083015261385e8161340a565b9050919050565b6000602082019050818103600083015261387e8161342d565b9050919050565b6000602082019050818103600083015261389e81613450565b9050919050565b600060208201905081810360008301526138be81613473565b9050919050565b600060208201905081810360008301526138de81613496565b9050919050565b600060208201905081810360008301526138fe816134b9565b9050919050565b6000602082019050818103600083015261391e816134dc565b9050919050565b600060208201905061393a6000830184613531565b92915050565b60006040820190506139556000830185613531565b6139626020830184613531565b9392505050565b6000613973613984565b905061397f8282613c50565b919050565b6000604051905090565b600067ffffffffffffffff8211156139a9576139a8613db7565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156139d5576139d4613db7565b5b6139de82613e04565b9050602081019050919050565b600067ffffffffffffffff821115613a0657613a05613db7565b5b613a0f82613e04565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a6a82613b9c565b9150613a7583613b9c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613aaa57613aa9613cfb565b5b828201905092915050565b6000613ac082613b9c565b9150613acb83613b9c565b925082613adb57613ada613d2a565b5b828204905092915050565b6000613af182613b9c565b9150613afc83613b9c565b925082821015613b0f57613b0e613cfb565b5b828203905092915050565b6000613b2582613b7c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b6000613bd582613ba6565b9050919050565b82818337600083830152505050565b60005b83811015613c09578082015181840152602081019050613bee565b83811115613c18576000848401525b50505050565b60006002820490506001821680613c3657607f821691505b60208210811415613c4a57613c49613d59565b5b50919050565b613c5982613e04565b810181811067ffffffffffffffff82111715613c7857613c77613db7565b5b80604052505050565b6000613c8c82613b9c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cbf57613cbe613cfb565b5b600182019050919050565b6000613cd582613b9c565b9150613ce083613b9c565b925082613cf057613cef613d2a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61431a81613b1a565b811461432557600080fd5b50565b61433181613b2c565b811461433c57600080fd5b50565b61434881613b38565b811461435357600080fd5b50565b61435f81613b42565b811461436a57600080fd5b50565b61437681613b6e565b811461438157600080fd5b50565b61438d81613b9c565b811461439857600080fd5b50565b6143a481613ba6565b81146143af57600080fd5b50565b6143bb81613bb6565b81146143c657600080fd5b5056fea264697066735822122010a9da9b6448ca3a07bca97359ce9536da2a7be2e05ccf89ea66c7e59f45b19e64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000180000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909000000000000000000000000000000000000000000000000000000000000000c4d4545362041766174617273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d41564100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6d6565362e78797a2f6170692f6e66742f617661746172732f6e66742d6d6574616461746100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6d6565362e78797a2f6170692f6e66742f617661746172732f6d657461646174610000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): MEE6 Avatars
Arg [1] : symbol (string): MAVA
Arg [2] : baseUri (string): https://mee6.xyz/api/nft/avatars/nft-metadata
Arg [3] : contractUri (string): https://mee6.xyz/api/nft/avatars/metadata
Arg [4] : vrfCoordinator (address): 0x271682DEB8C4E0901D1a1550aD2e64D568E69909

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [6] : 4d45453620417661746172730000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4d41564100000000000000000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [10] : 68747470733a2f2f6d6565362e78797a2f6170692f6e66742f61766174617273
Arg [11] : 2f6e66742d6d6574616461746100000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [13] : 68747470733a2f2f6d6565362e78797a2f6170692f6e66742f61766174617273
Arg [14] : 2f6d657461646174610000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52745:3995:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39709:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40654:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42213:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41736:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6777:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43103:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55393:65;;;:::i;:::-;;55466:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43513:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52289:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54608:84;;;:::i;:::-;;54934:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54827:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20787:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40348:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40078:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19084:94;;;:::i;:::-;;53947:77;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55324:61;;;:::i;:::-;;18433:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54700:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40823:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42506:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55113:117;;;:::i;:::-;;43769:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56047:493;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55688:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55238:78;;;:::i;:::-;;53842:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42872:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54032:387;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19333:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39709:305;39811:4;39863:25;39848:40;;;:11;:40;;;;:105;;;;39920:33;39905:48;;;:11;:48;;;;39848:105;:158;;;;39970:36;39994:11;39970:23;:36::i;:::-;39848:158;39828:178;;39709:305;;;:::o;40654:100::-;40708:13;40741:5;40734:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40654:100;:::o;42213:221::-;42289:7;42317:16;42325:7;42317;:16::i;:::-;42309:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42402:15;:24;42418:7;42402:24;;;;;;;;;;;;;;;;;;;;;42395:31;;42213:221;;;:::o;41736:411::-;41817:13;41833:23;41848:7;41833:14;:23::i;:::-;41817:39;;41881:5;41875:11;;:2;:11;;;;41867:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41975:5;41959:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41984:37;42001:5;42008:12;:10;:12::i;:::-;41984:16;:37::i;:::-;41959:62;41937:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;42118:21;42127:2;42131:7;42118:8;:21::i;:::-;41806:341;41736:411;;:::o;6777:261::-;6891:14;6877:28;;:10;:28;;;6873:111;;6949:10;6961:14;6923:53;;;;;;;;;;;;:::i;:::-;;;;;;;;6873:111;6990:42;7009:9;7020:11;6990:18;:42::i;:::-;6777:261;;:::o;43103:339::-;43298:41;43317:12;:10;:12::i;:::-;43331:7;43298:18;:41::i;:::-;43290:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;43406:28;43416:4;43422:2;43426:7;43406:9;:28::i;:::-;43103:339;;;:::o;55393:65::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55440:10:::1;:8;:10::i;:::-;55393:65::o:0;55466:214::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55532:14:::1;;;;;;;;;;;55524:23;;;::::0;::::1;;55558:15;55576:25;:15;:23;:25::i;:::-;55558:43;;55612:27;:15;:25;:27::i;:::-;55650:22;55660:2;55664:7;55650:9;:22::i;:::-;55513:167;55466:214:::0;:::o;43513:185::-;43651:39;43668:4;43674:2;43678:7;43651:39;;;;;;;;;;;;:16;:39::i;:::-;43513:185;;;:::o;52289:245::-;52407:41;52426:12;:10;:12::i;:::-;52440:7;52407:18;:41::i;:::-;52399:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;52512:14;52518:7;52512:5;:14::i;:::-;52289:245;:::o;54608:84::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54679:5:::1;54659:17;;:25;;;;;;;;;;;;;;;;;;54608:84::o:0;54934:171::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55020:34:::1;;;;;;;;;;;55012:43;;;::::0;::::1;;55093:4;55066:24;;:31;;;;;;;;;;;;;;;;;;54934:171:::0;:::o;54827:99::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54908:10:::1;54901:4;:17;;;;;;;;;;;;:::i;:::-;;54827:99:::0;:::o;20787:86::-;20834:4;20858:7;;;;;;;;;;;20851:14;;20787:86;:::o;40348:239::-;40420:7;40440:13;40456:7;:16;40464:7;40456:16;;;;;;;;;;;;;;;;;;;;;40440:32;;40508:1;40491:19;;:5;:19;;;;40483:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40574:5;40567:12;;;40348:239;;;:::o;40078:208::-;40150:7;40195:1;40178:19;;:5;:19;;;;40170:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;40262:9;:16;40272:5;40262:16;;;;;;;;;;;;;;;;40255:23;;40078:208;;;:::o;19084:94::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19149:21:::1;19167:1;19149:9;:21::i;:::-;19084:94::o:0;53947:77::-;53984:7;54011:5;;54004:12;;53947:77;:::o;55324:61::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55369:8:::1;:6;:8::i;:::-;55324:61::o:0;18433:87::-;18479:7;18506:6;;;;;;;;;;;18499:13;;18433:87;:::o;54700:119::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54797:14:::1;54782:12;:29;;;;;;;;;;;;:::i;:::-;;54700:119:::0;:::o;40823:104::-;40879:13;40912:7;40905:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40823:104;:::o;42506:295::-;42621:12;:10;:12::i;:::-;42609:24;;:8;:24;;;;42601:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;42721:8;42676:18;:32;42695:12;:10;:12::i;:::-;42676:32;;;;;;;;;;;;;;;:42;42709:8;42676:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;42774:8;42745:48;;42760:12;:10;:12::i;:::-;42745:48;;;42784:8;42745:48;;;;;;:::i;:::-;;;;;;;;42506:295;;:::o;55113:117::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55217:5:::1;55180:34;;:42;;;;;;;;;;;;;;;;;;55113:117::o:0;43769:328::-;43944:41;43963:12;:10;:12::i;:::-;43977:7;43944:18;:41::i;:::-;43936:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;44050:39;44064:4;44070:2;44074:7;44083:5;44050:13;:39::i;:::-;43769:328;;;;:::o;56047:493::-;56112:13;56138:23;56153:7;56138:14;:23::i;:::-;56212:1;56176:38;;:24;;;;;;;;;;;:38;;;56172:361;;56254:24;;;;;;;;;;;56238:50;;;56289:5;;56296:7;56238:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56231:73;;;;56172:361;56337:21;56361:10;:8;:10::i;:::-;56337:34;;56417:1;56399:7;56393:21;:25;:128;;;;;;;;;;;;;;;;;56445:7;56459:23;56476:5;;56459:16;:23::i;:::-;56489:25;56506:7;56489:16;:25::i;:::-;56428:87;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56393:128;56386:135;;;56047:493;;;;:::o;55688:216::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55775:14:::1;;;;;;;;;;;55767:23;;;::::0;::::1;;55806:9;55801:96;55825:9;;:16;;55821:1;:20;55801:96;;;55863:22;55872:9;;55882:1;55872:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55863:8;:22::i;:::-;55843:3;;;;;:::i;:::-;;;;55801:96;;;;55688:216:::0;;:::o;55238:78::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55303:5:::1;55286:14;;:22;;;;;;;;;;;;;;;;;;55238:78::o:0;53842:97::-;53886:13;53919:12;53912:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53842:97;:::o;42872:164::-;42969:4;42993:18;:25;43012:5;42993:25;;;;;;;;;;;;;;;:35;43019:8;42993:35;;;;;;;;;;;;;;;;;;;;;;;;;42986:42;;42872:164;;;;:::o;54032:387::-;54169:7;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54197:17:::1;;;;;;;;;;;54189:26;;;::::0;::::1;;54233:15;;;;;;;;;;;:34;;;54282:7;54304:14;54333:20;54368:16;54399:1;54233:178;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54226:185;;54032:387:::0;;;;;;:::o;19333:192::-;18664:12;:10;:12::i;:::-;18653:23;;:7;:5;:7::i;:::-;:23;;;18645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19442:1:::1;19422:22;;:8;:22;;;;19414:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19498:19;19508:8;19498:9;:19::i;:::-;19333:192:::0;:::o;32679:157::-;32764:4;32803:25;32788:40;;;:11;:40;;;;32781:47;;32679:157;;;:::o;45607:127::-;45672:4;45724:1;45696:30;;:7;:16;45704:7;45696:16;;;;;;;;;;;;;;;;;;;;;:30;;;;45689:37;;45607:127;;;:::o;17221:98::-;17274:7;17301:10;17294:17;;17221:98;:::o;49589:174::-;49691:2;49664:15;:24;49680:7;49664:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49747:7;49743:2;49709:46;;49718:23;49733:7;49718:14;:23::i;:::-;49709:46;;;;;;;;;;;;49589:174;;:::o;54427:173::-;54541:17;;;;;;;;;;;54533:26;;;;;;54578:11;54590:1;54578:14;;;;;;;;:::i;:::-;;;;;;;;54570:5;:22;;;;54427:173;;:::o;45901:348::-;45994:4;46019:16;46027:7;46019;:16::i;:::-;46011:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46095:13;46111:23;46126:7;46111:14;:23::i;:::-;46095:39;;46164:5;46153:16;;:7;:16;;;:51;;;;46197:7;46173:31;;:20;46185:7;46173:11;:20::i;:::-;:31;;;46153:51;:87;;;;46208:32;46225:5;46232:7;46208:16;:32::i;:::-;46153:87;46145:96;;;45901:348;;;;:::o;48893:578::-;49052:4;49025:31;;:23;49040:7;49025:14;:23::i;:::-;:31;;;49017:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49135:1;49121:16;;:2;:16;;;;49113:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;49191:39;49212:4;49218:2;49222:7;49191:20;:39::i;:::-;49295:29;49312:1;49316:7;49295:8;:29::i;:::-;49356:1;49337:9;:15;49347:4;49337:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;49385:1;49368:9;:13;49378:2;49368:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;49416:2;49397:7;:16;49405:7;49397:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49455:7;49451:2;49436:27;;49445:4;49436:27;;;;;;;;;;;;48893:578;;;:::o;21846:120::-;21390:8;:6;:8::i;:::-;21382:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;21915:5:::1;21905:7;;:15;;;;;;;;;;;;;;;;;;21936:22;21945:12;:10;:12::i;:::-;21936:22;;;;;;:::i;:::-;;;;;;;;21846:120::o:0;13933:114::-;13998:7;14025;:14;;;14018:21;;13933:114;;;:::o;14055:127::-;14162:1;14144:7;:14;;;:19;;;;;;;;;;;14055:127;:::o;46591:110::-;46667:26;46677:2;46681:7;46667:26;;;;;;;;;;;;:9;:26::i;:::-;46591:110;;:::o;48196:360::-;48256:13;48272:23;48287:7;48272:14;:23::i;:::-;48256:39;;48308:48;48329:5;48344:1;48348:7;48308:20;:48::i;:::-;48397:29;48414:1;48418:7;48397:8;:29::i;:::-;48459:1;48439:9;:16;48449:5;48439:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;48478:7;:16;48486:7;48478:16;;;;;;;;;;;;48471:23;;;;;;;;;;;48540:7;48536:1;48512:36;;48521:5;48512:36;;;;;;;;;;;;48245:311;48196:360;:::o;19533:173::-;19589:16;19608:6;;;;;;;;;;;19589:25;;19634:8;19625:6;;:17;;;;;;;;;;;;;;;;;;19689:8;19658:40;;19679:8;19658:40;;;;;;;;;;;;19578:128;19533:173;:::o;21587:118::-;21113:8;:6;:8::i;:::-;21112:9;21104:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;21657:4:::1;21647:7;;:14;;;;;;;;;;;;;;;;;;21677:20;21684:12;:10;:12::i;:::-;21677:20;;;;;;:::i;:::-;;;;;;;;21587:118::o:0;44979:315::-;45136:28;45146:4;45152:2;45156:7;45136:9;:28::i;:::-;45183:48;45206:4;45212:2;45216:7;45225:5;45183:22;:48::i;:::-;45175:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;44979:315;;;;:::o;55912:127::-;55986:16;55994:7;55986;:16::i;:::-;55978:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;55912:127;:::o;53737:97::-;53789:13;53822:4;53815:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53737:97;:::o;14837:723::-;14893:13;15123:1;15114:5;:10;15110:53;;;15141:10;;;;;;;;;;;;;;;;;;;;;15110:53;15173:12;15188:5;15173:20;;15204:14;15229:78;15244:1;15236:4;:9;15229:78;;15262:8;;;;;:::i;:::-;;;;15293:2;15285:10;;;;;:::i;:::-;;;15229:78;;;15317:19;15349:6;15339:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15317:39;;15367:154;15383:1;15374:5;:10;15367:154;;15411:1;15401:11;;;;;:::i;:::-;;;15478:2;15470:5;:10;;;;:::i;:::-;15457:2;:24;;;;:::i;:::-;15444:39;;15427:6;15434;15427:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15507:2;15498:11;;;;;:::i;:::-;;;15367:154;;;15545:6;15531:21;;;;;14837:723;;;;:::o;56548:189::-;21113:8;:6;:8::i;:::-;21112:9;21104:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56684:45:::1;56711:4;56717:2;56721:7;56684:26;:45::i;:::-;56548:189:::0;;;:::o;46928:321::-;47058:18;47064:2;47068:7;47058:5;:18::i;:::-;47109:54;47140:1;47144:2;47148:7;47157:5;47109:22;:54::i;:::-;47087:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;46928:321;;;:::o;50328:799::-;50483:4;50504:15;:2;:13;;;:15::i;:::-;50500:620;;;50556:2;50540:36;;;50577:12;:10;:12::i;:::-;50591:4;50597:7;50606:5;50540:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50536:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50799:1;50782:6;:13;:18;50778:272;;;50825:60;;;;;;;;;;:::i;:::-;;;;;;;;50778:272;51000:6;50994:13;50985:6;50981:2;50977:15;50970:38;50536:529;50673:41;;;50663:51;;;:6;:51;;;;50656:58;;;;;50500:620;51104:4;51097:11;;50328:799;;;;;;;:::o;51699:126::-;;;;:::o;47585:382::-;47679:1;47665:16;;:2;:16;;;;47657:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47738:16;47746:7;47738;:16::i;:::-;47737:17;47729:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47800:45;47829:1;47833:2;47837:7;47800:20;:45::i;:::-;47875:1;47858:9;:13;47868:2;47858:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47906:2;47887:7;:16;47895:7;47887:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47951:7;47947:2;47926:33;;47943:1;47926:33;;;;;;;;;;;;47585:382;;:::o;22739:387::-;22799:4;23007:12;23074:7;23062:20;23054:28;;23117:1;23110:4;:8;23103:15;;;22739:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:421::-;1675:5;1700:66;1716:49;1758:6;1716:49;:::i;:::-;1700:66;:::i;:::-;1691:75;;1789:6;1782:5;1775:21;1827:4;1820:5;1816:16;1865:3;1856:6;1851:3;1847:16;1844:25;1841:112;;;1872:79;;:::i;:::-;1841:112;1962:39;1994:6;1989:3;1984;1962:39;:::i;:::-;1681:326;1586:421;;;;;:::o;2013:139::-;2059:5;2097:6;2084:20;2075:29;;2113:33;2140:5;2113:33;:::i;:::-;2013:139;;;;:::o;2175:568::-;2248:8;2258:6;2308:3;2301:4;2293:6;2289:17;2285:27;2275:122;;2316:79;;:::i;:::-;2275:122;2429:6;2416:20;2406:30;;2459:18;2451:6;2448:30;2445:117;;;2481:79;;:::i;:::-;2445:117;2595:4;2587:6;2583:17;2571:29;;2649:3;2641:4;2633:6;2629:17;2619:8;2615:32;2612:41;2609:128;;;2656:79;;:::i;:::-;2609:128;2175:568;;;;;:::o;2766:370::-;2837:5;2886:3;2879:4;2871:6;2867:17;2863:27;2853:122;;2894:79;;:::i;:::-;2853:122;3011:6;2998:20;3036:94;3126:3;3118:6;3111:4;3103:6;3099:17;3036:94;:::i;:::-;3027:103;;2843:293;2766:370;;;;:::o;3142:133::-;3185:5;3223:6;3210:20;3201:29;;3239:30;3263:5;3239:30;:::i;:::-;3142:133;;;;:::o;3281:139::-;3327:5;3365:6;3352:20;3343:29;;3381:33;3408:5;3381:33;:::i;:::-;3281:139;;;;:::o;3426:137::-;3471:5;3509:6;3496:20;3487:29;;3525:32;3551:5;3525:32;:::i;:::-;3426:137;;;;:::o;3569:141::-;3625:5;3656:6;3650:13;3641:22;;3672:32;3698:5;3672:32;:::i;:::-;3569:141;;;;:::o;3729:338::-;3784:5;3833:3;3826:4;3818:6;3814:17;3810:27;3800:122;;3841:79;;:::i;:::-;3800:122;3958:6;3945:20;3983:78;4057:3;4049:6;4042:4;4034:6;4030:17;3983:78;:::i;:::-;3974:87;;3790:277;3729:338;;;;:::o;4087:340::-;4143:5;4192:3;4185:4;4177:6;4173:17;4169:27;4159:122;;4200:79;;:::i;:::-;4159:122;4317:6;4304:20;4342:79;4417:3;4409:6;4402:4;4394:6;4390:17;4342:79;:::i;:::-;4333:88;;4149:278;4087:340;;;;:::o;4447:355::-;4514:5;4563:3;4556:4;4548:6;4544:17;4540:27;4530:122;;4571:79;;:::i;:::-;4530:122;4681:6;4675:13;4706:90;4792:3;4784:6;4777:4;4769:6;4765:17;4706:90;:::i;:::-;4697:99;;4520:282;4447:355;;;;:::o;4808:137::-;4853:5;4891:6;4878:20;4869:29;;4907:32;4933:5;4907:32;:::i;:::-;4808:137;;;;:::o;4951:139::-;4997:5;5035:6;5022:20;5013:29;;5051:33;5078:5;5051:33;:::i;:::-;4951:139;;;;:::o;5096:143::-;5153:5;5184:6;5178:13;5169:22;;5200:33;5227:5;5200:33;:::i;:::-;5096:143;;;;:::o;5245:137::-;5290:5;5328:6;5315:20;5306:29;;5344:32;5370:5;5344:32;:::i;:::-;5245:137;;;;:::o;5388:::-;5433:5;5471:6;5458:20;5449:29;;5487:32;5513:5;5487:32;:::i;:::-;5388:137;;;;:::o;5531:329::-;5590:6;5639:2;5627:9;5618:7;5614:23;5610:32;5607:119;;;5645:79;;:::i;:::-;5607:119;5765:1;5790:53;5835:7;5826:6;5815:9;5811:22;5790:53;:::i;:::-;5780:63;;5736:117;5531:329;;;;:::o;5866:474::-;5934:6;5942;5991:2;5979:9;5970:7;5966:23;5962:32;5959:119;;;5997:79;;:::i;:::-;5959:119;6117:1;6142:53;6187:7;6178:6;6167:9;6163:22;6142:53;:::i;:::-;6132:63;;6088:117;6244:2;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6215:118;5866:474;;;;;:::o;6346:619::-;6423:6;6431;6439;6488:2;6476:9;6467:7;6463:23;6459:32;6456:119;;;6494:79;;:::i;:::-;6456:119;6614:1;6639:53;6684:7;6675:6;6664:9;6660:22;6639:53;:::i;:::-;6629:63;;6585:117;6741:2;6767:53;6812:7;6803:6;6792:9;6788:22;6767:53;:::i;:::-;6757:63;;6712:118;6869:2;6895:53;6940:7;6931:6;6920:9;6916:22;6895:53;:::i;:::-;6885:63;;6840:118;6346:619;;;;;:::o;6971:943::-;7066:6;7074;7082;7090;7139:3;7127:9;7118:7;7114:23;7110:33;7107:120;;;7146:79;;:::i;:::-;7107:120;7266:1;7291:53;7336:7;7327:6;7316:9;7312:22;7291:53;:::i;:::-;7281:63;;7237:117;7393:2;7419:53;7464:7;7455:6;7444:9;7440:22;7419:53;:::i;:::-;7409:63;;7364:118;7521:2;7547:53;7592:7;7583:6;7572:9;7568:22;7547:53;:::i;:::-;7537:63;;7492:118;7677:2;7666:9;7662:18;7649:32;7708:18;7700:6;7697:30;7694:117;;;7730:79;;:::i;:::-;7694:117;7835:62;7889:7;7880:6;7869:9;7865:22;7835:62;:::i;:::-;7825:72;;7620:287;6971:943;;;;;;;:::o;7920:468::-;7985:6;7993;8042:2;8030:9;8021:7;8017:23;8013:32;8010:119;;;8048:79;;:::i;:::-;8010:119;8168:1;8193:53;8238:7;8229:6;8218:9;8214:22;8193:53;:::i;:::-;8183:63;;8139:117;8295:2;8321:50;8363:7;8354:6;8343:9;8339:22;8321:50;:::i;:::-;8311:60;;8266:115;7920:468;;;;;:::o;8394:474::-;8462:6;8470;8519:2;8507:9;8498:7;8494:23;8490:32;8487:119;;;8525:79;;:::i;:::-;8487:119;8645:1;8670:53;8715:7;8706:6;8695:9;8691:22;8670:53;:::i;:::-;8660:63;;8616:117;8772:2;8798:53;8843:7;8834:6;8823:9;8819:22;8798:53;:::i;:::-;8788:63;;8743:118;8394:474;;;;;:::o;8874:559::-;8960:6;8968;9017:2;9005:9;8996:7;8992:23;8988:32;8985:119;;;9023:79;;:::i;:::-;8985:119;9171:1;9160:9;9156:17;9143:31;9201:18;9193:6;9190:30;9187:117;;;9223:79;;:::i;:::-;9187:117;9336:80;9408:7;9399:6;9388:9;9384:22;9336:80;:::i;:::-;9318:98;;;;9114:312;8874:559;;;;;:::o;9439:327::-;9497:6;9546:2;9534:9;9525:7;9521:23;9517:32;9514:119;;;9552:79;;:::i;:::-;9514:119;9672:1;9697:52;9741:7;9732:6;9721:9;9717:22;9697:52;:::i;:::-;9687:62;;9643:116;9439:327;;;;:::o;9772:349::-;9841:6;9890:2;9878:9;9869:7;9865:23;9861:32;9858:119;;;9896:79;;:::i;:::-;9858:119;10016:1;10041:63;10096:7;10087:6;10076:9;10072:22;10041:63;:::i;:::-;10031:73;;9987:127;9772:349;;;;:::o;10127:509::-;10196:6;10245:2;10233:9;10224:7;10220:23;10216:32;10213:119;;;10251:79;;:::i;:::-;10213:119;10399:1;10388:9;10384:17;10371:31;10429:18;10421:6;10418:30;10415:117;;;10451:79;;:::i;:::-;10415:117;10556:63;10611:7;10602:6;10591:9;10587:22;10556:63;:::i;:::-;10546:73;;10342:287;10127:509;;;;:::o;10642:524::-;10722:6;10771:2;10759:9;10750:7;10746:23;10742:32;10739:119;;;10777:79;;:::i;:::-;10739:119;10918:1;10907:9;10903:17;10897:24;10948:18;10940:6;10937:30;10934:117;;;10970:79;;:::i;:::-;10934:117;11075:74;11141:7;11132:6;11121:9;11117:22;11075:74;:::i;:::-;11065:84;;10868:291;10642:524;;;;:::o;11172:329::-;11231:6;11280:2;11268:9;11259:7;11255:23;11251:32;11248:119;;;11286:79;;:::i;:::-;11248:119;11406:1;11431:53;11476:7;11467:6;11456:9;11452:22;11431:53;:::i;:::-;11421:63;;11377:117;11172:329;;;;:::o;11507:351::-;11577:6;11626:2;11614:9;11605:7;11601:23;11597:32;11594:119;;;11632:79;;:::i;:::-;11594:119;11752:1;11777:64;11833:7;11824:6;11813:9;11809:22;11777:64;:::i;:::-;11767:74;;11723:128;11507:351;;;;:::o;11864:684::-;11957:6;11965;12014:2;12002:9;11993:7;11989:23;11985:32;11982:119;;;12020:79;;:::i;:::-;11982:119;12140:1;12165:53;12210:7;12201:6;12190:9;12186:22;12165:53;:::i;:::-;12155:63;;12111:117;12295:2;12284:9;12280:18;12267:32;12326:18;12318:6;12315:30;12312:117;;;12348:79;;:::i;:::-;12312:117;12453:78;12523:7;12514:6;12503:9;12499:22;12453:78;:::i;:::-;12443:88;;12238:303;11864:684;;;;;:::o;12554:759::-;12637:6;12645;12653;12661;12710:3;12698:9;12689:7;12685:23;12681:33;12678:120;;;12717:79;;:::i;:::-;12678:120;12837:1;12862:52;12906:7;12897:6;12886:9;12882:22;12862:52;:::i;:::-;12852:62;;12808:116;12963:2;12989:53;13034:7;13025:6;13014:9;13010:22;12989:53;:::i;:::-;12979:63;;12934:118;13091:2;13117:52;13161:7;13152:6;13141:9;13137:22;13117:52;:::i;:::-;13107:62;;13062:117;13218:2;13244:52;13288:7;13279:6;13268:9;13264:22;13244:52;:::i;:::-;13234:62;;13189:117;12554:759;;;;;;;:::o;13319:118::-;13406:24;13424:5;13406:24;:::i;:::-;13401:3;13394:37;13319:118;;:::o;13443:109::-;13524:21;13539:5;13524:21;:::i;:::-;13519:3;13512:34;13443:109;;:::o;13558:118::-;13645:24;13663:5;13645:24;:::i;:::-;13640:3;13633:37;13558:118;;:::o;13682:360::-;13768:3;13796:38;13828:5;13796:38;:::i;:::-;13850:70;13913:6;13908:3;13850:70;:::i;:::-;13843:77;;13929:52;13974:6;13969:3;13962:4;13955:5;13951:16;13929:52;:::i;:::-;14006:29;14028:6;14006:29;:::i;:::-;14001:3;13997:39;13990:46;;13772:270;13682:360;;;;:::o;14048:145::-;14142:44;14180:5;14142:44;:::i;:::-;14137:3;14130:57;14048:145;;:::o;14199:364::-;14287:3;14315:39;14348:5;14315:39;:::i;:::-;14370:71;14434:6;14429:3;14370:71;:::i;:::-;14363:78;;14450:52;14495:6;14490:3;14483:4;14476:5;14472:16;14450:52;:::i;:::-;14527:29;14549:6;14527:29;:::i;:::-;14522:3;14518:39;14511:46;;14291:272;14199:364;;;;:::o;14569:377::-;14675:3;14703:39;14736:5;14703:39;:::i;:::-;14758:89;14840:6;14835:3;14758:89;:::i;:::-;14751:96;;14856:52;14901:6;14896:3;14889:4;14882:5;14878:16;14856:52;:::i;:::-;14933:6;14928:3;14924:16;14917:23;;14679:267;14569:377;;;;:::o;14952:366::-;15094:3;15115:67;15179:2;15174:3;15115:67;:::i;:::-;15108:74;;15191:93;15280:3;15191:93;:::i;:::-;15309:2;15304:3;15300:12;15293:19;;14952:366;;;:::o;15324:::-;15466:3;15487:67;15551:2;15546:3;15487:67;:::i;:::-;15480:74;;15563:93;15652:3;15563:93;:::i;:::-;15681:2;15676:3;15672:12;15665:19;;15324:366;;;:::o;15696:::-;15838:3;15859:67;15923:2;15918:3;15859:67;:::i;:::-;15852:74;;15935:93;16024:3;15935:93;:::i;:::-;16053:2;16048:3;16044:12;16037:19;;15696:366;;;:::o;16068:::-;16210:3;16231:67;16295:2;16290:3;16231:67;:::i;:::-;16224:74;;16307:93;16396:3;16307:93;:::i;:::-;16425:2;16420:3;16416:12;16409:19;;16068:366;;;:::o;16440:::-;16582:3;16603:67;16667:2;16662:3;16603:67;:::i;:::-;16596:74;;16679:93;16768:3;16679:93;:::i;:::-;16797:2;16792:3;16788:12;16781:19;;16440:366;;;:::o;16812:::-;16954:3;16975:67;17039:2;17034:3;16975:67;:::i;:::-;16968:74;;17051:93;17140:3;17051:93;:::i;:::-;17169:2;17164:3;17160:12;17153:19;;16812:366;;;:::o;17184:::-;17326:3;17347:67;17411:2;17406:3;17347:67;:::i;:::-;17340:74;;17423:93;17512:3;17423:93;:::i;:::-;17541:2;17536:3;17532:12;17525:19;;17184:366;;;:::o;17556:::-;17698:3;17719:67;17783:2;17778:3;17719:67;:::i;:::-;17712:74;;17795:93;17884:3;17795:93;:::i;:::-;17913:2;17908:3;17904:12;17897:19;;17556:366;;;:::o;17928:::-;18070:3;18091:67;18155:2;18150:3;18091:67;:::i;:::-;18084:74;;18167:93;18256:3;18167:93;:::i;:::-;18285:2;18280:3;18276:12;18269:19;;17928:366;;;:::o;18300:::-;18442:3;18463:67;18527:2;18522:3;18463:67;:::i;:::-;18456:74;;18539:93;18628:3;18539:93;:::i;:::-;18657:2;18652:3;18648:12;18641:19;;18300:366;;;:::o;18672:::-;18814:3;18835:67;18899:2;18894:3;18835:67;:::i;:::-;18828:74;;18911:93;19000:3;18911:93;:::i;:::-;19029:2;19024:3;19020:12;19013:19;;18672:366;;;:::o;19044:::-;19186:3;19207:67;19271:2;19266:3;19207:67;:::i;:::-;19200:74;;19283:93;19372:3;19283:93;:::i;:::-;19401:2;19396:3;19392:12;19385:19;;19044:366;;;:::o;19416:::-;19558:3;19579:67;19643:2;19638:3;19579:67;:::i;:::-;19572:74;;19655:93;19744:3;19655:93;:::i;:::-;19773:2;19768:3;19764:12;19757:19;;19416:366;;;:::o;19788:::-;19930:3;19951:67;20015:2;20010:3;19951:67;:::i;:::-;19944:74;;20027:93;20116:3;20027:93;:::i;:::-;20145:2;20140:3;20136:12;20129:19;;19788:366;;;:::o;20160:::-;20302:3;20323:67;20387:2;20382:3;20323:67;:::i;:::-;20316:74;;20399:93;20488:3;20399:93;:::i;:::-;20517:2;20512:3;20508:12;20501:19;;20160:366;;;:::o;20532:::-;20674:3;20695:67;20759:2;20754:3;20695:67;:::i;:::-;20688:74;;20771:93;20860:3;20771:93;:::i;:::-;20889:2;20884:3;20880:12;20873:19;;20532:366;;;:::o;20904:::-;21046:3;21067:67;21131:2;21126:3;21067:67;:::i;:::-;21060:74;;21143:93;21232:3;21143:93;:::i;:::-;21261:2;21256:3;21252:12;21245:19;;20904:366;;;:::o;21276:::-;21418:3;21439:67;21503:2;21498:3;21439:67;:::i;:::-;21432:74;;21515:93;21604:3;21515:93;:::i;:::-;21633:2;21628:3;21624:12;21617:19;;21276:366;;;:::o;21648:::-;21790:3;21811:67;21875:2;21870:3;21811:67;:::i;:::-;21804:74;;21887:93;21976:3;21887:93;:::i;:::-;22005:2;22000:3;21996:12;21989:19;;21648:366;;;:::o;22020:400::-;22180:3;22201:84;22283:1;22278:3;22201:84;:::i;:::-;22194:91;;22294:93;22383:3;22294:93;:::i;:::-;22412:1;22407:3;22403:11;22396:18;;22020:400;;;:::o;22426:115::-;22511:23;22528:5;22511:23;:::i;:::-;22506:3;22499:36;22426:115;;:::o;22547:118::-;22634:24;22652:5;22634:24;:::i;:::-;22629:3;22622:37;22547:118;;:::o;22671:115::-;22756:23;22773:5;22756:23;:::i;:::-;22751:3;22744:36;22671:115;;:::o;22792:::-;22877:23;22894:5;22877:23;:::i;:::-;22872:3;22865:36;22792:115;;:::o;22913:1127::-;23343:3;23365:95;23456:3;23447:6;23365:95;:::i;:::-;23358:102;;23477:148;23621:3;23477:148;:::i;:::-;23470:155;;23642:95;23733:3;23724:6;23642:95;:::i;:::-;23635:102;;23754:148;23898:3;23754:148;:::i;:::-;23747:155;;23919:95;24010:3;24001:6;23919:95;:::i;:::-;23912:102;;24031:3;24024:10;;22913:1127;;;;;;:::o;24046:222::-;24139:4;24177:2;24166:9;24162:18;24154:26;;24190:71;24258:1;24247:9;24243:17;24234:6;24190:71;:::i;:::-;24046:222;;;;:::o;24274:332::-;24395:4;24433:2;24422:9;24418:18;24410:26;;24446:71;24514:1;24503:9;24499:17;24490:6;24446:71;:::i;:::-;24527:72;24595:2;24584:9;24580:18;24571:6;24527:72;:::i;:::-;24274:332;;;;;:::o;24612:640::-;24807:4;24845:3;24834:9;24830:19;24822:27;;24859:71;24927:1;24916:9;24912:17;24903:6;24859:71;:::i;:::-;24940:72;25008:2;24997:9;24993:18;24984:6;24940:72;:::i;:::-;25022;25090:2;25079:9;25075:18;25066:6;25022:72;:::i;:::-;25141:9;25135:4;25131:20;25126:2;25115:9;25111:18;25104:48;25169:76;25240:4;25231:6;25169:76;:::i;:::-;25161:84;;24612:640;;;;;;;:::o;25258:210::-;25345:4;25383:2;25372:9;25368:18;25360:26;;25396:65;25458:1;25447:9;25443:17;25434:6;25396:65;:::i;:::-;25258:210;;;;:::o;25474:666::-;25680:4;25718:3;25707:9;25703:19;25695:27;;25732:71;25800:1;25789:9;25785:17;25776:6;25732:71;:::i;:::-;25813:70;25879:2;25868:9;25864:18;25855:6;25813:70;:::i;:::-;25893;25959:2;25948:9;25944:18;25935:6;25893:70;:::i;:::-;25973;26039:2;26028:9;26024:18;26015:6;25973:70;:::i;:::-;26053:80;26128:3;26117:9;26113:19;26104:6;26053:80;:::i;:::-;25474:666;;;;;;;;:::o;26146:313::-;26259:4;26297:2;26286:9;26282:18;26274:26;;26346:9;26340:4;26336:20;26332:1;26321:9;26317:17;26310:47;26374:78;26447:4;26438:6;26374:78;:::i;:::-;26366:86;;26146:313;;;;:::o;26465:419::-;26631:4;26669:2;26658:9;26654:18;26646:26;;26718:9;26712:4;26708:20;26704:1;26693:9;26689:17;26682:47;26746:131;26872:4;26746:131;:::i;:::-;26738:139;;26465:419;;;:::o;26890:::-;27056:4;27094:2;27083:9;27079:18;27071:26;;27143:9;27137:4;27133:20;27129:1;27118:9;27114:17;27107:47;27171:131;27297:4;27171:131;:::i;:::-;27163:139;;26890:419;;;:::o;27315:::-;27481:4;27519:2;27508:9;27504:18;27496:26;;27568:9;27562:4;27558:20;27554:1;27543:9;27539:17;27532:47;27596:131;27722:4;27596:131;:::i;:::-;27588:139;;27315:419;;;:::o;27740:::-;27906:4;27944:2;27933:9;27929:18;27921:26;;27993:9;27987:4;27983:20;27979:1;27968:9;27964:17;27957:47;28021:131;28147:4;28021:131;:::i;:::-;28013:139;;27740:419;;;:::o;28165:::-;28331:4;28369:2;28358:9;28354:18;28346:26;;28418:9;28412:4;28408:20;28404:1;28393:9;28389:17;28382:47;28446:131;28572:4;28446:131;:::i;:::-;28438:139;;28165:419;;;:::o;28590:::-;28756:4;28794:2;28783:9;28779:18;28771:26;;28843:9;28837:4;28833:20;28829:1;28818:9;28814:17;28807:47;28871:131;28997:4;28871:131;:::i;:::-;28863:139;;28590:419;;;:::o;29015:::-;29181:4;29219:2;29208:9;29204:18;29196:26;;29268:9;29262:4;29258:20;29254:1;29243:9;29239:17;29232:47;29296:131;29422:4;29296:131;:::i;:::-;29288:139;;29015:419;;;:::o;29440:::-;29606:4;29644:2;29633:9;29629:18;29621:26;;29693:9;29687:4;29683:20;29679:1;29668:9;29664:17;29657:47;29721:131;29847:4;29721:131;:::i;:::-;29713:139;;29440:419;;;:::o;29865:::-;30031:4;30069:2;30058:9;30054:18;30046:26;;30118:9;30112:4;30108:20;30104:1;30093:9;30089:17;30082:47;30146:131;30272:4;30146:131;:::i;:::-;30138:139;;29865:419;;;:::o;30290:::-;30456:4;30494:2;30483:9;30479:18;30471:26;;30543:9;30537:4;30533:20;30529:1;30518:9;30514:17;30507:47;30571:131;30697:4;30571:131;:::i;:::-;30563:139;;30290:419;;;:::o;30715:::-;30881:4;30919:2;30908:9;30904:18;30896:26;;30968:9;30962:4;30958:20;30954:1;30943:9;30939:17;30932:47;30996:131;31122:4;30996:131;:::i;:::-;30988:139;;30715:419;;;:::o;31140:::-;31306:4;31344:2;31333:9;31329:18;31321:26;;31393:9;31387:4;31383:20;31379:1;31368:9;31364:17;31357:47;31421:131;31547:4;31421:131;:::i;:::-;31413:139;;31140:419;;;:::o;31565:::-;31731:4;31769:2;31758:9;31754:18;31746:26;;31818:9;31812:4;31808:20;31804:1;31793:9;31789:17;31782:47;31846:131;31972:4;31846:131;:::i;:::-;31838:139;;31565:419;;;:::o;31990:::-;32156:4;32194:2;32183:9;32179:18;32171:26;;32243:9;32237:4;32233:20;32229:1;32218:9;32214:17;32207:47;32271:131;32397:4;32271:131;:::i;:::-;32263:139;;31990:419;;;:::o;32415:::-;32581:4;32619:2;32608:9;32604:18;32596:26;;32668:9;32662:4;32658:20;32654:1;32643:9;32639:17;32632:47;32696:131;32822:4;32696:131;:::i;:::-;32688:139;;32415:419;;;:::o;32840:::-;33006:4;33044:2;33033:9;33029:18;33021:26;;33093:9;33087:4;33083:20;33079:1;33068:9;33064:17;33057:47;33121:131;33247:4;33121:131;:::i;:::-;33113:139;;32840:419;;;:::o;33265:::-;33431:4;33469:2;33458:9;33454:18;33446:26;;33518:9;33512:4;33508:20;33504:1;33493:9;33489:17;33482:47;33546:131;33672:4;33546:131;:::i;:::-;33538:139;;33265:419;;;:::o;33690:::-;33856:4;33894:2;33883:9;33879:18;33871:26;;33943:9;33937:4;33933:20;33929:1;33918:9;33914:17;33907:47;33971:131;34097:4;33971:131;:::i;:::-;33963:139;;33690:419;;;:::o;34115:::-;34281:4;34319:2;34308:9;34304:18;34296:26;;34368:9;34362:4;34358:20;34354:1;34343:9;34339:17;34332:47;34396:131;34522:4;34396:131;:::i;:::-;34388:139;;34115:419;;;:::o;34540:222::-;34633:4;34671:2;34660:9;34656:18;34648:26;;34684:71;34752:1;34741:9;34737:17;34728:6;34684:71;:::i;:::-;34540:222;;;;:::o;34768:332::-;34889:4;34927:2;34916:9;34912:18;34904:26;;34940:71;35008:1;34997:9;34993:17;34984:6;34940:71;:::i;:::-;35021:72;35089:2;35078:9;35074:18;35065:6;35021:72;:::i;:::-;34768:332;;;;;:::o;35106:129::-;35140:6;35167:20;;:::i;:::-;35157:30;;35196:33;35224:4;35216:6;35196:33;:::i;:::-;35106:129;;;:::o;35241:75::-;35274:6;35307:2;35301:9;35291:19;;35241:75;:::o;35322:311::-;35399:4;35489:18;35481:6;35478:30;35475:56;;;35511:18;;:::i;:::-;35475:56;35561:4;35553:6;35549:17;35541:25;;35621:4;35615;35611:15;35603:23;;35322:311;;;:::o;35639:307::-;35700:4;35790:18;35782:6;35779:30;35776:56;;;35812:18;;:::i;:::-;35776:56;35850:29;35872:6;35850:29;:::i;:::-;35842:37;;35934:4;35928;35924:15;35916:23;;35639:307;;;:::o;35952:308::-;36014:4;36104:18;36096:6;36093:30;36090:56;;;36126:18;;:::i;:::-;36090:56;36164:29;36186:6;36164:29;:::i;:::-;36156:37;;36248:4;36242;36238:15;36230:23;;35952:308;;;:::o;36266:98::-;36317:6;36351:5;36345:12;36335:22;;36266:98;;;:::o;36370:99::-;36422:6;36456:5;36450:12;36440:22;;36370:99;;;:::o;36475:168::-;36558:11;36592:6;36587:3;36580:19;36632:4;36627:3;36623:14;36608:29;;36475:168;;;;:::o;36649:169::-;36733:11;36767:6;36762:3;36755:19;36807:4;36802:3;36798:14;36783:29;;36649:169;;;;:::o;36824:148::-;36926:11;36963:3;36948:18;;36824:148;;;;:::o;36978:305::-;37018:3;37037:20;37055:1;37037:20;:::i;:::-;37032:25;;37071:20;37089:1;37071:20;:::i;:::-;37066:25;;37225:1;37157:66;37153:74;37150:1;37147:81;37144:107;;;37231:18;;:::i;:::-;37144:107;37275:1;37272;37268:9;37261:16;;36978:305;;;;:::o;37289:185::-;37329:1;37346:20;37364:1;37346:20;:::i;:::-;37341:25;;37380:20;37398:1;37380:20;:::i;:::-;37375:25;;37419:1;37409:35;;37424:18;;:::i;:::-;37409:35;37466:1;37463;37459:9;37454:14;;37289:185;;;;:::o;37480:191::-;37520:4;37540:20;37558:1;37540:20;:::i;:::-;37535:25;;37574:20;37592:1;37574:20;:::i;:::-;37569:25;;37613:1;37610;37607:8;37604:34;;;37618:18;;:::i;:::-;37604:34;37663:1;37660;37656:9;37648:17;;37480:191;;;;:::o;37677:96::-;37714:7;37743:24;37761:5;37743:24;:::i;:::-;37732:35;;37677:96;;;:::o;37779:90::-;37813:7;37856:5;37849:13;37842:21;37831:32;;37779:90;;;:::o;37875:77::-;37912:7;37941:5;37930:16;;37875:77;;;:::o;37958:149::-;37994:7;38034:66;38027:5;38023:78;38012:89;;37958:149;;;:::o;38113:89::-;38149:7;38189:6;38182:5;38178:18;38167:29;;38113:89;;;:::o;38208:126::-;38245:7;38285:42;38278:5;38274:54;38263:65;;38208:126;;;:::o;38340:77::-;38377:7;38406:5;38395:16;;38340:77;;;:::o;38423:93::-;38459:7;38499:10;38492:5;38488:22;38477:33;;38423:93;;;:::o;38522:101::-;38558:7;38598:18;38591:5;38587:30;38576:41;;38522:101;;;:::o;38629:119::-;38686:9;38719:23;38736:5;38719:23;:::i;:::-;38706:36;;38629:119;;;:::o;38754:154::-;38838:6;38833:3;38828;38815:30;38900:1;38891:6;38886:3;38882:16;38875:27;38754:154;;;:::o;38914:307::-;38982:1;38992:113;39006:6;39003:1;39000:13;38992:113;;;39091:1;39086:3;39082:11;39076:18;39072:1;39067:3;39063:11;39056:39;39028:2;39025:1;39021:10;39016:15;;38992:113;;;39123:6;39120:1;39117:13;39114:101;;;39203:1;39194:6;39189:3;39185:16;39178:27;39114:101;38963:258;38914:307;;;:::o;39227:320::-;39271:6;39308:1;39302:4;39298:12;39288:22;;39355:1;39349:4;39345:12;39376:18;39366:81;;39432:4;39424:6;39420:17;39410:27;;39366:81;39494:2;39486:6;39483:14;39463:18;39460:38;39457:84;;;39513:18;;:::i;:::-;39457:84;39278:269;39227:320;;;:::o;39553:281::-;39636:27;39658:4;39636:27;:::i;:::-;39628:6;39624:40;39766:6;39754:10;39751:22;39730:18;39718:10;39715:34;39712:62;39709:88;;;39777:18;;:::i;:::-;39709:88;39817:10;39813:2;39806:22;39596:238;39553:281;;:::o;39840:233::-;39879:3;39902:24;39920:5;39902:24;:::i;:::-;39893:33;;39948:66;39941:5;39938:77;39935:103;;;40018:18;;:::i;:::-;39935:103;40065:1;40058:5;40054:13;40047:20;;39840:233;;;:::o;40079:176::-;40111:1;40128:20;40146:1;40128:20;:::i;:::-;40123:25;;40162:20;40180:1;40162:20;:::i;:::-;40157:25;;40201:1;40191:35;;40206:18;;:::i;:::-;40191:35;40247:1;40244;40240:9;40235:14;;40079:176;;;;:::o;40261:180::-;40309:77;40306:1;40299:88;40406:4;40403:1;40396:15;40430:4;40427:1;40420:15;40447:180;40495:77;40492:1;40485:88;40592:4;40589:1;40582:15;40616:4;40613:1;40606:15;40633:180;40681:77;40678:1;40671:88;40778:4;40775:1;40768:15;40802:4;40799:1;40792:15;40819:180;40867:77;40864:1;40857:88;40964:4;40961:1;40954:15;40988:4;40985:1;40978:15;41005:180;41053:77;41050:1;41043:88;41150:4;41147:1;41140:15;41174:4;41171:1;41164:15;41191:117;41300:1;41297;41290:12;41314:117;41423:1;41420;41413:12;41437:117;41546:1;41543;41536:12;41560:117;41669:1;41666;41659:12;41683:117;41792:1;41789;41782:12;41806:117;41915:1;41912;41905:12;41929:102;41970:6;42021:2;42017:7;42012:2;42005:5;42001:14;41997:28;41987:38;;41929:102;;;:::o;42037:170::-;42177:22;42173:1;42165:6;42161:14;42154:46;42037:170;:::o;42213:237::-;42353:34;42349:1;42341:6;42337:14;42330:58;42422:20;42417:2;42409:6;42405:15;42398:45;42213:237;:::o;42456:225::-;42596:34;42592:1;42584:6;42580:14;42573:58;42665:8;42660:2;42652:6;42648:15;42641:33;42456:225;:::o;42687:178::-;42827:30;42823:1;42815:6;42811:14;42804:54;42687:178;:::o;42871:223::-;43011:34;43007:1;42999:6;42995:14;42988:58;43080:6;43075:2;43067:6;43063:15;43056:31;42871:223;:::o;43100:175::-;43240:27;43236:1;43228:6;43224:14;43217:51;43100:175;:::o;43281:231::-;43421:34;43417:1;43409:6;43405:14;43398:58;43490:14;43485:2;43477:6;43473:15;43466:39;43281:231;:::o;43518:166::-;43658:18;43654:1;43646:6;43642:14;43635:42;43518:166;:::o;43690:243::-;43830:34;43826:1;43818:6;43814:14;43807:58;43899:26;43894:2;43886:6;43882:15;43875:51;43690:243;:::o;43939:229::-;44079:34;44075:1;44067:6;44063:14;44056:58;44148:12;44143:2;44135:6;44131:15;44124:37;43939:229;:::o;44174:228::-;44314:34;44310:1;44302:6;44298:14;44291:58;44383:11;44378:2;44370:6;44366:15;44359:36;44174:228;:::o;44408:182::-;44548:34;44544:1;44536:6;44532:14;44525:58;44408:182;:::o;44596:231::-;44736:34;44732:1;44724:6;44720:14;44713:58;44805:14;44800:2;44792:6;44788:15;44781:39;44596:231;:::o;44833:182::-;44973:34;44969:1;44961:6;44957:14;44950:58;44833:182;:::o;45021:228::-;45161:34;45157:1;45149:6;45145:14;45138:58;45230:11;45225:2;45217:6;45213:15;45206:36;45021:228;:::o;45255:174::-;45395:26;45391:1;45383:6;45379:14;45372:50;45255:174;:::o;45435:220::-;45575:34;45571:1;45563:6;45559:14;45552:58;45644:3;45639:2;45631:6;45627:15;45620:28;45435:220;:::o;45661:236::-;45801:34;45797:1;45789:6;45785:14;45778:58;45870:19;45865:2;45857:6;45853:15;45846:44;45661:236;:::o;45903:235::-;46043:34;46039:1;46031:6;46027:14;46020:58;46112:18;46107:2;46099:6;46095:15;46088:43;45903:235;:::o;46144:151::-;46284:3;46280:1;46272:6;46268:14;46261:27;46144:151;:::o;46301:122::-;46374:24;46392:5;46374:24;:::i;:::-;46367:5;46364:35;46354:63;;46413:1;46410;46403:12;46354:63;46301:122;:::o;46429:116::-;46499:21;46514:5;46499:21;:::i;:::-;46492:5;46489:32;46479:60;;46535:1;46532;46525:12;46479:60;46429:116;:::o;46551:122::-;46624:24;46642:5;46624:24;:::i;:::-;46617:5;46614:35;46604:63;;46663:1;46660;46653:12;46604:63;46551:122;:::o;46679:120::-;46751:23;46768:5;46751:23;:::i;:::-;46744:5;46741:34;46731:62;;46789:1;46786;46779:12;46731:62;46679:120;:::o;46805:::-;46877:23;46894:5;46877:23;:::i;:::-;46870:5;46867:34;46857:62;;46915:1;46912;46905:12;46857:62;46805:120;:::o;46931:122::-;47004:24;47022:5;47004:24;:::i;:::-;46997:5;46994:35;46984:63;;47043:1;47040;47033:12;46984:63;46931:122;:::o;47059:120::-;47131:23;47148:5;47131:23;:::i;:::-;47124:5;47121:34;47111:62;;47169:1;47166;47159:12;47111:62;47059:120;:::o;47185:::-;47257:23;47274:5;47257:23;:::i;:::-;47250:5;47247:34;47237:62;;47295:1;47292;47285:12;47237:62;47185:120;:::o

Swarm Source

ipfs://10a9da9b6448ca3a07bca97359ce9536da2a7be2e05ccf89ea66c7e59f45b19e
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.