ETH Price: $3,386.36 (-1.76%)
Gas: 1 Gwei

Token

PyMons (PYMON)
 

Overview

Max Total Supply

11,111 PYMON

Holders

1,635

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 PYMON
0x4c15ce4cd15816bcd3866e49c4d3f8531502ade8
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Familiar yet unfamiliar creatures born from the realms of the pixel universe. P2E and PvP battling game modes coming soon.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PyMon

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 13: PyMon.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import './Ownable.sol';
import "./Strings.sol";
import "./ERC721Enumerable.sol";

contract PyMon is ERC721Enumerable, Ownable {
    using Strings for uint256;

    uint256 public MAX_TOKENS = 11111;
    uint256 public GIVEAWAY_AMOUNT = 15;
    uint256 public MAX_MINTABLE_PER_TX = 12;
    uint256 public PRICE_PER_TOKEN = 0.025 ether;

    string public beginning_uri = "https://pymonfiles.blob.core.windows.net/metadata/";
    string public ending_uri = ".json";

    bool public minting_allowed = false;

    address payable public main_owner = payable(0x9408c666a65F2867A3ef3060766077462f84C717);
    address payable public second_owner = payable(0x8614287f6f69548e5Dc1FcAD91504A4Fe9A7EAbc);
    address payable public third_owner = payable(0x2dF0ab8b36081d9bFEB27F7e73F8Cf04834b7d28);

    constructor() ERC721 ("PyMons", "PYMON") {
        // First 15 PyMons will be given away
        for (uint8 i = 0; i < GIVEAWAY_AMOUNT; ++i) {
            _safeMint(msg.sender, totalSupply());
        }
    }

    function calculateMintingPrice(uint256 _quantity) view public returns(uint256) {
        require(_quantity > 0, "Quantity must be greater than 0.");
        require(_quantity <= MAX_MINTABLE_PER_TX, "Too many tokens queried for minting.");

        return _quantity * PRICE_PER_TOKEN;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        return string(abi.encodePacked(beginning_uri, (tokenId + 1).toString(), ending_uri));
    }

    function mintToken(uint256 _num_to_mint) public payable {
        require(minting_allowed, "Minting has not begun yet!");
        require(msg.value >= calculateMintingPrice(_num_to_mint), "Did not send enough ETH to mint.");
        require(totalSupply() + _num_to_mint <= MAX_TOKENS, "Not enough NFTs left to mint.");

        for (uint8 quantity = 0; quantity < _num_to_mint; ++quantity) {
            _safeMint(msg.sender, totalSupply());
        }
    }

    function withdraw() public onlyOwner {
        main_owner.transfer(56 * address(this).balance / 100);
        second_owner.transfer(24 * address(this).balance / 44);
        third_owner.transfer(address(this).balance);
    }

    function toggleMinting() external onlyOwner {
        minting_allowed = !minting_allowed;
    }

    function setBeginningURI(string memory _new_uri) external onlyOwner {
        beginning_uri = _new_uri;
    }

    function setEndingURI(string memory _new_uri) external onlyOwner {
        ending_uri = _new_uri;
    }

    function setMainOwner(address _address) external onlyOwner {
        main_owner = payable(_address);
    }

    function setSecondOwner(address _address) external onlyOwner {
        second_owner = payable(_address);
    }

    function setThirdOwner(address _address) external onlyOwner {
        third_owner = payable(_address);
    }
}

File 1 of 13: 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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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 2 of 13: 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 3 of 13: 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 4 of 13: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./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(to).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 5 of 13: 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 6 of 13: 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 7 of 13: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./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 8 of 13: 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 9 of 13: 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 10 of 13: 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 11 of 13: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./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 13 of 13: 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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"GIVEAWAY_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTABLE_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","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":"beginning_uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"calculateMintingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ending_uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"main_owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num_to_mint","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minting_allowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"second_owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_new_uri","type":"string"}],"name":"setBeginningURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_new_uri","type":"string"}],"name":"setEndingURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setMainOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSecondOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setThirdOwner","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":"third_owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612b67600b55600f600c55600c600d556658d15e17628000600e556040518060600160405280603281526020016200581960329139600f90805190602001906200005092919062000e03565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601090805190602001906200009e92919062000e03565b506000601160006101000a81548160ff021916908315150217905550739408c666a65f2867a3ef3060766077462f84c717601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738614287f6f69548e5dc1fcad91504a4fe9a7eabc601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732df0ab8b36081d9bfeb27f7e73f8cf04834b7d28601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620001c657600080fd5b506040518060400160405280600681526020017f50794d6f6e7300000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f50594d4f4e00000000000000000000000000000000000000000000000000000081525081600090805190602001906200024b92919062000e03565b5080600190805190602001906200026492919062000e03565b505050620002876200027b620002d460201b60201c565b620002dc60201b60201c565b60005b600c548160ff161015620002cd57620002b933620002ad620003a260201b60201c565b620003af60201b60201c565b80620002c59062001331565b90506200028a565b50620013e9565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600880549050905090565b620003d1828260405180602001604052806000815250620003d560201b60201c565b5050565b620003e783836200044360201b60201c565b620003fc60008484846200062960201b60201c565b6200043e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004359062001101565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ad9062001167565b60405180910390fd5b620004c781620007e360201b60201c565b156200050a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005019062001123565b60405180910390fd5b6200051e600083836200084f60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005709190620011b6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620006578473ffffffffffffffffffffffffffffffffffffffff166200099660201b62001d181760201c565b15620007d6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000689620002d460201b60201c565b8786866040518563ffffffff1660e01b8152600401620006ad9493929190620010ad565b602060405180830381600087803b158015620006c857600080fd5b505af1925050508015620006fc57506040513d601f19601f82011682018060405250810190620006f9919062000eca565b60015b62000785573d80600081146200072f576040519150601f19603f3d011682016040523d82523d6000602084013e62000734565b606091505b506000815114156200077d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007749062001101565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620007db565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000867838383620009a960201b62001d2b1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620008b457620008ae81620009ae60201b60201c565b620008fc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620008fb57620008fa8382620009f760201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200094957620009438162000b7460201b60201c565b62000991565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000990576200098f828262000cbc60201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000a118462000d4860201b620012fe1760201c565b62000a1d919062001213565b905060006007600084815260200190815260200160002054905081811462000b03576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000b8a919062001213565b905060006009600084815260200190815260200160002054905060006008838154811062000be1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062000c2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000ca0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000cd48362000d4860201b620012fe1760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000db39062001145565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000e1190620012fb565b90600052602060002090601f01602090048101928262000e35576000855562000e81565b82601f1062000e5057805160ff191683800117855562000e81565b8280016001018555821562000e81579182015b8281111562000e8057825182559160200191906001019062000e63565b5b50905062000e90919062000e94565b5090565b5b8082111562000eaf57600081600090555060010162000e95565b5090565b60008151905062000ec481620013cf565b92915050565b60006020828403121562000edd57600080fd5b600062000eed8482850162000eb3565b91505092915050565b62000f01816200124e565b82525050565b600062000f148262001189565b62000f20818562001194565b935062000f32818560208601620012c5565b62000f3d81620013be565b840191505092915050565b600062000f57603283620011a5565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600062000fbf601c83620011a5565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600062001001602a83620011a5565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600062001069602083620011a5565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b620010a781620012ae565b82525050565b6000608082019050620010c4600083018762000ef6565b620010d3602083018662000ef6565b620010e260408301856200109c565b8181036060830152620010f6818462000f07565b905095945050505050565b600060208201905081810360008301526200111c8162000f48565b9050919050565b600060208201905081810360008301526200113e8162000fb0565b9050919050565b60006020820190508181036000830152620011608162000ff2565b9050919050565b6000602082019050818103600083015262001182816200105a565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620011c382620012ae565b9150620011d083620012ae565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001208576200120762001360565b5b828201905092915050565b60006200122082620012ae565b91506200122d83620012ae565b92508282101562001243576200124262001360565b5b828203905092915050565b60006200125b826200128e565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015620012e5578082015181840152602081019050620012c8565b83811115620012f5576000848401525b50505050565b600060028204905060018216806200131457607f821691505b602082108114156200132b576200132a6200138f565b5b50919050565b60006200133e82620012b8565b915060ff82141562001355576200135462001360565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b620013da8162001262565b8114620013e657600080fd5b50565b61442080620013f96000396000f3fe6080604052600436106102255760003560e01c806370a0823111610123578063b88d4fde116100ab578063c87b56dd1161006f578063c87b56dd146107c2578063e985e9c5146107ff578063f2fde38b1461083c578063f47c84c514610865578063f6511f931461089057610225565b8063b88d4fde146106fe578063b9dc7cc414610727578063bbedb64b14610752578063c11a12291461077b578063c634d032146107a657610225565b80638b2c1435116100f25780638b2c1435146106295780638da5cb5b1461065457806395d89b411461067f578063a22cb465146106aa578063ab88a7fa146106d357610225565b806370a0823114610593578063715018a6146105d05780637d55094d146105e7578063833b9499146105fe57610225565b80632f745c59116101b157806342842e0e1161017557806342842e0e1461049e5780634f6ccce7146104c75780635701fc0b14610504578063577522261461052d5780636352211e1461055657610225565b80632f745c59146103c9578063306e8f0c14610406578063376b0327146104315780633ccfd60b1461045c5780633d4f3b791461047357610225565b80630c9d4601116101f85780630c9d4601146102f857806318160ddd14610321578063186e02c91461034c57806323b872dd14610377578063242877c5146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c919061319f565b6108cd565b60405161025e9190613c00565b60405180910390f35b34801561027357600080fd5b5061027c610947565b6040516102899190613c1b565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613232565b6109d9565b6040516102c69190613b7e565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613163565b610a5e565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612ff8565b610b76565b005b34801561032d57600080fd5b50610336610c36565b6040516103439190613efd565b60405180910390f35b34801561035857600080fd5b50610361610c43565b60405161036e9190613b99565b60405180910390f35b34801561038357600080fd5b5061039e6004803603810190610399919061305d565b610c69565b005b3480156103ac57600080fd5b506103c760048036038101906103c291906131f1565b610cc9565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190613163565b610d5f565b6040516103fd9190613efd565b60405180910390f35b34801561041257600080fd5b5061041b610e04565b6040516104289190613efd565b60405180910390f35b34801561043d57600080fd5b50610446610e0a565b6040516104539190613b99565b60405180910390f35b34801561046857600080fd5b50610471610e30565b005b34801561047f57600080fd5b50610488611019565b6040516104959190613b99565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c0919061305d565b61103f565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190613232565b61105f565b6040516104fb9190613efd565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906131f1565b6110f6565b005b34801561053957600080fd5b50610554600480360381019061054f9190612ff8565b61118c565b005b34801561056257600080fd5b5061057d60048036038101906105789190613232565b61124c565b60405161058a9190613b7e565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190612ff8565b6112fe565b6040516105c79190613efd565b60405180910390f35b3480156105dc57600080fd5b506105e56113b6565b005b3480156105f357600080fd5b506105fc61143e565b005b34801561060a57600080fd5b506106136114e6565b6040516106209190613efd565b60405180910390f35b34801561063557600080fd5b5061063e6114ec565b60405161064b9190613c00565b60405180910390f35b34801561066057600080fd5b506106696114ff565b6040516106769190613b7e565b60405180910390f35b34801561068b57600080fd5b50610694611529565b6040516106a19190613c1b565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613127565b6115bb565b005b3480156106df57600080fd5b506106e861173c565b6040516106f59190613c1b565b60405180910390f35b34801561070a57600080fd5b50610725600480360381019061072091906130ac565b6117ca565b005b34801561073357600080fd5b5061073c61182c565b6040516107499190613c1b565b60405180910390f35b34801561075e57600080fd5b5061077960048036038101906107749190612ff8565b6118ba565b005b34801561078757600080fd5b5061079061197a565b60405161079d9190613efd565b60405180910390f35b6107c060048036038101906107bb9190613232565b611980565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190613232565b611aa5565b6040516107f69190613c1b565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613021565b611ae8565b6040516108339190613c00565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190612ff8565b611b7c565b005b34801561087157600080fd5b5061087a611c74565b6040516108879190613efd565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b29190613232565b611c7a565b6040516108c49190613efd565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610940575061093f82611d30565b5b9050919050565b606060008054610956906141eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610982906141eb565b80156109cf5780601f106109a4576101008083540402835291602001916109cf565b820191906000526020600020905b8154815290600101906020018083116109b257829003601f168201915b5050505050905090565b60006109e482611e12565b610a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1a90613dfd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a698261124c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190613e7d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af9611e7e565b73ffffffffffffffffffffffffffffffffffffffff161480610b285750610b2781610b22611e7e565b611ae8565b5b610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90613d7d565b60405180910390fd5b610b718383611e86565b505050565b610b7e611e7e565b73ffffffffffffffffffffffffffffffffffffffff16610b9c6114ff565b73ffffffffffffffffffffffffffffffffffffffff1614610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990613e1d565b60405180910390fd5b80601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600880549050905090565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c7a610c74611e7e565b82611f3f565b610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090613e9d565b60405180910390fd5b610cc483838361201d565b505050565b610cd1611e7e565b73ffffffffffffffffffffffffffffffffffffffff16610cef6114ff565b73ffffffffffffffffffffffffffffffffffffffff1614610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c90613e1d565b60405180910390fd5b8060109080519060200190610d5b929190612e1c565b5050565b6000610d6a836112fe565b8210610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290613c5d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e38611e7e565b73ffffffffffffffffffffffffffffffffffffffff16610e566114ff565b73ffffffffffffffffffffffffffffffffffffffff1614610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390613e1d565b60405180910390fd5b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6064476038610ef79190614088565b610f019190614057565b9081150290604051600060405180830381858888f19350505050158015610f2c573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc602c476018610f789190614088565b610f829190614057565b9081150290604051600060405180830381858888f19350505050158015610fad573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611016573d6000803e3d6000fd5b50565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61105a838383604051806020016040528060008152506117ca565b505050565b6000611069610c36565b82106110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190613ebd565b60405180910390fd5b600882815481106110e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110fe611e7e565b73ffffffffffffffffffffffffffffffffffffffff1661111c6114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990613e1d565b60405180910390fd5b80600f9080519060200190611188929190612e1c565b5050565b611194611e7e565b73ffffffffffffffffffffffffffffffffffffffff166111b26114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90613e1d565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec90613dbd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690613d9d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113be611e7e565b73ffffffffffffffffffffffffffffffffffffffff166113dc6114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990613e1d565b60405180910390fd5b61143c6000612279565b565b611446611e7e565b73ffffffffffffffffffffffffffffffffffffffff166114646114ff565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190613e1d565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b600e5481565b601160009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611538906141eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611564906141eb565b80156115b15780601f10611586576101008083540402835291602001916115b1565b820191906000526020600020905b81548152906001019060200180831161159457829003601f168201915b5050505050905090565b6115c3611e7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890613d1d565b60405180910390fd5b806005600061163e611e7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116eb611e7e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117309190613c00565b60405180910390a35050565b60108054611749906141eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611775906141eb565b80156117c25780601f10611797576101008083540402835291602001916117c2565b820191906000526020600020905b8154815290600101906020018083116117a557829003601f168201915b505050505081565b6117db6117d5611e7e565b83611f3f565b61181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190613e9d565b60405180910390fd5b6118268484848461233f565b50505050565b600f8054611839906141eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611865906141eb565b80156118b25780601f10611887576101008083540402835291602001916118b2565b820191906000526020600020905b81548152906001019060200180831161189557829003601f168201915b505050505081565b6118c2611e7e565b73ffffffffffffffffffffffffffffffffffffffff166118e06114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90613e1d565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b601160009054906101000a900460ff166119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690613d3d565b60405180910390fd5b6119d881611c7a565b341015611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190613edd565b60405180910390fd5b600b5481611a26610c36565b611a309190614001565b1115611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613e5d565b60405180910390fd5b60005b818160ff161015611aa157611a9033611a8b610c36565b61239b565b80611a9a90614266565b9050611a74565b5050565b6060600f611abe600184611ab99190614001565b6123b9565b6010604051602001611ad293929190613b4d565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b84611e7e565b73ffffffffffffffffffffffffffffffffffffffff16611ba26114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef90613e1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f90613cbd565b60405180910390fd5b611c7181612279565b50565b600b5481565b6000808211611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590613c3d565b60405180910390fd5b600d54821115611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90613c9d565b60405180910390fd5b600e5482611d119190614088565b9050919050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dfb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e0b5750611e0a82612566565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ef98361124c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f4a82611e12565b611f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8090613d5d565b60405180910390fd5b6000611f948361124c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061200357508373ffffffffffffffffffffffffffffffffffffffff16611feb846109d9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061201457506120138185611ae8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661203d8261124c565b73ffffffffffffffffffffffffffffffffffffffff1614612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90613e3d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa90613cfd565b60405180910390fd5b61210e8383836125d0565b612119600082611e86565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461216991906140e2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c09190614001565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61234a84848461201d565b612356848484846126e4565b612395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238c90613c7d565b60405180910390fd5b50505050565b6123b582826040518060200160405280600081525061287b565b5050565b60606000821415612401576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612561565b600082905060005b6000821461243357808061241c9061421d565b915050600a8261242c9190614057565b9150612409565b60008167ffffffffffffffff811115612475577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124a75781602001600182028036833780820191505090505b5090505b6000851461255a576001826124c091906140e2565b9150600a856124cf9190614290565b60306124db9190614001565b60f81b818381518110612517577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125539190614057565b94506124ab565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125db838383611d2b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261e57612619816128d6565b61265d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461265c5761265b838261291f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a05761269b81612a8c565b6126df565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126de576126dd8282612bcf565b5b5b505050565b60006127058473ffffffffffffffffffffffffffffffffffffffff16611d18565b1561286e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261272e611e7e565b8786866040518563ffffffff1660e01b81526004016127509493929190613bb4565b602060405180830381600087803b15801561276a57600080fd5b505af192505050801561279b57506040513d601f19601f8201168201806040525081019061279891906131c8565b60015b61281e573d80600081146127cb576040519150601f19603f3d011682016040523d82523d6000602084013e6127d0565b606091505b50600081511415612816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280d90613c7d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612873565b600190505b949350505050565b6128858383612c4e565b61289260008484846126e4565b6128d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c890613c7d565b60405180910390fd5b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161292c846112fe565b61293691906140e2565b9050600060076000848152602001908152602001600020549050818114612a1b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612aa091906140e2565b9050600060096000848152602001908152602001600020549050600060088381548110612af6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612bda836112fe565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb590613ddd565b60405180910390fd5b612cc781611e12565b15612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90613cdd565b60405180910390fd5b612d13600083836125d0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d639190614001565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e28906141eb565b90600052602060002090601f016020900481019282612e4a5760008555612e91565b82601f10612e6357805160ff1916838001178555612e91565b82800160010185558215612e91579182015b82811115612e90578251825591602001919060010190612e75565b5b509050612e9e9190612ea2565b5090565b5b80821115612ebb576000816000905550600101612ea3565b5090565b6000612ed2612ecd84613f49565b613f18565b905082815260208101848484011115612eea57600080fd5b612ef58482856141a9565b509392505050565b6000612f10612f0b84613f79565b613f18565b905082815260208101848484011115612f2857600080fd5b612f338482856141a9565b509392505050565b600081359050612f4a8161438e565b92915050565b600081359050612f5f816143a5565b92915050565b600081359050612f74816143bc565b92915050565b600081519050612f89816143bc565b92915050565b600082601f830112612fa057600080fd5b8135612fb0848260208601612ebf565b91505092915050565b600082601f830112612fca57600080fd5b8135612fda848260208601612efd565b91505092915050565b600081359050612ff2816143d3565b92915050565b60006020828403121561300a57600080fd5b600061301884828501612f3b565b91505092915050565b6000806040838503121561303457600080fd5b600061304285828601612f3b565b925050602061305385828601612f3b565b9150509250929050565b60008060006060848603121561307257600080fd5b600061308086828701612f3b565b935050602061309186828701612f3b565b92505060406130a286828701612fe3565b9150509250925092565b600080600080608085870312156130c257600080fd5b60006130d087828801612f3b565b94505060206130e187828801612f3b565b93505060406130f287828801612fe3565b925050606085013567ffffffffffffffff81111561310f57600080fd5b61311b87828801612f8f565b91505092959194509250565b6000806040838503121561313a57600080fd5b600061314885828601612f3b565b925050602061315985828601612f50565b9150509250929050565b6000806040838503121561317657600080fd5b600061318485828601612f3b565b925050602061319585828601612fe3565b9150509250929050565b6000602082840312156131b157600080fd5b60006131bf84828501612f65565b91505092915050565b6000602082840312156131da57600080fd5b60006131e884828501612f7a565b91505092915050565b60006020828403121561320357600080fd5b600082013567ffffffffffffffff81111561321d57600080fd5b61322984828501612fb9565b91505092915050565b60006020828403121561324457600080fd5b600061325284828501612fe3565b91505092915050565b61326481614128565b82525050565b61327381614116565b82525050565b6132828161413a565b82525050565b600061329382613fbe565b61329d8185613fd4565b93506132ad8185602086016141b8565b6132b68161437d565b840191505092915050565b60006132cc82613fc9565b6132d68185613fe5565b93506132e68185602086016141b8565b6132ef8161437d565b840191505092915050565b600061330582613fc9565b61330f8185613ff6565b935061331f8185602086016141b8565b80840191505092915050565b60008154613338816141eb565b6133428186613ff6565b9450600182166000811461335d576001811461336e576133a1565b60ff198316865281860193506133a1565b61337785613fa9565b60005b838110156133995781548189015260018201915060208101905061337a565b838801955050505b50505092915050565b60006133b7602083613fe5565b91507f5175616e74697479206d7573742062652067726561746572207468616e20302e6000830152602082019050919050565b60006133f7602b83613fe5565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061345d603283613fe5565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134c3602483613fe5565b91507f546f6f206d616e7920746f6b656e73207175657269656420666f72206d696e7460008301527f696e672e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613529602683613fe5565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061358f601c83613fe5565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006135cf602483613fe5565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613635601983613fe5565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613675601a83613fe5565b91507f4d696e74696e6720686173206e6f7420626567756e20796574210000000000006000830152602082019050919050565b60006136b5602c83613fe5565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061371b603883613fe5565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613781602a83613fe5565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006137e7602983613fe5565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061384d602083613fe5565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061388d602c83613fe5565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138f3602083613fe5565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613933602983613fe5565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613999601d83613fe5565b91507f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e0000006000830152602082019050919050565b60006139d9602183613fe5565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a3f603183613fe5565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613aa5602c83613fe5565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613b0b602083613fe5565b91507f446964206e6f742073656e6420656e6f7567682045544820746f206d696e742e6000830152602082019050919050565b613b4781614192565b82525050565b6000613b59828661332b565b9150613b6582856132fa565b9150613b71828461332b565b9150819050949350505050565b6000602082019050613b93600083018461326a565b92915050565b6000602082019050613bae600083018461325b565b92915050565b6000608082019050613bc9600083018761326a565b613bd6602083018661326a565b613be36040830185613b3e565b8181036060830152613bf58184613288565b905095945050505050565b6000602082019050613c156000830184613279565b92915050565b60006020820190508181036000830152613c3581846132c1565b905092915050565b60006020820190508181036000830152613c56816133aa565b9050919050565b60006020820190508181036000830152613c76816133ea565b9050919050565b60006020820190508181036000830152613c9681613450565b9050919050565b60006020820190508181036000830152613cb6816134b6565b9050919050565b60006020820190508181036000830152613cd68161351c565b9050919050565b60006020820190508181036000830152613cf681613582565b9050919050565b60006020820190508181036000830152613d16816135c2565b9050919050565b60006020820190508181036000830152613d3681613628565b9050919050565b60006020820190508181036000830152613d5681613668565b9050919050565b60006020820190508181036000830152613d76816136a8565b9050919050565b60006020820190508181036000830152613d968161370e565b9050919050565b60006020820190508181036000830152613db681613774565b9050919050565b60006020820190508181036000830152613dd6816137da565b9050919050565b60006020820190508181036000830152613df681613840565b9050919050565b60006020820190508181036000830152613e1681613880565b9050919050565b60006020820190508181036000830152613e36816138e6565b9050919050565b60006020820190508181036000830152613e5681613926565b9050919050565b60006020820190508181036000830152613e768161398c565b9050919050565b60006020820190508181036000830152613e96816139cc565b9050919050565b60006020820190508181036000830152613eb681613a32565b9050919050565b60006020820190508181036000830152613ed681613a98565b9050919050565b60006020820190508181036000830152613ef681613afe565b9050919050565b6000602082019050613f126000830184613b3e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613f3f57613f3e61434e565b5b8060405250919050565b600067ffffffffffffffff821115613f6457613f6361434e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613f9457613f9361434e565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061400c82614192565b915061401783614192565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561404c5761404b6142c1565b5b828201905092915050565b600061406282614192565b915061406d83614192565b92508261407d5761407c6142f0565b5b828204905092915050565b600061409382614192565b915061409e83614192565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140d7576140d66142c1565b5b828202905092915050565b60006140ed82614192565b91506140f883614192565b92508282101561410b5761410a6142c1565b5b828203905092915050565b600061412182614172565b9050919050565b600061413382614172565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156141d65780820151818401526020810190506141bb565b838111156141e5576000848401525b50505050565b6000600282049050600182168061420357607f821691505b602082108114156142175761421661431f565b5b50919050565b600061422882614192565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561425b5761425a6142c1565b5b600182019050919050565b60006142718261419c565b915060ff821415614285576142846142c1565b5b600182019050919050565b600061429b82614192565b91506142a683614192565b9250826142b6576142b56142f0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61439781614116565b81146143a257600080fd5b50565b6143ae8161413a565b81146143b957600080fd5b50565b6143c581614146565b81146143d057600080fd5b50565b6143dc81614192565b81146143e757600080fd5b5056fea2646970667358221220c0980ed2bfa01e47fb9df3b4e7eba25b2641fd4c0241f4dc42d9e026c471cbd664736f6c6343000800003368747470733a2f2f70796d6f6e66696c65732e626c6f622e636f72652e77696e646f77732e6e65742f6d657461646174612f

Deployed Bytecode

0x6080604052600436106102255760003560e01c806370a0823111610123578063b88d4fde116100ab578063c87b56dd1161006f578063c87b56dd146107c2578063e985e9c5146107ff578063f2fde38b1461083c578063f47c84c514610865578063f6511f931461089057610225565b8063b88d4fde146106fe578063b9dc7cc414610727578063bbedb64b14610752578063c11a12291461077b578063c634d032146107a657610225565b80638b2c1435116100f25780638b2c1435146106295780638da5cb5b1461065457806395d89b411461067f578063a22cb465146106aa578063ab88a7fa146106d357610225565b806370a0823114610593578063715018a6146105d05780637d55094d146105e7578063833b9499146105fe57610225565b80632f745c59116101b157806342842e0e1161017557806342842e0e1461049e5780634f6ccce7146104c75780635701fc0b14610504578063577522261461052d5780636352211e1461055657610225565b80632f745c59146103c9578063306e8f0c14610406578063376b0327146104315780633ccfd60b1461045c5780633d4f3b791461047357610225565b80630c9d4601116101f85780630c9d4601146102f857806318160ddd14610321578063186e02c91461034c57806323b872dd14610377578063242877c5146103a057610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c919061319f565b6108cd565b60405161025e9190613c00565b60405180910390f35b34801561027357600080fd5b5061027c610947565b6040516102899190613c1b565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613232565b6109d9565b6040516102c69190613b7e565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613163565b610a5e565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612ff8565b610b76565b005b34801561032d57600080fd5b50610336610c36565b6040516103439190613efd565b60405180910390f35b34801561035857600080fd5b50610361610c43565b60405161036e9190613b99565b60405180910390f35b34801561038357600080fd5b5061039e6004803603810190610399919061305d565b610c69565b005b3480156103ac57600080fd5b506103c760048036038101906103c291906131f1565b610cc9565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190613163565b610d5f565b6040516103fd9190613efd565b60405180910390f35b34801561041257600080fd5b5061041b610e04565b6040516104289190613efd565b60405180910390f35b34801561043d57600080fd5b50610446610e0a565b6040516104539190613b99565b60405180910390f35b34801561046857600080fd5b50610471610e30565b005b34801561047f57600080fd5b50610488611019565b6040516104959190613b99565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c0919061305d565b61103f565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190613232565b61105f565b6040516104fb9190613efd565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906131f1565b6110f6565b005b34801561053957600080fd5b50610554600480360381019061054f9190612ff8565b61118c565b005b34801561056257600080fd5b5061057d60048036038101906105789190613232565b61124c565b60405161058a9190613b7e565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190612ff8565b6112fe565b6040516105c79190613efd565b60405180910390f35b3480156105dc57600080fd5b506105e56113b6565b005b3480156105f357600080fd5b506105fc61143e565b005b34801561060a57600080fd5b506106136114e6565b6040516106209190613efd565b60405180910390f35b34801561063557600080fd5b5061063e6114ec565b60405161064b9190613c00565b60405180910390f35b34801561066057600080fd5b506106696114ff565b6040516106769190613b7e565b60405180910390f35b34801561068b57600080fd5b50610694611529565b6040516106a19190613c1b565b60405180910390f35b3480156106b657600080fd5b506106d160048036038101906106cc9190613127565b6115bb565b005b3480156106df57600080fd5b506106e861173c565b6040516106f59190613c1b565b60405180910390f35b34801561070a57600080fd5b50610725600480360381019061072091906130ac565b6117ca565b005b34801561073357600080fd5b5061073c61182c565b6040516107499190613c1b565b60405180910390f35b34801561075e57600080fd5b5061077960048036038101906107749190612ff8565b6118ba565b005b34801561078757600080fd5b5061079061197a565b60405161079d9190613efd565b60405180910390f35b6107c060048036038101906107bb9190613232565b611980565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190613232565b611aa5565b6040516107f69190613c1b565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613021565b611ae8565b6040516108339190613c00565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190612ff8565b611b7c565b005b34801561087157600080fd5b5061087a611c74565b6040516108879190613efd565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b29190613232565b611c7a565b6040516108c49190613efd565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610940575061093f82611d30565b5b9050919050565b606060008054610956906141eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610982906141eb565b80156109cf5780601f106109a4576101008083540402835291602001916109cf565b820191906000526020600020905b8154815290600101906020018083116109b257829003601f168201915b5050505050905090565b60006109e482611e12565b610a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1a90613dfd565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a698261124c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190613e7d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610af9611e7e565b73ffffffffffffffffffffffffffffffffffffffff161480610b285750610b2781610b22611e7e565b611ae8565b5b610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90613d7d565b60405180910390fd5b610b718383611e86565b505050565b610b7e611e7e565b73ffffffffffffffffffffffffffffffffffffffff16610b9c6114ff565b73ffffffffffffffffffffffffffffffffffffffff1614610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990613e1d565b60405180910390fd5b80601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600880549050905090565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610c7a610c74611e7e565b82611f3f565b610cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb090613e9d565b60405180910390fd5b610cc483838361201d565b505050565b610cd1611e7e565b73ffffffffffffffffffffffffffffffffffffffff16610cef6114ff565b73ffffffffffffffffffffffffffffffffffffffff1614610d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3c90613e1d565b60405180910390fd5b8060109080519060200190610d5b929190612e1c565b5050565b6000610d6a836112fe565b8210610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da290613c5d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d5481565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e38611e7e565b73ffffffffffffffffffffffffffffffffffffffff16610e566114ff565b73ffffffffffffffffffffffffffffffffffffffff1614610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390613e1d565b60405180910390fd5b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6064476038610ef79190614088565b610f019190614057565b9081150290604051600060405180830381858888f19350505050158015610f2c573d6000803e3d6000fd5b50601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc602c476018610f789190614088565b610f829190614057565b9081150290604051600060405180830381858888f19350505050158015610fad573d6000803e3d6000fd5b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611016573d6000803e3d6000fd5b50565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61105a838383604051806020016040528060008152506117ca565b505050565b6000611069610c36565b82106110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190613ebd565b60405180910390fd5b600882815481106110e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110fe611e7e565b73ffffffffffffffffffffffffffffffffffffffff1661111c6114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990613e1d565b60405180910390fd5b80600f9080519060200190611188929190612e1c565b5050565b611194611e7e565b73ffffffffffffffffffffffffffffffffffffffff166111b26114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90613e1d565b60405180910390fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec90613dbd565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690613d9d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113be611e7e565b73ffffffffffffffffffffffffffffffffffffffff166113dc6114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990613e1d565b60405180910390fd5b61143c6000612279565b565b611446611e7e565b73ffffffffffffffffffffffffffffffffffffffff166114646114ff565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190613e1d565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b600e5481565b601160009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611538906141eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611564906141eb565b80156115b15780601f10611586576101008083540402835291602001916115b1565b820191906000526020600020905b81548152906001019060200180831161159457829003601f168201915b5050505050905090565b6115c3611e7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162890613d1d565b60405180910390fd5b806005600061163e611e7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116eb611e7e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117309190613c00565b60405180910390a35050565b60108054611749906141eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611775906141eb565b80156117c25780601f10611797576101008083540402835291602001916117c2565b820191906000526020600020905b8154815290600101906020018083116117a557829003601f168201915b505050505081565b6117db6117d5611e7e565b83611f3f565b61181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190613e9d565b60405180910390fd5b6118268484848461233f565b50505050565b600f8054611839906141eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611865906141eb565b80156118b25780601f10611887576101008083540402835291602001916118b2565b820191906000526020600020905b81548152906001019060200180831161189557829003601f168201915b505050505081565b6118c2611e7e565b73ffffffffffffffffffffffffffffffffffffffff166118e06114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d90613e1d565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b601160009054906101000a900460ff166119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690613d3d565b60405180910390fd5b6119d881611c7a565b341015611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1190613edd565b60405180910390fd5b600b5481611a26610c36565b611a309190614001565b1115611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613e5d565b60405180910390fd5b60005b818160ff161015611aa157611a9033611a8b610c36565b61239b565b80611a9a90614266565b9050611a74565b5050565b6060600f611abe600184611ab99190614001565b6123b9565b6010604051602001611ad293929190613b4d565b6040516020818303038152906040529050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b84611e7e565b73ffffffffffffffffffffffffffffffffffffffff16611ba26114ff565b73ffffffffffffffffffffffffffffffffffffffff1614611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef90613e1d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f90613cbd565b60405180910390fd5b611c7181612279565b50565b600b5481565b6000808211611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590613c3d565b60405180910390fd5b600d54821115611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa90613c9d565b60405180910390fd5b600e5482611d119190614088565b9050919050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dfb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e0b5750611e0a82612566565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ef98361124c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f4a82611e12565b611f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8090613d5d565b60405180910390fd5b6000611f948361124c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061200357508373ffffffffffffffffffffffffffffffffffffffff16611feb846109d9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061201457506120138185611ae8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661203d8261124c565b73ffffffffffffffffffffffffffffffffffffffff1614612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90613e3d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa90613cfd565b60405180910390fd5b61210e8383836125d0565b612119600082611e86565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461216991906140e2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c09190614001565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61234a84848461201d565b612356848484846126e4565b612395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238c90613c7d565b60405180910390fd5b50505050565b6123b582826040518060200160405280600081525061287b565b5050565b60606000821415612401576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612561565b600082905060005b6000821461243357808061241c9061421d565b915050600a8261242c9190614057565b9150612409565b60008167ffffffffffffffff811115612475577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124a75781602001600182028036833780820191505090505b5090505b6000851461255a576001826124c091906140e2565b9150600a856124cf9190614290565b60306124db9190614001565b60f81b818381518110612517577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125539190614057565b94506124ab565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125db838383611d2b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261e57612619816128d6565b61265d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461265c5761265b838261291f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a05761269b81612a8c565b6126df565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126de576126dd8282612bcf565b5b5b505050565b60006127058473ffffffffffffffffffffffffffffffffffffffff16611d18565b1561286e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261272e611e7e565b8786866040518563ffffffff1660e01b81526004016127509493929190613bb4565b602060405180830381600087803b15801561276a57600080fd5b505af192505050801561279b57506040513d601f19601f8201168201806040525081019061279891906131c8565b60015b61281e573d80600081146127cb576040519150601f19603f3d011682016040523d82523d6000602084013e6127d0565b606091505b50600081511415612816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280d90613c7d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612873565b600190505b949350505050565b6128858383612c4e565b61289260008484846126e4565b6128d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c890613c7d565b60405180910390fd5b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161292c846112fe565b61293691906140e2565b9050600060076000848152602001908152602001600020549050818114612a1b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612aa091906140e2565b9050600060096000848152602001908152602001600020549050600060088381548110612af6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612b3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612bda836112fe565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb590613ddd565b60405180910390fd5b612cc781611e12565b15612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90613cdd565b60405180910390fd5b612d13600083836125d0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d639190614001565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e28906141eb565b90600052602060002090601f016020900481019282612e4a5760008555612e91565b82601f10612e6357805160ff1916838001178555612e91565b82800160010185558215612e91579182015b82811115612e90578251825591602001919060010190612e75565b5b509050612e9e9190612ea2565b5090565b5b80821115612ebb576000816000905550600101612ea3565b5090565b6000612ed2612ecd84613f49565b613f18565b905082815260208101848484011115612eea57600080fd5b612ef58482856141a9565b509392505050565b6000612f10612f0b84613f79565b613f18565b905082815260208101848484011115612f2857600080fd5b612f338482856141a9565b509392505050565b600081359050612f4a8161438e565b92915050565b600081359050612f5f816143a5565b92915050565b600081359050612f74816143bc565b92915050565b600081519050612f89816143bc565b92915050565b600082601f830112612fa057600080fd5b8135612fb0848260208601612ebf565b91505092915050565b600082601f830112612fca57600080fd5b8135612fda848260208601612efd565b91505092915050565b600081359050612ff2816143d3565b92915050565b60006020828403121561300a57600080fd5b600061301884828501612f3b565b91505092915050565b6000806040838503121561303457600080fd5b600061304285828601612f3b565b925050602061305385828601612f3b565b9150509250929050565b60008060006060848603121561307257600080fd5b600061308086828701612f3b565b935050602061309186828701612f3b565b92505060406130a286828701612fe3565b9150509250925092565b600080600080608085870312156130c257600080fd5b60006130d087828801612f3b565b94505060206130e187828801612f3b565b93505060406130f287828801612fe3565b925050606085013567ffffffffffffffff81111561310f57600080fd5b61311b87828801612f8f565b91505092959194509250565b6000806040838503121561313a57600080fd5b600061314885828601612f3b565b925050602061315985828601612f50565b9150509250929050565b6000806040838503121561317657600080fd5b600061318485828601612f3b565b925050602061319585828601612fe3565b9150509250929050565b6000602082840312156131b157600080fd5b60006131bf84828501612f65565b91505092915050565b6000602082840312156131da57600080fd5b60006131e884828501612f7a565b91505092915050565b60006020828403121561320357600080fd5b600082013567ffffffffffffffff81111561321d57600080fd5b61322984828501612fb9565b91505092915050565b60006020828403121561324457600080fd5b600061325284828501612fe3565b91505092915050565b61326481614128565b82525050565b61327381614116565b82525050565b6132828161413a565b82525050565b600061329382613fbe565b61329d8185613fd4565b93506132ad8185602086016141b8565b6132b68161437d565b840191505092915050565b60006132cc82613fc9565b6132d68185613fe5565b93506132e68185602086016141b8565b6132ef8161437d565b840191505092915050565b600061330582613fc9565b61330f8185613ff6565b935061331f8185602086016141b8565b80840191505092915050565b60008154613338816141eb565b6133428186613ff6565b9450600182166000811461335d576001811461336e576133a1565b60ff198316865281860193506133a1565b61337785613fa9565b60005b838110156133995781548189015260018201915060208101905061337a565b838801955050505b50505092915050565b60006133b7602083613fe5565b91507f5175616e74697479206d7573742062652067726561746572207468616e20302e6000830152602082019050919050565b60006133f7602b83613fe5565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061345d603283613fe5565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006134c3602483613fe5565b91507f546f6f206d616e7920746f6b656e73207175657269656420666f72206d696e7460008301527f696e672e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613529602683613fe5565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061358f601c83613fe5565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006135cf602483613fe5565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613635601983613fe5565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613675601a83613fe5565b91507f4d696e74696e6720686173206e6f7420626567756e20796574210000000000006000830152602082019050919050565b60006136b5602c83613fe5565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061371b603883613fe5565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613781602a83613fe5565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006137e7602983613fe5565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061384d602083613fe5565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061388d602c83613fe5565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138f3602083613fe5565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613933602983613fe5565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613999601d83613fe5565b91507f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e0000006000830152602082019050919050565b60006139d9602183613fe5565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a3f603183613fe5565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613aa5602c83613fe5565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613b0b602083613fe5565b91507f446964206e6f742073656e6420656e6f7567682045544820746f206d696e742e6000830152602082019050919050565b613b4781614192565b82525050565b6000613b59828661332b565b9150613b6582856132fa565b9150613b71828461332b565b9150819050949350505050565b6000602082019050613b93600083018461326a565b92915050565b6000602082019050613bae600083018461325b565b92915050565b6000608082019050613bc9600083018761326a565b613bd6602083018661326a565b613be36040830185613b3e565b8181036060830152613bf58184613288565b905095945050505050565b6000602082019050613c156000830184613279565b92915050565b60006020820190508181036000830152613c3581846132c1565b905092915050565b60006020820190508181036000830152613c56816133aa565b9050919050565b60006020820190508181036000830152613c76816133ea565b9050919050565b60006020820190508181036000830152613c9681613450565b9050919050565b60006020820190508181036000830152613cb6816134b6565b9050919050565b60006020820190508181036000830152613cd68161351c565b9050919050565b60006020820190508181036000830152613cf681613582565b9050919050565b60006020820190508181036000830152613d16816135c2565b9050919050565b60006020820190508181036000830152613d3681613628565b9050919050565b60006020820190508181036000830152613d5681613668565b9050919050565b60006020820190508181036000830152613d76816136a8565b9050919050565b60006020820190508181036000830152613d968161370e565b9050919050565b60006020820190508181036000830152613db681613774565b9050919050565b60006020820190508181036000830152613dd6816137da565b9050919050565b60006020820190508181036000830152613df681613840565b9050919050565b60006020820190508181036000830152613e1681613880565b9050919050565b60006020820190508181036000830152613e36816138e6565b9050919050565b60006020820190508181036000830152613e5681613926565b9050919050565b60006020820190508181036000830152613e768161398c565b9050919050565b60006020820190508181036000830152613e96816139cc565b9050919050565b60006020820190508181036000830152613eb681613a32565b9050919050565b60006020820190508181036000830152613ed681613a98565b9050919050565b60006020820190508181036000830152613ef681613afe565b9050919050565b6000602082019050613f126000830184613b3e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613f3f57613f3e61434e565b5b8060405250919050565b600067ffffffffffffffff821115613f6457613f6361434e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613f9457613f9361434e565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061400c82614192565b915061401783614192565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561404c5761404b6142c1565b5b828201905092915050565b600061406282614192565b915061406d83614192565b92508261407d5761407c6142f0565b5b828204905092915050565b600061409382614192565b915061409e83614192565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140d7576140d66142c1565b5b828202905092915050565b60006140ed82614192565b91506140f883614192565b92508282101561410b5761410a6142c1565b5b828203905092915050565b600061412182614172565b9050919050565b600061413382614172565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156141d65780820151818401526020810190506141bb565b838111156141e5576000848401525b50505050565b6000600282049050600182168061420357607f821691505b602082108114156142175761421661431f565b5b50919050565b600061422882614192565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561425b5761425a6142c1565b5b600182019050919050565b60006142718261419c565b915060ff821415614285576142846142c1565b5b600182019050919050565b600061429b82614192565b91506142a683614192565b9250826142b6576142b56142f0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61439781614116565b81146143a257600080fd5b50565b6143ae8161413a565b81146143b957600080fd5b50565b6143c581614146565b81146143d057600080fd5b50565b6143dc81614192565b81146143e757600080fd5b5056fea2646970667358221220c0980ed2bfa01e47fb9df3b4e7eba25b2641fd4c0241f4dc42d9e026c471cbd664736f6c63430008000033

Deployed Bytecode Sourcemap

172:2847:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;937:224:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2670:108:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1577:113:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;614:87:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:339:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2557:105:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1245:256:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;339:39:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;708:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2097:228;;;;;;;;;;;;;:::i;:::-;;804:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5285:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1767:233:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2438:111:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2906:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2120:239:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1850:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:10;;;;;;;;;;;;;:::i;:::-;;2333:97:11;;;;;;;;;;;;;:::i;:::-;;385:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;570:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;999:87:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4278:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;527:34:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5541:328:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;438:82:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2786:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;297:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1624:465;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1425:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4644:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;257:33:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1122:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;937:224:4;1039:4;1078:35;1063:50;;;:11;:50;;;;:90;;;;1117:36;1141:11;1117:23;:36::i;:::-;1063:90;1056:97;;937:224;;;:::o;2426:100:3:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3508:411;;;:::o;2670:108:11:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2761:8:11::1;2740:10;;:30;;;;;;;;;;;;;;;;;;2670:108:::0;:::o;1577:113:4:-;1638:7;1665:10;:17;;;;1658:24;;1577:113;:::o;614:87:11:-;;;;;;;;;;;;;:::o;4875:339:3:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;2557:105:11:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2646:8:11::1;2633:10;:21;;;;;;;;;;;;:::i;:::-;;2557:105:::0;:::o;1245:256:4:-;1342:7;1378:23;1395:5;1378:16;:23::i;:::-;1370:5;:31;1362:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1467:12;:19;1480:5;1467:19;;;;;;;;;;;;;;;:26;1487:5;1467:26;;;;;;;;;;;;1460:33;;1245:256;;;;:::o;339:39:11:-;;;;:::o;708:89::-;;;;;;;;;;;;;:::o;2097:228::-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2145:10:11::1;;;;;;;;;;;:19;;:53;2194:3;2170:21;2165:2;:26;;;;:::i;:::-;:32;;;;:::i;:::-;2145:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2209:12;;;;;;;;;;;:21;;:54;2260:2;2236:21;2231:2;:26;;;;:::i;:::-;:31;;;;:::i;:::-;2209:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2274:11;;;;;;;;;;;:20;;:43;2295:21;2274:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2097:228::o:0;804:88::-;;;;;;;;;;;;;:::o;5285:185:3:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;1767:233:4:-;1842:7;1878:30;:28;:30::i;:::-;1870:5;:38;1862:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1975:10;1986:5;1975:17;;;;;;;;;;;;;;;;;;;;;;;;1968:24;;1767:233;;;:::o;2438:111:11:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2533:8:11::1;2517:13;:24;;;;;;;;;;;;:::i;:::-;;2438:111:::0;:::o;2906:110::-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2999:8:11::1;2977:11;;:31;;;;;;;;;;;;;;;;;;2906:110:::0;:::o;2120:239:3:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;1850:208::-;1922:7;1967:1;1950:19;;:5;:19;;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1650:94:10:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;2333:97:11:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2407:15:11::1;;;;;;;;;;;2406:16;2388:15;;:34;;;;;;;;;;;;;;;;;;2333:97::o:0;385:44::-;;;;:::o;570:35::-;;;;;;;;;;;;;:::o;999:87:10:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;2595:104:3:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;4278:295::-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;527:34:11:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5541:328:3:-;5716:41;5735:12;:10;:12::i;:::-;5749:7;5716:18;:41::i;:::-;5708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5822:39;5836:4;5842:2;5846:7;5855:5;5822:13;:39::i;:::-;5541:328;;;;:::o;438:82:11:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2786:112::-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2881:8:11::1;2858:12;;:32;;;;;;;;;;;;;;;;;;2786:112:::0;:::o;297:35::-;;;;:::o;1624:465::-;1699:15;;;;;;;;;;;1691:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;1777:35;1799:12;1777:21;:35::i;:::-;1764:9;:48;;1756:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;1900:10;;1884:12;1868:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:42;;1860:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;1962:14;1957:125;1993:12;1982:8;:23;;;1957:125;;;2034:36;2044:10;2056:13;:11;:13::i;:::-;2034:9;:36::i;:::-;2007:10;;;;:::i;:::-;;;1957:125;;;;1624:465;:::o;1425:191::-;1498:13;1555;1570:24;1581:1;1571:7;:11;;;;:::i;:::-;1570:22;:24::i;:::-;1596:10;1538:69;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1524:84;;1425:191;;;:::o;4644:164:3:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;1899:192:10:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;257:33:11:-;;;;:::o;1122:295::-;1192:7;1232:1;1220:9;:13;1212:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1302:19;;1289:9;:32;;1281:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;1394:15;;1382:9;:27;;;;:::i;:::-;1375:34;;1122:295;;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;13475:126:3:-;;;;:::o;1481:305::-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;7379:127::-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;601:98:1:-;654:7;681:10;674:17;;601:98;:::o;11361:174:3:-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;7673:348::-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;2099:173:10:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2099:173;;:::o;6751:315:3:-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;8363:110::-;8439:26;8449:2;8453:7;8439:26;;;;;;;;;;;;:9;:26::i;:::-;8363:110;;:::o;288:723:12:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;787:157:2:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;2613:589:4:-;2757:45;2784:4;2790:2;2794:7;2757:26;:45::i;:::-;2835:1;2819:18;;:4;:18;;;2815:187;;;2854:40;2886:7;2854:31;:40::i;:::-;2815:187;;;2924:2;2916:10;;:4;:10;;;2912:90;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2912:90;2815:187;3030:1;3016:16;;:2;:16;;;3012:183;;;3049:45;3086:7;3049:36;:45::i;:::-;3012:183;;;3122:4;3116:10;;:2;:10;;;3112:83;;3143:40;3171:2;3175:7;3143:27;:40::i;:::-;3112:83;3012:183;2613:589;;;:::o;12100:803:3:-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:624;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12575:1;12558:6;:13;:18;12554:272;;;12601:60;;;;;;;;;;:::i;:::-;;;;;;;;12554:272;12776:6;12770:13;12761:6;12757:2;12753:15;12746:38;12308:533;12445:45;;;12435:55;;;:6;:55;;;;12428:62;;;;;12272:624;12880:4;12873:11;;12100:803;;;;;;;:::o;8700:321::-;8830:18;8836:2;8840:7;8830:5;:18::i;:::-;8881:54;8912:1;8916:2;8920:7;8929:5;8881:22;:54::i;:::-;8859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8700:321;;;:::o;3925:164:4:-;4029:10;:17;;;;4002:15;:24;4018:7;4002:24;;;;;;;;;;;:44;;;;4057:10;4073:7;4057:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:164;:::o;4716:988::-;4982:22;5032:1;5007:22;5024:4;5007:16;:22::i;:::-;:26;;;;:::i;:::-;4982:51;;5044:18;5065:17;:26;5083:7;5065:26;;;;;;;;;;;;5044:47;;5212:14;5198:10;:28;5194:328;;5243:19;5265:12;:18;5278:4;5265:18;;;;;;;;;;;;;;;:34;5284:14;5265:34;;;;;;;;;;;;5243:56;;5349:11;5316:12;:18;5329:4;5316:18;;;;;;;;;;;;;;;:30;5335:10;5316:30;;;;;;;;;;;:44;;;;5466:10;5433:17;:30;5451:11;5433:30;;;;;;;;;;;:43;;;;5194:328;;5618:17;:26;5636:7;5618:26;;;;;;;;;;;5611:33;;;5662:12;:18;5675:4;5662:18;;;;;;;;;;;;;;;:34;5681:14;5662:34;;;;;;;;;;;5655:41;;;4716:988;;;;:::o;5999:1079::-;6252:22;6297:1;6277:10;:17;;;;:21;;;;:::i;:::-;6252:46;;6309:18;6330:15;:24;6346:7;6330:24;;;;;;;;;;;;6309:45;;6681:19;6703:10;6714:14;6703:26;;;;;;;;;;;;;;;;;;;;;;;;6681:48;;6767:11;6742:10;6753;6742:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6878:10;6847:15;:28;6863:11;6847:28;;;;;;;;;;;:41;;;;7019:15;:24;7035:7;7019:24;;;;;;;;;;;7012:31;;;7054:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5999:1079;;;;:::o;3503:221::-;3588:14;3605:20;3622:2;3605:16;:20::i;:::-;3588:37;;3663:7;3636:12;:16;3649:2;3636:16;;;;;;;;;;;;;;;:24;3653:6;3636:24;;;;;;;;;;;:34;;;;3710:6;3681:17;:26;3699:7;3681:26;;;;;;;;;;;:35;;;;3503:221;;;:::o;9357:382:3:-;9451:1;9437:16;;:2;:16;;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:13:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:142::-;6187:32;6213:5;6187:32;:::i;:::-;6182:3;6175:45;6165:61;;:::o;6232:118::-;6319:24;6337:5;6319:24;:::i;:::-;6314:3;6307:37;6297:53;;:::o;6356:109::-;6437:21;6452:5;6437:21;:::i;:::-;6432:3;6425:34;6415:50;;:::o;6471:360::-;;6585:38;6617:5;6585:38;:::i;:::-;6639:70;6702:6;6697:3;6639:70;:::i;:::-;6632:77;;6718:52;6763:6;6758:3;6751:4;6744:5;6740:16;6718:52;:::i;:::-;6795:29;6817:6;6795:29;:::i;:::-;6790:3;6786:39;6779:46;;6561:270;;;;;:::o;6837:364::-;;6953:39;6986:5;6953:39;:::i;:::-;7008:71;7072:6;7067:3;7008:71;:::i;:::-;7001:78;;7088:52;7133:6;7128:3;7121:4;7114:5;7110:16;7088:52;:::i;:::-;7165:29;7187:6;7165:29;:::i;:::-;7160:3;7156:39;7149:46;;6929:272;;;;;:::o;7207:377::-;;7341:39;7374:5;7341:39;:::i;:::-;7396:89;7478:6;7473:3;7396:89;:::i;:::-;7389:96;;7494:52;7539:6;7534:3;7527:4;7520:5;7516:16;7494:52;:::i;:::-;7571:6;7566:3;7562:16;7555:23;;7317:267;;;;;:::o;7614:845::-;;7754:5;7748:12;7783:36;7809:9;7783:36;:::i;:::-;7835:89;7917:6;7912:3;7835:89;:::i;:::-;7828:96;;7955:1;7944:9;7940:17;7971:1;7966:137;;;;8117:1;8112:341;;;;7933:520;;7966:137;8050:4;8046:9;8035;8031:25;8026:3;8019:38;8086:6;8081:3;8077:16;8070:23;;7966:137;;8112:341;8179:38;8211:5;8179:38;:::i;:::-;8239:1;8253:154;8267:6;8264:1;8261:13;8253:154;;;8341:7;8335:14;8331:1;8326:3;8322:11;8315:35;8391:1;8382:7;8378:15;8367:26;;8289:4;8286:1;8282:12;8277:17;;8253:154;;;8436:6;8431:3;8427:16;8420:23;;8119:334;;7933:520;;7721:738;;;;;;:::o;8465:330::-;;8628:67;8692:2;8687:3;8628:67;:::i;:::-;8621:74;;8725:34;8721:1;8716:3;8712:11;8705:55;8786:2;8781:3;8777:12;8770:19;;8611:184;;;:::o;8801:375::-;;8964:67;9028:2;9023:3;8964:67;:::i;:::-;8957:74;;9061:34;9057:1;9052:3;9048:11;9041:55;9127:13;9122:2;9117:3;9113:12;9106:35;9167:2;9162:3;9158:12;9151:19;;8947:229;;;:::o;9182:382::-;;9345:67;9409:2;9404:3;9345:67;:::i;:::-;9338:74;;9442:34;9438:1;9433:3;9429:11;9422:55;9508:20;9503:2;9498:3;9494:12;9487:42;9555:2;9550:3;9546:12;9539:19;;9328:236;;;:::o;9570:368::-;;9733:67;9797:2;9792:3;9733:67;:::i;:::-;9726:74;;9830:34;9826:1;9821:3;9817:11;9810:55;9896:6;9891:2;9886:3;9882:12;9875:28;9929:2;9924:3;9920:12;9913:19;;9716:222;;;:::o;9944:370::-;;10107:67;10171:2;10166:3;10107:67;:::i;:::-;10100:74;;10204:34;10200:1;10195:3;10191:11;10184:55;10270:8;10265:2;10260:3;10256:12;10249:30;10305:2;10300:3;10296:12;10289:19;;10090:224;;;:::o;10320:326::-;;10483:67;10547:2;10542:3;10483:67;:::i;:::-;10476:74;;10580:30;10576:1;10571:3;10567:11;10560:51;10637:2;10632:3;10628:12;10621:19;;10466:180;;;:::o;10652:368::-;;10815:67;10879:2;10874:3;10815:67;:::i;:::-;10808:74;;10912:34;10908:1;10903:3;10899:11;10892:55;10978:6;10973:2;10968:3;10964:12;10957:28;11011:2;11006:3;11002:12;10995:19;;10798:222;;;:::o;11026:323::-;;11189:67;11253:2;11248:3;11189:67;:::i;:::-;11182:74;;11286:27;11282:1;11277:3;11273:11;11266:48;11340:2;11335:3;11331:12;11324:19;;11172:177;;;:::o;11355:324::-;;11518:67;11582:2;11577:3;11518:67;:::i;:::-;11511:74;;11615:28;11611:1;11606:3;11602:11;11595:49;11670:2;11665:3;11661:12;11654:19;;11501:178;;;:::o;11685:376::-;;11848:67;11912:2;11907:3;11848:67;:::i;:::-;11841:74;;11945:34;11941:1;11936:3;11932:11;11925:55;12011:14;12006:2;12001:3;11997:12;11990:36;12052:2;12047:3;12043:12;12036:19;;11831:230;;;:::o;12067:388::-;;12230:67;12294:2;12289:3;12230:67;:::i;:::-;12223:74;;12327:34;12323:1;12318:3;12314:11;12307:55;12393:26;12388:2;12383:3;12379:12;12372:48;12446:2;12441:3;12437:12;12430:19;;12213:242;;;:::o;12461:374::-;;12624:67;12688:2;12683:3;12624:67;:::i;:::-;12617:74;;12721:34;12717:1;12712:3;12708:11;12701:55;12787:12;12782:2;12777:3;12773:12;12766:34;12826:2;12821:3;12817:12;12810:19;;12607:228;;;:::o;12841:373::-;;13004:67;13068:2;13063:3;13004:67;:::i;:::-;12997:74;;13101:34;13097:1;13092:3;13088:11;13081:55;13167:11;13162:2;13157:3;13153:12;13146:33;13205:2;13200:3;13196:12;13189:19;;12987:227;;;:::o;13220:330::-;;13383:67;13447:2;13442:3;13383:67;:::i;:::-;13376:74;;13480:34;13476:1;13471:3;13467:11;13460:55;13541:2;13536:3;13532:12;13525:19;;13366:184;;;:::o;13556:376::-;;13719:67;13783:2;13778:3;13719:67;:::i;:::-;13712:74;;13816:34;13812:1;13807:3;13803:11;13796:55;13882:14;13877:2;13872:3;13868:12;13861:36;13923:2;13918:3;13914:12;13907:19;;13702:230;;;:::o;13938:330::-;;14101:67;14165:2;14160:3;14101:67;:::i;:::-;14094:74;;14198:34;14194:1;14189:3;14185:11;14178:55;14259:2;14254:3;14250:12;14243:19;;14084:184;;;:::o;14274:373::-;;14437:67;14501:2;14496:3;14437:67;:::i;:::-;14430:74;;14534:34;14530:1;14525:3;14521:11;14514:55;14600:11;14595:2;14590:3;14586:12;14579:33;14638:2;14633:3;14629:12;14622:19;;14420:227;;;:::o;14653:327::-;;14816:67;14880:2;14875:3;14816:67;:::i;:::-;14809:74;;14913:31;14909:1;14904:3;14900:11;14893:52;14971:2;14966:3;14962:12;14955:19;;14799:181;;;:::o;14986:365::-;;15149:67;15213:2;15208:3;15149:67;:::i;:::-;15142:74;;15246:34;15242:1;15237:3;15233:11;15226:55;15312:3;15307:2;15302:3;15298:12;15291:25;15342:2;15337:3;15333:12;15326:19;;15132:219;;;:::o;15357:381::-;;15520:67;15584:2;15579:3;15520:67;:::i;:::-;15513:74;;15617:34;15613:1;15608:3;15604:11;15597:55;15683:19;15678:2;15673:3;15669:12;15662:41;15729:2;15724:3;15720:12;15713:19;;15503:235;;;:::o;15744:376::-;;15907:67;15971:2;15966:3;15907:67;:::i;:::-;15900:74;;16004:34;16000:1;15995:3;15991:11;15984:55;16070:14;16065:2;16060:3;16056:12;16049:36;16111:2;16106:3;16102:12;16095:19;;15890:230;;;:::o;16126:330::-;;16289:67;16353:2;16348:3;16289:67;:::i;:::-;16282:74;;16386:34;16382:1;16377:3;16373:11;16366:55;16447:2;16442:3;16438:12;16431:19;;16272:184;;;:::o;16462:118::-;16549:24;16567:5;16549:24;:::i;:::-;16544:3;16537:37;16527:53;;:::o;16586:583::-;;16830:92;16918:3;16909:6;16830:92;:::i;:::-;16823:99;;16939:95;17030:3;17021:6;16939:95;:::i;:::-;16932:102;;17051:92;17139:3;17130:6;17051:92;:::i;:::-;17044:99;;17160:3;17153:10;;16812:357;;;;;;:::o;17175:222::-;;17306:2;17295:9;17291:18;17283:26;;17319:71;17387:1;17376:9;17372:17;17363:6;17319:71;:::i;:::-;17273:124;;;;:::o;17403:254::-;;17550:2;17539:9;17535:18;17527:26;;17563:87;17647:1;17636:9;17632:17;17623:6;17563:87;:::i;:::-;17517:140;;;;:::o;17663:640::-;;17896:3;17885:9;17881:19;17873:27;;17910:71;17978:1;17967:9;17963:17;17954:6;17910:71;:::i;:::-;17991:72;18059:2;18048:9;18044:18;18035:6;17991:72;:::i;:::-;18073;18141:2;18130:9;18126:18;18117:6;18073:72;:::i;:::-;18192:9;18186:4;18182:20;18177:2;18166:9;18162:18;18155:48;18220:76;18291:4;18282:6;18220:76;:::i;:::-;18212:84;;17863:440;;;;;;;:::o;18309:210::-;;18434:2;18423:9;18419:18;18411:26;;18447:65;18509:1;18498:9;18494:17;18485:6;18447:65;:::i;:::-;18401:118;;;;:::o;18525:313::-;;18676:2;18665:9;18661:18;18653:26;;18725:9;18719:4;18715:20;18711:1;18700:9;18696:17;18689:47;18753:78;18826:4;18817:6;18753:78;:::i;:::-;18745:86;;18643:195;;;;:::o;18844:419::-;;19048:2;19037:9;19033:18;19025:26;;19097:9;19091:4;19087:20;19083:1;19072:9;19068:17;19061:47;19125:131;19251:4;19125:131;:::i;:::-;19117:139;;19015:248;;;:::o;19269:419::-;;19473:2;19462:9;19458:18;19450:26;;19522:9;19516:4;19512:20;19508:1;19497:9;19493:17;19486:47;19550:131;19676:4;19550:131;:::i;:::-;19542:139;;19440:248;;;:::o;19694:419::-;;19898:2;19887:9;19883:18;19875:26;;19947:9;19941:4;19937:20;19933:1;19922:9;19918:17;19911:47;19975:131;20101:4;19975:131;:::i;:::-;19967:139;;19865:248;;;:::o;20119:419::-;;20323:2;20312:9;20308:18;20300:26;;20372:9;20366:4;20362:20;20358:1;20347:9;20343:17;20336:47;20400:131;20526:4;20400:131;:::i;:::-;20392:139;;20290:248;;;:::o;20544:419::-;;20748:2;20737:9;20733:18;20725:26;;20797:9;20791:4;20787:20;20783:1;20772:9;20768:17;20761:47;20825:131;20951:4;20825:131;:::i;:::-;20817:139;;20715:248;;;:::o;20969:419::-;;21173:2;21162:9;21158:18;21150:26;;21222:9;21216:4;21212:20;21208:1;21197:9;21193:17;21186:47;21250:131;21376:4;21250:131;:::i;:::-;21242:139;;21140:248;;;:::o;21394:419::-;;21598:2;21587:9;21583:18;21575:26;;21647:9;21641:4;21637:20;21633:1;21622:9;21618:17;21611:47;21675:131;21801:4;21675:131;:::i;:::-;21667:139;;21565:248;;;:::o;21819:419::-;;22023:2;22012:9;22008:18;22000:26;;22072:9;22066:4;22062:20;22058:1;22047:9;22043:17;22036:47;22100:131;22226:4;22100:131;:::i;:::-;22092:139;;21990:248;;;:::o;22244:419::-;;22448:2;22437:9;22433:18;22425:26;;22497:9;22491:4;22487:20;22483:1;22472:9;22468:17;22461:47;22525:131;22651:4;22525:131;:::i;:::-;22517:139;;22415:248;;;:::o;22669:419::-;;22873:2;22862:9;22858:18;22850:26;;22922:9;22916:4;22912:20;22908:1;22897:9;22893:17;22886:47;22950:131;23076:4;22950:131;:::i;:::-;22942:139;;22840:248;;;:::o;23094:419::-;;23298:2;23287:9;23283:18;23275:26;;23347:9;23341:4;23337:20;23333:1;23322:9;23318:17;23311:47;23375:131;23501:4;23375:131;:::i;:::-;23367:139;;23265:248;;;:::o;23519:419::-;;23723:2;23712:9;23708:18;23700:26;;23772:9;23766:4;23762:20;23758:1;23747:9;23743:17;23736:47;23800:131;23926:4;23800:131;:::i;:::-;23792:139;;23690:248;;;:::o;23944:419::-;;24148:2;24137:9;24133:18;24125:26;;24197:9;24191:4;24187:20;24183:1;24172:9;24168:17;24161:47;24225:131;24351:4;24225:131;:::i;:::-;24217:139;;24115:248;;;:::o;24369:419::-;;24573:2;24562:9;24558:18;24550:26;;24622:9;24616:4;24612:20;24608:1;24597:9;24593:17;24586:47;24650:131;24776:4;24650:131;:::i;:::-;24642:139;;24540:248;;;:::o;24794:419::-;;24998:2;24987:9;24983:18;24975:26;;25047:9;25041:4;25037:20;25033:1;25022:9;25018:17;25011:47;25075:131;25201:4;25075:131;:::i;:::-;25067:139;;24965:248;;;:::o;25219:419::-;;25423:2;25412:9;25408:18;25400:26;;25472:9;25466:4;25462:20;25458:1;25447:9;25443:17;25436:47;25500:131;25626:4;25500:131;:::i;:::-;25492:139;;25390:248;;;:::o;25644:419::-;;25848:2;25837:9;25833:18;25825:26;;25897:9;25891:4;25887:20;25883:1;25872:9;25868:17;25861:47;25925:131;26051:4;25925:131;:::i;:::-;25917:139;;25815:248;;;:::o;26069:419::-;;26273:2;26262:9;26258:18;26250:26;;26322:9;26316:4;26312:20;26308:1;26297:9;26293:17;26286:47;26350:131;26476:4;26350:131;:::i;:::-;26342:139;;26240:248;;;:::o;26494:419::-;;26698:2;26687:9;26683:18;26675:26;;26747:9;26741:4;26737:20;26733:1;26722:9;26718:17;26711:47;26775:131;26901:4;26775:131;:::i;:::-;26767:139;;26665:248;;;:::o;26919:419::-;;27123:2;27112:9;27108:18;27100:26;;27172:9;27166:4;27162:20;27158:1;27147:9;27143:17;27136:47;27200:131;27326:4;27200:131;:::i;:::-;27192:139;;27090:248;;;:::o;27344:419::-;;27548:2;27537:9;27533:18;27525:26;;27597:9;27591:4;27587:20;27583:1;27572:9;27568:17;27561:47;27625:131;27751:4;27625:131;:::i;:::-;27617:139;;27515:248;;;:::o;27769:419::-;;27973:2;27962:9;27958:18;27950:26;;28022:9;28016:4;28012:20;28008:1;27997:9;27993:17;27986:47;28050:131;28176:4;28050:131;:::i;:::-;28042:139;;27940:248;;;:::o;28194:222::-;;28325:2;28314:9;28310:18;28302:26;;28338:71;28406:1;28395:9;28391:17;28382:6;28338:71;:::i;:::-;28292:124;;;;:::o;28422:283::-;;28488:2;28482:9;28472:19;;28530:4;28522:6;28518:17;28637:6;28625:10;28622:22;28601:18;28589:10;28586:34;28583:62;28580:2;;;28648:18;;:::i;:::-;28580:2;28688:10;28684:2;28677:22;28462:243;;;;:::o;28711:331::-;;28862:18;28854:6;28851:30;28848:2;;;28884:18;;:::i;:::-;28848:2;28969:4;28965:9;28958:4;28950:6;28946:17;28942:33;28934:41;;29030:4;29024;29020:15;29012:23;;28777:265;;;:::o;29048:332::-;;29200:18;29192:6;29189:30;29186:2;;;29222:18;;:::i;:::-;29186:2;29307:4;29303:9;29296:4;29288:6;29284:17;29280:33;29272:41;;29368:4;29362;29358:15;29350:23;;29115:265;;;:::o;29386:141::-;;29458:3;29450:11;;29481:3;29478:1;29471:14;29515:4;29512:1;29502:18;29494:26;;29440:87;;;:::o;29533:98::-;;29618:5;29612:12;29602:22;;29591:40;;;:::o;29637:99::-;;29723:5;29717:12;29707:22;;29696:40;;;:::o;29742:168::-;;29859:6;29854:3;29847:19;29899:4;29894:3;29890:14;29875:29;;29837:73;;;;:::o;29916:169::-;;30034:6;30029:3;30022:19;30074:4;30069:3;30065:14;30050:29;;30012:73;;;;:::o;30091:148::-;;30230:3;30215:18;;30205:34;;;;:::o;30245:305::-;;30304:20;30322:1;30304:20;:::i;:::-;30299:25;;30338:20;30356:1;30338:20;:::i;:::-;30333:25;;30492:1;30424:66;30420:74;30417:1;30414:81;30411:2;;;30498:18;;:::i;:::-;30411:2;30542:1;30539;30535:9;30528:16;;30289:261;;;;:::o;30556:185::-;;30613:20;30631:1;30613:20;:::i;:::-;30608:25;;30647:20;30665:1;30647:20;:::i;:::-;30642:25;;30686:1;30676:2;;30691:18;;:::i;:::-;30676:2;30733:1;30730;30726:9;30721:14;;30598:143;;;;:::o;30747:348::-;;30810:20;30828:1;30810:20;:::i;:::-;30805:25;;30844:20;30862:1;30844:20;:::i;:::-;30839:25;;31032:1;30964:66;30960:74;30957:1;30954:81;30949:1;30942:9;30935:17;30931:105;30928:2;;;31039:18;;:::i;:::-;30928:2;31087:1;31084;31080:9;31069:20;;30795:300;;;;:::o;31101:191::-;;31161:20;31179:1;31161:20;:::i;:::-;31156:25;;31195:20;31213:1;31195:20;:::i;:::-;31190:25;;31234:1;31231;31228:8;31225:2;;;31239:18;;:::i;:::-;31225:2;31284:1;31281;31277:9;31269:17;;31146:146;;;;:::o;31298:96::-;;31364:24;31382:5;31364:24;:::i;:::-;31353:35;;31343:51;;;:::o;31400:104::-;;31474:24;31492:5;31474:24;:::i;:::-;31463:35;;31453:51;;;:::o;31510:90::-;;31587:5;31580:13;31573:21;31562:32;;31552:48;;;:::o;31606:149::-;;31682:66;31675:5;31671:78;31660:89;;31650:105;;;:::o;31761:126::-;;31838:42;31831:5;31827:54;31816:65;;31806:81;;;:::o;31893:77::-;;31959:5;31948:16;;31938:32;;;:::o;31976:86::-;;32051:4;32044:5;32040:16;32029:27;;32019:43;;;:::o;32068:154::-;32152:6;32147:3;32142;32129:30;32214:1;32205:6;32200:3;32196:16;32189:27;32119:103;;;:::o;32228:307::-;32296:1;32306:113;32320:6;32317:1;32314:13;32306:113;;;32405:1;32400:3;32396:11;32390:18;32386:1;32381:3;32377:11;32370:39;32342:2;32339:1;32335:10;32330:15;;32306:113;;;32437:6;32434:1;32431:13;32428:2;;;32517:1;32508:6;32503:3;32499:16;32492:27;32428:2;32277:258;;;;:::o;32541:320::-;;32622:1;32616:4;32612:12;32602:22;;32669:1;32663:4;32659:12;32690:18;32680:2;;32746:4;32738:6;32734:17;32724:27;;32680:2;32808;32800:6;32797:14;32777:18;32774:38;32771:2;;;32827:18;;:::i;:::-;32771:2;32592:269;;;;:::o;32867:233::-;;32929:24;32947:5;32929:24;:::i;:::-;32920:33;;32975:66;32968:5;32965:77;32962:2;;;33045:18;;:::i;:::-;32962:2;33092:1;33085:5;33081:13;33074:20;;32910:190;;;:::o;33106:167::-;;33166:22;33182:5;33166:22;:::i;:::-;33157:31;;33210:4;33203:5;33200:15;33197:2;;;33218:18;;:::i;:::-;33197:2;33265:1;33258:5;33254:13;33247:20;;33147:126;;;:::o;33279:176::-;;33328:20;33346:1;33328:20;:::i;:::-;33323:25;;33362:20;33380:1;33362:20;:::i;:::-;33357:25;;33401:1;33391:2;;33406:18;;:::i;:::-;33391:2;33447:1;33444;33440:9;33435:14;;33313:142;;;;:::o;33461:180::-;33509:77;33506:1;33499:88;33606:4;33603:1;33596:15;33630:4;33627:1;33620:15;33647:180;33695:77;33692:1;33685:88;33792:4;33789:1;33782:15;33816:4;33813:1;33806:15;33833:180;33881:77;33878:1;33871:88;33978:4;33975:1;33968:15;34002:4;33999:1;33992:15;34019:180;34067:77;34064:1;34057:88;34164:4;34161:1;34154:15;34188:4;34185:1;34178:15;34205:102;;34297:2;34293:7;34288:2;34281:5;34277:14;34273:28;34263:38;;34253:54;;;:::o;34313:122::-;34386:24;34404:5;34386:24;:::i;:::-;34379:5;34376:35;34366:2;;34425:1;34422;34415:12;34366:2;34356:79;:::o;34441:116::-;34511:21;34526:5;34511:21;:::i;:::-;34504:5;34501:32;34491:2;;34547:1;34544;34537:12;34491:2;34481:76;:::o;34563:120::-;34635:23;34652:5;34635:23;:::i;:::-;34628:5;34625:34;34615:2;;34673:1;34670;34663:12;34615:2;34605:78;:::o;34689:122::-;34762:24;34780:5;34762:24;:::i;:::-;34755:5;34752:35;34742:2;;34801:1;34798;34791:12;34742:2;34732:79;:::o

Swarm Source

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