ETH Price: $2,415.50 (-0.05%)

Token

Criminals (CRIM)
 

Overview

Max Total Supply

70 CRIM

Holders

70

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
noshillbill.eth
Balance
1 CRIM
0xc9303612f4F2284A7d50b81dC48e4F9ad07EF092
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:
Crims

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts v4.4.1 (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/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

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

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

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

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: https://github.com/nibbstack/erc721/src/contracts/ownership/ownable.sol


pragma solidity ^0.8.0;

/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

// File: https://github.com/nibbstack/erc721/src/contracts/tokens/erc721-enumerable.sol


pragma solidity ^0.8.0;

/**
 * @dev Optional enumeration extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Enumerable
{

  /**
   * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an
   * assigned and queryable owner not equal to the zero address.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is
   * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address,
   * representing invalid NFTs.
   * @param _owner An address where we are interested in NFTs owned by them.
   * @param _index A counter less than `balanceOf(_owner)`.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    view
    returns (uint256);

}

// File: https://github.com/nibbstack/erc721/src/contracts/tokens/erc721-metadata.sol


pragma solidity ^0.8.0;

/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata
{

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}

// File: https://github.com/nibbstack/erc721/src/contracts/utils/address-utils.sol


pragma solidity ^0.8.0;

/**
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 * @dev Utility library of inline functions on addresses.
 */
library AddressUtils
{

  /**
   * @dev Returns whether the target address is a contract.
   * @param _addr Address to check.
   * @return addressCheck True if _addr is a contract, false if not.
   */
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool addressCheck)
  {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
  }

}

// File: https://github.com/nibbstack/erc721/src/contracts/utils/erc165.sol


pragma solidity ^0.8.0;

/**
 * @dev A standard for detecting smart contract interfaces. 
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);
    
}

// File: https://github.com/nibbstack/erc721/src/contracts/utils/supports-interface.sol


pragma solidity ^0.8.0;


/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}

// File: https://github.com/nibbstack/erc721/src/contracts/tokens/erc721-token-receiver.sol


pragma solidity ^0.8.0;

/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @dev Handle the receipt of a NFT. The ERC721 smart contract calls this function on the
   * recipient after a `transfer`. This function MAY throw to revert and reject the transfer. Return
   * of other than the magic value MUST result in the transaction being reverted.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @param _operator The address which called `safeTransferFrom` function.
   * @param _from The address which previously owned the token.
   * @param _tokenId The NFT identifier which is being transferred.
   * @param _data Additional data with no specified format.
   * @return Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}

// File: https://github.com/nibbstack/erc721/src/contracts/tokens/erc721.sol


pragma solidity ^0.8.0;

/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721
{

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external;

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.  This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The contract MUST allow multiple operators per owner.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @notice Count all NFTs assigned to an owner.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @notice Find the owner of an NFT.
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @notice Query if an address is an authorized operator for another address.
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}

// File: https://github.com/nibbstack/erc721/src/contracts/tokens/nf-token.sol


pragma solidity ^0.8.0;





/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can receive NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApproval;

   /**
   * @dev Mapping from owner address to count of their tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || idToApproval[_tokenId] == msg.sender
      || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_APPROVED_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(
    uint256 _tokenId
  )
  {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
   * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
   * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
   * function checks if `_to` is a smart contract (code size > 0). If so, it calls
   * `onERC721Received` on `_to` and throws if the return value is not
   * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to "".
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    external
    override
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);
  }

  /**
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    override
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    idToApproval[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @notice This works even if sender doesn't own any tokens at the time.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external
    override
  {
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return _owner Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    override
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApproval[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    override
    view
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @notice Does NO checks.
   * @dev Actually performs the transfer.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);

    emit Transfer(from, _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from owner.
   * @param _from Address from which we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] -= 1;
    delete idToOwner[_tokenId];
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to owner.
   * @param _to Address to which we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] += 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage (gas optimization) of owner NFT count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @dev Actually perform the safeTransferFrom.
   * @param _from The current owner of the NFT.
   * @param _to The new owner.
   * @param _tokenId The NFT to transfer.
   * @param _data Additional data with no specified format, sent in call to `_to`.
   */
  function _safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes memory _data
  )
    private
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    if (_to.isContract())
    {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(
    uint256 _tokenId
  )
    private
  {
    delete idToApproval[_tokenId];
  }

}

// File: https://github.com/nibbstack/erc721/src/contracts/tokens/nf-token-enumerable.sol


pragma solidity ^0.8.0;



/**
 * @dev Optional enumeration implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenEnumerable is
  NFToken,
  ERC721Enumerable
{

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant INVALID_INDEX = "005007";

  /**
   * @dev Array of all NFT IDs.
   */
  uint256[] internal tokens;

  /**
   * @dev Mapping from token ID to its index in global tokens array.
   */
  mapping(uint256 => uint256) internal idToIndex;

  /**
   * @dev Mapping from owner to list of owned NFT IDs.
   */
  mapping(address => uint256[]) internal ownerToIds;

  /**
   * @dev Mapping from NFT ID to its index in the owner tokens list.
   */
  mapping(uint256 => uint256) internal idToOwnerIndex;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
  }

  /**
   * @dev Returns the count of all existing NFTokens.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    override
    view
    returns (uint256)
  {
    return tokens.length;
  }

  /**
   * @dev Returns NFT ID by its index.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < tokens.length, INVALID_INDEX);
    return tokens[_index];
  }

  /**
   * @dev returns the n-th NFT ID from a list of owner's tokens.
   * @param _owner Token owner's address.
   * @param _index Index number representing n-th token in owner's list of tokens.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < ownerToIds[_owner].length, INVALID_INDEX);
    return ownerToIds[_owner][_index];
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Mints a new NFT.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._mint(_to, _tokenId);
    tokens.push(_tokenId);
    idToIndex[_tokenId] = tokens.length - 1;
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    uint256 tokenIndex = idToIndex[_tokenId];
    uint256 lastTokenIndex = tokens.length - 1;
    uint256 lastToken = tokens[lastTokenIndex];

    tokens[tokenIndex] = lastToken;

    tokens.pop();
    // This wastes gas if you are burning the last token but saves a little gas if you are not.
    idToIndex[lastToken] = tokenIndex;
    idToIndex[_tokenId] = 0;
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from an address.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    delete idToOwner[_tokenId];

    uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
    uint256 lastTokenIndex = ownerToIds[_from].length - 1;

    if (lastTokenIndex != tokenToRemoveIndex)
    {
      uint256 lastToken = ownerToIds[_from][lastTokenIndex];
      ownerToIds[_from][tokenToRemoveIndex] = lastToken;
      idToOwnerIndex[lastToken] = tokenToRemoveIndex;
    }

    ownerToIds[_from].pop();
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to an address.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);
    idToOwner[_tokenId] = _to;

    ownerToIds[_to].push(_tokenId);
    idToOwnerIndex[_tokenId] = ownerToIds[_to].length - 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage(gas optimization) of owner NFT count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    override
    virtual
    view
    returns (uint256)
  {
    return ownerToIds[_owner].length;
  }
}

// File: https://github.com/nibbstack/erc721/src/contracts/tokens/nf-token-metadata.sol


pragma solidity ^0.8.0;



/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;

  /**
   * @dev Mapping from NFT ID to metadata uri.
   */
  mapping (uint256 => string) internal idToUri;

  /**
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   * @return _name Representing name.
   */
  function name()
    external
    override
    view
    returns (string memory _name)
  {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    override
    view
    returns (string memory _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function tokenURI(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return _tokenURI(_tokenId);
  }

  /**
   * @notice This is an internal function that can be overriden if you want to implement a different
   * way to generate token URI.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function _tokenURI(
    uint256 _tokenId
  )
    internal
    virtual
    view
    returns (string memory)
  {
    return idToUri[_tokenId];
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    delete idToUri[_tokenId];
  }

  /**
   * @notice This is an internal function which should be called from user-implemented external
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @param _tokenId Id for which we want URI.
   * @param _uri String representing RFC 3986 URI.
   */
  function _setTokenUri(
    uint256 _tokenId,
    string memory _uri
  )
    internal
    validNFToken(_tokenId)
  {
    idToUri[_tokenId] = _uri;
  }

}

// File: contracts/Criminals.sol


pragma solidity ^0.8.0;






contract Crims is
  NFTokenEnumerable,
  NFTokenMetadata,
  Ownable
{

	using SafeMath for uint256;

  //used for uint256 .toString()
	using Strings for uint256;

  string public baseURI;

  //max giveaway items
  uint256 private constant totalGiveawayItems = 112;

  //max total supply
  uint256 private constant maxSupply = 8888;

  //max mintable supply
  uint256 private constant maxMintableSupply = maxSupply - totalGiveawayItems;



  //cost of each nft
  uint256 private constant mintPrice = 0.025 ether;

  //admin addresses
  address private constant address1 = 0x2851A87a4e572F3F91d72FFfDcee53e41Ed57A0b;
  address private constant address2 = 0x8C9453c77f40a3a6e5D94B519AfE59Dc5E4cf9D9;
  address private constant address3 = 0xCd1287E55AAc8f0CD9c3fc5F202348aaB5959a86;
  address private constant address4 = 0x00000000002870670871555dA8E9686fAaBf712F;
  

  //sale state indicators
  bool public isMintable;

  //address => totalMinted during PRESALE
  mapping (address => uint256) private usersTotalMints;
  mapping (address => uint256) private usersFreeMints;
  mapping (address => uint256) private usersPaidMint;

  //indicate whether giveaways have been minted to only allow once
  bool private giveawaysMinted;

  //master index increments on each mint
  uint256 private index = 1;

  /**
   * @dev Contract constructor.
   * @param _name Contract/nft name
   * @param _symbol An abbreviated name for the collection.
   */
  constructor(
    string memory _name,
    string memory _symbol
  )
  {
    nftName = _name;
    nftSymbol = _symbol;
  }

  /**
   * @dev mints giveaway tokens from a specific index to avoid lower token ids
   */
  function mintGiveaways() external onlyOwner {
      require(!giveawaysMinted, "Giveaways already minted");
      require(tokens.length.add(totalGiveawayItems) <= maxSupply, "Not enough left to mint");

      for (uint i; i < totalGiveawayItems; i++) {
        super._mint(msg.sender, index + i);
      }
      giveawaysMinted = true;
  }

  /**
   * @dev Toggles if tokens are mintable
   */
  function toggleIsMintable() external onlyOwner {
    isMintable = !isMintable;
  }

  /**
   * @dev Sets the base URI
   */

  function setBaseURI(string memory _uri) external onlyOwner {
    baseURI = _uri;
  }
  /**
   * @dev Returns the URI for the token
   * @notice This function overrides the nibbstack _tokenURI call
   * @param _tokenId id of the token
   */
  function _tokenURI(uint256 _tokenId) override internal view returns (string memory) {
    return string(abi.encodePacked(baseURI, _tokenId.toString()));
  }

  /**
   * @dev Mints a paid criminal
   * @param _mintCount amount of nfts to mint
   */
  function mintPaidCrim(uint256 _mintCount) external payable {
    require(isMintable, "Minting is not available");
    require(usersTotalMints[msg.sender].add(_mintCount) <= 11, "Max possible is 11");
    require(_mintCount <= 5, "Too many");
    if (_mintCount <= 0) {
        _mintCount = 1;
    }
    require(tokens.length.add(_mintCount) <= maxMintableSupply, "Not enough left to mint");
    require(mintPrice.mul(_mintCount) == msg.value, "Invalid amount sent");
    uint _successfulMints; //increase var in memory then apply to index, cheaper in gas 
    for (uint i; i < _mintCount; i++) {
        super._mint(msg.sender, index + i);
        _successfulMints++;
    }
    index = index.add(_successfulMints);
    usersTotalMints[msg.sender] = usersTotalMints[msg.sender].add(_successfulMints);
  }

    /**
   * @dev Mints a free criminal
   */
  function mintFreeCrim() external {
    require(isMintable, "Minting is not available");
    require(usersTotalMints[msg.sender].add(1) <= 11, "Max possible is 11");
    require(tokens.length.add(1) <= 1500, "Not enough free to mint");
    require(usersFreeMints[msg.sender] != 1, "Can only mint 1 free");
    super._mint(msg.sender, index);
    index = index.add(1);
    usersTotalMints[msg.sender] = usersTotalMints[msg.sender].add(1);
    usersFreeMints[msg.sender] = 1;
  }
  

  /*
   * @dev Withdraws all balance
   * @notice This is an emergency function to be used whenever the withdraw function fails
  */

  function emergencyWithdraw() external onlyOwner {
    uint256 balance = address(this).balance;

    require(payable(address1).send(balance), "emergency withdraw failed");
  }
  
  /*
   * @dev Withdraws balance split between 4 addresses
   * @notice This is the withdraw function to withdraw funds
  */
  function withdraw() external onlyOwner {

    uint256 balance = address(this).balance;

    require(payable(address1).send(balance.mul(325).div(1000)), "address1 couldn't withdraw ");

    require(payable(address2).send(balance.mul(325).div(1000)), "address2 couldn't withdraw");

    require(payable(address3).send(balance.mul(175).div(1000)), "address3 couldn't withdraw");

    require(payable(address4).send(balance.mul(175).div(1000)), "address4 couldn't withdraw");
  }


  //nibbstack overrides DONT TOUCH

  /**
   * @dev Mints a new NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    override(NFToken, NFTokenEnumerable)
    virtual
  {
    NFTokenEnumerable._mint(_to, _tokenId);
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override(NFTokenMetadata, NFTokenEnumerable)
    virtual
  {
    NFTokenEnumerable._burn(_tokenId);
    if (bytes(idToUri[_tokenId]).length != 0)
    {
      delete idToUri[_tokenId];
    }
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from an address.
   * @param _from Address from wich we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    override(NFToken, NFTokenEnumerable)
  {
    NFTokenEnumerable._removeNFToken(_from, _tokenId);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to an address.
   * @param _to Address to wich we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    override(NFToken, NFTokenEnumerable)
  {
    NFTokenEnumerable._addNFToken(_to, _tokenId);
  }

   /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage(gas optimization) of owner nft count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    override(NFToken, NFTokenEnumerable)
    view
    returns (uint256)
  {
    return NFTokenEnumerable._getOwnerNFTCount(_owner);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":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"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"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":"isMintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFreeCrim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintGiveaways","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintCount","type":"uint256"}],"name":"mintPaidCrim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_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":"_owner","type":"address"}],"stateMutability":"view","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":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","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":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleIsMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260016013553480156200001657600080fd5b50604051620050a0380380620050a083398181016040528101906200003c919062000329565b60016000806301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016000806380ac58cd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008063780e9d6360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600080635b5e139f60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555033600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160099080519060200190620001d9929190620001fb565b5080600a9080519060200190620001f2929190620001fb565b50505062000532565b828054620002099062000443565b90600052602060002090601f0160209004810192826200022d576000855562000279565b82601f106200024857805160ff191683800117855562000279565b8280016001018555821562000279579182015b82811115620002785782518255916020019190600101906200025b565b5b5090506200028891906200028c565b5090565b5b80821115620002a75760008160009055506001016200028d565b5090565b6000620002c2620002bc84620003d7565b620003ae565b905082815260208101848484011115620002e157620002e062000512565b5b620002ee8482856200040d565b509392505050565b600082601f8301126200030e576200030d6200050d565b5b815162000320848260208601620002ab565b91505092915050565b600080604083850312156200034357620003426200051c565b5b600083015167ffffffffffffffff81111562000364576200036362000517565b5b6200037285828601620002f6565b925050602083015167ffffffffffffffff81111562000396576200039562000517565b5b620003a485828601620002f6565b9150509250929050565b6000620003ba620003cd565b9050620003c8828262000479565b919050565b6000604051905090565b600067ffffffffffffffff821115620003f557620003f4620004de565b5b620004008262000521565b9050602081019050919050565b60005b838110156200042d57808201518184015260208101905062000410565b838111156200043d576000848401525b50505050565b600060028204905060018216806200045c57607f821691505b60208210811415620004735762000472620004af565b5b50919050565b620004848262000521565b810181811067ffffffffffffffff82111715620004a657620004a5620004de565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b614b5e80620005426000396000f3fe6080604052600436106101c25760003560e01c80636352211e116100f7578063a22cb46511610095578063db2e21bc11610064578063db2e21bc1461060d578063e985e9c514610624578063f2fde38b14610661578063f3fe3bc31461068a576101c2565b8063a22cb46514610567578063b88d4fde14610590578063c87b56dd146105b9578063ce0d0d67146105f6576101c2565b806381072bf4116100d157806381072bf4146104cf578063860d248a146104e65780638da5cb5b1461051157806395d89b411461053c576101c2565b80636352211e1461042a5780636c0360eb1461046757806370a0823114610492576101c2565b80632f745c591161016457806346b45af71161013e57806346b45af7146103825780634f6ccce7146103ad57806355f804b3146103ea5780635c609c5214610413576101c2565b80632f745c59146103055780633ccfd60b1461034257806342842e0e14610359576101c2565b806308405d2b116101a057806308405d2b1461026c578063095ea7b31461028857806318160ddd146102b157806323b872dd146102dc576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190613daf565b6106b5565b6040516101fb9190614220565b60405180910390f35b34801561021057600080fd5b5061021961071c565b604051610226919061423b565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613e52565b6107ae565b60405161026391906141b9565b60405180910390f35b61028660048036038101906102819190613e52565b6108c9565b005b34801561029457600080fd5b506102af60048036038101906102aa9190613d6f565b610bba565b005b3480156102bd57600080fd5b506102c6610f9d565b6040516102d391906143fd565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613c54565b610faa565b005b34801561031157600080fd5b5061032c60048036038101906103279190613d6f565b6113fc565b60405161033991906143fd565b60405180910390f35b34801561034e57600080fd5b5061035761151f565b005b34801561036557600080fd5b50610380600480360381019061037b9190613c54565b6118a9565b005b34801561038e57600080fd5b506103976118c9565b6040516103a49190614220565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190613e52565b6118dc565b6040516103e191906143fd565b60405180910390f35b3480156103f657600080fd5b50610411600480360381019061040c9190613e09565b611984565b005b34801561041f57600080fd5b50610428611a67565b005b34801561043657600080fd5b50610451600480360381019061044c9190613e52565b611d31565b60405161045e91906141b9565b60405180910390f35b34801561047357600080fd5b5061047c611e17565b604051610489919061423b565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613be7565b611ea5565b6040516104c691906143fd565b60405180910390f35b3480156104db57600080fd5b506104e4611f5f565b005b3480156104f257600080fd5b506104fb612054565b604051610508919061423b565b60405180910390f35b34801561051d57600080fd5b5061052661208d565b60405161053391906141b9565b60405180910390f35b34801561054857600080fd5b506105516120b3565b60405161055e919061423b565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190613d2f565b612145565b005b34801561059c57600080fd5b506105b760048036038101906105b29190613ca7565b612242565b005b3480156105c557600080fd5b506105e060048036038101906105db9190613e52565b612299565b6040516105ed919061423b565b60405180910390f35b34801561060257600080fd5b5061060b612389565b005b34801561061957600080fd5b50610622612553565b005b34801561063057600080fd5b5061064b60048036038101906106469190613c14565b6126ac565b6040516106589190614220565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613be7565b612740565b005b34801561069657600080fd5b5061069f612972565b6040516106ac919061423b565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606009805461072b90614691565b80601f016020809104026020016040519081016040528092919081815260200182805461075790614691565b80156107a45780601f10610779576101008083540402835291602001916107a4565b820191906000526020600020905b81548152906001019060200180831161078757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061088c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610883919061423b565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b600e60009054906101000a900460ff16610918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090f906143dd565b60405180910390fd5b600b61096c82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ab90919063ffffffff16565b11156109ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a49061435d565b60405180910390fd5b60058111156109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e89061433d565b60405180910390fd5b600081116109fe57600190505b60706122b8610a0d91906145a7565b610a25826005805490506129ab90919063ffffffff16565b1115610a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5d906142fd565b60405180910390fd5b34610a81826658d15e176280006129c190919063ffffffff16565b14610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab8906142dd565b60405180910390fd5b6000805b82811015610b0557610ae43382601354610adf91906144c6565b6129d7565b8180610aef906146f4565b9250508080610afd906146f4565b915050610ac5565b50610b1b816013546129ab90919063ffffffff16565b601381905550610b7381600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ab90919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610cb35750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d21919061423b565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe919061423b565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede919061423b565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600580549050905090565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061107b57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061110c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a919061423b565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257919061423b565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303700000000000000000000000000000000000000000000000000008152509061133f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611336919061423b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df919061423b565b60405180910390fd5b506113f38686612a37565b50505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f3030353030370000000000000000000000000000000000000000000000000000815250906114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b1919061423b565b60405180910390fd5b50600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061150c5761150b61482a565b5b9060005260206000200154905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de919061423b565b60405180910390fd5b506000479050732851a87a4e572f3f91d72fffdcee53e41ed57a0b73ffffffffffffffffffffffffffffffffffffffff166108fc6116446103e8611636610145866129c190919063ffffffff16565b612aec90919063ffffffff16565b9081150290604051600060405180830381858888f1935050505061169d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116949061439d565b60405180910390fd5b738c9453c77f40a3a6e5d94b519afe59dc5e4cf9d973ffffffffffffffffffffffffffffffffffffffff166108fc6116f46103e86116e6610145866129c190919063ffffffff16565b612aec90919063ffffffff16565b9081150290604051600060405180830381858888f1935050505061174d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117449061425d565b60405180910390fd5b73cd1287e55aac8f0cd9c3fc5f202348aab5959a8673ffffffffffffffffffffffffffffffffffffffff166108fc6117a36103e861179560af866129c190919063ffffffff16565b612aec90919063ffffffff16565b9081150290604051600060405180830381858888f193505050506117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f39061437d565b60405180910390fd5b6e2870670871555da8e9686faabf712f73ffffffffffffffffffffffffffffffffffffffff166108fc61184d6103e861183f60af866129c190919063ffffffff16565b612aec90919063ffffffff16565b9081150290604051600060405180830381858888f193505050506118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d9061431d565b60405180910390fd5b50565b6118c483838360405180602001604052806000815250612b02565b505050565b600e60009054906101000a900460ff1681565b600060058054905082106040518060400160405280600681526020017f30303530303700000000000000000000000000000000000000000000000000008152509061195d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611954919061423b565b60405180910390fd5b50600582815481106119725761197161482a565b5b90600052602060002001549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43919061423b565b60405180910390fd5b5080600d9080519060200190611a63929190613a15565b5050565b600e60009054906101000a900460ff16611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad906143dd565b60405180910390fd5b600b611b0b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ab90919063ffffffff16565b1115611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b439061435d565b60405180910390fd5b6105dc611b6860016005805490506129ab90919063ffffffff16565b1115611ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba09061429d565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c23906142bd565b60405180910390fd5b611c38336013546129d7565b611c4e60016013546129ab90919063ffffffff16565b601381905550611ca76001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ab90919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e08919061423b565b60405180910390fd5b50919050565b600d8054611e2490614691565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5090614691565b8015611e9d5780601f10611e7257610100808354040283529160200191611e9d565b820191906000526020600020905b815481529060010190602001808311611e8057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f45919061423b565b60405180910390fd5b50611f58826130d0565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201e919061423b565b60405180910390fd5b50600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a80546120c290614691565b80601f01602080910402602001604051908101604052809291908181526020018280546120ee90614691565b801561213b5780601f106121105761010080835404028352916020019161213b565b820191906000526020600020905b81548152906001019060200180831161211e57829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122369190614220565b60405180910390a35050565b61229285858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b02565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e919061423b565b60405180910390fd5b50612381836130e2565b915050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612448919061423b565b60405180910390fd5b50601260009054906101000a900460ff16156124a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124999061427d565b60405180910390fd5b6122b86124be60706005805490506129ab90919063ffffffff16565b11156124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f6906142fd565b60405180910390fd5b60005b607081101561253557612522338260135461251d91906144c6565b6129d7565b808061252d906146f4565b915050612502565b506001601260006101000a81548160ff021916908315150217905550565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061261b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612612919061423b565b60405180910390fd5b506000479050732851a87a4e572f3f91d72fffdcee53e41ed57a0b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a0906143bd565b60405180910390fd5b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ff919061423b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3031383030320000000000000000000000000000000000000000000000000000815250906128b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a8919061423b565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600081836129b991906144c6565b905092915050565b600081836129cf919061454d565b905092915050565b6129e18282613116565b60058190806001815401808255809150506001900390600052602060002001600090919091909150556001600580549050612a1c91906145a7565b60066000838152602001908152602001600020819055505050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612a7882613304565b612a82818361333d565b612a8c838361334b565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612afa919061451c565b905092915050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612bd357503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612c645750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd2919061423b565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612daf919061423b565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e919061423b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f37919061423b565b60405180910390fd5b50612f4b8787612a37565b612f6a8773ffffffffffffffffffffffffffffffffffffffff16613359565b156130c65760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401612fb094939291906141d4565b602060405180830381600087803b158015612fca57600080fd5b505af1158015612fde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130029190613ddc565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906130c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ba919061423b565b60405180910390fd5b50505b5050505050505050565b60006130db826133a4565b9050919050565b6060600d6130ef836133f0565b604051602001613100929190614195565b6040516020818303038152906040529050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906131be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b5919061423b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613299576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613290919061423b565b60405180910390fd5b506132a4828261334b565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b6133478282613551565b5050565b6133558282613818565b5050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561339b5750808214155b92505050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60606000821415613438576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061354c565b600082905060005b6000821461346a578080613453906146f4565b915050600a82613463919061451c565b9150613440565b60008167ffffffffffffffff81111561348657613485614859565b5b6040519080825280601f01601f1916602001820160405280156134b85781602001600182028036833780820191505090505b5090505b60008514613545576001826134d191906145a7565b9150600a856134e0919061473d565b60306134ec91906144c6565b60f81b8183815181106135025761350161482a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561353e919061451c565b94506134bc565b8093505050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303700000000000000000000000000000000000000000000000000008152509061362a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613621919061423b565b60405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560006008600083815260200190815260200160002054905060006001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506136ca91906145a7565b90508181146137ad576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106137265761372561482a565b5b9060005260206000200154905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106137855761378461482a565b5b9060005260206000200181905550826008600083815260200190815260200160002081905550505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806137fc576137fb6147fb565b5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906138f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e9919061423b565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506139fa91906145a7565b60086000838152602001908152602001600020819055505050565b828054613a2190614691565b90600052602060002090601f016020900481019282613a435760008555613a8a565b82601f10613a5c57805160ff1916838001178555613a8a565b82800160010185558215613a8a579182015b82811115613a89578251825591602001919060010190613a6e565b5b509050613a979190613a9b565b5090565b5b80821115613ab4576000816000905550600101613a9c565b5090565b6000613acb613ac68461443d565b614418565b905082815260208101848484011115613ae757613ae6614897565b5b613af284828561464f565b509392505050565b600081359050613b0981614acc565b92915050565b600081359050613b1e81614ae3565b92915050565b600081359050613b3381614afa565b92915050565b600081519050613b4881614afa565b92915050565b60008083601f840112613b6457613b6361488d565b5b8235905067ffffffffffffffff811115613b8157613b80614888565b5b602083019150836001820283011115613b9d57613b9c614892565b5b9250929050565b600082601f830112613bb957613bb861488d565b5b8135613bc9848260208601613ab8565b91505092915050565b600081359050613be181614b11565b92915050565b600060208284031215613bfd57613bfc6148a1565b5b6000613c0b84828501613afa565b91505092915050565b60008060408385031215613c2b57613c2a6148a1565b5b6000613c3985828601613afa565b9250506020613c4a85828601613afa565b9150509250929050565b600080600060608486031215613c6d57613c6c6148a1565b5b6000613c7b86828701613afa565b9350506020613c8c86828701613afa565b9250506040613c9d86828701613bd2565b9150509250925092565b600080600080600060808688031215613cc357613cc26148a1565b5b6000613cd188828901613afa565b9550506020613ce288828901613afa565b9450506040613cf388828901613bd2565b935050606086013567ffffffffffffffff811115613d1457613d1361489c565b5b613d2088828901613b4e565b92509250509295509295909350565b60008060408385031215613d4657613d456148a1565b5b6000613d5485828601613afa565b9250506020613d6585828601613b0f565b9150509250929050565b60008060408385031215613d8657613d856148a1565b5b6000613d9485828601613afa565b9250506020613da585828601613bd2565b9150509250929050565b600060208284031215613dc557613dc46148a1565b5b6000613dd384828501613b24565b91505092915050565b600060208284031215613df257613df16148a1565b5b6000613e0084828501613b39565b91505092915050565b600060208284031215613e1f57613e1e6148a1565b5b600082013567ffffffffffffffff811115613e3d57613e3c61489c565b5b613e4984828501613ba4565b91505092915050565b600060208284031215613e6857613e676148a1565b5b6000613e7684828501613bd2565b91505092915050565b613e88816145db565b82525050565b613e97816145ed565b82525050565b6000613ea882614483565b613eb28185614499565b9350613ec281856020860161465e565b613ecb816148a6565b840191505092915050565b6000613ee18261448e565b613eeb81856144aa565b9350613efb81856020860161465e565b613f04816148a6565b840191505092915050565b6000613f1a8261448e565b613f2481856144bb565b9350613f3481856020860161465e565b80840191505092915050565b60008154613f4d81614691565b613f5781866144bb565b94506001821660008114613f725760018114613f8357613fb6565b60ff19831686528186019350613fb6565b613f8c8561446e565b60005b83811015613fae57815481890152600182019150602081019050613f8f565b838801955050505b50505092915050565b6000613fcc601a836144aa565b9150613fd7826148b7565b602082019050919050565b6000613fef6018836144aa565b9150613ffa826148e0565b602082019050919050565b60006140126017836144aa565b915061401d82614909565b602082019050919050565b60006140356014836144aa565b915061404082614932565b602082019050919050565b60006140586013836144aa565b91506140638261495b565b602082019050919050565b600061407b6017836144aa565b915061408682614984565b602082019050919050565b600061409e601a836144aa565b91506140a9826149ad565b602082019050919050565b60006140c16008836144aa565b91506140cc826149d6565b602082019050919050565b60006140e46012836144aa565b91506140ef826149ff565b602082019050919050565b6000614107601a836144aa565b915061411282614a28565b602082019050919050565b600061412a601b836144aa565b915061413582614a51565b602082019050919050565b600061414d6019836144aa565b915061415882614a7a565b602082019050919050565b60006141706018836144aa565b915061417b82614aa3565b602082019050919050565b61418f81614645565b82525050565b60006141a18285613f40565b91506141ad8284613f0f565b91508190509392505050565b60006020820190506141ce6000830184613e7f565b92915050565b60006080820190506141e96000830187613e7f565b6141f66020830186613e7f565b6142036040830185614186565b81810360608301526142158184613e9d565b905095945050505050565b60006020820190506142356000830184613e8e565b92915050565b600060208201905081810360008301526142558184613ed6565b905092915050565b6000602082019050818103600083015261427681613fbf565b9050919050565b6000602082019050818103600083015261429681613fe2565b9050919050565b600060208201905081810360008301526142b681614005565b9050919050565b600060208201905081810360008301526142d681614028565b9050919050565b600060208201905081810360008301526142f68161404b565b9050919050565b600060208201905081810360008301526143168161406e565b9050919050565b6000602082019050818103600083015261433681614091565b9050919050565b60006020820190508181036000830152614356816140b4565b9050919050565b60006020820190508181036000830152614376816140d7565b9050919050565b60006020820190508181036000830152614396816140fa565b9050919050565b600060208201905081810360008301526143b68161411d565b9050919050565b600060208201905081810360008301526143d681614140565b9050919050565b600060208201905081810360008301526143f681614163565b9050919050565b60006020820190506144126000830184614186565b92915050565b6000614422614433565b905061442e82826146c3565b919050565b6000604051905090565b600067ffffffffffffffff82111561445857614457614859565b5b614461826148a6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144d182614645565b91506144dc83614645565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145115761451061476e565b5b828201905092915050565b600061452782614645565b915061453283614645565b9250826145425761454161479d565b5b828204905092915050565b600061455882614645565b915061456383614645565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561459c5761459b61476e565b5b828202905092915050565b60006145b282614645565b91506145bd83614645565b9250828210156145d0576145cf61476e565b5b828203905092915050565b60006145e682614625565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561467c578082015181840152602081019050614661565b8381111561468b576000848401525b50505050565b600060028204905060018216806146a957607f821691505b602082108114156146bd576146bc6147cc565b5b50919050565b6146cc826148a6565b810181811067ffffffffffffffff821117156146eb576146ea614859565b5b80604052505050565b60006146ff82614645565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147325761473161476e565b5b600182019050919050565b600061474882614645565b915061475383614645565b9250826147635761476261479d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f616464726573733220636f756c646e2774207769746864726177000000000000600082015250565b7f47697665617761797320616c7265616479206d696e7465640000000000000000600082015250565b7f4e6f7420656e6f756768206672656520746f206d696e74000000000000000000600082015250565b7f43616e206f6e6c79206d696e7420312066726565000000000000000000000000600082015250565b7f496e76616c696420616d6f756e742073656e7400000000000000000000000000600082015250565b7f4e6f7420656e6f756768206c65667420746f206d696e74000000000000000000600082015250565b7f616464726573733420636f756c646e2774207769746864726177000000000000600082015250565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b7f4d617820706f737369626c652069732031310000000000000000000000000000600082015250565b7f616464726573733320636f756c646e2774207769746864726177000000000000600082015250565b7f616464726573733120636f756c646e2774207769746864726177200000000000600082015250565b7f656d657267656e6379207769746864726177206661696c656400000000000000600082015250565b7f4d696e74696e67206973206e6f7420617661696c61626c650000000000000000600082015250565b614ad5816145db565b8114614ae057600080fd5b50565b614aec816145ed565b8114614af757600080fd5b50565b614b03816145f9565b8114614b0e57600080fd5b50565b614b1a81614645565b8114614b2557600080fd5b5056fea26469706673582212200c2f599a1890a5b0f46a4c98c7ff1ce111be087ab4191a9d3869826d8145aff164736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000094372696d696e616c73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044352494d00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80636352211e116100f7578063a22cb46511610095578063db2e21bc11610064578063db2e21bc1461060d578063e985e9c514610624578063f2fde38b14610661578063f3fe3bc31461068a576101c2565b8063a22cb46514610567578063b88d4fde14610590578063c87b56dd146105b9578063ce0d0d67146105f6576101c2565b806381072bf4116100d157806381072bf4146104cf578063860d248a146104e65780638da5cb5b1461051157806395d89b411461053c576101c2565b80636352211e1461042a5780636c0360eb1461046757806370a0823114610492576101c2565b80632f745c591161016457806346b45af71161013e57806346b45af7146103825780634f6ccce7146103ad57806355f804b3146103ea5780635c609c5214610413576101c2565b80632f745c59146103055780633ccfd60b1461034257806342842e0e14610359576101c2565b806308405d2b116101a057806308405d2b1461026c578063095ea7b31461028857806318160ddd146102b157806323b872dd146102dc576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190613daf565b6106b5565b6040516101fb9190614220565b60405180910390f35b34801561021057600080fd5b5061021961071c565b604051610226919061423b565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190613e52565b6107ae565b60405161026391906141b9565b60405180910390f35b61028660048036038101906102819190613e52565b6108c9565b005b34801561029457600080fd5b506102af60048036038101906102aa9190613d6f565b610bba565b005b3480156102bd57600080fd5b506102c6610f9d565b6040516102d391906143fd565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613c54565b610faa565b005b34801561031157600080fd5b5061032c60048036038101906103279190613d6f565b6113fc565b60405161033991906143fd565b60405180910390f35b34801561034e57600080fd5b5061035761151f565b005b34801561036557600080fd5b50610380600480360381019061037b9190613c54565b6118a9565b005b34801561038e57600080fd5b506103976118c9565b6040516103a49190614220565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190613e52565b6118dc565b6040516103e191906143fd565b60405180910390f35b3480156103f657600080fd5b50610411600480360381019061040c9190613e09565b611984565b005b34801561041f57600080fd5b50610428611a67565b005b34801561043657600080fd5b50610451600480360381019061044c9190613e52565b611d31565b60405161045e91906141b9565b60405180910390f35b34801561047357600080fd5b5061047c611e17565b604051610489919061423b565b60405180910390f35b34801561049e57600080fd5b506104b960048036038101906104b49190613be7565b611ea5565b6040516104c691906143fd565b60405180910390f35b3480156104db57600080fd5b506104e4611f5f565b005b3480156104f257600080fd5b506104fb612054565b604051610508919061423b565b60405180910390f35b34801561051d57600080fd5b5061052661208d565b60405161053391906141b9565b60405180910390f35b34801561054857600080fd5b506105516120b3565b60405161055e919061423b565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190613d2f565b612145565b005b34801561059c57600080fd5b506105b760048036038101906105b29190613ca7565b612242565b005b3480156105c557600080fd5b506105e060048036038101906105db9190613e52565b612299565b6040516105ed919061423b565b60405180910390f35b34801561060257600080fd5b5061060b612389565b005b34801561061957600080fd5b50610622612553565b005b34801561063057600080fd5b5061064b60048036038101906106469190613c14565b6126ac565b6040516106589190614220565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613be7565b612740565b005b34801561069657600080fd5b5061069f612972565b6040516106ac919061423b565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606009805461072b90614691565b80601f016020809104026020016040519081016040528092919081815260200182805461075790614691565b80156107a45780601f10610779576101008083540402835291602001916107a4565b820191906000526020600020905b81548152906001019060200180831161078757829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f30303330303200000000000000000000000000000000000000000000000000008152509061088c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610883919061423b565b60405180910390fd5b506002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b600e60009054906101000a900460ff16610918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090f906143dd565b60405180910390fd5b600b61096c82600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ab90919063ffffffff16565b11156109ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a49061435d565b60405180910390fd5b60058111156109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e89061433d565b60405180910390fd5b600081116109fe57600190505b60706122b8610a0d91906145a7565b610a25826005805490506129ab90919063ffffffff16565b1115610a66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5d906142fd565b60405180910390fd5b34610a81826658d15e176280006129c190919063ffffffff16565b14610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab8906142dd565b60405180910390fd5b6000805b82811015610b0557610ae43382601354610adf91906144c6565b6129d7565b8180610aef906146f4565b9250508080610afd906146f4565b915050610ac5565b50610b1b816013546129ab90919063ffffffff16565b601381905550610b7381600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ab90919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610cb35750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303033000000000000000000000000000000000000000000000000000081525090610d2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d21919061423b565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe919061423b565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303038000000000000000000000000000000000000000000000000000081525090610ee7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ede919061423b565b60405180910390fd5b50856002600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b6000600580549050905090565b8060006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061107b57503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061110c5750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117a919061423b565b60405180910390fd5b5082600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611260576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611257919061423b565b60405180910390fd5b5060006001600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303700000000000000000000000000000000000000000000000000008152509061133f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611336919061423b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df919061423b565b60405180910390fd5b506113f38686612a37565b50505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905082106040518060400160405280600681526020017f3030353030370000000000000000000000000000000000000000000000000000815250906114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b1919061423b565b60405180910390fd5b50600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061150c5761150b61482a565b5b9060005260206000200154905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3031383030310000000000000000000000000000000000000000000000000000815250906115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de919061423b565b60405180910390fd5b506000479050732851a87a4e572f3f91d72fffdcee53e41ed57a0b73ffffffffffffffffffffffffffffffffffffffff166108fc6116446103e8611636610145866129c190919063ffffffff16565b612aec90919063ffffffff16565b9081150290604051600060405180830381858888f1935050505061169d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116949061439d565b60405180910390fd5b738c9453c77f40a3a6e5d94b519afe59dc5e4cf9d973ffffffffffffffffffffffffffffffffffffffff166108fc6116f46103e86116e6610145866129c190919063ffffffff16565b612aec90919063ffffffff16565b9081150290604051600060405180830381858888f1935050505061174d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117449061425d565b60405180910390fd5b73cd1287e55aac8f0cd9c3fc5f202348aab5959a8673ffffffffffffffffffffffffffffffffffffffff166108fc6117a36103e861179560af866129c190919063ffffffff16565b612aec90919063ffffffff16565b9081150290604051600060405180830381858888f193505050506117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f39061437d565b60405180910390fd5b6e2870670871555da8e9686faabf712f73ffffffffffffffffffffffffffffffffffffffff166108fc61184d6103e861183f60af866129c190919063ffffffff16565b612aec90919063ffffffff16565b9081150290604051600060405180830381858888f193505050506118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d9061431d565b60405180910390fd5b50565b6118c483838360405180602001604052806000815250612b02565b505050565b600e60009054906101000a900460ff1681565b600060058054905082106040518060400160405280600681526020017f30303530303700000000000000000000000000000000000000000000000000008152509061195d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611954919061423b565b60405180910390fd5b50600582815481106119725761197161482a565b5b90600052602060002001549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090611a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a43919061423b565b60405180910390fd5b5080600d9080519060200190611a63929190613a15565b5050565b600e60009054906101000a900460ff16611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad906143dd565b60405180910390fd5b600b611b0b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ab90919063ffffffff16565b1115611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b439061435d565b60405180910390fd5b6105dc611b6860016005805490506129ab90919063ffffffff16565b1115611ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba09061429d565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c23906142bd565b60405180910390fd5b611c38336013546129d7565b611c4e60016013546129ab90919063ffffffff16565b601381905550611ca76001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129ab90919063ffffffff16565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e08919061423b565b60405180910390fd5b50919050565b600d8054611e2490614691565b80601f0160208091040260200160405190810160405280929190818152602001828054611e5090614691565b8015611e9d5780601f10611e7257610100808354040283529160200191611e9d565b820191906000526020600020905b815481529060010190602001808311611e8057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f45919061423b565b60405180910390fd5b50611f58826130d0565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201e919061423b565b60405180910390fd5b50600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b6040518060400160405280600681526020017f303138303032000000000000000000000000000000000000000000000000000081525081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a80546120c290614691565b80601f01602080910402602001604051908101604052809291908181526020018280546120ee90614691565b801561213b5780601f106121105761010080835404028352916020019161213b565b820191906000526020600020905b81548152906001019060200180831161211e57829003601f168201915b5050505050905090565b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122369190614220565b60405180910390a35050565b61229285858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612b02565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e919061423b565b60405180910390fd5b50612381836130e2565b915050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612448919061423b565b60405180910390fd5b50601260009054906101000a900460ff16156124a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124999061427d565b60405180910390fd5b6122b86124be60706005805490506129ab90919063ffffffff16565b11156124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f6906142fd565b60405180910390fd5b60005b607081101561253557612522338260135461251d91906144c6565b6129d7565b808061252d906146f4565b915050612502565b506001601260006101000a81548160ff021916908315150217905550565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30313830303100000000000000000000000000000000000000000000000000008152509061261b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612612919061423b565b60405180910390fd5b506000479050732851a87a4e572f3f91d72fffdcee53e41ed57a0b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a0906143bd565b60405180910390fd5b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525090612808576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ff919061423b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3031383030320000000000000000000000000000000000000000000000000000815250906128b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a8919061423b565b60405180910390fd5b508073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060400160405280600681526020017f303138303031000000000000000000000000000000000000000000000000000081525081565b600081836129b991906144c6565b905092915050565b600081836129cf919061454d565b905092915050565b6129e18282613116565b60058190806001815401808255809150506001900390600052602060002001600090919091909150556001600580549050612a1c91906145a7565b60066000838152602001908152602001600020819055505050565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612a7882613304565b612a82818361333d565b612a8c838361334b565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612afa919061451c565b905092915050565b8160006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612bd357503373ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80612c645750600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6040518060400160405280600681526020017f303033303034000000000000000000000000000000000000000000000000000081525090612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd2919061423b565b60405180910390fd5b5083600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303032000000000000000000000000000000000000000000000000000081525090612db8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612daf919061423b565b60405180910390fd5b5060006001600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303037000000000000000000000000000000000000000000000000000081525090612e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e919061423b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f303033303031000000000000000000000000000000000000000000000000000081525090612f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f37919061423b565b60405180910390fd5b50612f4b8787612a37565b612f6a8773ffffffffffffffffffffffffffffffffffffffff16613359565b156130c65760008773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff1660e01b8152600401612fb094939291906141d4565b602060405180830381600087803b158015612fca57600080fd5b505af1158015612fde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130029190613ddc565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146040518060400160405280600681526020017f3030333030350000000000000000000000000000000000000000000000000000815250906130c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ba919061423b565b60405180910390fd5b50505b5050505050505050565b60006130db826133a4565b9050919050565b6060600d6130ef836133f0565b604051602001613100929190614195565b6040516020818303038152906040529050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156040518060400160405280600681526020017f3030333030310000000000000000000000000000000000000000000000000000815250906131be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b5919061423b565b60405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f303033303036000000000000000000000000000000000000000000000000000081525090613299576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613290919061423b565b60405180910390fd5b506132a4828261334b565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b6133478282613551565b5050565b6133558282613818565b5050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561339b5750808214155b92505050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60606000821415613438576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061354c565b600082905060005b6000821461346a578080613453906146f4565b915050600a82613463919061451c565b9150613440565b60008167ffffffffffffffff81111561348657613485614859565b5b6040519080825280601f01601f1916602001820160405280156134b85781602001600182028036833780820191505090505b5090505b60008514613545576001826134d191906145a7565b9150600a856134e0919061473d565b60306134ec91906144c6565b60f81b8183815181106135025761350161482a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561353e919061451c565b94506134bc565b8093505050505b919050565b8173ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f30303330303700000000000000000000000000000000000000000000000000008152509061362a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613621919061423b565b60405180910390fd5b506001600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560006008600083815260200190815260200160002054905060006001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506136ca91906145a7565b90508181146137ad576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106137265761372561482a565b5b9060005260206000200154905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106137855761378461482a565b5b9060005260206000200181905550826008600083815260200190815260200160002081905550505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806137fc576137fb6147fb565b5b6001900381819060005260206000200160009055905550505050565b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600681526020017f3030333030360000000000000000000000000000000000000000000000000000815250906138f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e9919061423b565b60405180910390fd5b50816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150506001900390600052602060002001600090919091909150556001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506139fa91906145a7565b60086000838152602001908152602001600020819055505050565b828054613a2190614691565b90600052602060002090601f016020900481019282613a435760008555613a8a565b82601f10613a5c57805160ff1916838001178555613a8a565b82800160010185558215613a8a579182015b82811115613a89578251825591602001919060010190613a6e565b5b509050613a979190613a9b565b5090565b5b80821115613ab4576000816000905550600101613a9c565b5090565b6000613acb613ac68461443d565b614418565b905082815260208101848484011115613ae757613ae6614897565b5b613af284828561464f565b509392505050565b600081359050613b0981614acc565b92915050565b600081359050613b1e81614ae3565b92915050565b600081359050613b3381614afa565b92915050565b600081519050613b4881614afa565b92915050565b60008083601f840112613b6457613b6361488d565b5b8235905067ffffffffffffffff811115613b8157613b80614888565b5b602083019150836001820283011115613b9d57613b9c614892565b5b9250929050565b600082601f830112613bb957613bb861488d565b5b8135613bc9848260208601613ab8565b91505092915050565b600081359050613be181614b11565b92915050565b600060208284031215613bfd57613bfc6148a1565b5b6000613c0b84828501613afa565b91505092915050565b60008060408385031215613c2b57613c2a6148a1565b5b6000613c3985828601613afa565b9250506020613c4a85828601613afa565b9150509250929050565b600080600060608486031215613c6d57613c6c6148a1565b5b6000613c7b86828701613afa565b9350506020613c8c86828701613afa565b9250506040613c9d86828701613bd2565b9150509250925092565b600080600080600060808688031215613cc357613cc26148a1565b5b6000613cd188828901613afa565b9550506020613ce288828901613afa565b9450506040613cf388828901613bd2565b935050606086013567ffffffffffffffff811115613d1457613d1361489c565b5b613d2088828901613b4e565b92509250509295509295909350565b60008060408385031215613d4657613d456148a1565b5b6000613d5485828601613afa565b9250506020613d6585828601613b0f565b9150509250929050565b60008060408385031215613d8657613d856148a1565b5b6000613d9485828601613afa565b9250506020613da585828601613bd2565b9150509250929050565b600060208284031215613dc557613dc46148a1565b5b6000613dd384828501613b24565b91505092915050565b600060208284031215613df257613df16148a1565b5b6000613e0084828501613b39565b91505092915050565b600060208284031215613e1f57613e1e6148a1565b5b600082013567ffffffffffffffff811115613e3d57613e3c61489c565b5b613e4984828501613ba4565b91505092915050565b600060208284031215613e6857613e676148a1565b5b6000613e7684828501613bd2565b91505092915050565b613e88816145db565b82525050565b613e97816145ed565b82525050565b6000613ea882614483565b613eb28185614499565b9350613ec281856020860161465e565b613ecb816148a6565b840191505092915050565b6000613ee18261448e565b613eeb81856144aa565b9350613efb81856020860161465e565b613f04816148a6565b840191505092915050565b6000613f1a8261448e565b613f2481856144bb565b9350613f3481856020860161465e565b80840191505092915050565b60008154613f4d81614691565b613f5781866144bb565b94506001821660008114613f725760018114613f8357613fb6565b60ff19831686528186019350613fb6565b613f8c8561446e565b60005b83811015613fae57815481890152600182019150602081019050613f8f565b838801955050505b50505092915050565b6000613fcc601a836144aa565b9150613fd7826148b7565b602082019050919050565b6000613fef6018836144aa565b9150613ffa826148e0565b602082019050919050565b60006140126017836144aa565b915061401d82614909565b602082019050919050565b60006140356014836144aa565b915061404082614932565b602082019050919050565b60006140586013836144aa565b91506140638261495b565b602082019050919050565b600061407b6017836144aa565b915061408682614984565b602082019050919050565b600061409e601a836144aa565b91506140a9826149ad565b602082019050919050565b60006140c16008836144aa565b91506140cc826149d6565b602082019050919050565b60006140e46012836144aa565b91506140ef826149ff565b602082019050919050565b6000614107601a836144aa565b915061411282614a28565b602082019050919050565b600061412a601b836144aa565b915061413582614a51565b602082019050919050565b600061414d6019836144aa565b915061415882614a7a565b602082019050919050565b60006141706018836144aa565b915061417b82614aa3565b602082019050919050565b61418f81614645565b82525050565b60006141a18285613f40565b91506141ad8284613f0f565b91508190509392505050565b60006020820190506141ce6000830184613e7f565b92915050565b60006080820190506141e96000830187613e7f565b6141f66020830186613e7f565b6142036040830185614186565b81810360608301526142158184613e9d565b905095945050505050565b60006020820190506142356000830184613e8e565b92915050565b600060208201905081810360008301526142558184613ed6565b905092915050565b6000602082019050818103600083015261427681613fbf565b9050919050565b6000602082019050818103600083015261429681613fe2565b9050919050565b600060208201905081810360008301526142b681614005565b9050919050565b600060208201905081810360008301526142d681614028565b9050919050565b600060208201905081810360008301526142f68161404b565b9050919050565b600060208201905081810360008301526143168161406e565b9050919050565b6000602082019050818103600083015261433681614091565b9050919050565b60006020820190508181036000830152614356816140b4565b9050919050565b60006020820190508181036000830152614376816140d7565b9050919050565b60006020820190508181036000830152614396816140fa565b9050919050565b600060208201905081810360008301526143b68161411d565b9050919050565b600060208201905081810360008301526143d681614140565b9050919050565b600060208201905081810360008301526143f681614163565b9050919050565b60006020820190506144126000830184614186565b92915050565b6000614422614433565b905061442e82826146c3565b919050565b6000604051905090565b600067ffffffffffffffff82111561445857614457614859565b5b614461826148a6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144d182614645565b91506144dc83614645565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145115761451061476e565b5b828201905092915050565b600061452782614645565b915061453283614645565b9250826145425761454161479d565b5b828204905092915050565b600061455882614645565b915061456383614645565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561459c5761459b61476e565b5b828202905092915050565b60006145b282614645565b91506145bd83614645565b9250828210156145d0576145cf61476e565b5b828203905092915050565b60006145e682614625565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561467c578082015181840152602081019050614661565b8381111561468b576000848401525b50505050565b600060028204905060018216806146a957607f821691505b602082108114156146bd576146bc6147cc565b5b50919050565b6146cc826148a6565b810181811067ffffffffffffffff821117156146eb576146ea614859565b5b80604052505050565b60006146ff82614645565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147325761473161476e565b5b600182019050919050565b600061474882614645565b915061475383614645565b9250826147635761476261479d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f616464726573733220636f756c646e2774207769746864726177000000000000600082015250565b7f47697665617761797320616c7265616479206d696e7465640000000000000000600082015250565b7f4e6f7420656e6f756768206672656520746f206d696e74000000000000000000600082015250565b7f43616e206f6e6c79206d696e7420312066726565000000000000000000000000600082015250565b7f496e76616c696420616d6f756e742073656e7400000000000000000000000000600082015250565b7f4e6f7420656e6f756768206c65667420746f206d696e74000000000000000000600082015250565b7f616464726573733420636f756c646e2774207769746864726177000000000000600082015250565b7f546f6f206d616e79000000000000000000000000000000000000000000000000600082015250565b7f4d617820706f737369626c652069732031310000000000000000000000000000600082015250565b7f616464726573733320636f756c646e2774207769746864726177000000000000600082015250565b7f616464726573733120636f756c646e2774207769746864726177200000000000600082015250565b7f656d657267656e6379207769746864726177206661696c656400000000000000600082015250565b7f4d696e74696e67206973206e6f7420617661696c61626c650000000000000000600082015250565b614ad5816145db565b8114614ae057600080fd5b50565b614aec816145ed565b8114614af757600080fd5b50565b614b03816145f9565b8114614b0e57600080fd5b50565b614b1a81614645565b8114614b2557600080fd5b5056fea26469706673582212200c2f599a1890a5b0f46a4c98c7ff1ce111be087ab4191a9d3869826d8145aff164736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000094372696d696e616c73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044352494d00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Criminals
Arg [1] : _symbol (string): CRIM

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 4372696d696e616c730000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 4352494d00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

46072:7792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16201:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43792:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32132:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48842:819;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29917:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38455:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29143:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39152:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50665:486;;;;;;;;;;;;;:::i;:::-;;28388:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47000:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38716:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48334:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49716:485;;;;;;;;;;;;;:::i;:::-;;31680:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46248:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31206:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48199:84;;;;;;;;;;;;;:::i;:::-;;9706:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9826:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44028:128;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30680:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27768:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44309:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47792:345;;;;;;;;;;;;;:::i;:::-;;50350:178;;;;;;;;;;;;;:::i;:::-;;32584:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10651:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9650:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16201:172;16311:4;16334:19;:33;16354:12;16334:33;;;;;;;;;;;;;;;;;;;;;;;;;;;16327:40;;16201:172;;;:::o;43792:120::-;43860:19;43899:7;43891:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43792:120;:::o;32132:183::-;32261:7;32237:8;26731:1;26700:33;;:9;:19;26710:8;26700:19;;;;;;;;;;;;;;;;;;;;;:33;;;;26735:13;;;;;;;;;;;;;;;;;26692:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;32287:12:::1;:22;32300:8;32287:22;;;;;;;;;;;;;;;;;;;;;32280:29;;32132:183:::0;;;;:::o;48842:819::-;48916:10;;;;;;;;;;;48908:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;49017:2;48970:43;49002:10;48970:15;:27;48986:10;48970:27;;;;;;;;;;;;;;;;:31;;:43;;;;:::i;:::-;:49;;48962:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;49071:1;49057:10;:15;;49049:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;49110:1;49096:10;:15;49092:54;;49137:1;49124:14;;49092:54;46346:3;46415:4;46496:30;;;;:::i;:::-;49160:29;49178:10;49160:6;:13;;;;:17;;:29;;;;:::i;:::-;:50;;49152:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;49282:9;49253:25;49267:10;46596:11;49253:13;;:25;;;;:::i;:::-;:38;49245:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49322:21;49417:6;49412:116;49429:10;49425:1;:14;49412:116;;;49457:34;49469:10;49489:1;49481:5;;:9;;;;:::i;:::-;49457:11;:34::i;:::-;49502:18;;;;;:::i;:::-;;;;49441:3;;;;;:::i;:::-;;;;49412:116;;;;49542:27;49552:16;49542:5;;:9;;:27;;;;:::i;:::-;49534:5;:35;;;;49606:49;49638:16;49606:15;:27;49622:10;49606:27;;;;;;;;;;;;;;;;:31;;:49;;;;:::i;:::-;49576:15;:27;49592:10;49576:27;;;;;;;;;;;;;;;:79;;;;48901:760;48842:819;:::o;29917:352::-;30030:8;25884:18;25905:9;:19;25915:8;25905:19;;;;;;;;;;;;;;;;;;;;;25884:40;;25961:10;25947:24;;:10;:24;;;:68;;;;25975:16;:28;25992:10;25975:28;;;;;;;;;;;;;;;:40;26004:10;25975:40;;;;;;;;;;;;;;;;;;;;;;;;;25947:68;26024:21;;;;;;;;;;;;;;;;;25931:121;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30058:8:::1;26731:1;26700:33;;:9;:19;26710:8;26700:19;;;;;;;;;;;;;;;;;;;;;:33;;;;26735:13;;;;;;;;;;;;;;;;::::0;26692:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30078:18:::2;30099:9;:19;30109:8;30099:19;;;;;;;;;;;;;;;;;;;;;30078:40;;30146:10;30133:23;;:9;:23;;;;30158:8;;;;;;;;;;;;;;;;::::0;30125:42:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;30201:9;30176:12;:22;30189:8;30176:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;30254:8;30243:9;30222:41;;30231:10;30222:41;;;;;;;;;;;;30071:198;26059:1:::1;25877:189:::0;29917:352;;;:::o;38455:120::-;38530:7;38556:6;:13;;;;38549:20;;38455:120;:::o;29143:353::-;29276:8;26264:18;26285:9;:19;26295:8;26285:19;;;;;;;;;;;;;;;;;;;;;26264:40;;26341:10;26327:24;;:10;:24;;;:71;;;;26388:10;26362:36;;:12;:22;26375:8;26362:22;;;;;;;;;;;;;;;;;;;;;:36;;;26327:71;:122;;;;26409:16;:28;26426:10;26409:28;;;;;;;;;;;;;;;:40;26438:10;26409:40;;;;;;;;;;;;;;;;;;;;;;;;;26327:122;26458:30;;;;;;;;;;;;;;;;;26311:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29304:8:::1;26731:1;26700:33;;:9;:19;26710:8;26700:19;;;;;;;;;;;;;;;;;;;;;:33;;;;26735:13;;;;;;;;;;;;;;;;::::0;26692:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29324:18:::2;29345:9;:19;29355:8;29345:19;;;;;;;;;;;;;;;;;;;;;29324:40;;29393:5;29379:19;;:10;:19;;;29400:9;;;;;;;;;;;;;;;;::::0;29371:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29440:1;29425:17;;:3;:17;;;;29444:12;;;;;;;;;;;;;;;;::::0;29417:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;29466:24;29476:3;29481:8;29466:9;:24::i;:::-;29317:179;26502:1:::1;26257:252:::0;29143:353;;;;:::o;39152:251::-;39280:7;39316:10;:18;39327:6;39316:18;;;;;;;;;;;;;;;:25;;;;39307:6;:34;39343:13;;;;;;;;;;;;;;;;;39299:58;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;39371:10;:18;39382:6;39371:18;;;;;;;;;;;;;;;39390:6;39371:26;;;;;;;;:::i;:::-;;;;;;;;;;39364:33;;39152:251;;;;:::o;50665:486::-;10444:5;;;;;;;;;;;10430:19;;:10;:19;;;10451:17;;;;;;;;;;;;;;;;;10422:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;50713:15:::1;50731:21;50713:39;;46671:42;50769:22;;:50;50792:26;50813:4;50792:16;50804:3;50792:7;:11;;:16;;;;:::i;:::-;:20;;:26;;;;:::i;:::-;50769:50;;;;;;;;;;;;;;;;;;;;;;;50761:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;46754:42;50868:22;;:50;50891:26;50912:4;50891:16;50903:3;50891:7;:11;;:16;;;;:::i;:::-;:20;;:26;;;;:::i;:::-;50868:50;;;;;;;;;;;;;;;;;;;;;;;50860:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;46837:42;50966:22;;:50;50989:26;51010:4;50989:16;51001:3;50989:7;:11;;:16;;;;:::i;:::-;:20;;:26;;;;:::i;:::-;50966:50;;;;;;;;;;;;;;;;;;;;;;;50958:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;46920:42;51064:22;;:50;51087:26;51108:4;51087:16;51099:3;51087:7;:11;;:16;;;;:::i;:::-;:20;;:26;;;;:::i;:::-;51064:50;;;;;;;;;;;;;;;;;;;;;;;51056:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;50704:447;50665:486::o:0;28388:179::-;28518:43;28536:5;28543:3;28548:8;28518:43;;;;;;;;;;;;:17;:43::i;:::-;28388:179;;;:::o;47000:22::-;;;;;;;;;;;;;:::o;38716:199::-;38816:7;38852:6;:13;;;;38843:6;:22;38867:13;;;;;;;;;;;;;;;;;38835:46;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38895:6;38902;38895:14;;;;;;;;:::i;:::-;;;;;;;;;;38888:21;;38716:199;;;:::o;48334:86::-;10444:5;;;;;;;;;;;10430:19;;:10;:19;;;10451:17;;;;;;;;;;;;;;;;;10422:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;48410:4:::1;48400:7;:14;;;;;;;;;;;;:::i;:::-;;48334:86:::0;:::o;49716:485::-;49764:10;;;;;;;;;;;49756:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;49856:2;49818:34;49850:1;49818:15;:27;49834:10;49818:27;;;;;;;;;;;;;;;;:31;;:34;;;;:::i;:::-;:40;;49810:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;49920:4;49896:20;49914:1;49896:6;:13;;;;:17;;:20;;;;:::i;:::-;:28;;49888:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;49997:1;49967:14;:26;49982:10;49967:26;;;;;;;;;;;;;;;;:31;;49959:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50030:30;50042:10;50054:5;;50030:11;:30::i;:::-;50075:12;50085:1;50075:5;;:9;;:12;;;;:::i;:::-;50067:5;:20;;;;50124:34;50156:1;50124:15;:27;50140:10;50124:27;;;;;;;;;;;;;;;;:31;;:34;;;;:::i;:::-;50094:15;:27;50110:10;50094:27;;;;;;;;;;;;;;;:64;;;;50194:1;50165:14;:26;50180:10;50165:26;;;;;;;;;;;;;;;:30;;;;49716:485::o;31680:208::-;31777:14;31812:9;:19;31822:8;31812:19;;;;;;;;;;;;;;;;;;;;;31803:28;;31864:1;31846:20;;:6;:20;;;;31868:13;;;;;;;;;;;;;;;;;31838:44;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31680:208;;;:::o;46248:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31206:204::-;31303:7;31348:1;31330:20;;:6;:20;;;;31352:12;;;;;;;;;;;;;;;;;31322:43;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31379:25;31397:6;31379:17;:25::i;:::-;31372:32;;31206:204;;;:::o;48199:84::-;10444:5;;;;;;;;;;;10430:19;;:10;:19;;;10451:17;;;;;;;;;;;;;;;;;10422:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;48267:10:::1;;;;;;;;;;;48266:11;48253:10;;:24;;;;;;;;;;;;;;;;;;48199:84::o:0;9706:65::-;;;;;;;;;;;;;;;;;;;:::o;9826:20::-;;;;;;;;;;;;;:::o;44028:128::-;44098:21;44141:9;44131:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44028:128;:::o;30680:232::-;30837:9;30795:16;:28;30812:10;30795:28;;;;;;;;;;;;;;;:39;30824:9;30795:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;30885:9;30858:48;;30873:10;30858:48;;;30896:9;30858:48;;;;;;:::i;:::-;;;;;;;;30680:232;;:::o;27768:209::-;27925:46;27943:5;27950:3;27955:8;27965:5;;27925:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;27768:209;;;;;:::o;44309:183::-;44435:13;44411:8;26731:1;26700:33;;:9;:19;26710:8;26700:19;;;;;;;;;;;;;;;;;;;;;:33;;;;26735:13;;;;;;;;;;;;;;;;;26692:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;44467:19:::1;44477:8;44467:9;:19::i;:::-;44460:26;;44309:183:::0;;;;:::o;47792:345::-;10444:5;;;;;;;;;;;10430:19;;:10;:19;;;10451:17;;;;;;;;;;;;;;;;;10422:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;47854:15:::1;;;;;;;;;;;47853:16;47845:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;46415:4;47915:37;46346:3;47915:6;:13;;;;:17;;:37;;;;:::i;:::-;:50;;47907:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;48009:6;48004:97;46346:3;48017:1;:22;48004:97;;;48057:34;48069:10;48089:1;48081:5;;:9;;;;:::i;:::-;48057:11;:34::i;:::-;48041:3;;;;;:::i;:::-;;;;48004:97;;;;48127:4;48109:15;;:22;;;;;;;;;;;;;;;;;;47792:345::o:0;50350:178::-;10444:5;;;;;;;;;;;10430:19;;:10;:19;;;10451:17;;;;;;;;;;;;;;;;;10422:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;50405:15:::1;50423:21;50405:39;;46671:42;50461:22;;:31;50484:7;50461:31;;;;;;;;;;;;;;;;;;;;;;;50453:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50398:130;50350:178::o:0;32584:192::-;32712:4;32735:16;:24;32752:6;32735:24;;;;;;;;;;;;;;;:35;32760:9;32735:35;;;;;;;;;;;;;;;;;;;;;;;;;32728:42;;32584:192;;;;:::o;10651:238::-;10444:5;;;;;;;;;;;10430:19;;:10;:19;;;10451:17;;;;;;;;;;;;;;;;;10422:47;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10773:1:::1;10752:23;;:9;:23;;;;10777:31;;;;;;;;;;;;;;;;::::0;10744:65:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10849:9;10821:38;;10842:5;;;;;;;;;;;10821:38;;;;;;;;;;;;10874:9;10866:5;;:17;;;;;;;;;;;;;;;;;;10651:238:::0;:::o;9650:51::-;;;;;;;;;;;;;;;;;;;:::o;5000:98::-;5058:7;5089:1;5085;:5;;;;:::i;:::-;5078:12;;5000:98;;;;:::o;5738:::-;5796:7;5827:1;5823;:5;;;;:::i;:::-;5816:12;;5738:98;;;;:::o;39794:218::-;39906:26;39918:3;39923:8;39906:11;:26::i;:::-;39939:6;39951:8;39939:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40005:1;39989:6;:13;;;;:17;;;;:::i;:::-;39967:9;:19;39977:8;39967:19;;;;;;;;;;;:39;;;;39794:218;;:::o;32967:288::-;33069:12;33084:9;:19;33094:8;33084:19;;;;;;;;;;;;;;;;;;;;;33069:34;;33110:24;33125:8;33110:14;:24::i;:::-;33143:30;33158:4;33164:8;33143:14;:30::i;:::-;33180:26;33192:3;33197:8;33180:11;:26::i;:::-;33240:8;33235:3;33220:29;;33229:4;33220:29;;;;;;;;;;;;33062:193;32967:288;;:::o;6137:98::-;6195:7;6226:1;6222;:5;;;;:::i;:::-;6215:12;;6137:98;;;;:::o;36383:590::-;36531:8;26264:18;26285:9;:19;26295:8;26285:19;;;;;;;;;;;;;;;;;;;;;26264:40;;26341:10;26327:24;;:10;:24;;;:71;;;;26388:10;26362:36;;:12;:22;26375:8;26362:22;;;;;;;;;;;;;;;;;;;;;:36;;;26327:71;:122;;;;26409:16;:28;26426:10;26409:28;;;;;;;;;;;;;;;:40;26438:10;26409:40;;;;;;;;;;;;;;;;;;;;;;;;;26327:122;26458:30;;;;;;;;;;;;;;;;;26311:184;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;36559:8:::1;26731:1;26700:33;;:9;:19;26710:8;26700:19;;;;;;;;;;;;;;;;;;;;;:33;;;;26735:13;;;;;;;;;;;;;;;;::::0;26692:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;36579:18:::2;36600:9;:19;36610:8;36600:19;;;;;;;;;;;;;;;;;;;;;36579:40;;36648:5;36634:19;;:10;:19;;;36655:9;;;;;;;;;;;;;;;;::::0;36626:39:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;36695:1;36680:17;;:3;:17;;;;36699:12;;;;;;;;;;;;;;;;::::0;36672:40:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;36721:24;36731:3;36736:8;36721:9;:24::i;:::-;36758:16;:3;:14;;;:16::i;:::-;36754:214;;;36790:13;36826:3;36806:41;;;36848:10;36860:5;36867:8;36877:5;36806:77;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36790:93;;25102:10;36910:24;;36900:34;;;:6;:34;;;;36936:23;;;;;;;;;;;;;;;;::::0;36892:68:::2;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;36781:187;36754:214;36572:401;26502:1:::1;26257:252:::0;36383:590;;;;;:::o;53653:208::-;53786:7;53812:43;53848:6;53812:35;:43::i;:::-;53805:50;;53653:208;;;:::o;48584:158::-;48653:13;48706:7;48715:19;:8;:17;:19::i;:::-;48689:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48675:61;;48584:158;;;:::o;33646:297::-;33767:1;33752:17;;:3;:17;;;;33771:12;;;;;;;;;;;;;;;;;33744:40;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;33830:1;33799:33;;:9;:19;33809:8;33799:19;;;;;;;;;;;;;;;;;;;;;:33;;;33834:18;;;;;;;;;;;;;;;;;33791:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;33862:26;33874:3;33879:8;33862:11;:26::i;:::-;33928:8;33923:3;33902:35;;33919:1;33902:35;;;;;;;;;;;;33646:297;;:::o;37106:110::-;37188:12;:22;37201:8;37188:22;;;;;;;;;;;;37181:29;;;;;;;;;;;37106:110;:::o;52711:193::-;52849:49;52882:5;52889:8;52849:32;:49::i;:::-;52711:193;;:::o;53175:183::-;53308:44;53338:3;53343:8;53308:29;:44::i;:::-;53175:183;;:::o;14017:780::-;14100:17;14541:16;14564:19;14586:66;14564:88;;;;14694:5;14682:18;14670:30;;14760:3;14748:15;;:8;:15;;:42;;;;;14779:11;14767:8;:23;;14748:42;14732:59;;14122:675;;14017:780;;;:::o;42674:175::-;42792:7;42818:10;:18;42829:6;42818:18;;;;;;;;;;;;;;;:25;;;;42811:32;;42674:175;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;41189:602::-;41343:5;41320:28;;:9;:19;41330:8;41320:19;;;;;;;;;;;;;;;;;;;;;:28;;;41350:9;;;;;;;;;;;;;;;;;41312:48;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41374:9;:19;41384:8;41374:19;;;;;;;;;;;;41367:26;;;;;;;;;;;41402;41431:14;:24;41446:8;41431:24;;;;;;;;;;;;41402:53;;41462:22;41514:1;41487:10;:17;41498:5;41487:17;;;;;;;;;;;;;;;:24;;;;:28;;;;:::i;:::-;41462:53;;41546:18;41528:14;:36;41524:230;;41580:17;41600:10;:17;41611:5;41600:17;;;;;;;;;;;;;;;41618:14;41600:33;;;;;;;;:::i;:::-;;;;;;;;;;41580:53;;41682:9;41642:10;:17;41653:5;41642:17;;;;;;;;;;;;;;;41660:18;41642:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;41728:18;41700:14;:25;41715:9;41700:25;;;;;;;;;;;:46;;;;41571:183;41524:230;41762:10;:17;41773:5;41762:17;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41305:486;;41189:602;;:::o;42062:317::-;42219:1;42188:33;;:9;:19;42198:8;42188:19;;;;;;;;;;;;;;;;;;;;;:33;;;42223:18;;;;;;;;;;;;;;;;;42180:62;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42271:3;42249:9;:19;42259:8;42249:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;42283:10;:15;42294:3;42283:15;;;;;;;;;;;;;;;42304:8;42283:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42372:1;42347:10;:15;42358:3;42347:15;;;;;;;;;;;;;;;:22;;;;:26;;;;:::i;:::-;42320:14;:24;42335:8;42320:24;;;;;;;;;;;:53;;;;42062:317;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:412:1:-;85:5;110:66;126:49;168:6;126:49;:::i;:::-;110:66;:::i;:::-;101:75;;199:6;192:5;185:21;237:4;230:5;226:16;275:3;266:6;261:3;257:16;254:25;251:112;;;282:79;;:::i;:::-;251:112;372:41;406:6;401:3;396;372:41;:::i;:::-;91:328;7:412;;;;;:::o;425:139::-;471:5;509:6;496:20;487:29;;525:33;552:5;525:33;:::i;:::-;425:139;;;;:::o;570:133::-;613:5;651:6;638:20;629:29;;667:30;691:5;667:30;:::i;:::-;570:133;;;;:::o;709:137::-;754:5;792:6;779:20;770:29;;808:32;834:5;808:32;:::i;:::-;709:137;;;;:::o;852:141::-;908:5;939:6;933:13;924:22;;955:32;981:5;955:32;:::i;:::-;852:141;;;;:::o;1012:552::-;1069:8;1079:6;1129:3;1122:4;1114:6;1110:17;1106:27;1096:122;;1137:79;;:::i;:::-;1096:122;1250:6;1237:20;1227:30;;1280:18;1272:6;1269:30;1266:117;;;1302:79;;:::i;:::-;1266:117;1416:4;1408:6;1404:17;1392:29;;1470:3;1462:4;1454:6;1450:17;1440:8;1436:32;1433:41;1430:128;;;1477:79;;:::i;:::-;1430:128;1012:552;;;;;:::o;1584:340::-;1640:5;1689:3;1682:4;1674:6;1670:17;1666:27;1656:122;;1697:79;;:::i;:::-;1656:122;1814:6;1801:20;1839:79;1914:3;1906:6;1899:4;1891:6;1887:17;1839:79;:::i;:::-;1830:88;;1646:278;1584:340;;;;:::o;1930:139::-;1976:5;2014:6;2001:20;1992:29;;2030:33;2057:5;2030:33;:::i;:::-;1930:139;;;;:::o;2075:329::-;2134:6;2183:2;2171:9;2162:7;2158:23;2154:32;2151:119;;;2189:79;;:::i;:::-;2151:119;2309:1;2334:53;2379:7;2370:6;2359:9;2355:22;2334:53;:::i;:::-;2324:63;;2280:117;2075:329;;;;:::o;2410:474::-;2478:6;2486;2535:2;2523:9;2514:7;2510:23;2506:32;2503:119;;;2541:79;;:::i;:::-;2503:119;2661:1;2686:53;2731:7;2722:6;2711:9;2707:22;2686:53;:::i;:::-;2676:63;;2632:117;2788:2;2814:53;2859:7;2850:6;2839:9;2835:22;2814:53;:::i;:::-;2804:63;;2759:118;2410:474;;;;;:::o;2890:619::-;2967:6;2975;2983;3032:2;3020:9;3011:7;3007:23;3003:32;3000:119;;;3038:79;;:::i;:::-;3000:119;3158:1;3183:53;3228:7;3219:6;3208:9;3204:22;3183:53;:::i;:::-;3173:63;;3129:117;3285:2;3311:53;3356:7;3347:6;3336:9;3332:22;3311:53;:::i;:::-;3301:63;;3256:118;3413:2;3439:53;3484:7;3475:6;3464:9;3460:22;3439:53;:::i;:::-;3429:63;;3384:118;2890:619;;;;;:::o;3515:963::-;3612:6;3620;3628;3636;3644;3693:3;3681:9;3672:7;3668:23;3664:33;3661:120;;;3700:79;;:::i;:::-;3661:120;3820:1;3845:53;3890:7;3881:6;3870:9;3866:22;3845:53;:::i;:::-;3835:63;;3791:117;3947:2;3973:53;4018:7;4009:6;3998:9;3994:22;3973:53;:::i;:::-;3963:63;;3918:118;4075:2;4101:53;4146:7;4137:6;4126:9;4122:22;4101:53;:::i;:::-;4091:63;;4046:118;4231:2;4220:9;4216:18;4203:32;4262:18;4254:6;4251:30;4248:117;;;4284:79;;:::i;:::-;4248:117;4397:64;4453:7;4444:6;4433:9;4429:22;4397:64;:::i;:::-;4379:82;;;;4174:297;3515:963;;;;;;;;:::o;4484:468::-;4549:6;4557;4606:2;4594:9;4585:7;4581:23;4577:32;4574:119;;;4612:79;;:::i;:::-;4574:119;4732:1;4757:53;4802:7;4793:6;4782:9;4778:22;4757:53;:::i;:::-;4747:63;;4703:117;4859:2;4885:50;4927:7;4918:6;4907:9;4903:22;4885:50;:::i;:::-;4875:60;;4830:115;4484:468;;;;;:::o;4958:474::-;5026:6;5034;5083:2;5071:9;5062:7;5058:23;5054:32;5051:119;;;5089:79;;:::i;:::-;5051:119;5209:1;5234:53;5279:7;5270:6;5259:9;5255:22;5234:53;:::i;:::-;5224:63;;5180:117;5336:2;5362:53;5407:7;5398:6;5387:9;5383:22;5362:53;:::i;:::-;5352:63;;5307:118;4958:474;;;;;:::o;5438:327::-;5496:6;5545:2;5533:9;5524:7;5520:23;5516:32;5513:119;;;5551:79;;:::i;:::-;5513:119;5671:1;5696:52;5740:7;5731:6;5720:9;5716:22;5696:52;:::i;:::-;5686:62;;5642:116;5438:327;;;;:::o;5771:349::-;5840:6;5889:2;5877:9;5868:7;5864:23;5860:32;5857:119;;;5895:79;;:::i;:::-;5857:119;6015:1;6040:63;6095:7;6086:6;6075:9;6071:22;6040:63;:::i;:::-;6030:73;;5986:127;5771:349;;;;:::o;6126:509::-;6195:6;6244:2;6232:9;6223:7;6219:23;6215:32;6212:119;;;6250:79;;:::i;:::-;6212:119;6398:1;6387:9;6383:17;6370:31;6428:18;6420:6;6417:30;6414:117;;;6450:79;;:::i;:::-;6414:117;6555:63;6610:7;6601:6;6590:9;6586:22;6555:63;:::i;:::-;6545:73;;6341:287;6126:509;;;;:::o;6641:329::-;6700:6;6749:2;6737:9;6728:7;6724:23;6720:32;6717:119;;;6755:79;;:::i;:::-;6717:119;6875:1;6900:53;6945:7;6936:6;6925:9;6921:22;6900:53;:::i;:::-;6890:63;;6846:117;6641:329;;;;:::o;6976:118::-;7063:24;7081:5;7063:24;:::i;:::-;7058:3;7051:37;6976:118;;:::o;7100:109::-;7181:21;7196:5;7181:21;:::i;:::-;7176:3;7169:34;7100:109;;:::o;7215:360::-;7301:3;7329:38;7361:5;7329:38;:::i;:::-;7383:70;7446:6;7441:3;7383:70;:::i;:::-;7376:77;;7462:52;7507:6;7502:3;7495:4;7488:5;7484:16;7462:52;:::i;:::-;7539:29;7561:6;7539:29;:::i;:::-;7534:3;7530:39;7523:46;;7305:270;7215:360;;;;:::o;7581:364::-;7669:3;7697:39;7730:5;7697:39;:::i;:::-;7752:71;7816:6;7811:3;7752:71;:::i;:::-;7745:78;;7832:52;7877:6;7872:3;7865:4;7858:5;7854:16;7832:52;:::i;:::-;7909:29;7931:6;7909:29;:::i;:::-;7904:3;7900:39;7893:46;;7673:272;7581:364;;;;:::o;7951:377::-;8057:3;8085:39;8118:5;8085:39;:::i;:::-;8140:89;8222:6;8217:3;8140:89;:::i;:::-;8133:96;;8238:52;8283:6;8278:3;8271:4;8264:5;8260:16;8238:52;:::i;:::-;8315:6;8310:3;8306:16;8299:23;;8061:267;7951:377;;;;:::o;8358:845::-;8461:3;8498:5;8492:12;8527:36;8553:9;8527:36;:::i;:::-;8579:89;8661:6;8656:3;8579:89;:::i;:::-;8572:96;;8699:1;8688:9;8684:17;8715:1;8710:137;;;;8861:1;8856:341;;;;8677:520;;8710:137;8794:4;8790:9;8779;8775:25;8770:3;8763:38;8830:6;8825:3;8821:16;8814:23;;8710:137;;8856:341;8923:38;8955:5;8923:38;:::i;:::-;8983:1;8997:154;9011:6;9008:1;9005:13;8997:154;;;9085:7;9079:14;9075:1;9070:3;9066:11;9059:35;9135:1;9126:7;9122:15;9111:26;;9033:4;9030:1;9026:12;9021:17;;8997:154;;;9180:6;9175:3;9171:16;9164:23;;8863:334;;8677:520;;8465:738;;8358:845;;;;:::o;9209:366::-;9351:3;9372:67;9436:2;9431:3;9372:67;:::i;:::-;9365:74;;9448:93;9537:3;9448:93;:::i;:::-;9566:2;9561:3;9557:12;9550:19;;9209:366;;;:::o;9581:::-;9723:3;9744:67;9808:2;9803:3;9744:67;:::i;:::-;9737:74;;9820:93;9909:3;9820:93;:::i;:::-;9938:2;9933:3;9929:12;9922:19;;9581:366;;;:::o;9953:::-;10095:3;10116:67;10180:2;10175:3;10116:67;:::i;:::-;10109:74;;10192:93;10281:3;10192:93;:::i;:::-;10310:2;10305:3;10301:12;10294:19;;9953:366;;;:::o;10325:::-;10467:3;10488:67;10552:2;10547:3;10488:67;:::i;:::-;10481:74;;10564:93;10653:3;10564:93;:::i;:::-;10682:2;10677:3;10673:12;10666:19;;10325:366;;;:::o;10697:::-;10839:3;10860:67;10924:2;10919:3;10860:67;:::i;:::-;10853:74;;10936:93;11025:3;10936:93;:::i;:::-;11054:2;11049:3;11045:12;11038:19;;10697:366;;;:::o;11069:::-;11211:3;11232:67;11296:2;11291:3;11232:67;:::i;:::-;11225:74;;11308:93;11397:3;11308:93;:::i;:::-;11426:2;11421:3;11417:12;11410:19;;11069:366;;;:::o;11441:::-;11583:3;11604:67;11668:2;11663:3;11604:67;:::i;:::-;11597:74;;11680:93;11769:3;11680:93;:::i;:::-;11798:2;11793:3;11789:12;11782:19;;11441:366;;;:::o;11813:365::-;11955:3;11976:66;12040:1;12035:3;11976:66;:::i;:::-;11969:73;;12051:93;12140:3;12051:93;:::i;:::-;12169:2;12164:3;12160:12;12153:19;;11813:365;;;:::o;12184:366::-;12326:3;12347:67;12411:2;12406:3;12347:67;:::i;:::-;12340:74;;12423:93;12512:3;12423:93;:::i;:::-;12541:2;12536:3;12532:12;12525:19;;12184:366;;;:::o;12556:::-;12698:3;12719:67;12783:2;12778:3;12719:67;:::i;:::-;12712:74;;12795:93;12884:3;12795:93;:::i;:::-;12913:2;12908:3;12904:12;12897:19;;12556:366;;;:::o;12928:::-;13070:3;13091:67;13155:2;13150:3;13091:67;:::i;:::-;13084:74;;13167:93;13256:3;13167:93;:::i;:::-;13285:2;13280:3;13276:12;13269:19;;12928:366;;;:::o;13300:::-;13442:3;13463:67;13527:2;13522:3;13463:67;:::i;:::-;13456:74;;13539:93;13628:3;13539:93;:::i;:::-;13657:2;13652:3;13648:12;13641:19;;13300:366;;;:::o;13672:::-;13814:3;13835:67;13899:2;13894:3;13835:67;:::i;:::-;13828:74;;13911:93;14000:3;13911:93;:::i;:::-;14029:2;14024:3;14020:12;14013:19;;13672:366;;;:::o;14044:118::-;14131:24;14149:5;14131:24;:::i;:::-;14126:3;14119:37;14044:118;;:::o;14168:429::-;14345:3;14367:92;14455:3;14446:6;14367:92;:::i;:::-;14360:99;;14476:95;14567:3;14558:6;14476:95;:::i;:::-;14469:102;;14588:3;14581:10;;14168:429;;;;;:::o;14603:222::-;14696:4;14734:2;14723:9;14719:18;14711:26;;14747:71;14815:1;14804:9;14800:17;14791:6;14747:71;:::i;:::-;14603:222;;;;:::o;14831:640::-;15026:4;15064:3;15053:9;15049:19;15041:27;;15078:71;15146:1;15135:9;15131:17;15122:6;15078:71;:::i;:::-;15159:72;15227:2;15216:9;15212:18;15203:6;15159:72;:::i;:::-;15241;15309:2;15298:9;15294:18;15285:6;15241:72;:::i;:::-;15360:9;15354:4;15350:20;15345:2;15334:9;15330:18;15323:48;15388:76;15459:4;15450:6;15388:76;:::i;:::-;15380:84;;14831:640;;;;;;;:::o;15477:210::-;15564:4;15602:2;15591:9;15587:18;15579:26;;15615:65;15677:1;15666:9;15662:17;15653:6;15615:65;:::i;:::-;15477:210;;;;:::o;15693:313::-;15806:4;15844:2;15833:9;15829:18;15821:26;;15893:9;15887:4;15883:20;15879:1;15868:9;15864:17;15857:47;15921:78;15994:4;15985:6;15921:78;:::i;:::-;15913:86;;15693:313;;;;:::o;16012:419::-;16178:4;16216:2;16205:9;16201:18;16193:26;;16265:9;16259:4;16255:20;16251:1;16240:9;16236:17;16229:47;16293:131;16419:4;16293:131;:::i;:::-;16285:139;;16012:419;;;:::o;16437:::-;16603:4;16641:2;16630:9;16626:18;16618:26;;16690:9;16684:4;16680:20;16676:1;16665:9;16661:17;16654:47;16718:131;16844:4;16718:131;:::i;:::-;16710:139;;16437:419;;;:::o;16862:::-;17028:4;17066:2;17055:9;17051:18;17043:26;;17115:9;17109:4;17105:20;17101:1;17090:9;17086:17;17079:47;17143:131;17269:4;17143:131;:::i;:::-;17135:139;;16862:419;;;:::o;17287:::-;17453:4;17491:2;17480:9;17476:18;17468:26;;17540:9;17534:4;17530:20;17526:1;17515:9;17511:17;17504:47;17568:131;17694:4;17568:131;:::i;:::-;17560:139;;17287:419;;;:::o;17712:::-;17878:4;17916:2;17905:9;17901:18;17893:26;;17965:9;17959:4;17955:20;17951:1;17940:9;17936:17;17929:47;17993:131;18119:4;17993:131;:::i;:::-;17985:139;;17712:419;;;:::o;18137:::-;18303:4;18341:2;18330:9;18326:18;18318:26;;18390:9;18384:4;18380:20;18376:1;18365:9;18361:17;18354:47;18418:131;18544:4;18418:131;:::i;:::-;18410:139;;18137:419;;;:::o;18562:::-;18728:4;18766:2;18755:9;18751:18;18743:26;;18815:9;18809:4;18805:20;18801:1;18790:9;18786:17;18779:47;18843:131;18969:4;18843:131;:::i;:::-;18835:139;;18562:419;;;:::o;18987:::-;19153:4;19191:2;19180:9;19176:18;19168:26;;19240:9;19234:4;19230:20;19226:1;19215:9;19211:17;19204:47;19268:131;19394:4;19268:131;:::i;:::-;19260:139;;18987:419;;;:::o;19412:::-;19578:4;19616:2;19605:9;19601:18;19593:26;;19665:9;19659:4;19655:20;19651:1;19640:9;19636:17;19629:47;19693:131;19819:4;19693:131;:::i;:::-;19685:139;;19412:419;;;:::o;19837:::-;20003:4;20041:2;20030:9;20026:18;20018:26;;20090:9;20084:4;20080:20;20076:1;20065:9;20061:17;20054:47;20118:131;20244:4;20118:131;:::i;:::-;20110:139;;19837:419;;;:::o;20262:::-;20428:4;20466:2;20455:9;20451:18;20443:26;;20515:9;20509:4;20505:20;20501:1;20490:9;20486:17;20479:47;20543:131;20669:4;20543:131;:::i;:::-;20535:139;;20262:419;;;:::o;20687:::-;20853:4;20891:2;20880:9;20876:18;20868:26;;20940:9;20934:4;20930:20;20926:1;20915:9;20911:17;20904:47;20968:131;21094:4;20968:131;:::i;:::-;20960:139;;20687:419;;;:::o;21112:::-;21278:4;21316:2;21305:9;21301:18;21293:26;;21365:9;21359:4;21355:20;21351:1;21340:9;21336:17;21329:47;21393:131;21519:4;21393:131;:::i;:::-;21385:139;;21112:419;;;:::o;21537:222::-;21630:4;21668:2;21657:9;21653:18;21645:26;;21681:71;21749:1;21738:9;21734:17;21725:6;21681:71;:::i;:::-;21537:222;;;;:::o;21765:129::-;21799:6;21826:20;;:::i;:::-;21816:30;;21855:33;21883:4;21875:6;21855:33;:::i;:::-;21765:129;;;:::o;21900:75::-;21933:6;21966:2;21960:9;21950:19;;21900:75;:::o;21981:308::-;22043:4;22133:18;22125:6;22122:30;22119:56;;;22155:18;;:::i;:::-;22119:56;22193:29;22215:6;22193:29;:::i;:::-;22185:37;;22277:4;22271;22267:15;22259:23;;21981:308;;;:::o;22295:141::-;22344:4;22367:3;22359:11;;22390:3;22387:1;22380:14;22424:4;22421:1;22411:18;22403:26;;22295:141;;;:::o;22442:98::-;22493:6;22527:5;22521:12;22511:22;;22442:98;;;:::o;22546:99::-;22598:6;22632:5;22626:12;22616:22;;22546:99;;;:::o;22651:168::-;22734:11;22768:6;22763:3;22756:19;22808:4;22803:3;22799:14;22784:29;;22651:168;;;;:::o;22825:169::-;22909:11;22943:6;22938:3;22931:19;22983:4;22978:3;22974:14;22959:29;;22825:169;;;;:::o;23000:148::-;23102:11;23139:3;23124:18;;23000:148;;;;:::o;23154:305::-;23194:3;23213:20;23231:1;23213:20;:::i;:::-;23208:25;;23247:20;23265:1;23247:20;:::i;:::-;23242:25;;23401:1;23333:66;23329:74;23326:1;23323:81;23320:107;;;23407:18;;:::i;:::-;23320:107;23451:1;23448;23444:9;23437:16;;23154:305;;;;:::o;23465:185::-;23505:1;23522:20;23540:1;23522:20;:::i;:::-;23517:25;;23556:20;23574:1;23556:20;:::i;:::-;23551:25;;23595:1;23585:35;;23600:18;;:::i;:::-;23585:35;23642:1;23639;23635:9;23630:14;;23465:185;;;;:::o;23656:348::-;23696:7;23719:20;23737:1;23719:20;:::i;:::-;23714:25;;23753:20;23771:1;23753:20;:::i;:::-;23748:25;;23941:1;23873:66;23869:74;23866:1;23863:81;23858:1;23851:9;23844:17;23840:105;23837:131;;;23948:18;;:::i;:::-;23837:131;23996:1;23993;23989:9;23978:20;;23656:348;;;;:::o;24010:191::-;24050:4;24070:20;24088:1;24070:20;:::i;:::-;24065:25;;24104:20;24122:1;24104:20;:::i;:::-;24099:25;;24143:1;24140;24137:8;24134:34;;;24148:18;;:::i;:::-;24134:34;24193:1;24190;24186:9;24178:17;;24010:191;;;;:::o;24207:96::-;24244:7;24273:24;24291:5;24273:24;:::i;:::-;24262:35;;24207:96;;;:::o;24309:90::-;24343:7;24386:5;24379:13;24372:21;24361:32;;24309:90;;;:::o;24405:149::-;24441:7;24481:66;24474:5;24470:78;24459:89;;24405:149;;;:::o;24560:126::-;24597:7;24637:42;24630:5;24626:54;24615:65;;24560:126;;;:::o;24692:77::-;24729:7;24758:5;24747:16;;24692:77;;;:::o;24775:154::-;24859:6;24854:3;24849;24836:30;24921:1;24912:6;24907:3;24903:16;24896:27;24775:154;;;:::o;24935:307::-;25003:1;25013:113;25027:6;25024:1;25021:13;25013:113;;;25112:1;25107:3;25103:11;25097:18;25093:1;25088:3;25084:11;25077:39;25049:2;25046:1;25042:10;25037:15;;25013:113;;;25144:6;25141:1;25138:13;25135:101;;;25224:1;25215:6;25210:3;25206:16;25199:27;25135:101;24984:258;24935:307;;;:::o;25248:320::-;25292:6;25329:1;25323:4;25319:12;25309:22;;25376:1;25370:4;25366:12;25397:18;25387:81;;25453:4;25445:6;25441:17;25431:27;;25387:81;25515:2;25507:6;25504:14;25484:18;25481:38;25478:84;;;25534:18;;:::i;:::-;25478:84;25299:269;25248:320;;;:::o;25574:281::-;25657:27;25679:4;25657:27;:::i;:::-;25649:6;25645:40;25787:6;25775:10;25772:22;25751:18;25739:10;25736:34;25733:62;25730:88;;;25798:18;;:::i;:::-;25730:88;25838:10;25834:2;25827:22;25617:238;25574:281;;:::o;25861:233::-;25900:3;25923:24;25941:5;25923:24;:::i;:::-;25914:33;;25969:66;25962:5;25959:77;25956:103;;;26039:18;;:::i;:::-;25956:103;26086:1;26079:5;26075:13;26068:20;;25861:233;;;:::o;26100:176::-;26132:1;26149:20;26167:1;26149:20;:::i;:::-;26144:25;;26183:20;26201:1;26183:20;:::i;:::-;26178:25;;26222:1;26212:35;;26227:18;;:::i;:::-;26212:35;26268:1;26265;26261:9;26256:14;;26100:176;;;;:::o;26282:180::-;26330:77;26327:1;26320:88;26427:4;26424:1;26417:15;26451:4;26448:1;26441:15;26468:180;26516:77;26513:1;26506:88;26613:4;26610:1;26603:15;26637:4;26634:1;26627:15;26654:180;26702:77;26699:1;26692:88;26799:4;26796:1;26789:15;26823:4;26820:1;26813:15;26840:180;26888:77;26885:1;26878:88;26985:4;26982:1;26975:15;27009:4;27006:1;26999:15;27026:180;27074:77;27071:1;27064:88;27171:4;27168:1;27161:15;27195:4;27192:1;27185:15;27212:180;27260:77;27257:1;27250:88;27357:4;27354:1;27347:15;27381:4;27378:1;27371:15;27398:117;27507:1;27504;27497:12;27521:117;27630:1;27627;27620:12;27644:117;27753:1;27750;27743:12;27767:117;27876:1;27873;27866:12;27890:117;27999:1;27996;27989:12;28013:117;28122:1;28119;28112:12;28136:102;28177:6;28228:2;28224:7;28219:2;28212:5;28208:14;28204:28;28194:38;;28136:102;;;:::o;28244:176::-;28384:28;28380:1;28372:6;28368:14;28361:52;28244:176;:::o;28426:174::-;28566:26;28562:1;28554:6;28550:14;28543:50;28426:174;:::o;28606:173::-;28746:25;28742:1;28734:6;28730:14;28723:49;28606:173;:::o;28785:170::-;28925:22;28921:1;28913:6;28909:14;28902:46;28785:170;:::o;28961:169::-;29101:21;29097:1;29089:6;29085:14;29078:45;28961:169;:::o;29136:173::-;29276:25;29272:1;29264:6;29260:14;29253:49;29136:173;:::o;29315:176::-;29455:28;29451:1;29443:6;29439:14;29432:52;29315:176;:::o;29497:158::-;29637:10;29633:1;29625:6;29621:14;29614:34;29497:158;:::o;29661:168::-;29801:20;29797:1;29789:6;29785:14;29778:44;29661:168;:::o;29835:176::-;29975:28;29971:1;29963:6;29959:14;29952:52;29835:176;:::o;30017:177::-;30157:29;30153:1;30145:6;30141:14;30134:53;30017:177;:::o;30200:175::-;30340:27;30336:1;30328:6;30324:14;30317:51;30200:175;:::o;30381:174::-;30521:26;30517:1;30509:6;30505:14;30498:50;30381:174;:::o;30561:122::-;30634:24;30652:5;30634:24;:::i;:::-;30627:5;30624:35;30614:63;;30673:1;30670;30663:12;30614:63;30561:122;:::o;30689:116::-;30759:21;30774:5;30759:21;:::i;:::-;30752:5;30749:32;30739:60;;30795:1;30792;30785:12;30739:60;30689:116;:::o;30811:120::-;30883:23;30900:5;30883:23;:::i;:::-;30876:5;30873:34;30863:62;;30921:1;30918;30911:12;30863:62;30811:120;:::o;30937:122::-;31010:24;31028:5;31010:24;:::i;:::-;31003:5;31000:35;30990:63;;31049:1;31046;31039:12;30990:63;30937:122;:::o

Swarm Source

ipfs://0c2f599a1890a5b0f46a4c98c7ff1ce111be087ab4191a9d3869826d8145aff1
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.