ETH Price: $3,045.64 (+4.47%)

Token

The Trailers (TRAILERS)
 

Overview

Max Total Supply

1,137 TRAILERS

Holders

523

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
crypt2kennedy.eth
Balance
3 TRAILERS
0x72edb8b8b9ca70225ddaecb82abb0dc43cde931f
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:
trailersNFT

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 14 : trailersNFT.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.4.22 <0.9.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
// import "@openzeppelin/contracts/utils/Counters.sol";

contract trailersNFT is Ownable, ERC721{

    using SafeMath for uint256;
    
     // address private mainContract = "";
    
    bool public isURIFrozen = true;
    
    string public baseURI = "https://";
    
    uint256 public MAX_SUPPLY = 8500;
    
    uint256 constant public MINT_PRICE = 0.07 ether;
    
    bool public mintIsActive = false;
    
    uint256 public MAX_MINT = 10;
    
    uint256 private LOT_NO = 85;
    
    uint256 private VERIFIER;
    
    uint256 private lotSize = 100;
    
    uint256 public totalSupply = 0;
    
    mapping(uint256 => uint256) private lotTracker;
    
    uint256[] private mintableTokens;
    
    uint256[] private minted;

    constructor(string memory name, string memory symbol)
        ERC721(name, symbol)
    {
        for(uint i = 0; i < LOT_NO; i++) {
           mintableTokens.push(i*lotSize);
        }
    }

    function _baseURI() internal view override returns (string memory)  {
        return baseURI;
    }
    
    function toggleURI() external onlyOwner {
        isURIFrozen = !isURIFrozen;
    }
    
    function setBaseURI(string calldata newURI) external onlyOwner {
        require(!isURIFrozen, "URI is Frozen");
        baseURI = newURI;
    }
    
    function setVerifier( uint256 verifier) external onlyOwner {
        VERIFIER = verifier;
    }
    
    function reserveTrailers() public onlyOwner {        
        for (uint i = 0; i < 30; i++) {
            uint256 lot = (1634500097242 * (i+1)) % mintableTokens.length;
            
               lotTracker[lot] += 1; 
               uint256 mintID = mintableTokens[lot]+lotTracker[lot];
               minted.push(mintID);
               _safeMint(msg.sender, mintID);
               totalSupply++;
              
            
            if(lotTracker[lot] >= lotSize){
                mintableTokens[lot] = mintableTokens[mintableTokens.length - 1];
                lotTracker[lot] = lotTracker[mintableTokens.length - 1];
                mintableTokens.pop();
            }
        }
    }
    
    function mintTrailer(uint256 randomiser, uint256 tokenQuantity, uint256 verifier) external payable {
        
        require(totalSupply < MAX_SUPPLY, "Sold Out");
        require(mintIsActive, "Minting has not commenced or has ended");
        require(totalSupply + tokenQuantity <= MAX_SUPPLY, "Requested Quantity Less than Available");
        require(tokenQuantity <= MAX_MINT, "You can only mint 20");
        require(VERIFIER == verifier, "Illegal Mint Action");
        require(MINT_PRICE * tokenQuantity <= msg.value, "Insufficient Funds");
        
        
        for(uint i = 0; i < tokenQuantity; i++) {
            uint256 lot = (randomiser * (i+1)) % mintableTokens.length;
            
                lotTracker[lot] += 1; 
                uint256 mintID = mintableTokens[lot]+lotTracker[lot];
                minted.push(mintID);
               _safeMint(msg.sender, mintID);
               totalSupply++;
            
            if(lotTracker[lot] >= lotSize){
                mintableTokens[lot] = mintableTokens[mintableTokens.length - 1];
                lotTracker[lot] = lotTracker[mintableTokens.length - 1];
                mintableTokens.pop();
            }
        }
      
    }
    
    function burn(uint256 _tokenId) public {
        require(!mintIsActive, "Ongoing Sale");
        require(_exists(_tokenId), "Token Does Not Exist");
        require(msg.sender == ownerOf(_tokenId), "Not Owner");
        totalSupply -= 1;
        _burn(_tokenId);
    }
    
    function toggleMint() external onlyOwner {
        mintIsActive = !mintIsActive;
    }

    function withdrawAll(address treasury) external payable onlyOwner {
        require(payable(treasury).send(address(this).balance));
    }
}

File 2 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

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

File 3 of 14 : ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 4 of 14 : IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 5 of 14 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 6 of 14 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 7 of 14 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 8 of 14 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 9 of 14 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

File 10 of 14 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 11 of 14 : Strings.sol
// SPDX-License-Identifier: MIT

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 12 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 13 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 14 of 14 : SafeMath.sol
// SPDX-License-Identifier: MIT

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 no longer needed starting with Solidity 0.8. 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 substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "london",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

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":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","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":"isURIFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"randomiser","type":"uint256"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"},{"internalType":"uint256","name":"verifier","type":"uint256"}],"name":"mintTrailer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTrailers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"verifier","type":"uint256"}],"name":"setVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleURI","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"treasury","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526001600760006101000a81548160ff0219169083151502179055506040518060400160405280600881526020017f68747470733a2f2f000000000000000000000000000000000000000000000000815250600890805190602001906200006c9291906200025c565b506121346009556000600a60006101000a81548160ff021916908315150217905550600a600b556055600c556064600e556000600f55348015620000af57600080fd5b50604051620048d6380380620048d68339818101604052810190620000d59190620004a9565b8181620000f7620000eb6200019060201b60201c565b6200019860201b60201c565b81600190805190602001906200010f9291906200025c565b508060029080519060200190620001289291906200025c565b50505060005b600c5481101562000187576011600e54826200014b919062000567565b908060018154018082558091505060019003906000526020600020016000909190919091505580806200017e90620005c8565b9150506200012e565b5050506200067b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026a9062000645565b90600052602060002090601f0160209004810192826200028e5760008555620002da565b82601f10620002a957805160ff1916838001178555620002da565b82800160010185558215620002da579182015b82811115620002d9578251825591602001919060010190620002bc565b5b509050620002e99190620002ed565b5090565b5b8082111562000308576000816000905550600101620002ee565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000375826200032a565b810181811067ffffffffffffffff821117156200039757620003966200033b565b5b80604052505050565b6000620003ac6200030c565b9050620003ba82826200036a565b919050565b600067ffffffffffffffff821115620003dd57620003dc6200033b565b5b620003e8826200032a565b9050602081019050919050565b60005b8381101562000415578082015181840152602081019050620003f8565b8381111562000425576000848401525b50505050565b6000620004426200043c84620003bf565b620003a0565b90508281526020810184848401111562000461576200046062000325565b5b6200046e848285620003f5565b509392505050565b600082601f8301126200048e576200048d62000320565b5b8151620004a08482602086016200042b565b91505092915050565b60008060408385031215620004c357620004c262000316565b5b600083015167ffffffffffffffff811115620004e457620004e36200031b565b5b620004f28582860162000476565b925050602083015167ffffffffffffffff8111156200051657620005156200031b565b5b620005248582860162000476565b9150509250929050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000574826200052e565b915062000581836200052e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620005bd57620005bc62000538565b5b828202905092915050565b6000620005d5826200052e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200060b576200060a62000538565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065e57607f821691505b6020821081141562000675576200067462000616565b5b50919050565b61424b806200068b6000396000f3fe6080604052600436106101d85760003560e01c8063715018a611610102578063d3dd5fe011610095578063f2fde38b11610064578063f2fde38b14610677578063fa09e630146106a0578063fcd4b212146106bc578063fe79f211146106e7576101d8565b8063d3dd5fe0146105e1578063d5be21bb146105f8578063e985e9c51461060f578063f0292a031461064c576101d8565b8063a22cb465116100d1578063a22cb46514610527578063b88d4fde14610550578063c002d23d14610579578063c87b56dd146105a4576101d8565b8063715018a61461049e57806383e67dc6146104b55780638da5cb5b146104d157806395d89b41146104fc576101d8565b806342842e0e1161017a57806355f804b31161014957806355f804b3146103d05780636352211e146103f95780636c0360eb1461043657806370a0823114610461576101d8565b806342842e0e1461032a57806342966c6814610353578063471a42941461037c5780634d7547b8146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d657806332cb6b0c146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612ac3565b6106fe565b6040516102119190612b0b565b60405180910390f35b34801561022657600080fd5b5061022f6107e0565b60405161023c9190612bbf565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612c17565b610872565b6040516102799190612c85565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612ccc565b6108f7565b005b3480156102b757600080fd5b506102c0610a0f565b6040516102cd9190612d1b565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612d36565b610a15565b005b34801561030b57600080fd5b50610314610a75565b6040516103219190612d1b565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190612d36565b610a7b565b005b34801561035f57600080fd5b5061037a60048036038101906103759190612c17565b610a9b565b005b34801561038857600080fd5b50610391610bcf565b60405161039e9190612b0b565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190612c17565b610be2565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190612dee565b610c68565b005b34801561040557600080fd5b50610420600480360381019061041b9190612c17565b610d4a565b60405161042d9190612c85565b60405180910390f35b34801561044257600080fd5b5061044b610dfc565b6040516104589190612bbf565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190612e3b565b610e8a565b6040516104959190612d1b565b60405180910390f35b3480156104aa57600080fd5b506104b3610f42565b005b6104cf60048036038101906104ca9190612e68565b610fca565b005b3480156104dd57600080fd5b506104e661136b565b6040516104f39190612c85565b60405180910390f35b34801561050857600080fd5b50610511611394565b60405161051e9190612bbf565b60405180910390f35b34801561053357600080fd5b5061054e60048036038101906105499190612ee7565b611426565b005b34801561055c57600080fd5b5061057760048036038101906105729190613057565b6115a7565b005b34801561058557600080fd5b5061058e611609565b60405161059b9190612d1b565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190612c17565b611614565b6040516105d89190612bbf565b60405180910390f35b3480156105ed57600080fd5b506105f66116bb565b005b34801561060457600080fd5b5061060d611763565b005b34801561061b57600080fd5b50610636600480360381019061063191906130da565b6119bf565b6040516106439190612b0b565b60405180910390f35b34801561065857600080fd5b50610661611a53565b60405161066e9190612d1b565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190612e3b565b611a59565b005b6106ba60048036038101906106b59190612e3b565b611b51565b005b3480156106c857600080fd5b506106d1611c0e565b6040516106de9190612b0b565b60405180910390f35b3480156106f357600080fd5b506106fc611c21565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d957506107d882611cc9565b5b9050919050565b6060600180546107ef90613149565b80601f016020809104026020016040519081016040528092919081815260200182805461081b90613149565b80156108685780601f1061083d57610100808354040283529160200191610868565b820191906000526020600020905b81548152906001019060200180831161084b57829003601f168201915b5050505050905090565b600061087d82611d33565b6108bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b3906131ed565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090282610d4a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096a9061327f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610992611d9f565b73ffffffffffffffffffffffffffffffffffffffff1614806109c157506109c0816109bb611d9f565b6119bf565b5b610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f790613311565b60405180910390fd5b610a0a8383611da7565b505050565b600f5481565b610a26610a20611d9f565b82611e60565b610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906133a3565b60405180910390fd5b610a70838383611f3e565b505050565b60095481565b610a96838383604051806020016040528060008152506115a7565b505050565b600a60009054906101000a900460ff1615610aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae29061340f565b60405180910390fd5b610af481611d33565b610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a9061347b565b60405180910390fd5b610b3c81610d4a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906134e7565b60405180910390fd5b6001600f6000828254610bbc9190613536565b92505081905550610bcc8161219a565b50565b600a60009054906101000a900460ff1681565b610bea611d9f565b73ffffffffffffffffffffffffffffffffffffffff16610c0861136b565b73ffffffffffffffffffffffffffffffffffffffff1614610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c55906135b6565b60405180910390fd5b80600d8190555050565b610c70611d9f565b73ffffffffffffffffffffffffffffffffffffffff16610c8e61136b565b73ffffffffffffffffffffffffffffffffffffffff1614610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb906135b6565b60405180910390fd5b600760009054906101000a900460ff1615610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613622565b60405180910390fd5b818160089190610d459291906129b4565b505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906136b4565b60405180910390fd5b80915050919050565b60088054610e0990613149565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3590613149565b8015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290613746565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f4a611d9f565b73ffffffffffffffffffffffffffffffffffffffff16610f6861136b565b73ffffffffffffffffffffffffffffffffffffffff1614610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb5906135b6565b60405180910390fd5b610fc860006122ab565b565b600954600f5410611010576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611007906137b2565b60405180910390fd5b600a60009054906101000a900460ff1661105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690613844565b60405180910390fd5b60095482600f546110709190613864565b11156110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a89061392c565b60405180910390fd5b600b548211156110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90613998565b60405180910390fd5b80600d541461113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190613a04565b60405180910390fd5b348266f8b0a10e47000061114e9190613a24565b111561118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690613aca565b60405180910390fd5b60005b828110156113655760006011805490506001836111af9190613864565b866111ba9190613a24565b6111c49190613b19565b905060016010600083815260200190815260200160002060008282546111ea9190613864565b92505081905550600060106000838152602001908152602001600020546011838154811061121b5761121a613b4a565b5b90600052602060002001546112309190613864565b90506012819080600181540180825580915050600190039060005260206000200160009091909190915055611265338261236f565b600f600081548092919061127890613b79565b9190505550600e5460106000848152602001908152602001600020541061135057601160016011805490506112ad9190613536565b815481106112be576112bd613b4a565b5b9060005260206000200154601183815481106112dd576112dc613b4a565b5b90600052602060002001819055506010600060016011805490506113019190613536565b8152602001908152602001600020546010600084815260200190815260200160002081905550601180548061133957611338613bc2565b5b600190038181906000526020600020016000905590555b5050808061135d90613b79565b915050611192565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546113a390613149565b80601f01602080910402602001604051908101604052809291908181526020018280546113cf90613149565b801561141c5780601f106113f15761010080835404028352916020019161141c565b820191906000526020600020905b8154815290600101906020018083116113ff57829003601f168201915b5050505050905090565b61142e611d9f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561149c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149390613c3d565b60405180910390fd5b80600660006114a9611d9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611556611d9f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161159b9190612b0b565b60405180910390a35050565b6115b86115b2611d9f565b83611e60565b6115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee906133a3565b60405180910390fd5b6116038484848461238d565b50505050565b66f8b0a10e47000081565b606061161f82611d33565b61165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590613ccf565b60405180910390fd5b60006116686123e9565b9050600081511161168857604051806020016040528060008152506116b3565b806116928461247b565b6040516020016116a3929190613d2b565b6040516020818303038152906040525b915050919050565b6116c3611d9f565b73ffffffffffffffffffffffffffffffffffffffff166116e161136b565b73ffffffffffffffffffffffffffffffffffffffff1614611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e906135b6565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b61176b611d9f565b73ffffffffffffffffffffffffffffffffffffffff1661178961136b565b73ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d6906135b6565b60405180910390fd5b60005b601e8110156119bc5760006011805490506001836118009190613864565b65017c8fcc34da6118119190613a24565b61181b9190613b19565b905060016010600083815260200190815260200160002060008282546118419190613864565b92505081905550600060106000838152602001908152602001600020546011838154811061187257611871613b4a565b5b90600052602060002001546118879190613864565b905060128190806001815401808255809150506001900390600052602060002001600090919091909150556118bc338261236f565b600f60008154809291906118cf90613b79565b9190505550600e546010600084815260200190815260200160002054106119a757601160016011805490506119049190613536565b8154811061191557611914613b4a565b5b90600052602060002001546011838154811061193457611933613b4a565b5b90600052602060002001819055506010600060016011805490506119589190613536565b815260200190815260200160002054601060008481526020019081526020016000208190555060118054806119905761198f613bc2565b5b600190038181906000526020600020016000905590555b505080806119b490613b79565b9150506117e2565b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b611a61611d9f565b73ffffffffffffffffffffffffffffffffffffffff16611a7f61136b565b73ffffffffffffffffffffffffffffffffffffffff1614611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc906135b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613dc1565b60405180910390fd5b611b4e816122ab565b50565b611b59611d9f565b73ffffffffffffffffffffffffffffffffffffffff16611b7761136b565b73ffffffffffffffffffffffffffffffffffffffff1614611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc4906135b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611c0b57600080fd5b50565b600760009054906101000a900460ff1681565b611c29611d9f565b73ffffffffffffffffffffffffffffffffffffffff16611c4761136b565b73ffffffffffffffffffffffffffffffffffffffff1614611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c94906135b6565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e1a83610d4a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e6b82611d33565b611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea190613e53565b60405180910390fd5b6000611eb583610d4a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f2457508373ffffffffffffffffffffffffffffffffffffffff16611f0c84610872565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f355750611f3481856119bf565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f5e82610d4a565b73ffffffffffffffffffffffffffffffffffffffff1614611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab90613ee5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b90613f77565b60405180910390fd5b61202f8383836125dc565b61203a600082611da7565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461208a9190613536565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e19190613864565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006121a582610d4a565b90506121b3816000846125dc565b6121be600083611da7565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220e9190613536565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123898282604051806020016040528060008152506125e1565b5050565b612398848484611f3e565b6123a48484848461263c565b6123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da90614009565b60405180910390fd5b50505050565b6060600880546123f890613149565b80601f016020809104026020016040519081016040528092919081815260200182805461242490613149565b80156124715780601f1061244657610100808354040283529160200191612471565b820191906000526020600020905b81548152906001019060200180831161245457829003601f168201915b5050505050905090565b606060008214156124c3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d7565b600082905060005b600082146124f55780806124de90613b79565b915050600a826124ee9190614029565b91506124cb565b60008167ffffffffffffffff81111561251157612510612f2c565b5b6040519080825280601f01601f1916602001820160405280156125435781602001600182028036833780820191505090505b5090505b600085146125d05760018261255c9190613536565b9150600a8561256b9190613b19565b60306125779190613864565b60f81b81838151811061258d5761258c613b4a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125c99190614029565b9450612547565b8093505050505b919050565b505050565b6125eb83836127d3565b6125f8600084848461263c565b612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262e90614009565b60405180910390fd5b505050565b600061265d8473ffffffffffffffffffffffffffffffffffffffff166129a1565b156127c6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612686611d9f565b8786866040518563ffffffff1660e01b81526004016126a894939291906140af565b602060405180830381600087803b1580156126c257600080fd5b505af19250505080156126f357506040513d601f19601f820116820180604052508101906126f09190614110565b60015b612776573d8060008114612723576040519150601f19603f3d011682016040523d82523d6000602084013e612728565b606091505b5060008151141561276e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276590614009565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127cb565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283a90614189565b60405180910390fd5b61284c81611d33565b1561288c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612883906141f5565b60405180910390fd5b612898600083836125dc565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e89190613864565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546129c090613149565b90600052602060002090601f0160209004810192826129e25760008555612a29565b82601f106129fb57803560ff1916838001178555612a29565b82800160010185558215612a29579182015b82811115612a28578235825591602001919060010190612a0d565b5b509050612a369190612a3a565b5090565b5b80821115612a53576000816000905550600101612a3b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612aa081612a6b565b8114612aab57600080fd5b50565b600081359050612abd81612a97565b92915050565b600060208284031215612ad957612ad8612a61565b5b6000612ae784828501612aae565b91505092915050565b60008115159050919050565b612b0581612af0565b82525050565b6000602082019050612b206000830184612afc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b60578082015181840152602081019050612b45565b83811115612b6f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b9182612b26565b612b9b8185612b31565b9350612bab818560208601612b42565b612bb481612b75565b840191505092915050565b60006020820190508181036000830152612bd98184612b86565b905092915050565b6000819050919050565b612bf481612be1565b8114612bff57600080fd5b50565b600081359050612c1181612beb565b92915050565b600060208284031215612c2d57612c2c612a61565b5b6000612c3b84828501612c02565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c6f82612c44565b9050919050565b612c7f81612c64565b82525050565b6000602082019050612c9a6000830184612c76565b92915050565b612ca981612c64565b8114612cb457600080fd5b50565b600081359050612cc681612ca0565b92915050565b60008060408385031215612ce357612ce2612a61565b5b6000612cf185828601612cb7565b9250506020612d0285828601612c02565b9150509250929050565b612d1581612be1565b82525050565b6000602082019050612d306000830184612d0c565b92915050565b600080600060608486031215612d4f57612d4e612a61565b5b6000612d5d86828701612cb7565b9350506020612d6e86828701612cb7565b9250506040612d7f86828701612c02565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612dae57612dad612d89565b5b8235905067ffffffffffffffff811115612dcb57612dca612d8e565b5b602083019150836001820283011115612de757612de6612d93565b5b9250929050565b60008060208385031215612e0557612e04612a61565b5b600083013567ffffffffffffffff811115612e2357612e22612a66565b5b612e2f85828601612d98565b92509250509250929050565b600060208284031215612e5157612e50612a61565b5b6000612e5f84828501612cb7565b91505092915050565b600080600060608486031215612e8157612e80612a61565b5b6000612e8f86828701612c02565b9350506020612ea086828701612c02565b9250506040612eb186828701612c02565b9150509250925092565b612ec481612af0565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b60008060408385031215612efe57612efd612a61565b5b6000612f0c85828601612cb7565b9250506020612f1d85828601612ed2565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f6482612b75565b810181811067ffffffffffffffff82111715612f8357612f82612f2c565b5b80604052505050565b6000612f96612a57565b9050612fa28282612f5b565b919050565b600067ffffffffffffffff821115612fc257612fc1612f2c565b5b612fcb82612b75565b9050602081019050919050565b82818337600083830152505050565b6000612ffa612ff584612fa7565b612f8c565b90508281526020810184848401111561301657613015612f27565b5b613021848285612fd8565b509392505050565b600082601f83011261303e5761303d612d89565b5b813561304e848260208601612fe7565b91505092915050565b6000806000806080858703121561307157613070612a61565b5b600061307f87828801612cb7565b945050602061309087828801612cb7565b93505060406130a187828801612c02565b925050606085013567ffffffffffffffff8111156130c2576130c1612a66565b5b6130ce87828801613029565b91505092959194509250565b600080604083850312156130f1576130f0612a61565b5b60006130ff85828601612cb7565b925050602061311085828601612cb7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061316157607f821691505b602082108114156131755761317461311a565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006131d7602c83612b31565b91506131e28261317b565b604082019050919050565b60006020820190508181036000830152613206816131ca565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613269602183612b31565b91506132748261320d565b604082019050919050565b600060208201905081810360008301526132988161325c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006132fb603883612b31565b91506133068261329f565b604082019050919050565b6000602082019050818103600083015261332a816132ee565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061338d603183612b31565b915061339882613331565b604082019050919050565b600060208201905081810360008301526133bc81613380565b9050919050565b7f4f6e676f696e672053616c650000000000000000000000000000000000000000600082015250565b60006133f9600c83612b31565b9150613404826133c3565b602082019050919050565b60006020820190508181036000830152613428816133ec565b9050919050565b7f546f6b656e20446f6573204e6f74204578697374000000000000000000000000600082015250565b6000613465601483612b31565b91506134708261342f565b602082019050919050565b6000602082019050818103600083015261349481613458565b9050919050565b7f4e6f74204f776e65720000000000000000000000000000000000000000000000600082015250565b60006134d1600983612b31565b91506134dc8261349b565b602082019050919050565b60006020820190508181036000830152613500816134c4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061354182612be1565b915061354c83612be1565b92508282101561355f5761355e613507565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135a0602083612b31565b91506135ab8261356a565b602082019050919050565b600060208201905081810360008301526135cf81613593565b9050919050565b7f5552492069732046726f7a656e00000000000000000000000000000000000000600082015250565b600061360c600d83612b31565b9150613617826135d6565b602082019050919050565b6000602082019050818103600083015261363b816135ff565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061369e602983612b31565b91506136a982613642565b604082019050919050565b600060208201905081810360008301526136cd81613691565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613730602a83612b31565b915061373b826136d4565b604082019050919050565b6000602082019050818103600083015261375f81613723565b9050919050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b600061379c600883612b31565b91506137a782613766565b602082019050919050565b600060208201905081810360008301526137cb8161378f565b9050919050565b7f4d696e74696e6720686173206e6f7420636f6d6d656e636564206f722068617360008201527f20656e6465640000000000000000000000000000000000000000000000000000602082015250565b600061382e602683612b31565b9150613839826137d2565b604082019050919050565b6000602082019050818103600083015261385d81613821565b9050919050565b600061386f82612be1565b915061387a83612be1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138af576138ae613507565b5b828201905092915050565b7f526571756573746564205175616e74697479204c657373207468616e2041766160008201527f696c61626c650000000000000000000000000000000000000000000000000000602082015250565b6000613916602683612b31565b9150613921826138ba565b604082019050919050565b6000602082019050818103600083015261394581613909565b9050919050565b7f596f752063616e206f6e6c79206d696e74203230000000000000000000000000600082015250565b6000613982601483612b31565b915061398d8261394c565b602082019050919050565b600060208201905081810360008301526139b181613975565b9050919050565b7f496c6c6567616c204d696e7420416374696f6e00000000000000000000000000600082015250565b60006139ee601383612b31565b91506139f9826139b8565b602082019050919050565b60006020820190508181036000830152613a1d816139e1565b9050919050565b6000613a2f82612be1565b9150613a3a83612be1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a7357613a72613507565b5b828202905092915050565b7f496e73756666696369656e742046756e64730000000000000000000000000000600082015250565b6000613ab4601283612b31565b9150613abf82613a7e565b602082019050919050565b60006020820190508181036000830152613ae381613aa7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b2482612be1565b9150613b2f83612be1565b925082613b3f57613b3e613aea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b8482612be1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bb757613bb6613507565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613c27601983612b31565b9150613c3282613bf1565b602082019050919050565b60006020820190508181036000830152613c5681613c1a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613cb9602f83612b31565b9150613cc482613c5d565b604082019050919050565b60006020820190508181036000830152613ce881613cac565b9050919050565b600081905092915050565b6000613d0582612b26565b613d0f8185613cef565b9350613d1f818560208601612b42565b80840191505092915050565b6000613d378285613cfa565b9150613d438284613cfa565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dab602683612b31565b9150613db682613d4f565b604082019050919050565b60006020820190508181036000830152613dda81613d9e565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e3d602c83612b31565b9150613e4882613de1565b604082019050919050565b60006020820190508181036000830152613e6c81613e30565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613ecf602983612b31565b9150613eda82613e73565b604082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f61602483612b31565b9150613f6c82613f05565b604082019050919050565b60006020820190508181036000830152613f9081613f54565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613ff3603283612b31565b9150613ffe82613f97565b604082019050919050565b6000602082019050818103600083015261402281613fe6565b9050919050565b600061403482612be1565b915061403f83612be1565b92508261404f5761404e613aea565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006140818261405a565b61408b8185614065565b935061409b818560208601612b42565b6140a481612b75565b840191505092915050565b60006080820190506140c46000830187612c76565b6140d16020830186612c76565b6140de6040830185612d0c565b81810360608301526140f08184614076565b905095945050505050565b60008151905061410a81612a97565b92915050565b60006020828403121561412657614125612a61565b5b6000614134848285016140fb565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614173602083612b31565b915061417e8261413d565b602082019050919050565b600060208201905081810360008301526141a281614166565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006141df601c83612b31565b91506141ea826141a9565b602082019050919050565b6000602082019050818103600083015261420e816141d2565b905091905056fea2646970667358221220b3a47c4d1dac0e872bd9ba72794ec297221d915a8b76e0e4af0aa51ffaa51b0864736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c54686520547261696c65727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008545241494c455253000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101d85760003560e01c8063715018a611610102578063d3dd5fe011610095578063f2fde38b11610064578063f2fde38b14610677578063fa09e630146106a0578063fcd4b212146106bc578063fe79f211146106e7576101d8565b8063d3dd5fe0146105e1578063d5be21bb146105f8578063e985e9c51461060f578063f0292a031461064c576101d8565b8063a22cb465116100d1578063a22cb46514610527578063b88d4fde14610550578063c002d23d14610579578063c87b56dd146105a4576101d8565b8063715018a61461049e57806383e67dc6146104b55780638da5cb5b146104d157806395d89b41146104fc576101d8565b806342842e0e1161017a57806355f804b31161014957806355f804b3146103d05780636352211e146103f95780636c0360eb1461043657806370a0823114610461576101d8565b806342842e0e1461032a57806342966c6814610353578063471a42941461037c5780634d7547b8146103a7576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d657806332cb6b0c146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612ac3565b6106fe565b6040516102119190612b0b565b60405180910390f35b34801561022657600080fd5b5061022f6107e0565b60405161023c9190612bbf565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612c17565b610872565b6040516102799190612c85565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612ccc565b6108f7565b005b3480156102b757600080fd5b506102c0610a0f565b6040516102cd9190612d1b565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612d36565b610a15565b005b34801561030b57600080fd5b50610314610a75565b6040516103219190612d1b565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190612d36565b610a7b565b005b34801561035f57600080fd5b5061037a60048036038101906103759190612c17565b610a9b565b005b34801561038857600080fd5b50610391610bcf565b60405161039e9190612b0b565b60405180910390f35b3480156103b357600080fd5b506103ce60048036038101906103c99190612c17565b610be2565b005b3480156103dc57600080fd5b506103f760048036038101906103f29190612dee565b610c68565b005b34801561040557600080fd5b50610420600480360381019061041b9190612c17565b610d4a565b60405161042d9190612c85565b60405180910390f35b34801561044257600080fd5b5061044b610dfc565b6040516104589190612bbf565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190612e3b565b610e8a565b6040516104959190612d1b565b60405180910390f35b3480156104aa57600080fd5b506104b3610f42565b005b6104cf60048036038101906104ca9190612e68565b610fca565b005b3480156104dd57600080fd5b506104e661136b565b6040516104f39190612c85565b60405180910390f35b34801561050857600080fd5b50610511611394565b60405161051e9190612bbf565b60405180910390f35b34801561053357600080fd5b5061054e60048036038101906105499190612ee7565b611426565b005b34801561055c57600080fd5b5061057760048036038101906105729190613057565b6115a7565b005b34801561058557600080fd5b5061058e611609565b60405161059b9190612d1b565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190612c17565b611614565b6040516105d89190612bbf565b60405180910390f35b3480156105ed57600080fd5b506105f66116bb565b005b34801561060457600080fd5b5061060d611763565b005b34801561061b57600080fd5b50610636600480360381019061063191906130da565b6119bf565b6040516106439190612b0b565b60405180910390f35b34801561065857600080fd5b50610661611a53565b60405161066e9190612d1b565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190612e3b565b611a59565b005b6106ba60048036038101906106b59190612e3b565b611b51565b005b3480156106c857600080fd5b506106d1611c0e565b6040516106de9190612b0b565b60405180910390f35b3480156106f357600080fd5b506106fc611c21565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107d957506107d882611cc9565b5b9050919050565b6060600180546107ef90613149565b80601f016020809104026020016040519081016040528092919081815260200182805461081b90613149565b80156108685780601f1061083d57610100808354040283529160200191610868565b820191906000526020600020905b81548152906001019060200180831161084b57829003601f168201915b5050505050905090565b600061087d82611d33565b6108bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b3906131ed565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061090282610d4a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096a9061327f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610992611d9f565b73ffffffffffffffffffffffffffffffffffffffff1614806109c157506109c0816109bb611d9f565b6119bf565b5b610a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f790613311565b60405180910390fd5b610a0a8383611da7565b505050565b600f5481565b610a26610a20611d9f565b82611e60565b610a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5c906133a3565b60405180910390fd5b610a70838383611f3e565b505050565b60095481565b610a96838383604051806020016040528060008152506115a7565b505050565b600a60009054906101000a900460ff1615610aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae29061340f565b60405180910390fd5b610af481611d33565b610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a9061347b565b60405180910390fd5b610b3c81610d4a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906134e7565b60405180910390fd5b6001600f6000828254610bbc9190613536565b92505081905550610bcc8161219a565b50565b600a60009054906101000a900460ff1681565b610bea611d9f565b73ffffffffffffffffffffffffffffffffffffffff16610c0861136b565b73ffffffffffffffffffffffffffffffffffffffff1614610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c55906135b6565b60405180910390fd5b80600d8190555050565b610c70611d9f565b73ffffffffffffffffffffffffffffffffffffffff16610c8e61136b565b73ffffffffffffffffffffffffffffffffffffffff1614610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb906135b6565b60405180910390fd5b600760009054906101000a900460ff1615610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613622565b60405180910390fd5b818160089190610d459291906129b4565b505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906136b4565b60405180910390fd5b80915050919050565b60088054610e0990613149565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3590613149565b8015610e825780601f10610e5757610100808354040283529160200191610e82565b820191906000526020600020905b815481529060010190602001808311610e6557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef290613746565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f4a611d9f565b73ffffffffffffffffffffffffffffffffffffffff16610f6861136b565b73ffffffffffffffffffffffffffffffffffffffff1614610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb5906135b6565b60405180910390fd5b610fc860006122ab565b565b600954600f5410611010576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611007906137b2565b60405180910390fd5b600a60009054906101000a900460ff1661105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105690613844565b60405180910390fd5b60095482600f546110709190613864565b11156110b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a89061392c565b60405180910390fd5b600b548211156110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90613998565b60405180910390fd5b80600d541461113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190613a04565b60405180910390fd5b348266f8b0a10e47000061114e9190613a24565b111561118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690613aca565b60405180910390fd5b60005b828110156113655760006011805490506001836111af9190613864565b866111ba9190613a24565b6111c49190613b19565b905060016010600083815260200190815260200160002060008282546111ea9190613864565b92505081905550600060106000838152602001908152602001600020546011838154811061121b5761121a613b4a565b5b90600052602060002001546112309190613864565b90506012819080600181540180825580915050600190039060005260206000200160009091909190915055611265338261236f565b600f600081548092919061127890613b79565b9190505550600e5460106000848152602001908152602001600020541061135057601160016011805490506112ad9190613536565b815481106112be576112bd613b4a565b5b9060005260206000200154601183815481106112dd576112dc613b4a565b5b90600052602060002001819055506010600060016011805490506113019190613536565b8152602001908152602001600020546010600084815260200190815260200160002081905550601180548061133957611338613bc2565b5b600190038181906000526020600020016000905590555b5050808061135d90613b79565b915050611192565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546113a390613149565b80601f01602080910402602001604051908101604052809291908181526020018280546113cf90613149565b801561141c5780601f106113f15761010080835404028352916020019161141c565b820191906000526020600020905b8154815290600101906020018083116113ff57829003601f168201915b5050505050905090565b61142e611d9f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561149c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149390613c3d565b60405180910390fd5b80600660006114a9611d9f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611556611d9f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161159b9190612b0b565b60405180910390a35050565b6115b86115b2611d9f565b83611e60565b6115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee906133a3565b60405180910390fd5b6116038484848461238d565b50505050565b66f8b0a10e47000081565b606061161f82611d33565b61165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590613ccf565b60405180910390fd5b60006116686123e9565b9050600081511161168857604051806020016040528060008152506116b3565b806116928461247b565b6040516020016116a3929190613d2b565b6040516020818303038152906040525b915050919050565b6116c3611d9f565b73ffffffffffffffffffffffffffffffffffffffff166116e161136b565b73ffffffffffffffffffffffffffffffffffffffff1614611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e906135b6565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b61176b611d9f565b73ffffffffffffffffffffffffffffffffffffffff1661178961136b565b73ffffffffffffffffffffffffffffffffffffffff16146117df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d6906135b6565b60405180910390fd5b60005b601e8110156119bc5760006011805490506001836118009190613864565b65017c8fcc34da6118119190613a24565b61181b9190613b19565b905060016010600083815260200190815260200160002060008282546118419190613864565b92505081905550600060106000838152602001908152602001600020546011838154811061187257611871613b4a565b5b90600052602060002001546118879190613864565b905060128190806001815401808255809150506001900390600052602060002001600090919091909150556118bc338261236f565b600f60008154809291906118cf90613b79565b9190505550600e546010600084815260200190815260200160002054106119a757601160016011805490506119049190613536565b8154811061191557611914613b4a565b5b90600052602060002001546011838154811061193457611933613b4a565b5b90600052602060002001819055506010600060016011805490506119589190613536565b815260200190815260200160002054601060008481526020019081526020016000208190555060118054806119905761198f613bc2565b5b600190038181906000526020600020016000905590555b505080806119b490613b79565b9150506117e2565b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b611a61611d9f565b73ffffffffffffffffffffffffffffffffffffffff16611a7f61136b565b73ffffffffffffffffffffffffffffffffffffffff1614611ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acc906135b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90613dc1565b60405180910390fd5b611b4e816122ab565b50565b611b59611d9f565b73ffffffffffffffffffffffffffffffffffffffff16611b7761136b565b73ffffffffffffffffffffffffffffffffffffffff1614611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc4906135b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611c0b57600080fd5b50565b600760009054906101000a900460ff1681565b611c29611d9f565b73ffffffffffffffffffffffffffffffffffffffff16611c4761136b565b73ffffffffffffffffffffffffffffffffffffffff1614611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c94906135b6565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e1a83610d4a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e6b82611d33565b611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea190613e53565b60405180910390fd5b6000611eb583610d4a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f2457508373ffffffffffffffffffffffffffffffffffffffff16611f0c84610872565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f355750611f3481856119bf565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f5e82610d4a565b73ffffffffffffffffffffffffffffffffffffffff1614611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab90613ee5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201b90613f77565b60405180910390fd5b61202f8383836125dc565b61203a600082611da7565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461208a9190613536565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e19190613864565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006121a582610d4a565b90506121b3816000846125dc565b6121be600083611da7565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220e9190613536565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123898282604051806020016040528060008152506125e1565b5050565b612398848484611f3e565b6123a48484848461263c565b6123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da90614009565b60405180910390fd5b50505050565b6060600880546123f890613149565b80601f016020809104026020016040519081016040528092919081815260200182805461242490613149565b80156124715780601f1061244657610100808354040283529160200191612471565b820191906000526020600020905b81548152906001019060200180831161245457829003601f168201915b5050505050905090565b606060008214156124c3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d7565b600082905060005b600082146124f55780806124de90613b79565b915050600a826124ee9190614029565b91506124cb565b60008167ffffffffffffffff81111561251157612510612f2c565b5b6040519080825280601f01601f1916602001820160405280156125435781602001600182028036833780820191505090505b5090505b600085146125d05760018261255c9190613536565b9150600a8561256b9190613b19565b60306125779190613864565b60f81b81838151811061258d5761258c613b4a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125c99190614029565b9450612547565b8093505050505b919050565b505050565b6125eb83836127d3565b6125f8600084848461263c565b612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262e90614009565b60405180910390fd5b505050565b600061265d8473ffffffffffffffffffffffffffffffffffffffff166129a1565b156127c6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612686611d9f565b8786866040518563ffffffff1660e01b81526004016126a894939291906140af565b602060405180830381600087803b1580156126c257600080fd5b505af19250505080156126f357506040513d601f19601f820116820180604052508101906126f09190614110565b60015b612776573d8060008114612723576040519150601f19603f3d011682016040523d82523d6000602084013e612728565b606091505b5060008151141561276e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276590614009565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127cb565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283a90614189565b60405180910390fd5b61284c81611d33565b1561288c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612883906141f5565b60405180910390fd5b612898600083836125dc565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e89190613864565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546129c090613149565b90600052602060002090601f0160209004810192826129e25760008555612a29565b82601f106129fb57803560ff1916838001178555612a29565b82800160010185558215612a29579182015b82811115612a28578235825591602001919060010190612a0d565b5b509050612a369190612a3a565b5090565b5b80821115612a53576000816000905550600101612a3b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612aa081612a6b565b8114612aab57600080fd5b50565b600081359050612abd81612a97565b92915050565b600060208284031215612ad957612ad8612a61565b5b6000612ae784828501612aae565b91505092915050565b60008115159050919050565b612b0581612af0565b82525050565b6000602082019050612b206000830184612afc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b60578082015181840152602081019050612b45565b83811115612b6f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b9182612b26565b612b9b8185612b31565b9350612bab818560208601612b42565b612bb481612b75565b840191505092915050565b60006020820190508181036000830152612bd98184612b86565b905092915050565b6000819050919050565b612bf481612be1565b8114612bff57600080fd5b50565b600081359050612c1181612beb565b92915050565b600060208284031215612c2d57612c2c612a61565b5b6000612c3b84828501612c02565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c6f82612c44565b9050919050565b612c7f81612c64565b82525050565b6000602082019050612c9a6000830184612c76565b92915050565b612ca981612c64565b8114612cb457600080fd5b50565b600081359050612cc681612ca0565b92915050565b60008060408385031215612ce357612ce2612a61565b5b6000612cf185828601612cb7565b9250506020612d0285828601612c02565b9150509250929050565b612d1581612be1565b82525050565b6000602082019050612d306000830184612d0c565b92915050565b600080600060608486031215612d4f57612d4e612a61565b5b6000612d5d86828701612cb7565b9350506020612d6e86828701612cb7565b9250506040612d7f86828701612c02565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612dae57612dad612d89565b5b8235905067ffffffffffffffff811115612dcb57612dca612d8e565b5b602083019150836001820283011115612de757612de6612d93565b5b9250929050565b60008060208385031215612e0557612e04612a61565b5b600083013567ffffffffffffffff811115612e2357612e22612a66565b5b612e2f85828601612d98565b92509250509250929050565b600060208284031215612e5157612e50612a61565b5b6000612e5f84828501612cb7565b91505092915050565b600080600060608486031215612e8157612e80612a61565b5b6000612e8f86828701612c02565b9350506020612ea086828701612c02565b9250506040612eb186828701612c02565b9150509250925092565b612ec481612af0565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b60008060408385031215612efe57612efd612a61565b5b6000612f0c85828601612cb7565b9250506020612f1d85828601612ed2565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f6482612b75565b810181811067ffffffffffffffff82111715612f8357612f82612f2c565b5b80604052505050565b6000612f96612a57565b9050612fa28282612f5b565b919050565b600067ffffffffffffffff821115612fc257612fc1612f2c565b5b612fcb82612b75565b9050602081019050919050565b82818337600083830152505050565b6000612ffa612ff584612fa7565b612f8c565b90508281526020810184848401111561301657613015612f27565b5b613021848285612fd8565b509392505050565b600082601f83011261303e5761303d612d89565b5b813561304e848260208601612fe7565b91505092915050565b6000806000806080858703121561307157613070612a61565b5b600061307f87828801612cb7565b945050602061309087828801612cb7565b93505060406130a187828801612c02565b925050606085013567ffffffffffffffff8111156130c2576130c1612a66565b5b6130ce87828801613029565b91505092959194509250565b600080604083850312156130f1576130f0612a61565b5b60006130ff85828601612cb7565b925050602061311085828601612cb7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061316157607f821691505b602082108114156131755761317461311a565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006131d7602c83612b31565b91506131e28261317b565b604082019050919050565b60006020820190508181036000830152613206816131ca565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613269602183612b31565b91506132748261320d565b604082019050919050565b600060208201905081810360008301526132988161325c565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006132fb603883612b31565b91506133068261329f565b604082019050919050565b6000602082019050818103600083015261332a816132ee565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061338d603183612b31565b915061339882613331565b604082019050919050565b600060208201905081810360008301526133bc81613380565b9050919050565b7f4f6e676f696e672053616c650000000000000000000000000000000000000000600082015250565b60006133f9600c83612b31565b9150613404826133c3565b602082019050919050565b60006020820190508181036000830152613428816133ec565b9050919050565b7f546f6b656e20446f6573204e6f74204578697374000000000000000000000000600082015250565b6000613465601483612b31565b91506134708261342f565b602082019050919050565b6000602082019050818103600083015261349481613458565b9050919050565b7f4e6f74204f776e65720000000000000000000000000000000000000000000000600082015250565b60006134d1600983612b31565b91506134dc8261349b565b602082019050919050565b60006020820190508181036000830152613500816134c4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061354182612be1565b915061354c83612be1565b92508282101561355f5761355e613507565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135a0602083612b31565b91506135ab8261356a565b602082019050919050565b600060208201905081810360008301526135cf81613593565b9050919050565b7f5552492069732046726f7a656e00000000000000000000000000000000000000600082015250565b600061360c600d83612b31565b9150613617826135d6565b602082019050919050565b6000602082019050818103600083015261363b816135ff565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061369e602983612b31565b91506136a982613642565b604082019050919050565b600060208201905081810360008301526136cd81613691565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613730602a83612b31565b915061373b826136d4565b604082019050919050565b6000602082019050818103600083015261375f81613723565b9050919050565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b600061379c600883612b31565b91506137a782613766565b602082019050919050565b600060208201905081810360008301526137cb8161378f565b9050919050565b7f4d696e74696e6720686173206e6f7420636f6d6d656e636564206f722068617360008201527f20656e6465640000000000000000000000000000000000000000000000000000602082015250565b600061382e602683612b31565b9150613839826137d2565b604082019050919050565b6000602082019050818103600083015261385d81613821565b9050919050565b600061386f82612be1565b915061387a83612be1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156138af576138ae613507565b5b828201905092915050565b7f526571756573746564205175616e74697479204c657373207468616e2041766160008201527f696c61626c650000000000000000000000000000000000000000000000000000602082015250565b6000613916602683612b31565b9150613921826138ba565b604082019050919050565b6000602082019050818103600083015261394581613909565b9050919050565b7f596f752063616e206f6e6c79206d696e74203230000000000000000000000000600082015250565b6000613982601483612b31565b915061398d8261394c565b602082019050919050565b600060208201905081810360008301526139b181613975565b9050919050565b7f496c6c6567616c204d696e7420416374696f6e00000000000000000000000000600082015250565b60006139ee601383612b31565b91506139f9826139b8565b602082019050919050565b60006020820190508181036000830152613a1d816139e1565b9050919050565b6000613a2f82612be1565b9150613a3a83612be1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a7357613a72613507565b5b828202905092915050565b7f496e73756666696369656e742046756e64730000000000000000000000000000600082015250565b6000613ab4601283612b31565b9150613abf82613a7e565b602082019050919050565b60006020820190508181036000830152613ae381613aa7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b2482612be1565b9150613b2f83612be1565b925082613b3f57613b3e613aea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b8482612be1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bb757613bb6613507565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613c27601983612b31565b9150613c3282613bf1565b602082019050919050565b60006020820190508181036000830152613c5681613c1a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613cb9602f83612b31565b9150613cc482613c5d565b604082019050919050565b60006020820190508181036000830152613ce881613cac565b9050919050565b600081905092915050565b6000613d0582612b26565b613d0f8185613cef565b9350613d1f818560208601612b42565b80840191505092915050565b6000613d378285613cfa565b9150613d438284613cfa565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dab602683612b31565b9150613db682613d4f565b604082019050919050565b60006020820190508181036000830152613dda81613d9e565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e3d602c83612b31565b9150613e4882613de1565b604082019050919050565b60006020820190508181036000830152613e6c81613e30565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613ecf602983612b31565b9150613eda82613e73565b604082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613f61602483612b31565b9150613f6c82613f05565b604082019050919050565b60006020820190508181036000830152613f9081613f54565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613ff3603283612b31565b9150613ffe82613f97565b604082019050919050565b6000602082019050818103600083015261402281613fe6565b9050919050565b600061403482612be1565b915061403f83612be1565b92508261404f5761404e613aea565b5b828204905092915050565b600081519050919050565b600082825260208201905092915050565b60006140818261405a565b61408b8185614065565b935061409b818560208601612b42565b6140a481612b75565b840191505092915050565b60006080820190506140c46000830187612c76565b6140d16020830186612c76565b6140de6040830185612d0c565b81810360608301526140f08184614076565b905095945050505050565b60008151905061410a81612a97565b92915050565b60006020828403121561412657614125612a61565b5b6000614134848285016140fb565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614173602083612b31565b915061417e8261413d565b602082019050919050565b600060208201905081810360008301526141a281614166565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006141df601c83612b31565b91506141ea826141a9565b602082019050919050565b6000602082019050818103600083015261420e816141d2565b905091905056fea2646970667358221220b3a47c4d1dac0e872bd9ba72794ec297221d915a8b76e0e4af0aa51ffaa51b0864736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000c54686520547261696c65727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008545241494c455253000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): The Trailers
Arg [1] : symbol (string): TRAILERS

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [3] : 54686520547261696c6572730000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 545241494c455253000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

382:3894:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1496:300:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2414:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3925:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3463:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;919:30:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4789:330:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;609:32:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5185:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3752:274:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;714:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1672:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1513:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2117:235:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;562:34:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1855:205:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1605:92:0;;;;;;;;;;;;;:::i;:::-;;2504:1236:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;973:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2576:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4209:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5430:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;654:47:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2744:329:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4038:88:13;;;;;;;;;;;;;:::i;:::-;;1781:711;;;;;;;;;;;;;:::i;:::-;;4565:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;759:28:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1846:189:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4134:139:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;519:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1416:85;;;;;;;;;;;;;:::i;:::-;;1496:300:1;1598:4;1648:25;1633:40;;;:11;:40;;;;:104;;;;1704:33;1689:48;;;:11;:48;;;;1633:104;:156;;;;1753:36;1777:11;1753:23;:36::i;:::-;1633:156;1614:175;;1496:300;;;:::o;2414:98::-;2468:13;2500:5;2493:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:98;:::o;3925:217::-;4001:7;4028:16;4036:7;4028;:16::i;:::-;4020:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4111:15;:24;4127:7;4111:24;;;;;;;;;;;;;;;;;;;;;4104:31;;3925:217;;;:::o;3463:401::-;3543:13;3559:23;3574:7;3559:14;:23::i;:::-;3543:39;;3606:5;3600:11;;:2;:11;;;;3592:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3697:5;3681:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3706:37;3723:5;3730:12;:10;:12::i;:::-;3706:16;:37::i;:::-;3681:62;3660:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3836:21;3845:2;3849:7;3836:8;:21::i;:::-;3533:331;3463:401;;:::o;919:30:13:-;;;;:::o;4789:330:1:-;4978:41;4997:12;:10;:12::i;:::-;5011:7;4978:18;:41::i;:::-;4970:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5084:28;5094:4;5100:2;5104:7;5084:9;:28::i;:::-;4789:330;;;:::o;609:32:13:-;;;;:::o;5185:179:1:-;5318:39;5335:4;5341:2;5345:7;5318:39;;;;;;;;;;;;:16;:39::i;:::-;5185:179;;;:::o;3752:274:13:-;3811:12;;;;;;;;;;;3810:13;3802:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;3859:17;3867:8;3859:7;:17::i;:::-;3851:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3934:17;3942:8;3934:7;:17::i;:::-;3920:31;;:10;:31;;;3912:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3991:1;3976:11;;:16;;;;;;;:::i;:::-;;;;;;;;4003:15;4009:8;4003:5;:15::i;:::-;3752:274;:::o;714:32::-;;;;;;;;;;;;;:::o;1672:97::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1753:8:13::1;1742;:19;;;;1672:97:::0;:::o;1513:147::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1596:11:13::1;;;;;;;;;;;1595:12;1587:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1646:6;;1636:7;:16;;;;;;;:::i;:::-;;1513:147:::0;;:::o;2117:235:1:-;2189:7;2208:13;2224:7;:16;2232:7;2224:16;;;;;;;;;;;;;;;;;;;;;2208:32;;2275:1;2258:19;;:5;:19;;;;2250:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2340:5;2333:12;;;2117:235;;;:::o;562:34:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1855:205:1:-;1927:7;1971:1;1954:19;;:5;:19;;;;1946:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2037:9;:16;2047:5;2037:16;;;;;;;;;;;;;;;;2030:23;;1855:205;;;:::o;1605:92:0:-;1196:12;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;2504:1236:13:-;2646:10;;2632:11;;:24;2624:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;2688:12;;;;;;;;;;;2680:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2793:10;;2776:13;2762:11;;:27;;;;:::i;:::-;:41;;2754:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;2882:8;;2865:13;:25;;2857:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2946:8;2934;;:20;2926:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3027:9;3010:13;691:10;2997:26;;;;:::i;:::-;:39;;2989:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;3094:6;3090:635;3110:13;3106:1;:17;3090:635;;;3145:11;3182:14;:21;;;;3176:1;3174;:3;;;;:::i;:::-;3160:10;:18;;;;:::i;:::-;3159:44;;;;:::i;:::-;3145:58;;3255:1;3236:10;:15;3247:3;3236:15;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;3276:14;3313:10;:15;3324:3;3313:15;;;;;;;;;;;;3293:14;3308:3;3293:19;;;;;;;;:::i;:::-;;;;;;;;;;:35;;;;:::i;:::-;3276:52;;3347:6;3359;3347:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3384:29;3394:10;3406:6;3384:9;:29::i;:::-;3431:11;;:13;;;;;;;;;:::i;:::-;;;;;;3495:7;;3476:10;:15;3487:3;3476:15;;;;;;;;;;;;:26;3473:241;;3544:14;3583:1;3559:14;:21;;;;:25;;;;:::i;:::-;3544:41;;;;;;;;:::i;:::-;;;;;;;;;;3522:14;3537:3;3522:19;;;;;;;;:::i;:::-;;;;;;;;;:63;;;;3622:10;:37;3657:1;3633:14;:21;;;;:25;;;;:::i;:::-;3622:37;;;;;;;;;;;;3604:10;:15;3615:3;3604:15;;;;;;;;;;;:55;;;;3678:14;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3473:241;3130:595;;3125:3;;;;;:::i;:::-;;;;3090:635;;;;2504:1236;;;:::o;973:85:0:-;1019:7;1045:6;;;;;;;;;;;1038:13;;973:85;:::o;2576:102:1:-;2632:13;2664:7;2657:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2576:102;:::o;4209:290::-;4323:12;:10;:12::i;:::-;4311:24;;:8;:24;;;;4303:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4421:8;4376:18;:32;4395:12;:10;:12::i;:::-;4376:32;;;;;;;;;;;;;;;:42;4409:8;4376:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4473:8;4444:48;;4459:12;:10;:12::i;:::-;4444:48;;;4483:8;4444:48;;;;;;:::i;:::-;;;;;;;;4209:290;;:::o;5430:320::-;5599:41;5618:12;:10;:12::i;:::-;5632:7;5599:18;:41::i;:::-;5591:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5704:39;5718:4;5724:2;5728:7;5737:5;5704:13;:39::i;:::-;5430:320;;;;:::o;654:47:13:-;691:10;654:47;:::o;2744:329:1:-;2817:13;2850:16;2858:7;2850;:16::i;:::-;2842:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2929:21;2953:10;:8;:10::i;:::-;2929:34;;3004:1;2986:7;2980:21;:25;:86;;;;;;;;;;;;;;;;;3032:7;3041:18;:7;:16;:18::i;:::-;3015:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2980:86;2973:93;;;2744:329;;;:::o;4038:88:13:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4106:12:13::1;;;;;;;;;;;4105:13;4090:12;;:28;;;;;;;;;;;;;;;;;;4038:88::o:0;1781:711::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1849:6:13::1;1844:641;1865:2;1861:1;:6;1844:641;;;1889:11;1929:14;:21;;;;1923:1;1921;:3;;;;:::i;:::-;1904:13;:21;;;;:::i;:::-;1903:47;;;;:::i;:::-;1889:61;;2001:1;1982:10;:15;1993:3;1982:15;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;2021:14;2058:10;:15;2069:3;2058:15;;;;;;;;;;;;2038:14;2053:3;2038:19;;;;;;;;:::i;:::-;;;;;;;;;;:35;;;;:::i;:::-;2021:52;;2091:6;2103;2091:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2128:29;2138:10;2150:6;2128:9;:29::i;:::-;2175:11;;:13;;;;;;;;;:::i;:::-;;;;;;2255:7;;2236:10;:15;2247:3;2236:15;;;;;;;;;;;;:26;2233:241;;2304:14;2343:1;2319:14;:21;;;;:25;;;;:::i;:::-;2304:41;;;;;;;;:::i;:::-;;;;;;;;;;2282:14;2297:3;2282:19;;;;;;;;:::i;:::-;;;;;;;;;:63;;;;2382:10;:37;2417:1;2393:14;:21;;;;:25;;;;:::i;:::-;2382:37;;;;;;;;;;;;2364:10;:15;2375:3;2364:15;;;;;;;;;;;:55;;;;2438:14;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2233:241;1874:611;;1869:3;;;;;:::i;:::-;;;;1844:641;;;;1781:711::o:0;4565:162:1:-;4662:4;4685:18;:25;4704:5;4685:25;;;;;;;;;;;;;;;:35;4711:8;4685:35;;;;;;;;;;;;;;;;;;;;;;;;;4678:42;;4565:162;;;;:::o;759:28:13:-;;;;:::o;1846:189:0:-;1196:12;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1954:1:::1;1934:22;;:8;:22;;;;1926:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2009:19;2019:8;2009:9;:19::i;:::-;1846:189:::0;:::o;4134:139:13:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4227:8:13::1;4219:22;;:45;4242:21;4219:45;;;;;;;;;;;;;;;;;;;;;;;4211:54;;;::::0;::::1;;4134:139:::0;:::o;519:30::-;;;;;;;;;;;;;:::o;1416:85::-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1482:11:13::1;;;;;;;;;;;1481:12;1467:11;;:26;;;;;;;;;;;;;;;;;;1416:85::o:0;763:155:10:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;7222:125:1:-;7287:4;7338:1;7310:30;;:7;:16;7318:7;7310:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7303:37;;7222:125;;;:::o;587:96:8:-;640:7;666:10;659:17;;587:96;:::o;11073:171:1:-;11174:2;11147:15;:24;11163:7;11147:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11229:7;11225:2;11191:46;;11200:23;11215:7;11200:14;:23::i;:::-;11191:46;;;;;;;;;;;;11073:171;;:::o;7505:344::-;7598:4;7622:16;7630:7;7622;:16::i;:::-;7614:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7697:13;7713:23;7728:7;7713:14;:23::i;:::-;7697:39;;7765:5;7754:16;;:7;:16;;;:51;;;;7798:7;7774:31;;:20;7786:7;7774:11;:20::i;:::-;:31;;;7754:51;:87;;;;7809:32;7826:5;7833:7;7809:16;:32::i;:::-;7754:87;7746:96;;;7505:344;;;;:::o;10402:560::-;10556:4;10529:31;;:23;10544:7;10529:14;:23::i;:::-;:31;;;10521:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10638:1;10624:16;;:2;:16;;;;10616:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10692:39;10713:4;10719:2;10723:7;10692:20;:39::i;:::-;10793:29;10810:1;10814:7;10793:8;:29::i;:::-;10852:1;10833:9;:15;10843:4;10833:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10880:1;10863:9;:13;10873:2;10863:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10910:2;10891:7;:16;10899:7;10891:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10947:7;10943:2;10928:27;;10937:4;10928:27;;;;;;;;;;;;10402:560;;;:::o;9730:348::-;9789:13;9805:23;9820:7;9805:14;:23::i;:::-;9789:39;;9839:48;9860:5;9875:1;9879:7;9839:20;:48::i;:::-;9925:29;9942:1;9946:7;9925:8;:29::i;:::-;9985:1;9965:9;:16;9975:5;9965:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;10003:7;:16;10011:7;10003:16;;;;;;;;;;;;9996:23;;;;;;;;;;;10063:7;10059:1;10035:36;;10044:5;10035:36;;;;;;;;;;;;9779:299;9730:348;:::o;2041:169:0:-;2096:16;2115:6;;;;;;;;;;;2096:25;;2140:8;2131:6;;:17;;;;;;;;;;;;;;;;;;2194:8;2163:40;;2184:8;2163:40;;;;;;;;;;;;2086:124;2041:169;:::o;8179:108:1:-;8254:26;8264:2;8268:7;8254:26;;;;;;;;;;;;:9;:26::i;:::-;8179:108;;:::o;6612:307::-;6763:28;6773:4;6779:2;6783:7;6763:9;:28::i;:::-;6809:48;6832:4;6838:2;6842:7;6851:5;6809:22;:48::i;:::-;6801:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6612:307;;;;:::o;1303:101:13:-;1355:13;1389:7;1382:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:101;:::o;275:703:9:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;13131:122:1:-;;;;:::o;8508:311::-;8633:18;8639:2;8643:7;8633:5;:18::i;:::-;8682:54;8713:1;8717:2;8721:7;8730:5;8682:22;:54::i;:::-;8661:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8508:311;;;:::o;11797:778::-;11947:4;11967:15;:2;:13;;;:15::i;:::-;11963:606;;;12018:2;12002:36;;;12039:12;:10;:12::i;:::-;12053:4;12059:7;12068:5;12002:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11998:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12258:1;12241:6;:13;:18;12237:266;;;12283:60;;;;;;;;;;:::i;:::-;;;;;;;;12237:266;12455:6;12449:13;12440:6;12436:2;12432:15;12425:38;11998:519;12134:41;;;12124:51;;;:6;:51;;;;12117:58;;;;;11963:606;12554:4;12547:11;;11797:778;;;;;;;:::o;9141:372::-;9234:1;9220:16;;:2;:16;;;;9212:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9292:16;9300:7;9292;:16::i;:::-;9291:17;9283:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9352:45;9381:1;9385:2;9389:7;9352:20;:45::i;:::-;9425:1;9408:9;:13;9418:2;9408:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9455:2;9436:7;:16;9444:7;9436:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9498:7;9494:2;9473:33;;9490:1;9473:33;;;;;;;;;;;;9141:372;;:::o;718:377:7:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6298:553;6356:8;6366:6;6416:3;6409:4;6401:6;6397:17;6393:27;6383:122;;6424:79;;:::i;:::-;6383:122;6537:6;6524:20;6514:30;;6567:18;6559:6;6556:30;6553:117;;;6589:79;;:::i;:::-;6553:117;6703:4;6695:6;6691:17;6679:29;;6757:3;6749:4;6741:6;6737:17;6727:8;6723:32;6720:41;6717:128;;;6764:79;;:::i;:::-;6717:128;6298:553;;;;;:::o;6857:529::-;6928:6;6936;6985:2;6973:9;6964:7;6960:23;6956:32;6953:119;;;6991:79;;:::i;:::-;6953:119;7139:1;7128:9;7124:17;7111:31;7169:18;7161:6;7158:30;7155:117;;;7191:79;;:::i;:::-;7155:117;7304:65;7361:7;7352:6;7341:9;7337:22;7304:65;:::i;:::-;7286:83;;;;7082:297;6857:529;;;;;:::o;7392:329::-;7451:6;7500:2;7488:9;7479:7;7475:23;7471:32;7468:119;;;7506:79;;:::i;:::-;7468:119;7626:1;7651:53;7696:7;7687:6;7676:9;7672:22;7651:53;:::i;:::-;7641:63;;7597:117;7392:329;;;;:::o;7727:619::-;7804:6;7812;7820;7869:2;7857:9;7848:7;7844:23;7840:32;7837:119;;;7875:79;;:::i;:::-;7837:119;7995:1;8020:53;8065:7;8056:6;8045:9;8041:22;8020:53;:::i;:::-;8010:63;;7966:117;8122:2;8148:53;8193:7;8184:6;8173:9;8169:22;8148:53;:::i;:::-;8138:63;;8093:118;8250:2;8276:53;8321:7;8312:6;8301:9;8297:22;8276:53;:::i;:::-;8266:63;;8221:118;7727:619;;;;;:::o;8352:116::-;8422:21;8437:5;8422:21;:::i;:::-;8415:5;8412:32;8402:60;;8458:1;8455;8448:12;8402:60;8352:116;:::o;8474:133::-;8517:5;8555:6;8542:20;8533:29;;8571:30;8595:5;8571:30;:::i;:::-;8474:133;;;;:::o;8613:468::-;8678:6;8686;8735:2;8723:9;8714:7;8710:23;8706:32;8703:119;;;8741:79;;:::i;:::-;8703:119;8861:1;8886:53;8931:7;8922:6;8911:9;8907:22;8886:53;:::i;:::-;8876:63;;8832:117;8988:2;9014:50;9056:7;9047:6;9036:9;9032:22;9014:50;:::i;:::-;9004:60;;8959:115;8613:468;;;;;:::o;9087:117::-;9196:1;9193;9186:12;9210:180;9258:77;9255:1;9248:88;9355:4;9352:1;9345:15;9379:4;9376:1;9369:15;9396:281;9479:27;9501:4;9479:27;:::i;:::-;9471:6;9467:40;9609:6;9597:10;9594:22;9573:18;9561:10;9558:34;9555:62;9552:88;;;9620:18;;:::i;:::-;9552:88;9660:10;9656:2;9649:22;9439:238;9396:281;;:::o;9683:129::-;9717:6;9744:20;;:::i;:::-;9734:30;;9773:33;9801:4;9793:6;9773:33;:::i;:::-;9683:129;;;:::o;9818:307::-;9879:4;9969:18;9961:6;9958:30;9955:56;;;9991:18;;:::i;:::-;9955:56;10029:29;10051:6;10029:29;:::i;:::-;10021:37;;10113:4;10107;10103:15;10095:23;;9818:307;;;:::o;10131:154::-;10215:6;10210:3;10205;10192:30;10277:1;10268:6;10263:3;10259:16;10252:27;10131:154;;;:::o;10291:410::-;10368:5;10393:65;10409:48;10450:6;10409:48;:::i;:::-;10393:65;:::i;:::-;10384:74;;10481:6;10474:5;10467:21;10519:4;10512:5;10508:16;10557:3;10548:6;10543:3;10539:16;10536:25;10533:112;;;10564:79;;:::i;:::-;10533:112;10654:41;10688:6;10683:3;10678;10654:41;:::i;:::-;10374:327;10291:410;;;;;:::o;10720:338::-;10775:5;10824:3;10817:4;10809:6;10805:17;10801:27;10791:122;;10832:79;;:::i;:::-;10791:122;10949:6;10936:20;10974:78;11048:3;11040:6;11033:4;11025:6;11021:17;10974:78;:::i;:::-;10965:87;;10781:277;10720:338;;;;:::o;11064:943::-;11159:6;11167;11175;11183;11232:3;11220:9;11211:7;11207:23;11203:33;11200:120;;;11239:79;;:::i;:::-;11200:120;11359:1;11384:53;11429:7;11420:6;11409:9;11405:22;11384:53;:::i;:::-;11374:63;;11330:117;11486:2;11512:53;11557:7;11548:6;11537:9;11533:22;11512:53;:::i;:::-;11502:63;;11457:118;11614:2;11640:53;11685:7;11676:6;11665:9;11661:22;11640:53;:::i;:::-;11630:63;;11585:118;11770:2;11759:9;11755:18;11742:32;11801:18;11793:6;11790:30;11787:117;;;11823:79;;:::i;:::-;11787:117;11928:62;11982:7;11973:6;11962:9;11958:22;11928:62;:::i;:::-;11918:72;;11713:287;11064:943;;;;;;;:::o;12013:474::-;12081:6;12089;12138:2;12126:9;12117:7;12113:23;12109:32;12106:119;;;12144:79;;:::i;:::-;12106:119;12264:1;12289:53;12334:7;12325:6;12314:9;12310:22;12289:53;:::i;:::-;12279:63;;12235:117;12391:2;12417:53;12462:7;12453:6;12442:9;12438:22;12417:53;:::i;:::-;12407:63;;12362:118;12013:474;;;;;:::o;12493:180::-;12541:77;12538:1;12531:88;12638:4;12635:1;12628:15;12662:4;12659:1;12652:15;12679:320;12723:6;12760:1;12754:4;12750:12;12740:22;;12807:1;12801:4;12797:12;12828:18;12818:81;;12884:4;12876:6;12872:17;12862:27;;12818:81;12946:2;12938:6;12935:14;12915:18;12912:38;12909:84;;;12965:18;;:::i;:::-;12909:84;12730:269;12679:320;;;:::o;13005:231::-;13145:34;13141:1;13133:6;13129:14;13122:58;13214:14;13209:2;13201:6;13197:15;13190:39;13005:231;:::o;13242:366::-;13384:3;13405:67;13469:2;13464:3;13405:67;:::i;:::-;13398:74;;13481:93;13570:3;13481:93;:::i;:::-;13599:2;13594:3;13590:12;13583:19;;13242:366;;;:::o;13614:419::-;13780:4;13818:2;13807:9;13803:18;13795:26;;13867:9;13861:4;13857:20;13853:1;13842:9;13838:17;13831:47;13895:131;14021:4;13895:131;:::i;:::-;13887:139;;13614:419;;;:::o;14039:220::-;14179:34;14175:1;14167:6;14163:14;14156:58;14248:3;14243:2;14235:6;14231:15;14224:28;14039:220;:::o;14265:366::-;14407:3;14428:67;14492:2;14487:3;14428:67;:::i;:::-;14421:74;;14504:93;14593:3;14504:93;:::i;:::-;14622:2;14617:3;14613:12;14606:19;;14265:366;;;:::o;14637:419::-;14803:4;14841:2;14830:9;14826:18;14818:26;;14890:9;14884:4;14880:20;14876:1;14865:9;14861:17;14854:47;14918:131;15044:4;14918:131;:::i;:::-;14910:139;;14637:419;;;:::o;15062:243::-;15202:34;15198:1;15190:6;15186:14;15179:58;15271:26;15266:2;15258:6;15254:15;15247:51;15062:243;:::o;15311:366::-;15453:3;15474:67;15538:2;15533:3;15474:67;:::i;:::-;15467:74;;15550:93;15639:3;15550:93;:::i;:::-;15668:2;15663:3;15659:12;15652:19;;15311:366;;;:::o;15683:419::-;15849:4;15887:2;15876:9;15872:18;15864:26;;15936:9;15930:4;15926:20;15922:1;15911:9;15907:17;15900:47;15964:131;16090:4;15964:131;:::i;:::-;15956:139;;15683:419;;;:::o;16108:236::-;16248:34;16244:1;16236:6;16232:14;16225:58;16317:19;16312:2;16304:6;16300:15;16293:44;16108:236;:::o;16350:366::-;16492:3;16513:67;16577:2;16572:3;16513:67;:::i;:::-;16506:74;;16589:93;16678:3;16589:93;:::i;:::-;16707:2;16702:3;16698:12;16691:19;;16350:366;;;:::o;16722:419::-;16888:4;16926:2;16915:9;16911:18;16903:26;;16975:9;16969:4;16965:20;16961:1;16950:9;16946:17;16939:47;17003:131;17129:4;17003:131;:::i;:::-;16995:139;;16722:419;;;:::o;17147:162::-;17287:14;17283:1;17275:6;17271:14;17264:38;17147:162;:::o;17315:366::-;17457:3;17478:67;17542:2;17537:3;17478:67;:::i;:::-;17471:74;;17554:93;17643:3;17554:93;:::i;:::-;17672:2;17667:3;17663:12;17656:19;;17315:366;;;:::o;17687:419::-;17853:4;17891:2;17880:9;17876:18;17868:26;;17940:9;17934:4;17930:20;17926:1;17915:9;17911:17;17904:47;17968:131;18094:4;17968:131;:::i;:::-;17960:139;;17687:419;;;:::o;18112:170::-;18252:22;18248:1;18240:6;18236:14;18229:46;18112:170;:::o;18288:366::-;18430:3;18451:67;18515:2;18510:3;18451:67;:::i;:::-;18444:74;;18527:93;18616:3;18527:93;:::i;:::-;18645:2;18640:3;18636:12;18629:19;;18288:366;;;:::o;18660:419::-;18826:4;18864:2;18853:9;18849:18;18841:26;;18913:9;18907:4;18903:20;18899:1;18888:9;18884:17;18877:47;18941:131;19067:4;18941:131;:::i;:::-;18933:139;;18660:419;;;:::o;19085:159::-;19225:11;19221:1;19213:6;19209:14;19202:35;19085:159;:::o;19250:365::-;19392:3;19413:66;19477:1;19472:3;19413:66;:::i;:::-;19406:73;;19488:93;19577:3;19488:93;:::i;:::-;19606:2;19601:3;19597:12;19590:19;;19250:365;;;:::o;19621:419::-;19787:4;19825:2;19814:9;19810:18;19802:26;;19874:9;19868:4;19864:20;19860:1;19849:9;19845:17;19838:47;19902:131;20028:4;19902:131;:::i;:::-;19894:139;;19621:419;;;:::o;20046:180::-;20094:77;20091:1;20084:88;20191:4;20188:1;20181:15;20215:4;20212:1;20205:15;20232:191;20272:4;20292:20;20310:1;20292:20;:::i;:::-;20287:25;;20326:20;20344:1;20326:20;:::i;:::-;20321:25;;20365:1;20362;20359:8;20356:34;;;20370:18;;:::i;:::-;20356:34;20415:1;20412;20408:9;20400:17;;20232:191;;;;:::o;20429:182::-;20569:34;20565:1;20557:6;20553:14;20546:58;20429:182;:::o;20617:366::-;20759:3;20780:67;20844:2;20839:3;20780:67;:::i;:::-;20773:74;;20856:93;20945:3;20856:93;:::i;:::-;20974:2;20969:3;20965:12;20958:19;;20617:366;;;:::o;20989:419::-;21155:4;21193:2;21182:9;21178:18;21170:26;;21242:9;21236:4;21232:20;21228:1;21217:9;21213:17;21206:47;21270:131;21396:4;21270:131;:::i;:::-;21262:139;;20989:419;;;:::o;21414:163::-;21554:15;21550:1;21542:6;21538:14;21531:39;21414:163;:::o;21583:366::-;21725:3;21746:67;21810:2;21805:3;21746:67;:::i;:::-;21739:74;;21822:93;21911:3;21822:93;:::i;:::-;21940:2;21935:3;21931:12;21924:19;;21583:366;;;:::o;21955:419::-;22121:4;22159:2;22148:9;22144:18;22136:26;;22208:9;22202:4;22198:20;22194:1;22183:9;22179:17;22172:47;22236:131;22362:4;22236:131;:::i;:::-;22228:139;;21955:419;;;:::o;22380:228::-;22520:34;22516:1;22508:6;22504:14;22497:58;22589:11;22584:2;22576:6;22572:15;22565:36;22380:228;:::o;22614:366::-;22756:3;22777:67;22841:2;22836:3;22777:67;:::i;:::-;22770:74;;22853:93;22942:3;22853:93;:::i;:::-;22971:2;22966:3;22962:12;22955:19;;22614:366;;;:::o;22986:419::-;23152:4;23190:2;23179:9;23175:18;23167:26;;23239:9;23233:4;23229:20;23225:1;23214:9;23210:17;23203:47;23267:131;23393:4;23267:131;:::i;:::-;23259:139;;22986:419;;;:::o;23411:229::-;23551:34;23547:1;23539:6;23535:14;23528:58;23620:12;23615:2;23607:6;23603:15;23596:37;23411:229;:::o;23646:366::-;23788:3;23809:67;23873:2;23868:3;23809:67;:::i;:::-;23802:74;;23885:93;23974:3;23885:93;:::i;:::-;24003:2;23998:3;23994:12;23987:19;;23646:366;;;:::o;24018:419::-;24184:4;24222:2;24211:9;24207:18;24199:26;;24271:9;24265:4;24261:20;24257:1;24246:9;24242:17;24235:47;24299:131;24425:4;24299:131;:::i;:::-;24291:139;;24018:419;;;:::o;24443:158::-;24583:10;24579:1;24571:6;24567:14;24560:34;24443:158;:::o;24607:365::-;24749:3;24770:66;24834:1;24829:3;24770:66;:::i;:::-;24763:73;;24845:93;24934:3;24845:93;:::i;:::-;24963:2;24958:3;24954:12;24947:19;;24607:365;;;:::o;24978:419::-;25144:4;25182:2;25171:9;25167:18;25159:26;;25231:9;25225:4;25221:20;25217:1;25206:9;25202:17;25195:47;25259:131;25385:4;25259:131;:::i;:::-;25251:139;;24978:419;;;:::o;25403:225::-;25543:34;25539:1;25531:6;25527:14;25520:58;25612:8;25607:2;25599:6;25595:15;25588:33;25403:225;:::o;25634:366::-;25776:3;25797:67;25861:2;25856:3;25797:67;:::i;:::-;25790:74;;25873:93;25962:3;25873:93;:::i;:::-;25991:2;25986:3;25982:12;25975:19;;25634:366;;;:::o;26006:419::-;26172:4;26210:2;26199:9;26195:18;26187:26;;26259:9;26253:4;26249:20;26245:1;26234:9;26230:17;26223:47;26287:131;26413:4;26287:131;:::i;:::-;26279:139;;26006:419;;;:::o;26431:305::-;26471:3;26490:20;26508:1;26490:20;:::i;:::-;26485:25;;26524:20;26542:1;26524:20;:::i;:::-;26519:25;;26678:1;26610:66;26606:74;26603:1;26600:81;26597:107;;;26684:18;;:::i;:::-;26597:107;26728:1;26725;26721:9;26714:16;;26431:305;;;;:::o;26742:225::-;26882:34;26878:1;26870:6;26866:14;26859:58;26951:8;26946:2;26938:6;26934:15;26927:33;26742:225;:::o;26973:366::-;27115:3;27136:67;27200:2;27195:3;27136:67;:::i;:::-;27129:74;;27212:93;27301:3;27212:93;:::i;:::-;27330:2;27325:3;27321:12;27314:19;;26973:366;;;:::o;27345:419::-;27511:4;27549:2;27538:9;27534:18;27526:26;;27598:9;27592:4;27588:20;27584:1;27573:9;27569:17;27562:47;27626:131;27752:4;27626:131;:::i;:::-;27618:139;;27345:419;;;:::o;27770:170::-;27910:22;27906:1;27898:6;27894:14;27887:46;27770:170;:::o;27946:366::-;28088:3;28109:67;28173:2;28168:3;28109:67;:::i;:::-;28102:74;;28185:93;28274:3;28185:93;:::i;:::-;28303:2;28298:3;28294:12;28287:19;;27946:366;;;:::o;28318:419::-;28484:4;28522:2;28511:9;28507:18;28499:26;;28571:9;28565:4;28561:20;28557:1;28546:9;28542:17;28535:47;28599:131;28725:4;28599:131;:::i;:::-;28591:139;;28318:419;;;:::o;28743:169::-;28883:21;28879:1;28871:6;28867:14;28860:45;28743:169;:::o;28918:366::-;29060:3;29081:67;29145:2;29140:3;29081:67;:::i;:::-;29074:74;;29157:93;29246:3;29157:93;:::i;:::-;29275:2;29270:3;29266:12;29259:19;;28918:366;;;:::o;29290:419::-;29456:4;29494:2;29483:9;29479:18;29471:26;;29543:9;29537:4;29533:20;29529:1;29518:9;29514:17;29507:47;29571:131;29697:4;29571:131;:::i;:::-;29563:139;;29290:419;;;:::o;29715:348::-;29755:7;29778:20;29796:1;29778:20;:::i;:::-;29773:25;;29812:20;29830:1;29812:20;:::i;:::-;29807:25;;30000:1;29932:66;29928:74;29925:1;29922:81;29917:1;29910:9;29903:17;29899:105;29896:131;;;30007:18;;:::i;:::-;29896:131;30055:1;30052;30048:9;30037:20;;29715:348;;;;:::o;30069:168::-;30209:20;30205:1;30197:6;30193:14;30186:44;30069:168;:::o;30243:366::-;30385:3;30406:67;30470:2;30465:3;30406:67;:::i;:::-;30399:74;;30482:93;30571:3;30482:93;:::i;:::-;30600:2;30595:3;30591:12;30584:19;;30243:366;;;:::o;30615:419::-;30781:4;30819:2;30808:9;30804:18;30796:26;;30868:9;30862:4;30858:20;30854:1;30843:9;30839:17;30832:47;30896:131;31022:4;30896:131;:::i;:::-;30888:139;;30615:419;;;:::o;31040:180::-;31088:77;31085:1;31078:88;31185:4;31182:1;31175:15;31209:4;31206:1;31199:15;31226:176;31258:1;31275:20;31293:1;31275:20;:::i;:::-;31270:25;;31309:20;31327:1;31309:20;:::i;:::-;31304:25;;31348:1;31338:35;;31353:18;;:::i;:::-;31338:35;31394:1;31391;31387:9;31382:14;;31226:176;;;;:::o;31408:180::-;31456:77;31453:1;31446:88;31553:4;31550:1;31543:15;31577:4;31574:1;31567:15;31594:233;31633:3;31656:24;31674:5;31656:24;:::i;:::-;31647:33;;31702:66;31695:5;31692:77;31689:103;;;31772:18;;:::i;:::-;31689:103;31819:1;31812:5;31808:13;31801:20;;31594:233;;;:::o;31833:180::-;31881:77;31878:1;31871:88;31978:4;31975:1;31968:15;32002:4;31999:1;31992:15;32019:175;32159:27;32155:1;32147:6;32143:14;32136:51;32019:175;:::o;32200:366::-;32342:3;32363:67;32427:2;32422:3;32363:67;:::i;:::-;32356:74;;32439:93;32528:3;32439:93;:::i;:::-;32557:2;32552:3;32548:12;32541:19;;32200:366;;;:::o;32572:419::-;32738:4;32776:2;32765:9;32761:18;32753:26;;32825:9;32819:4;32815:20;32811:1;32800:9;32796:17;32789:47;32853:131;32979:4;32853:131;:::i;:::-;32845:139;;32572:419;;;:::o;32997:234::-;33137:34;33133:1;33125:6;33121:14;33114:58;33206:17;33201:2;33193:6;33189:15;33182:42;32997:234;:::o;33237:366::-;33379:3;33400:67;33464:2;33459:3;33400:67;:::i;:::-;33393:74;;33476:93;33565:3;33476:93;:::i;:::-;33594:2;33589:3;33585:12;33578:19;;33237:366;;;:::o;33609:419::-;33775:4;33813:2;33802:9;33798:18;33790:26;;33862:9;33856:4;33852:20;33848:1;33837:9;33833:17;33826:47;33890:131;34016:4;33890:131;:::i;:::-;33882:139;;33609:419;;;:::o;34034:148::-;34136:11;34173:3;34158:18;;34034:148;;;;:::o;34188:377::-;34294:3;34322:39;34355:5;34322:39;:::i;:::-;34377:89;34459:6;34454:3;34377:89;:::i;:::-;34370:96;;34475:52;34520:6;34515:3;34508:4;34501:5;34497:16;34475:52;:::i;:::-;34552:6;34547:3;34543:16;34536:23;;34298:267;34188:377;;;;:::o;34571:435::-;34751:3;34773:95;34864:3;34855:6;34773:95;:::i;:::-;34766:102;;34885:95;34976:3;34967:6;34885:95;:::i;:::-;34878:102;;34997:3;34990:10;;34571:435;;;;;:::o;35012:225::-;35152:34;35148:1;35140:6;35136:14;35129:58;35221:8;35216:2;35208:6;35204:15;35197:33;35012:225;:::o;35243:366::-;35385:3;35406:67;35470:2;35465:3;35406:67;:::i;:::-;35399:74;;35482:93;35571:3;35482:93;:::i;:::-;35600:2;35595:3;35591:12;35584:19;;35243:366;;;:::o;35615:419::-;35781:4;35819:2;35808:9;35804:18;35796:26;;35868:9;35862:4;35858:20;35854:1;35843:9;35839:17;35832:47;35896:131;36022:4;35896:131;:::i;:::-;35888:139;;35615:419;;;:::o;36040:231::-;36180:34;36176:1;36168:6;36164:14;36157:58;36249:14;36244:2;36236:6;36232:15;36225:39;36040:231;:::o;36277:366::-;36419:3;36440:67;36504:2;36499:3;36440:67;:::i;:::-;36433:74;;36516:93;36605:3;36516:93;:::i;:::-;36634:2;36629:3;36625:12;36618:19;;36277:366;;;:::o;36649:419::-;36815:4;36853:2;36842:9;36838:18;36830:26;;36902:9;36896:4;36892:20;36888:1;36877:9;36873:17;36866:47;36930:131;37056:4;36930:131;:::i;:::-;36922:139;;36649:419;;;:::o;37074:228::-;37214:34;37210:1;37202:6;37198:14;37191:58;37283:11;37278:2;37270:6;37266:15;37259:36;37074:228;:::o;37308:366::-;37450:3;37471:67;37535:2;37530:3;37471:67;:::i;:::-;37464:74;;37547:93;37636:3;37547:93;:::i;:::-;37665:2;37660:3;37656:12;37649:19;;37308:366;;;:::o;37680:419::-;37846:4;37884:2;37873:9;37869:18;37861:26;;37933:9;37927:4;37923:20;37919:1;37908:9;37904:17;37897:47;37961:131;38087:4;37961:131;:::i;:::-;37953:139;;37680:419;;;:::o;38105:223::-;38245:34;38241:1;38233:6;38229:14;38222:58;38314:6;38309:2;38301:6;38297:15;38290:31;38105:223;:::o;38334:366::-;38476:3;38497:67;38561:2;38556:3;38497:67;:::i;:::-;38490:74;;38573:93;38662:3;38573:93;:::i;:::-;38691:2;38686:3;38682:12;38675:19;;38334:366;;;:::o;38706:419::-;38872:4;38910:2;38899:9;38895:18;38887:26;;38959:9;38953:4;38949:20;38945:1;38934:9;38930:17;38923:47;38987:131;39113:4;38987:131;:::i;:::-;38979:139;;38706:419;;;:::o;39131:237::-;39271:34;39267:1;39259:6;39255:14;39248:58;39340:20;39335:2;39327:6;39323:15;39316:45;39131:237;:::o;39374:366::-;39516:3;39537:67;39601:2;39596:3;39537:67;:::i;:::-;39530:74;;39613:93;39702:3;39613:93;:::i;:::-;39731:2;39726:3;39722:12;39715:19;;39374:366;;;:::o;39746:419::-;39912:4;39950:2;39939:9;39935:18;39927:26;;39999:9;39993:4;39989:20;39985:1;39974:9;39970:17;39963:47;40027:131;40153:4;40027:131;:::i;:::-;40019:139;;39746:419;;;:::o;40171:185::-;40211:1;40228:20;40246:1;40228:20;:::i;:::-;40223:25;;40262:20;40280:1;40262:20;:::i;:::-;40257:25;;40301:1;40291:35;;40306:18;;:::i;:::-;40291:35;40348:1;40345;40341:9;40336:14;;40171:185;;;;:::o;40362:98::-;40413:6;40447:5;40441:12;40431:22;;40362:98;;;:::o;40466:168::-;40549:11;40583:6;40578:3;40571:19;40623:4;40618:3;40614:14;40599:29;;40466:168;;;;:::o;40640:360::-;40726:3;40754:38;40786:5;40754:38;:::i;:::-;40808:70;40871:6;40866:3;40808:70;:::i;:::-;40801:77;;40887:52;40932:6;40927:3;40920:4;40913:5;40909:16;40887:52;:::i;:::-;40964:29;40986:6;40964:29;:::i;:::-;40959:3;40955:39;40948:46;;40730:270;40640:360;;;;:::o;41006:640::-;41201:4;41239:3;41228:9;41224:19;41216:27;;41253:71;41321:1;41310:9;41306:17;41297:6;41253:71;:::i;:::-;41334:72;41402:2;41391:9;41387:18;41378:6;41334:72;:::i;:::-;41416;41484:2;41473:9;41469:18;41460:6;41416:72;:::i;:::-;41535:9;41529:4;41525:20;41520:2;41509:9;41505:18;41498:48;41563:76;41634:4;41625:6;41563:76;:::i;:::-;41555:84;;41006:640;;;;;;;:::o;41652:141::-;41708:5;41739:6;41733:13;41724:22;;41755:32;41781:5;41755:32;:::i;:::-;41652:141;;;;:::o;41799:349::-;41868:6;41917:2;41905:9;41896:7;41892:23;41888:32;41885:119;;;41923:79;;:::i;:::-;41885:119;42043:1;42068:63;42123:7;42114:6;42103:9;42099:22;42068:63;:::i;:::-;42058:73;;42014:127;41799:349;;;;:::o;42154:182::-;42294:34;42290:1;42282:6;42278:14;42271:58;42154:182;:::o;42342:366::-;42484:3;42505:67;42569:2;42564:3;42505:67;:::i;:::-;42498:74;;42581:93;42670:3;42581:93;:::i;:::-;42699:2;42694:3;42690:12;42683:19;;42342:366;;;:::o;42714:419::-;42880:4;42918:2;42907:9;42903:18;42895:26;;42967:9;42961:4;42957:20;42953:1;42942:9;42938:17;42931:47;42995:131;43121:4;42995:131;:::i;:::-;42987:139;;42714:419;;;:::o;43139:178::-;43279:30;43275:1;43267:6;43263:14;43256:54;43139:178;:::o;43323:366::-;43465:3;43486:67;43550:2;43545:3;43486:67;:::i;:::-;43479:74;;43562:93;43651:3;43562:93;:::i;:::-;43680:2;43675:3;43671:12;43664:19;;43323:366;;;:::o;43695:419::-;43861:4;43899:2;43888:9;43884:18;43876:26;;43948:9;43942:4;43938:20;43934:1;43923:9;43919:17;43912:47;43976:131;44102:4;43976:131;:::i;:::-;43968:139;;43695:419;;;:::o

Swarm Source

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