ETH Price: $2,628.58 (-2.50%)

Token

GOGOS (GOG)
 

Overview

Max Total Supply

739 GOG

Holders

195

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoGogos

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-08
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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() internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

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);
}

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;
}

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);
}

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);
}

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);
}

abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

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;
        // solhint-disable-next-line no-inline-assembly
        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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value)
        private
        view
        returns (bool)
    {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index)
        private
        view
        returns (bytes32)
    {
        require(
            set._values.length > index,
            "EnumerableSet: index out of bounds"
        );
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index)
        internal
        view
        returns (bytes32)
    {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index)
        internal
        view
        returns (uint256)
    {
        return uint256(_at(set._inner, index));
    }
}

library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;
        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(
        Map storage map,
        bytes32 key,
        bytes32 value
    ) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) {
            // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({_key: key, _value: value}));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) {
            // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key)
        private
        view
        returns (bool)
    {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

    /**
     * @dev Returns the key-value pair stored at position `index` in the map. O(1).
     *
     * Note that there are no guarantees on the ordering of entries inside the
     * array, and it may change when more entries are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Map storage map, uint256 index)
        private
        view
        returns (bytes32, bytes32)
    {
        require(
            map._entries.length > index,
            "EnumerableMap: index out of bounds"
        );

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key)
        private
        view
        returns (bool, bytes32)
    {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(
        Map storage map,
        bytes32 key,
        string memory errorMessage
    ) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(
        UintToAddressMap storage map,
        uint256 key,
        address value
    ) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key)
        internal
        returns (bool)
    {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key)
        internal
        view
        returns (bool)
    {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map)
        internal
        view
        returns (uint256)
    {
        return _length(map._inner);
    }

    /**
     * @dev Returns the element stored at position `index` in the set. O(1).
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintToAddressMap storage map, uint256 index)
        internal
        view
        returns (uint256, address)
    {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key)
        internal
        view
        returns (bool, address)
    {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(
        UintToAddressMap storage map,
        uint256 key,
        string memory errorMessage
    ) internal view returns (address) {
        return
            address(
                uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))
            );
    }
}

library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + (temp % 10)));
            temp /= 10;
        }
        return string(buffer);
    }
}

contract ERC721 is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping(address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

    // 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;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @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 _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        return
            _tokenOwners.get(
                tokenId,
                "ERC721: owner query for nonexistent token"
            );
    }

    /**
     * @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 _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
     * @dev Returns the base URI set via {_setBaseURI}. This will be
     * automatically added as a prefix in {tokenURI} to each token's URI, or
     * to the token ID if no specific URI is set for that token ID.
     */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @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 ||
                ERC721.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 _tokenOwners.contains(tokenId);
    }

    /**
     * @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 ||
            ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(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); // internal owner

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(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"
        ); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI)
        internal
        virtual
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI set of nonexistent token"
        );
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata =
            to.functionCall(
                abi.encodeWithSelector(
                    IERC721Receiver(to).onERC721Received.selector,
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                ),
                "ERC721: transfer to non ERC721Receiver implementer"
            );
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

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

abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

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

    bool private _paused;

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

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

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

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

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

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

abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

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

contract CryptoGogos is ERC721Burnable, ERC721Pausable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds; //Counter is a struct in the Counters library
    using SafeMath for uint256;

    uint256 private maxSupply = 7777;

    uint256 private maxSalePrice = 1 ether;

    event MAX_SUPPLY_UPDATED(uint256 maxSupply);
    event MAX_PRICE_UPDATED(uint256 maxPrice);

    constructor(string memory _baseURI) public ERC721("GOGOS", "GOG") {
        _setBaseURI(_baseURI);
    }

    /**
     * @dev Gets current gogo Pack Price
     */
    function getNFTPackPrice() public view returns (uint256) {
        uint256 currentSupply = totalSupply();

        if (currentSupply >= 7150) {
            return maxSalePrice.mul(3 * 83333333).div(100000000);
        } else if (currentSupply >= 3150) {
            return 0.55 ether;
        } else if (currentSupply >= 850) {
            return 0.4 ether;
        } else {
            return 0;
        }
    }

    /**
     * @dev Gets current gogo Price
     */
    function getNFTPrice() public view returns (uint256) {
        uint256 currentSupply = totalSupply();

        if (currentSupply >= 7150) {
            return maxSalePrice;
        } else if (currentSupply >= 3150) {
            return 0.2 ether;
        } else if (currentSupply >= 1150) {
            return 0.15 ether;
        } else if (currentSupply >= 300) {
            return 0.1 ether;
        } else if (currentSupply >= 150) {
            return 0.07 ether;
        } else {
            return 0.05 ether;
        }
    }

    /**
     * @dev Gets current gogo Price
     */
    function cantMint() public view returns (bool) {
        uint256 currentSupply = totalSupply();
        if (currentSupply <= 150 && balanceOf(msg.sender) >= 2) return false;
        if (currentSupply <= 300 && balanceOf(msg.sender) >= 4) return false;
        return true;
    }

    /**
     * @dev Gets current gogo Price
     */
    function updateMaxPrice(uint256 _price) public onlyOwner {
        maxSalePrice = _price;

        emit MAX_PRICE_UPDATED(_price);
    }

    /**
     * @dev Creates a new token for `to`. Its token ID will be automatically
     * assigned (and available on the emitted {IERC721-Transfer} event), and the token
     * URI autogenerated based on the base URI passed at construction.
     *
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mintByAdmin(address to) public onlyOwner {
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        require(newItemId <= maxSupply);
        _mint(to, newItemId);
    }

    /*
     *  _tokenURI is link to json
     */
    function mint() public payable returns (uint256) {
        require(getNFTPrice() == msg.value, "Ether value sent is not correct");
        require(!paused(), "ERC721Pausable: token mint while paused");

        uint256 currentSupply = totalSupply();
        if (!cantMint()) revert();
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        require(newItemId <= maxSupply);
        _mint(msg.sender, newItemId);
        return newItemId;
    }

    /*
     *  _tokenURIs is a array of links to json
     */
    function mintPack() public payable returns (uint256) {
        require(totalSupply() >= 850, "Pack is not available now");
        require(
            getNFTPackPrice() == msg.value,
            "Ether value sent is not correct"
        );
        require(!paused(), "ERC721Pausable: token mint while paused");

        uint256 newItemId;
        for (uint256 i = 0; i < 3; i++) {
            _tokenIds.increment();
            newItemId = _tokenIds.current();
            require(newItemId <= maxSupply);
            _mint(msg.sender, newItemId);
        }
        return newItemId;
    }

    function updateBaseURI(string memory _baseURI) public onlyOwner {
        _setBaseURI(_baseURI);
    }

    /**
     * @dev Withdraw ether from this contract (Callable by owner)
     */
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        msg.sender.transfer(balance);
    }

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721Pausable, ERC721) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function pause() public onlyOwner whenNotPaused {
        _pause();
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function unpause() public onlyOwner whenPaused {
        _unpause();
    }

    function updateMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
        emit MAX_SUPPLY_UPDATED(_maxSupply);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"MAX_PRICE_UPDATED","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"MAX_SUPPLY_UPDATED","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cantMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPackPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateMaxPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611e61600c55670de0b6b3a7640000600d553480156200002357600080fd5b5060405162004e6138038062004e6183398181016040528101906200004991906200042b565b6040518060400160405280600581526020017f474f474f530000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f474f470000000000000000000000000000000000000000000000000000000000815250620000cd6301ffc9a760e01b6200022d60201b60201c565b8160069080519060200190620000e592919062000329565b508060079080519060200190620000fe92919062000329565b50620001176380ac58cd60e01b6200022d60201b60201c565b6200012f635b5e139f60e01b6200022d60201b60201c565b6200014763780e9d6360e01b6200022d60201b60201c565b50506000600a60006101000a81548160ff0219169083151502179055506000620001766200030560201b60201c565b905080600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000226816200030d60201b60201c565b5062000576565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000299576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029090620004b2565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b80600990805190602001906200032592919062000329565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200036c57805160ff19168380011785556200039d565b828001600101855582156200039d579182015b828111156200039c5782518255916020019190600101906200037f565b5b509050620003ac9190620003b0565b5090565b5b80821115620003cb576000816000905550600101620003b1565b5090565b600082601f830112620003e157600080fd5b8151620003f8620003f28262000502565b620004d4565b915080825260208301602083018583830111156200041557600080fd5b6200042283828462000540565b50505092915050565b6000602082840312156200043e57600080fd5b600082015167ffffffffffffffff8111156200045957600080fd5b6200046784828501620003cf565b91505092915050565b60006200047f601c836200052f565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b60006020820190508181036000830152620004cd8162000470565b9050919050565b6000604051905081810181811067ffffffffffffffff82111715620004f857600080fd5b8060405250919050565b600067ffffffffffffffff8211156200051a57600080fd5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b838110156200056057808201518184015260208101905062000543565b8381111562000570576000848401525b50505050565b6148db80620005866000396000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d578063931688cb116100a0578063c87b56dd1161006f578063c87b56dd146106cd578063e985e9c51461070a578063f103b43314610747578063f2fde38b14610770578063fb107a4f14610799576101f9565b8063931688cb1461062757806395d89b4114610650578063a22cb4651461067b578063b88d4fde146106a4576101f9565b8063722676e2116100dc578063722676e21461059e5780638456cb59146105bc5780638da5cb5b146105d35780638ea0507b146105fe576101f9565b80636352211e146104e25780636c0360eb1461051f57806370a082311461054a578063715018a614610587576101f9565b80632f745c591161019057806342966c681161015f57806342966c68146103fd578063469619f2146104265780634f6ccce71461044f5780635ac117251461048c5780635c975abb146104b7576101f9565b80632f745c59146103695780633ccfd60b146103a65780633f4ba83a146103bd57806342842e0e146103d4576101f9565b80631249c58b116101cc5780631249c58b146102cc57806318160ddd146102ea57806319e325151461031557806323b872dd14610340576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906135f0565b6107c4565b6040516102329190614234565b60405180910390f35b34801561024757600080fd5b5061025061082b565b60405161025d919061424f565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613683565b6108cd565b60405161029a91906141b2565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906135b4565b610952565b005b6102d4610a6a565b6040516102e191906145f1565b60405180910390f35b3480156102f657600080fd5b506102ff610b53565b60405161030c91906145f1565b60405180910390f35b34801561032157600080fd5b5061032a610b64565b6040516103379190614234565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906134ae565b610bcd565b005b34801561037557600080fd5b50610390600480360381019061038b91906135b4565b610c2d565b60405161039d91906145f1565b60405180910390f35b3480156103b257600080fd5b506103bb610c88565b005b3480156103c957600080fd5b506103d2610d53565b005b3480156103e057600080fd5b506103fb60048036038101906103f691906134ae565b610e20565b005b34801561040957600080fd5b50610424600480360381019061041f9190613683565b610e40565b005b34801561043257600080fd5b5061044d60048036038101906104489190613683565b610e9c565b005b34801561045b57600080fd5b5061047660048036038101906104719190613683565b610f59565b60405161048391906145f1565b60405180910390f35b34801561049857600080fd5b506104a1610f7c565b6040516104ae91906145f1565b60405180910390f35b3480156104c357600080fd5b506104cc611006565b6040516104d99190614234565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190613683565b61101d565b60405161051691906141b2565b60405180910390f35b34801561052b57600080fd5b50610534611054565b604051610541919061424f565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190613449565b6110f6565b60405161057e91906145f1565b60405180910390f35b34801561059357600080fd5b5061059c6111b5565b005b6105a66112f2565b6040516105b391906145f1565b60405180910390f35b3480156105c857600080fd5b506105d1611426565b005b3480156105df57600080fd5b506105e86114f4565b6040516105f591906141b2565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613449565b61151e565b005b34801561063357600080fd5b5061064e60048036038101906106499190613642565b6115cf565b005b34801561065c57600080fd5b50610665611657565b604051610672919061424f565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613578565b6116f9565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906134fd565b61187a565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190613683565b6118dc565b604051610701919061424f565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c9190613472565b611a5f565b60405161073e9190614234565b60405180910390f35b34801561075357600080fd5b5061076e60048036038101906107699190613683565b611af3565b005b34801561077c57600080fd5b5061079760048036038101906107929190613449565b611bb0565b005b3480156107a557600080fd5b506107ae611d5c565b6040516107bb91906145f1565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611df2565b610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906144f1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095d8261101d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590614571565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ed611e0f565b73ffffffffffffffffffffffffffffffffffffffff161480610a1c5750610a1b81610a16611e0f565b611a5f565b5b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290614431565b60405180910390fd5b610a658383611e17565b505050565b600034610a75611d5c565b14610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90614371565b60405180910390fd5b610abd611006565b15610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af4906144b1565b60405180910390fd5b6000610b07610b53565b9050610b11610b64565b610b1a57600080fd5b610b24600b611ed0565b6000610b30600b611ee6565b9050600c54811115610b4157600080fd5b610b4b3382611ef4565b809250505090565b6000610b5f6002612082565b905090565b600080610b6f610b53565b905060968111158015610b8b57506002610b88336110f6565b10155b15610b9a576000915050610bca565b61012c8111158015610bb557506004610bb2336110f6565b10155b15610bc4576000915050610bca565b60019150505b90565b610bde610bd8611e0f565b82612097565b610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490614591565b60405180910390fd5b610c28838383612175565b505050565b6000610c8082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061238c90919063ffffffff16565b905092915050565b610c90611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610cae6114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90614511565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d4f573d6000803e3d6000fd5b5050565b610d5b611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610d796114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690614511565b60405180910390fd5b610dd7611006565b610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d906142b1565b60405180910390fd5b610e1e6123a6565b565b610e3b8383836040518060200160405280600081525061187a565b505050565b610e51610e4b611e0f565b82612097565b610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e87906145d1565b60405180910390fd5b610e9981612448565b50565b610ea4611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610ec26114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614511565b60405180910390fd5b80600d819055507f4b9d786179e2599e65d6eb10cdb73af77287bb79b562194500404a8612be165781604051610f4e91906145f1565b60405180910390a150565b600080610f7083600261258290919063ffffffff16565b50905080915050919050565b600080610f87610b53565b9050611bee8110610fc957610fc16305f5e100610fb3630ee6b27f600d546125ae90919063ffffffff16565b61261e90919063ffffffff16565b915050611003565b610c4e8110610fe3576707a1fe1602770000915050611003565b6103528110610ffd5767058d15e176280000915050611003565b60009150505b90565b6000600a60009054906101000a900460ff16905090565b600061104d8260405180606001604052806029815260200161487d6029913960026126749092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110ec5780601f106110c1576101008083540402835291602001916110ec565b820191906000526020600020905b8154815290600101906020018083116110cf57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90614451565b60405180910390fd5b6111ae600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612693565b9050919050565b6111bd611e0f565b73ffffffffffffffffffffffffffffffffffffffff166111db6114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614511565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006103526112ff610b53565b1015611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614391565b60405180910390fd5b34611349610f7c565b14611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090614371565b60405180910390fd5b611391611006565b156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c8906144b1565b60405180910390fd5b600080600090505b600381101561141e576113ec600b611ed0565b6113f6600b611ee6565b9150600c5482111561140757600080fd5b6114113383611ef4565b80806001019150506113d9565b508091505090565b61142e611e0f565b73ffffffffffffffffffffffffffffffffffffffff1661144c6114f4565b73ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990614511565b60405180910390fd5b6114aa611006565b156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614411565b60405180910390fd5b6114f26126a8565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611526611e0f565b73ffffffffffffffffffffffffffffffffffffffff166115446114f4565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159190614511565b60405180910390fd5b6115a4600b611ed0565b60006115b0600b611ee6565b9050600c548111156115c157600080fd5b6115cb8282611ef4565b5050565b6115d7611e0f565b73ffffffffffffffffffffffffffffffffffffffff166115f56114f4565b73ffffffffffffffffffffffffffffffffffffffff161461164b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164290614511565b60405180910390fd5b6116548161274b565b50565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b611701611e0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614351565b60405180910390fd5b806005600061177c611e0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611829611e0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186e9190614234565b60405180910390a35050565b61188b611885611e0f565b83612097565b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614591565b60405180910390fd5b6118d684848484612765565b50505050565b60606118e782611df2565b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90614551565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119cf5780601f106119a4576101008083540402835291602001916119cf565b820191906000526020600020905b8154815290600101906020018083116119b257829003601f168201915b5050505050905060606119e0611054565b90506000815114156119f6578192505050611a5a565b600082511115611a2b578082604051602001611a1392919061418e565b60405160208183030381529060405292505050611a5a565b80611a35856127c1565b604051602001611a4692919061418e565b604051602081830303815290604052925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611afb611e0f565b73ffffffffffffffffffffffffffffffffffffffff16611b196114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690614511565b60405180910390fd5b80600c819055507fd8419718ffd2a34111add9f7b4dca791378fc702c0803a6c6b12bf0b1896278d81604051611ba591906145f1565b60405180910390a150565b611bb8611e0f565b73ffffffffffffffffffffffffffffffffffffffff16611bd66114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390614511565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c93906142f1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611d67610b53565b9050611bee8110611d7d57600d54915050611def565b610c4e8110611d97576702c68af0bb140000915050611def565b61047e8110611db157670214e8348c4f0000915050611def565b61012c8110611dcb5767016345785d8a0000915050611def565b60968110611de35766f8b0a10e470000915050611def565b66b1a2bc2ec500009150505b90565b6000611e0882600261290890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e8a8361101d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5b90614491565b60405180910390fd5b611f6d81611df2565b15611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490614311565b60405180910390fd5b611fb960008383612922565b61200a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061293290919063ffffffff16565b506120218183600261294c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061209082600001612981565b9050919050565b60006120a282611df2565b6120e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d8906143d1565b60405180910390fd5b60006120ec8361101d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061215b57508373ffffffffffffffffffffffffffffffffffffffff16612143846108cd565b73ffffffffffffffffffffffffffffffffffffffff16145b8061216c575061216b8185611a5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121958261101d565b73ffffffffffffffffffffffffffffffffffffffff16146121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e290614531565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225290614331565b60405180910390fd5b612266838383612922565b612271600082611e17565b6122c281600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061299290919063ffffffff16565b5061231481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061293290919063ffffffff16565b5061232b8183600261294c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061239b83600001836129ac565b60001c905092915050565b6123ae611006565b6123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e4906142b1565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612431611e0f565b60405161243e91906141cd565b60405180910390a1565b60006124538261101d565b905061246181600084612922565b61246c600083611e17565b600060086000848152602001908152602001600020805460018160011615610100020316600290049050146124bb576008600083815260200190815260200160002060006124ba9190613253565b5b61250c82600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061299290919063ffffffff16565b50612521826002612a1990919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806000806125958660000186612a33565b915091508160001c8160001c9350935050509250929050565b6000808314156125c15760009050612618565b60008284029050828482816125d257fe5b0414612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a906144d1565b60405180910390fd5b809150505b92915050565b6000808211612662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612659906143f1565b60405180910390fd5b81838161266b57fe5b04905092915050565b6000612687846000018460001b84612ab6565b60001c90509392505050565b60006126a182600001612b47565b9050919050565b6126b0611006565b156126f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e790614411565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612734611e0f565b60405161274191906141cd565b60405180910390a1565b806009908051906020019061276192919061329b565b5050565b612770848484612175565b61277c84848484612b58565b6127bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b2906142d1565b60405180910390fd5b50505050565b60606000821415612809576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612903565b600082905060005b60008214612833578080600101915050600a828161282b57fe5b049150612811565b60608167ffffffffffffffff8111801561284c57600080fd5b506040519080825280601f01601f19166020018201604052801561287f5781602001600182028036833780820191505090505b50905060006001830390508593505b600084146128fb57600a84816128a057fe5b0660300160f81b828280600190039350815181106128ba57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816128f357fe5b04935061288e565b819450505050505b919050565b600061291a836000018360001b612cbc565b905092915050565b61292d838383612cdf565b505050565b6000612944836000018360001b612d37565b905092915050565b6000612978846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612da7565b90509392505050565b600081600001805490509050919050565b60006129a4836000018360001b612e83565b905092915050565b6000818360000180549050116129f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ee90614271565b60405180910390fd5b826000018281548110612a0657fe5b9060005260206000200154905092915050565b6000612a2b836000018360001b612f6b565b905092915050565b60008082846000018054905011612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614471565b60405180910390fd5b6000846000018481548110612a9057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0f919061424f565b60405180910390fd5b50846000016001820381548110612b2b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612b798473ffffffffffffffffffffffffffffffffffffffff16613084565b612b865760019050612cb4565b6060612c4d63150b7a0260e01b612b9b611e0f565b888787604051602401612bb194939291906141e8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161484b603291398773ffffffffffffffffffffffffffffffffffffffff166130979092919063ffffffff16565b9050600081806020019051810190612c659190613619565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b612cea8383836130af565b612cf2611006565b15612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990614291565b60405180910390fd5b505050565b6000612d4383836130b4565b612d9c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612da1565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612e4e57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612e7c565b82856000016001830381548110612e6157fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60008083600101600084815260200190815260200160002054905060008114612f5f5760006001820390506000600186600001805490500390506000866000018281548110612ece57fe5b9060005260206000200154905080876000018481548110612eeb57fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612f2357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612f65565b60009150505b92915050565b600080836001016000848152602001908152602001600020549050600081146130785760006001820390506000600186600001805490500390506000866000018281548110612fb657fe5b9060005260206000209060020201905080876000018481548110612fd657fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061302957fe5b600190038181906000526020600020906002020160008082016000905560018201600090555050905586600101600087815260200190815260200160002060009055600194505050505061307e565b60009150505b92915050565b600080823b905060008111915050919050565b60606130a684846000856130d7565b90509392505050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561311c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613113906143b1565b60405180910390fd5b61312585613084565b613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b906145b1565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff16858760405161318e9190614177565b60006040518083038185875af1925050503d80600081146131cb576040519150601f19603f3d011682016040523d82523d6000602084013e6131d0565b606091505b50915091506131e08282866131ec565b92505050949350505050565b606083156131fc5782905061324c565b60008351111561320f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613243919061424f565b60405180910390fd5b9392505050565b50805460018160011615610100020316600290046000825580601f106132795750613298565b601f016020900490600052602060002090810190613297919061331b565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106132dc57805160ff191683800117855561330a565b8280016001018555821561330a579182015b828111156133095782518255916020019190600101906132ee565b5b509050613317919061331b565b5090565b5b8082111561333457600081600090555060010161331c565b5090565b600081359050613347816147ee565b92915050565b60008135905061335c81614805565b92915050565b6000813590506133718161481c565b92915050565b6000815190506133868161481c565b92915050565b600082601f83011261339d57600080fd5b81356133b06133ab82614639565b61460c565b915080825260208301602083018583830111156133cc57600080fd5b6133d783828461479b565b50505092915050565b600082601f8301126133f157600080fd5b81356134046133ff82614665565b61460c565b9150808252602083016020830185838301111561342057600080fd5b61342b83828461479b565b50505092915050565b60008135905061344381614833565b92915050565b60006020828403121561345b57600080fd5b600061346984828501613338565b91505092915050565b6000806040838503121561348557600080fd5b600061349385828601613338565b92505060206134a485828601613338565b9150509250929050565b6000806000606084860312156134c357600080fd5b60006134d186828701613338565b93505060206134e286828701613338565b92505060406134f386828701613434565b9150509250925092565b6000806000806080858703121561351357600080fd5b600061352187828801613338565b945050602061353287828801613338565b935050604061354387828801613434565b925050606085013567ffffffffffffffff81111561356057600080fd5b61356c8782880161338c565b91505092959194509250565b6000806040838503121561358b57600080fd5b600061359985828601613338565b92505060206135aa8582860161334d565b9150509250929050565b600080604083850312156135c757600080fd5b60006135d585828601613338565b92505060206135e685828601613434565b9150509250929050565b60006020828403121561360257600080fd5b600061361084828501613362565b91505092915050565b60006020828403121561362b57600080fd5b600061363984828501613377565b91505092915050565b60006020828403121561365457600080fd5b600082013567ffffffffffffffff81111561366e57600080fd5b61367a848285016133e0565b91505092915050565b60006020828403121561369557600080fd5b60006136a384828501613434565b91505092915050565b6136b581614765565b82525050565b6136c4816146f1565b82525050565b6136d3816146df565b82525050565b6136e281614703565b82525050565b60006136f382614691565b6136fd81856146a7565b935061370d8185602086016147aa565b613716816147dd565b840191505092915050565b600061372c82614691565b61373681856146b8565b93506137468185602086016147aa565b80840191505092915050565b600061375d8261469c565b61376781856146c3565b93506137778185602086016147aa565b613780816147dd565b840191505092915050565b60006137968261469c565b6137a081856146d4565b93506137b08185602086016147aa565b80840191505092915050565b60006137c96022836146c3565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061382f602b836146c3565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006138956014836146c3565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006138d56032836146c3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061393b6026836146c3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139a1601c836146c3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006139e16024836146c3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a476019836146c3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613a87601f836146c3565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613ac76019836146c3565b91507f5061636b206973206e6f7420617661696c61626c65206e6f77000000000000006000830152602082019050919050565b6000613b076026836146c3565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b6d602c836146c3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613bd3601a836146c3565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b6000613c136010836146c3565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613c536038836146c3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613cb9602a836146c3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d1f6022836146c3565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d856020836146c3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613dc56027836146c3565b91507f4552433732315061757361626c653a20746f6b656e206d696e74207768696c6560008301527f20706175736564000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e2b6021836146c3565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e91602c836146c3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ef76020836146c3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613f376029836146c3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f9d602f836146c3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006140036021836146c3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140696031836146c3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006140cf601d836146c3565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061410f6030836146c3565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b6141718161475b565b82525050565b60006141838284613721565b915081905092915050565b600061419a828561378b565b91506141a6828461378b565b91508190509392505050565b60006020820190506141c760008301846136ca565b92915050565b60006020820190506141e260008301846136ac565b92915050565b60006080820190506141fd60008301876136bb565b61420a60208301866136ca565b6142176040830185614168565b818103606083015261422981846136e8565b905095945050505050565b600060208201905061424960008301846136d9565b92915050565b600060208201905081810360008301526142698184613752565b905092915050565b6000602082019050818103600083015261428a816137bc565b9050919050565b600060208201905081810360008301526142aa81613822565b9050919050565b600060208201905081810360008301526142ca81613888565b9050919050565b600060208201905081810360008301526142ea816138c8565b9050919050565b6000602082019050818103600083015261430a8161392e565b9050919050565b6000602082019050818103600083015261432a81613994565b9050919050565b6000602082019050818103600083015261434a816139d4565b9050919050565b6000602082019050818103600083015261436a81613a3a565b9050919050565b6000602082019050818103600083015261438a81613a7a565b9050919050565b600060208201905081810360008301526143aa81613aba565b9050919050565b600060208201905081810360008301526143ca81613afa565b9050919050565b600060208201905081810360008301526143ea81613b60565b9050919050565b6000602082019050818103600083015261440a81613bc6565b9050919050565b6000602082019050818103600083015261442a81613c06565b9050919050565b6000602082019050818103600083015261444a81613c46565b9050919050565b6000602082019050818103600083015261446a81613cac565b9050919050565b6000602082019050818103600083015261448a81613d12565b9050919050565b600060208201905081810360008301526144aa81613d78565b9050919050565b600060208201905081810360008301526144ca81613db8565b9050919050565b600060208201905081810360008301526144ea81613e1e565b9050919050565b6000602082019050818103600083015261450a81613e84565b9050919050565b6000602082019050818103600083015261452a81613eea565b9050919050565b6000602082019050818103600083015261454a81613f2a565b9050919050565b6000602082019050818103600083015261456a81613f90565b9050919050565b6000602082019050818103600083015261458a81613ff6565b9050919050565b600060208201905081810360008301526145aa8161405c565b9050919050565b600060208201905081810360008301526145ca816140c2565b9050919050565b600060208201905081810360008301526145ea81614102565b9050919050565b60006020820190506146066000830184614168565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561462f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561465057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561467c57600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146ea8261473b565b9050919050565b60006146fc8261473b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061477082614777565b9050919050565b600061478282614789565b9050919050565b60006147948261473b565b9050919050565b82818337600083830152505050565b60005b838110156147c85780820151818401526020810190506147ad565b838111156147d7576000848401525b50505050565b6000601f19601f8301169050919050565b6147f7816146df565b811461480257600080fd5b50565b61480e81614703565b811461481957600080fd5b50565b6148258161470f565b811461483057600080fd5b50565b61483c8161475b565b811461484757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220e5012c02ec2c17618d7710a25f17f0c0f410a6118d027bdba0f534cda8829ebe64736f6c634300070000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6170692e63727970746f676f676f732e636f6d2f6170692f6d657461646174612f0000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80636352211e1161010d578063931688cb116100a0578063c87b56dd1161006f578063c87b56dd146106cd578063e985e9c51461070a578063f103b43314610747578063f2fde38b14610770578063fb107a4f14610799576101f9565b8063931688cb1461062757806395d89b4114610650578063a22cb4651461067b578063b88d4fde146106a4576101f9565b8063722676e2116100dc578063722676e21461059e5780638456cb59146105bc5780638da5cb5b146105d35780638ea0507b146105fe576101f9565b80636352211e146104e25780636c0360eb1461051f57806370a082311461054a578063715018a614610587576101f9565b80632f745c591161019057806342966c681161015f57806342966c68146103fd578063469619f2146104265780634f6ccce71461044f5780635ac117251461048c5780635c975abb146104b7576101f9565b80632f745c59146103695780633ccfd60b146103a65780633f4ba83a146103bd57806342842e0e146103d4576101f9565b80631249c58b116101cc5780631249c58b146102cc57806318160ddd146102ea57806319e325151461031557806323b872dd14610340576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906135f0565b6107c4565b6040516102329190614234565b60405180910390f35b34801561024757600080fd5b5061025061082b565b60405161025d919061424f565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613683565b6108cd565b60405161029a91906141b2565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906135b4565b610952565b005b6102d4610a6a565b6040516102e191906145f1565b60405180910390f35b3480156102f657600080fd5b506102ff610b53565b60405161030c91906145f1565b60405180910390f35b34801561032157600080fd5b5061032a610b64565b6040516103379190614234565b60405180910390f35b34801561034c57600080fd5b50610367600480360381019061036291906134ae565b610bcd565b005b34801561037557600080fd5b50610390600480360381019061038b91906135b4565b610c2d565b60405161039d91906145f1565b60405180910390f35b3480156103b257600080fd5b506103bb610c88565b005b3480156103c957600080fd5b506103d2610d53565b005b3480156103e057600080fd5b506103fb60048036038101906103f691906134ae565b610e20565b005b34801561040957600080fd5b50610424600480360381019061041f9190613683565b610e40565b005b34801561043257600080fd5b5061044d60048036038101906104489190613683565b610e9c565b005b34801561045b57600080fd5b5061047660048036038101906104719190613683565b610f59565b60405161048391906145f1565b60405180910390f35b34801561049857600080fd5b506104a1610f7c565b6040516104ae91906145f1565b60405180910390f35b3480156104c357600080fd5b506104cc611006565b6040516104d99190614234565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190613683565b61101d565b60405161051691906141b2565b60405180910390f35b34801561052b57600080fd5b50610534611054565b604051610541919061424f565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c9190613449565b6110f6565b60405161057e91906145f1565b60405180910390f35b34801561059357600080fd5b5061059c6111b5565b005b6105a66112f2565b6040516105b391906145f1565b60405180910390f35b3480156105c857600080fd5b506105d1611426565b005b3480156105df57600080fd5b506105e86114f4565b6040516105f591906141b2565b60405180910390f35b34801561060a57600080fd5b5061062560048036038101906106209190613449565b61151e565b005b34801561063357600080fd5b5061064e60048036038101906106499190613642565b6115cf565b005b34801561065c57600080fd5b50610665611657565b604051610672919061424f565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d9190613578565b6116f9565b005b3480156106b057600080fd5b506106cb60048036038101906106c691906134fd565b61187a565b005b3480156106d957600080fd5b506106f460048036038101906106ef9190613683565b6118dc565b604051610701919061424f565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c9190613472565b611a5f565b60405161073e9190614234565b60405180910390f35b34801561075357600080fd5b5061076e60048036038101906107699190613683565b611af3565b005b34801561077c57600080fd5b5061079760048036038101906107929190613449565b611bb0565b005b3480156107a557600080fd5b506107ae611d5c565b6040516107bb91906145f1565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611df2565b610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e906144f1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095d8261101d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590614571565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ed611e0f565b73ffffffffffffffffffffffffffffffffffffffff161480610a1c5750610a1b81610a16611e0f565b611a5f565b5b610a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5290614431565b60405180910390fd5b610a658383611e17565b505050565b600034610a75611d5c565b14610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90614371565b60405180910390fd5b610abd611006565b15610afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af4906144b1565b60405180910390fd5b6000610b07610b53565b9050610b11610b64565b610b1a57600080fd5b610b24600b611ed0565b6000610b30600b611ee6565b9050600c54811115610b4157600080fd5b610b4b3382611ef4565b809250505090565b6000610b5f6002612082565b905090565b600080610b6f610b53565b905060968111158015610b8b57506002610b88336110f6565b10155b15610b9a576000915050610bca565b61012c8111158015610bb557506004610bb2336110f6565b10155b15610bc4576000915050610bca565b60019150505b90565b610bde610bd8611e0f565b82612097565b610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490614591565b60405180910390fd5b610c28838383612175565b505050565b6000610c8082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061238c90919063ffffffff16565b905092915050565b610c90611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610cae6114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90614511565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d4f573d6000803e3d6000fd5b5050565b610d5b611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610d796114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690614511565b60405180910390fd5b610dd7611006565b610e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0d906142b1565b60405180910390fd5b610e1e6123a6565b565b610e3b8383836040518060200160405280600081525061187a565b505050565b610e51610e4b611e0f565b82612097565b610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e87906145d1565b60405180910390fd5b610e9981612448565b50565b610ea4611e0f565b73ffffffffffffffffffffffffffffffffffffffff16610ec26114f4565b73ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90614511565b60405180910390fd5b80600d819055507f4b9d786179e2599e65d6eb10cdb73af77287bb79b562194500404a8612be165781604051610f4e91906145f1565b60405180910390a150565b600080610f7083600261258290919063ffffffff16565b50905080915050919050565b600080610f87610b53565b9050611bee8110610fc957610fc16305f5e100610fb3630ee6b27f600d546125ae90919063ffffffff16565b61261e90919063ffffffff16565b915050611003565b610c4e8110610fe3576707a1fe1602770000915050611003565b6103528110610ffd5767058d15e176280000915050611003565b60009150505b90565b6000600a60009054906101000a900460ff16905090565b600061104d8260405180606001604052806029815260200161487d6029913960026126749092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110ec5780601f106110c1576101008083540402835291602001916110ec565b820191906000526020600020905b8154815290600101906020018083116110cf57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90614451565b60405180910390fd5b6111ae600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612693565b9050919050565b6111bd611e0f565b73ffffffffffffffffffffffffffffffffffffffff166111db6114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614511565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006103526112ff610b53565b1015611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614391565b60405180910390fd5b34611349610f7c565b14611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090614371565b60405180910390fd5b611391611006565b156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c8906144b1565b60405180910390fd5b600080600090505b600381101561141e576113ec600b611ed0565b6113f6600b611ee6565b9150600c5482111561140757600080fd5b6114113383611ef4565b80806001019150506113d9565b508091505090565b61142e611e0f565b73ffffffffffffffffffffffffffffffffffffffff1661144c6114f4565b73ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990614511565b60405180910390fd5b6114aa611006565b156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614411565b60405180910390fd5b6114f26126a8565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611526611e0f565b73ffffffffffffffffffffffffffffffffffffffff166115446114f4565b73ffffffffffffffffffffffffffffffffffffffff161461159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159190614511565b60405180910390fd5b6115a4600b611ed0565b60006115b0600b611ee6565b9050600c548111156115c157600080fd5b6115cb8282611ef4565b5050565b6115d7611e0f565b73ffffffffffffffffffffffffffffffffffffffff166115f56114f4565b73ffffffffffffffffffffffffffffffffffffffff161461164b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164290614511565b60405180910390fd5b6116548161274b565b50565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b611701611e0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614351565b60405180910390fd5b806005600061177c611e0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611829611e0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161186e9190614234565b60405180910390a35050565b61188b611885611e0f565b83612097565b6118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614591565b60405180910390fd5b6118d684848484612765565b50505050565b60606118e782611df2565b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90614551565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119cf5780601f106119a4576101008083540402835291602001916119cf565b820191906000526020600020905b8154815290600101906020018083116119b257829003601f168201915b5050505050905060606119e0611054565b90506000815114156119f6578192505050611a5a565b600082511115611a2b578082604051602001611a1392919061418e565b60405160208183030381529060405292505050611a5a565b80611a35856127c1565b604051602001611a4692919061418e565b604051602081830303815290604052925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611afb611e0f565b73ffffffffffffffffffffffffffffffffffffffff16611b196114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6690614511565b60405180910390fd5b80600c819055507fd8419718ffd2a34111add9f7b4dca791378fc702c0803a6c6b12bf0b1896278d81604051611ba591906145f1565b60405180910390a150565b611bb8611e0f565b73ffffffffffffffffffffffffffffffffffffffff16611bd66114f4565b73ffffffffffffffffffffffffffffffffffffffff1614611c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2390614511565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c93906142f1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611d67610b53565b9050611bee8110611d7d57600d54915050611def565b610c4e8110611d97576702c68af0bb140000915050611def565b61047e8110611db157670214e8348c4f0000915050611def565b61012c8110611dcb5767016345785d8a0000915050611def565b60968110611de35766f8b0a10e470000915050611def565b66b1a2bc2ec500009150505b90565b6000611e0882600261290890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e8a8361101d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5b90614491565b60405180910390fd5b611f6d81611df2565b15611fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa490614311565b60405180910390fd5b611fb960008383612922565b61200a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061293290919063ffffffff16565b506120218183600261294c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600061209082600001612981565b9050919050565b60006120a282611df2565b6120e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d8906143d1565b60405180910390fd5b60006120ec8361101d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061215b57508373ffffffffffffffffffffffffffffffffffffffff16612143846108cd565b73ffffffffffffffffffffffffffffffffffffffff16145b8061216c575061216b8185611a5f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121958261101d565b73ffffffffffffffffffffffffffffffffffffffff16146121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e290614531565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225290614331565b60405180910390fd5b612266838383612922565b612271600082611e17565b6122c281600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061299290919063ffffffff16565b5061231481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061293290919063ffffffff16565b5061232b8183600261294c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061239b83600001836129ac565b60001c905092915050565b6123ae611006565b6123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e4906142b1565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612431611e0f565b60405161243e91906141cd565b60405180910390a1565b60006124538261101d565b905061246181600084612922565b61246c600083611e17565b600060086000848152602001908152602001600020805460018160011615610100020316600290049050146124bb576008600083815260200190815260200160002060006124ba9190613253565b5b61250c82600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061299290919063ffffffff16565b50612521826002612a1990919063ffffffff16565b5081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806000806125958660000186612a33565b915091508160001c8160001c9350935050509250929050565b6000808314156125c15760009050612618565b60008284029050828482816125d257fe5b0414612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a906144d1565b60405180910390fd5b809150505b92915050565b6000808211612662576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612659906143f1565b60405180910390fd5b81838161266b57fe5b04905092915050565b6000612687846000018460001b84612ab6565b60001c90509392505050565b60006126a182600001612b47565b9050919050565b6126b0611006565b156126f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e790614411565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612734611e0f565b60405161274191906141cd565b60405180910390a1565b806009908051906020019061276192919061329b565b5050565b612770848484612175565b61277c84848484612b58565b6127bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b2906142d1565b60405180910390fd5b50505050565b60606000821415612809576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612903565b600082905060005b60008214612833578080600101915050600a828161282b57fe5b049150612811565b60608167ffffffffffffffff8111801561284c57600080fd5b506040519080825280601f01601f19166020018201604052801561287f5781602001600182028036833780820191505090505b50905060006001830390508593505b600084146128fb57600a84816128a057fe5b0660300160f81b828280600190039350815181106128ba57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816128f357fe5b04935061288e565b819450505050505b919050565b600061291a836000018360001b612cbc565b905092915050565b61292d838383612cdf565b505050565b6000612944836000018360001b612d37565b905092915050565b6000612978846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b612da7565b90509392505050565b600081600001805490509050919050565b60006129a4836000018360001b612e83565b905092915050565b6000818360000180549050116129f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ee90614271565b60405180910390fd5b826000018281548110612a0657fe5b9060005260206000200154905092915050565b6000612a2b836000018360001b612f6b565b905092915050565b60008082846000018054905011612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614471565b60405180910390fd5b6000846000018481548110612a9057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0f919061424f565b60405180910390fd5b50846000016001820381548110612b2b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612b798473ffffffffffffffffffffffffffffffffffffffff16613084565b612b865760019050612cb4565b6060612c4d63150b7a0260e01b612b9b611e0f565b888787604051602401612bb194939291906141e8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161484b603291398773ffffffffffffffffffffffffffffffffffffffff166130979092919063ffffffff16565b9050600081806020019051810190612c659190613619565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b612cea8383836130af565b612cf2611006565b15612d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2990614291565b60405180910390fd5b505050565b6000612d4383836130b4565b612d9c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612da1565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612e4e57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612e7c565b82856000016001830381548110612e6157fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60008083600101600084815260200190815260200160002054905060008114612f5f5760006001820390506000600186600001805490500390506000866000018281548110612ece57fe5b9060005260206000200154905080876000018481548110612eeb57fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612f2357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612f65565b60009150505b92915050565b600080836001016000848152602001908152602001600020549050600081146130785760006001820390506000600186600001805490500390506000866000018281548110612fb657fe5b9060005260206000209060020201905080876000018481548110612fd657fe5b906000526020600020906002020160008201548160000155600182015481600101559050506001830187600101600083600001548152602001908152602001600020819055508660000180548061302957fe5b600190038181906000526020600020906002020160008082016000905560018201600090555050905586600101600087815260200190815260200160002060009055600194505050505061307e565b60009150505b92915050565b600080823b905060008111915050919050565b60606130a684846000856130d7565b90509392505050565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561311c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613113906143b1565b60405180910390fd5b61312585613084565b613164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315b906145b1565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff16858760405161318e9190614177565b60006040518083038185875af1925050503d80600081146131cb576040519150601f19603f3d011682016040523d82523d6000602084013e6131d0565b606091505b50915091506131e08282866131ec565b92505050949350505050565b606083156131fc5782905061324c565b60008351111561320f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613243919061424f565b60405180910390fd5b9392505050565b50805460018160011615610100020316600290046000825580601f106132795750613298565b601f016020900490600052602060002090810190613297919061331b565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106132dc57805160ff191683800117855561330a565b8280016001018555821561330a579182015b828111156133095782518255916020019190600101906132ee565b5b509050613317919061331b565b5090565b5b8082111561333457600081600090555060010161331c565b5090565b600081359050613347816147ee565b92915050565b60008135905061335c81614805565b92915050565b6000813590506133718161481c565b92915050565b6000815190506133868161481c565b92915050565b600082601f83011261339d57600080fd5b81356133b06133ab82614639565b61460c565b915080825260208301602083018583830111156133cc57600080fd5b6133d783828461479b565b50505092915050565b600082601f8301126133f157600080fd5b81356134046133ff82614665565b61460c565b9150808252602083016020830185838301111561342057600080fd5b61342b83828461479b565b50505092915050565b60008135905061344381614833565b92915050565b60006020828403121561345b57600080fd5b600061346984828501613338565b91505092915050565b6000806040838503121561348557600080fd5b600061349385828601613338565b92505060206134a485828601613338565b9150509250929050565b6000806000606084860312156134c357600080fd5b60006134d186828701613338565b93505060206134e286828701613338565b92505060406134f386828701613434565b9150509250925092565b6000806000806080858703121561351357600080fd5b600061352187828801613338565b945050602061353287828801613338565b935050604061354387828801613434565b925050606085013567ffffffffffffffff81111561356057600080fd5b61356c8782880161338c565b91505092959194509250565b6000806040838503121561358b57600080fd5b600061359985828601613338565b92505060206135aa8582860161334d565b9150509250929050565b600080604083850312156135c757600080fd5b60006135d585828601613338565b92505060206135e685828601613434565b9150509250929050565b60006020828403121561360257600080fd5b600061361084828501613362565b91505092915050565b60006020828403121561362b57600080fd5b600061363984828501613377565b91505092915050565b60006020828403121561365457600080fd5b600082013567ffffffffffffffff81111561366e57600080fd5b61367a848285016133e0565b91505092915050565b60006020828403121561369557600080fd5b60006136a384828501613434565b91505092915050565b6136b581614765565b82525050565b6136c4816146f1565b82525050565b6136d3816146df565b82525050565b6136e281614703565b82525050565b60006136f382614691565b6136fd81856146a7565b935061370d8185602086016147aa565b613716816147dd565b840191505092915050565b600061372c82614691565b61373681856146b8565b93506137468185602086016147aa565b80840191505092915050565b600061375d8261469c565b61376781856146c3565b93506137778185602086016147aa565b613780816147dd565b840191505092915050565b60006137968261469c565b6137a081856146d4565b93506137b08185602086016147aa565b80840191505092915050565b60006137c96022836146c3565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061382f602b836146c3565b91507f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008301527f68696c65207061757365640000000000000000000000000000000000000000006020830152604082019050919050565b60006138956014836146c3565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006138d56032836146c3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061393b6026836146c3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139a1601c836146c3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006139e16024836146c3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a476019836146c3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613a87601f836146c3565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613ac76019836146c3565b91507f5061636b206973206e6f7420617661696c61626c65206e6f77000000000000006000830152602082019050919050565b6000613b076026836146c3565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b6d602c836146c3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613bd3601a836146c3565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b6000613c136010836146c3565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613c536038836146c3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613cb9602a836146c3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d1f6022836146c3565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d856020836146c3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613dc56027836146c3565b91507f4552433732315061757361626c653a20746f6b656e206d696e74207768696c6560008301527f20706175736564000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e2b6021836146c3565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e91602c836146c3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613ef76020836146c3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613f376029836146c3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f9d602f836146c3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006140036021836146c3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140696031836146c3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006140cf601d836146c3565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b600061410f6030836146c3565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b6141718161475b565b82525050565b60006141838284613721565b915081905092915050565b600061419a828561378b565b91506141a6828461378b565b91508190509392505050565b60006020820190506141c760008301846136ca565b92915050565b60006020820190506141e260008301846136ac565b92915050565b60006080820190506141fd60008301876136bb565b61420a60208301866136ca565b6142176040830185614168565b818103606083015261422981846136e8565b905095945050505050565b600060208201905061424960008301846136d9565b92915050565b600060208201905081810360008301526142698184613752565b905092915050565b6000602082019050818103600083015261428a816137bc565b9050919050565b600060208201905081810360008301526142aa81613822565b9050919050565b600060208201905081810360008301526142ca81613888565b9050919050565b600060208201905081810360008301526142ea816138c8565b9050919050565b6000602082019050818103600083015261430a8161392e565b9050919050565b6000602082019050818103600083015261432a81613994565b9050919050565b6000602082019050818103600083015261434a816139d4565b9050919050565b6000602082019050818103600083015261436a81613a3a565b9050919050565b6000602082019050818103600083015261438a81613a7a565b9050919050565b600060208201905081810360008301526143aa81613aba565b9050919050565b600060208201905081810360008301526143ca81613afa565b9050919050565b600060208201905081810360008301526143ea81613b60565b9050919050565b6000602082019050818103600083015261440a81613bc6565b9050919050565b6000602082019050818103600083015261442a81613c06565b9050919050565b6000602082019050818103600083015261444a81613c46565b9050919050565b6000602082019050818103600083015261446a81613cac565b9050919050565b6000602082019050818103600083015261448a81613d12565b9050919050565b600060208201905081810360008301526144aa81613d78565b9050919050565b600060208201905081810360008301526144ca81613db8565b9050919050565b600060208201905081810360008301526144ea81613e1e565b9050919050565b6000602082019050818103600083015261450a81613e84565b9050919050565b6000602082019050818103600083015261452a81613eea565b9050919050565b6000602082019050818103600083015261454a81613f2a565b9050919050565b6000602082019050818103600083015261456a81613f90565b9050919050565b6000602082019050818103600083015261458a81613ff6565b9050919050565b600060208201905081810360008301526145aa8161405c565b9050919050565b600060208201905081810360008301526145ca816140c2565b9050919050565b600060208201905081810360008301526145ea81614102565b9050919050565b60006020820190506146066000830184614168565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561462f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561465057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561467c57600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146ea8261473b565b9050919050565b60006146fc8261473b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061477082614777565b9050919050565b600061478282614789565b9050919050565b60006147948261473b565b9050919050565b82818337600083830152505050565b60005b838110156147c85780820151818401526020810190506147ad565b838111156147d7576000848401525b50505050565b6000601f19601f8301169050919050565b6147f7816146df565b811461480257600080fd5b50565b61480e81614703565b811461481957600080fd5b50565b6148258161470f565b811461483057600080fd5b50565b61483c8161475b565b811461484757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220e5012c02ec2c17618d7710a25f17f0c0f410a6118d027bdba0f534cda8829ebe64736f6c63430007000033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6170692e63727970746f676f676f732e636f6d2f6170692f6d657461646174612f0000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): https://api.cryptogogos.com/api/metadata/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [2] : 68747470733a2f2f6170692e63727970746f676f676f732e636f6d2f6170692f
Arg [3] : 6d657461646174612f0000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

68547:5292:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18114:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51724:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54732:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54231:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71361:486;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53659:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70242:283;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55791:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53371:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72731:136;;;;;;;;;;;;;:::i;:::-;;73603:76;;;;;;;;;;;;;:::i;:::-;;56238:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68258:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70588:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53947:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69144:424;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66350:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51368:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53190:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50998:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1669:148;;;;;;;;;;;;;:::i;:::-;;71920:606;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73387:75;;;;;;;;;;;;;:::i;:::-;;1018:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71088:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72534:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51893;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55112:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56494:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52068:879;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55510:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73687:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1972:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69631:548;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18114:200;18244:4;18273:20;:33;18294:11;18273:33;;;;;;;;;;;;;;;;;;;;;;;;;;;18266:40;;18114:200;;;:::o;51724:100::-;51778:13;51811:5;51804:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51724:100;:::o;54732:308::-;54853:7;54900:16;54908:7;54900;:16::i;:::-;54878:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;55008:15;:24;55024:7;55008:24;;;;;;;;;;;;;;;;;;;;;55001:31;;54732:308;;;:::o;54231:435::-;54312:13;54328:23;54343:7;54328:14;:23::i;:::-;54312:39;;54376:5;54370:11;;:2;:11;;;;54362:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;54470:5;54454:21;;:12;:10;:12::i;:::-;:21;;;:86;;;;54496:44;54520:5;54527:12;:10;:12::i;:::-;54496:23;:44::i;:::-;54454:86;54432:192;;;;;;;;;;;;:::i;:::-;;;;;;;;;54637:21;54646:2;54650:7;54637:8;:21::i;:::-;54231:435;;;:::o;71361:486::-;71401:7;71446:9;71429:13;:11;:13::i;:::-;:26;71421:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;71511:8;:6;:8::i;:::-;71510:9;71502:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71576:21;71600:13;:11;:13::i;:::-;71576:37;;71629:10;:8;:10::i;:::-;71624:25;;71641:8;;;71624:25;71660:21;:9;:19;:21::i;:::-;71692:17;71712:19;:9;:17;:19::i;:::-;71692:39;;71763:9;;71750;:22;;71742:31;;;;;;71784:28;71790:10;71802:9;71784:5;:28::i;:::-;71830:9;71823:16;;;;71361:486;:::o;53659:211::-;53720:7;53841:21;:12;:19;:21::i;:::-;53834:28;;53659:211;:::o;70242:283::-;70283:4;70300:21;70324:13;:11;:13::i;:::-;70300:37;;70369:3;70352:13;:20;;:50;;;;;70401:1;70376:21;70386:10;70376:9;:21::i;:::-;:26;;70352:50;70348:68;;;70411:5;70404:12;;;;;70348:68;70448:3;70431:13;:20;;:50;;;;;70480:1;70455:21;70465:10;70455:9;:21::i;:::-;:26;;70431:50;70427:68;;;70490:5;70483:12;;;;;70427:68;70513:4;70506:11;;;70242:283;;:::o;55791:376::-;56000:41;56019:12;:10;:12::i;:::-;56033:7;56000:18;:41::i;:::-;55978:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;56131:28;56141:4;56147:2;56151:7;56131:9;:28::i;:::-;55791:376;;;:::o;53371:212::-;53513:7;53545:30;53569:5;53545:13;:20;53559:5;53545:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53538:37;;53371:212;;;;:::o;72731:136::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72781:15:::1;72799:21;72781:39;;72831:10;:19;;:28;72851:7;72831:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1309:1;72731:136::o:0;73603:76::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66953:8:::1;:6;:8::i;:::-;66945:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;73661:10:::2;:8;:10::i;:::-;73603:76::o:0;56238:185::-;56376:39;56393:4;56399:2;56403:7;56376:39;;;;;;;;;;;;:16;:39::i;:::-;56238:185;;;:::o;68258:282::-;68390:41;68409:12;:10;:12::i;:::-;68423:7;68390:18;:41::i;:::-;68368:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;68518:14;68524:7;68518:5;:14::i;:::-;68258:282;:::o;70588:140::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70671:6:::1;70656:12;:21;;;;70695:25;70713:6;70695:25;;;;;;:::i;:::-;;;;;;;;70588:140:::0;:::o;53947:222::-;54067:7;54093:15;54114:22;54130:5;54114:12;:15;;:22;;;;:::i;:::-;54092:44;;;54154:7;54147:14;;;53947:222;;;:::o;69144:424::-;69192:7;69212:21;69236:13;:11;:13::i;:::-;69212:37;;69283:4;69266:13;:21;69262:299;;69311:45;69346:9;69311:30;69328:12;69311;;:16;;:30;;;;:::i;:::-;:34;;:45;;;;:::i;:::-;69304:52;;;;;69262:299;69395:4;69378:13;:21;69374:187;;69423:10;69416:17;;;;;69374:187;69472:3;69455:13;:20;69451:110;;69499:9;69492:16;;;;;69451:110;69548:1;69541:8;;;69144:424;;:::o;66350:86::-;66397:4;66421:7;;;;;;;;;;;66414:14;;66350:86;:::o;51368:289::-;51485:7;51530:119;51565:7;51530:119;;;;;;;;;;;;;;;;;:12;:16;;:119;;;;;:::i;:::-;51510:139;;51368:289;;;:::o;53190:97::-;53238:13;53271:8;53264:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53190:97;:::o;50998:308::-;51115:7;51179:1;51162:19;;:5;:19;;;;51140:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;51269:29;:13;:20;51283:5;51269:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51262:36;;50998:308;;;:::o;1669:148::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1776:1:::1;1739:40;;1760:6;;;;;;;;;;;1739:40;;;;;;;;;;;;1807:1;1790:6;;:19;;;;;;;;;;;;;;;;;;1669:148::o:0;71920:606::-;71964:7;72009:3;71992:13;:11;:13::i;:::-;:20;;71984:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;72096:9;72075:17;:15;:17::i;:::-;:30;72053:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;72184:8;:6;:8::i;:::-;72183:9;72175:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;72249:17;72282:9;72294:1;72282:13;;72277:215;72301:1;72297;:5;72277:215;;;72324:21;:9;:19;:21::i;:::-;72372:19;:9;:17;:19::i;:::-;72360:31;;72427:9;;72414;:22;;72406:31;;;;;;72452:28;72458:10;72470:9;72452:5;:28::i;:::-;72304:3;;;;;;;72277:215;;;;72509:9;72502:16;;;71920:606;:::o;73387:75::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66676:8:::1;:6;:8::i;:::-;66675:9;66667:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;73446:8:::2;:6;:8::i;:::-;73387:75::o:0;1018:87::-;1064:7;1091:6;;;;;;;;;;;1084:13;;1018:87;:::o;71088:213::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71149:21:::1;:9;:19;:21::i;:::-;71181:17;71201:19;:9;:17;:19::i;:::-;71181:39;;71252:9;;71239;:22;;71231:31;;;::::0;::::1;;71273:20;71279:2;71283:9;71273:5;:20::i;:::-;1309:1;71088:213:::0;:::o;72534:104::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72609:21:::1;72621:8;72609:11;:21::i;:::-;72534:104:::0;:::o;51893:::-;51949:13;51982:7;51975:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51893:104;:::o;55112:327::-;55259:12;:10;:12::i;:::-;55247:24;;:8;:24;;;;55239:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;55359:8;55314:18;:32;55333:12;:10;:12::i;:::-;55314:32;;;;;;;;;;;;;;;:42;55347:8;55314:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;55412:8;55383:48;;55398:12;:10;:12::i;:::-;55383:48;;;55422:8;55383:48;;;;;;:::i;:::-;;;;;;;;55112:327;;:::o;56494:365::-;56683:41;56702:12;:10;:12::i;:::-;56716:7;56683:18;:41::i;:::-;56661:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;56812:39;56826:4;56832:2;56836:7;56845:5;56812:13;:39::i;:::-;56494:365;;;;:::o;52068:879::-;52186:13;52239:16;52247:7;52239;:16::i;:::-;52217:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;52343:23;52369:10;:19;52380:7;52369:19;;;;;;;;;;;52343:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52399:18;52420:9;:7;:9::i;:::-;52399:30;;52527:1;52511:4;52505:18;:23;52501:72;;;52552:9;52545:16;;;;;;52501:72;52703:1;52683:9;52677:23;:27;52673:108;;;52752:4;52758:9;52735:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52721:48;;;;;;52673:108;52913:4;52919:18;:7;:16;:18::i;:::-;52896:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52882:57;;;;52068:879;;;;:::o;55510:214::-;55652:4;55681:18;:25;55700:5;55681:25;;;;;;;;;;;;;;;:35;55707:8;55681:35;;;;;;;;;;;;;;;;;;;;;;;;;55674:42;;55510:214;;;;:::o;73687:149::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73772:10:::1;73760:9;:22;;;;73798:30;73817:10;73798:30;;;;;;:::i;:::-;;;;;;;;73687:149:::0;:::o;1972:281::-;1249:12;:10;:12::i;:::-;1238:23;;:7;:5;:7::i;:::-;:23;;;1230:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2053:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2208:8;2179:38;;2200:6;;;;;;;;;;;2179:38;;;;;;;;;;;;2237:8;2228:6;;:17;;;;;;;;;;;;;;;;;;1972:281:::0;:::o;69631:548::-;69675:7;69695:21;69719:13;:11;:13::i;:::-;69695:37;;69766:4;69749:13;:21;69745:427;;69794:12;;69787:19;;;;;69745:427;69845:4;69828:13;:21;69824:348;;69873:9;69866:16;;;;;69824:348;69921:4;69904:13;:21;69900:272;;69949:10;69942:17;;;;;69900:272;69998:3;69981:13;:20;69977:195;;70025:9;70018:16;;;;;69977:195;70073:3;70056:13;:20;70052:120;;70100:10;70093:17;;;;;70052:120;70150:10;70143:17;;;69631:548;;:::o;58406:127::-;58471:4;58495:30;58517:7;58495:12;:21;;:30;;;;:::i;:::-;58488:37;;58406:127;;;:::o;130:106::-;183:15;218:10;211:17;;130:106;:::o;64869:192::-;64971:2;64944:15;:24;64960:7;64944:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;65027:7;65023:2;64989:46;;64998:23;65013:7;64998:14;:23::i;:::-;64989:46;;;;;;;;;;;;64869:192;;:::o;9884:181::-;10056:1;10038:7;:14;;;:19;;;;;;;;;;;9884:181;:::o;9762:114::-;9827:7;9854;:14;;;9847:21;;9762:114;;;:::o;60496:404::-;60590:1;60576:16;;:2;:16;;;;60568:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;60649:16;60657:7;60649;:16::i;:::-;60648:17;60640:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;60711:45;60740:1;60744:2;60748:7;60711:20;:45::i;:::-;60769:30;60791:7;60769:13;:17;60783:2;60769:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;60812:29;60829:7;60838:2;60812:12;:16;;:29;;;;;:::i;:::-;;60884:7;60880:2;60859:33;;60876:1;60859:33;;;;;;;;;;;;60496:404;;:::o;44407:155::-;44503:7;44535:19;44543:3;:10;;44535:7;:19::i;:::-;44528:26;;44407:155;;;:::o;58700:459::-;58829:4;58873:16;58881:7;58873;:16::i;:::-;58851:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;58972:13;58988:23;59003:7;58988:14;:23::i;:::-;58972:39;;59041:5;59030:16;;:7;:16;;;:64;;;;59087:7;59063:31;;:20;59075:7;59063:11;:20::i;:::-;:31;;;59030:64;:120;;;;59111:39;59135:5;59142:7;59111:23;:39::i;:::-;59030:120;59022:129;;;58700:459;;;;:::o;62011:670::-;62184:4;62157:31;;:23;62172:7;62157:14;:23::i;:::-;:31;;;62135:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;62308:1;62294:16;;:2;:16;;;;62286:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;62364:39;62385:4;62391:2;62395:7;62364:20;:39::i;:::-;62468:29;62485:1;62489:7;62468:8;:29::i;:::-;62510:35;62537:7;62510:13;:19;62524:4;62510:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;62556:30;62578:7;62556:13;:17;62570:2;62556:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;62599:29;62616:7;62625:2;62599:12;:16;;:29;;;;;:::i;:::-;;62665:7;62661:2;62646:27;;62655:4;62646:27;;;;;;;;;;;;62011:670;;;:::o;36674:169::-;36772:7;36812:22;36816:3;:10;;36828:5;36812:3;:22::i;:::-;36804:31;;36797:38;;36674:169;;;;:::o;67409:120::-;66953:8;:6;:8::i;:::-;66945:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;67478:5:::1;67468:7;;:15;;;;;;;;;;;;;;;;;;67499:22;67508:12;:10;:12::i;:::-;67499:22;;;;;;:::i;:::-;;;;;;;;67409:120::o:0;61129:545::-;61189:13;61205:23;61220:7;61205:14;:23::i;:::-;61189:39;;61259:48;61280:5;61295:1;61299:7;61259:20;:48::i;:::-;61348:29;61365:1;61369:7;61348:8;:29::i;:::-;61467:1;61436:10;:19;61447:7;61436:19;;;;;;;;;;;61430:33;;;;;;;;;;;;;;;;:38;61426:97;;61492:10;:19;61503:7;61492:19;;;;;;;;;;;;61485:26;;;;:::i;:::-;61426:97;61535:36;61563:7;61535:13;:20;61549:5;61535:20;;;;;;;;;;;;;;;:27;;:36;;;;:::i;:::-;;61584:28;61604:7;61584:12;:19;;:28;;;;:::i;:::-;;61658:7;61654:1;61630:36;;61639:5;61630:36;;;;;;;;;;;;61129:545;;:::o;44910:268::-;45017:7;45026;45052:11;45065:13;45082:22;45086:3;:10;;45098:5;45082:3;:22::i;:::-;45051:53;;;;45131:3;45123:12;;45161:5;45153:14;;45115:55;;;;;;44910:268;;;;;:::o;5426:220::-;5484:7;5513:1;5508;:6;5504:20;;;5523:1;5516:8;;;;5504:20;5535:9;5551:1;5547;:5;5535:17;;5580:1;5575;5571;:5;;;;;;:10;5563:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;5637:1;5630:8;;;5426:220;;;;;:::o;6124:153::-;6182:7;6214:1;6210;:5;6202:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;6268:1;6264;:5;;;;;;6257:12;;6124:153;;;;:::o;46292:292::-;46433:7;46515:44;46520:3;:10;;46540:3;46532:12;;46546;46515:4;:44::i;:::-;46507:53;;46453:123;;46292:292;;;;;:::o;36206:114::-;36266:7;36293:19;36301:3;:10;;36293:7;:19::i;:::-;36286:26;;36206:114;;;:::o;67150:118::-;66676:8;:6;:8::i;:::-;66675:9;66667:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;67220:4:::1;67210:7;;:14;;;;;;;;;;;;;;;;;;67240:20;67247:12;:10;:12::i;:::-;67240:20;;;;;;:::i;:::-;;;;;;;;67150:118::o:0;63342:100::-;63426:8;63415;:19;;;;;;;;;;;;:::i;:::-;;63342:100;:::o;57741:352::-;57898:28;57908:4;57914:2;57918:7;57898:9;:28::i;:::-;57959:48;57982:4;57988:2;57992:7;58001:5;57959:22;:48::i;:::-;57937:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;57741:352;;;;:::o;46704:748::-;46760:13;46990:1;46981:5;:10;46977:53;;;47008:10;;;;;;;;;;;;;;;;;;;;;46977:53;47040:12;47055:5;47040:20;;47071:14;47096:78;47111:1;47103:4;:9;47096:78;;47129:8;;;;;;;47160:2;47152:10;;;;;;;;;47096:78;;;47184:19;47216:6;47206:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47184:39;;47234:13;47259:1;47250:6;:10;47234:26;;47278:5;47271:12;;47294:119;47309:1;47301:4;:9;47294:119;;47371:2;47364:4;:9;;;;;;47358:2;:16;47345:31;;47327:6;47334:7;;;;;;;47327:15;;;;;;;;;;;:49;;;;;;;;;;;47399:2;47391:10;;;;;;;;;47294:119;;;47437:6;47423:21;;;;;;46704:748;;;;:::o;44136:183::-;44247:4;44276:35;44286:3;:10;;44306:3;44298:12;;44276:9;:35::i;:::-;44269:42;;44136:183;;;;:::o;73022:221::-;73190:45;73217:4;73223:2;73227:7;73190:26;:45::i;:::-;73022:221;;;:::o;35389:131::-;35456:4;35480:32;35485:3;:10;;35505:5;35497:14;;35480:4;:32::i;:::-;35473:39;;35389:131;;;;:::o;43502:219::-;43625:4;43649:64;43654:3;:10;;43674:3;43666:12;;43704:5;43688:23;;43680:32;;43649:4;:64::i;:::-;43642:71;;43502:219;;;;;:::o;40752:110::-;40808:7;40835:3;:12;;:19;;;;40828:26;;40752:110;;;:::o;35696:160::-;35784:4;35813:35;35821:3;:10;;35841:5;35833:14;;35813:7;:35::i;:::-;35806:42;;35696:160;;;;:::o;31340:273::-;31434:7;31502:5;31481:3;:11;;:18;;;;:26;31459:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31587:3;:11;;31599:5;31587:18;;;;;;;;;;;;;;;;31580:25;;31340:273;;;;:::o;43887:165::-;43982:4;44011:33;44019:3;:10;;44039:3;44031:12;;44011:7;:33::i;:::-;44004:40;;43887:165;;;;:::o;41227:348::-;41321:7;41330;41399:5;41377:3;:12;;:19;;;;:27;41355:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41479:22;41504:3;:12;;41517:5;41504:19;;;;;;;;;;;;;;;;;;41479:44;;41542:5;:10;;;41554:5;:12;;;41534:33;;;;;41227:348;;;;;:::o;42825:353::-;42953:7;42973:16;42992:3;:12;;:17;43005:3;42992:17;;;;;;;;;;;;42973:36;;43040:1;43028:8;:13;;43043:12;43020:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;43110:3;:12;;43134:1;43123:8;:12;43110:26;;;;;;;;;;;;;;;;;;:33;;;43103:40;;;42825:353;;;;;:::o;30877:109::-;30933:7;30960:3;:11;;:18;;;;30953:25;;30877:109;;;:::o;64007:743::-;64162:4;64184:15;:2;:13;;;:15::i;:::-;64179:60;;64223:4;64216:11;;;;64179:60;64249:23;64288:349;64367:45;;;64435:12;:10;:12::i;:::-;64470:4;64497:7;64527:5;64322:229;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64288:349;;;;;;;;;;;;;;;;;:2;:15;;;;:349;;;;;:::i;:::-;64249:388;;64648:13;64675:10;64664:32;;;;;;;;;;;;:::i;:::-;64648:48;;48001:10;64725:16;;64715:26;;;:6;:26;;;;64707:35;;;;64007:743;;;;;;;:::o;40500:157::-;40598:4;40648:1;40627:3;:12;;:17;40640:3;40627:17;;;;;;;;;;;;:22;;40620:29;;40500:157;;;;:::o;67743:275::-;67887:45;67914:4;67920:2;67924:7;67887:26;:45::i;:::-;67954:8;:6;:8::i;:::-;67953:9;67945:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;67743:275;;;:::o;28397:414::-;28460:4;28482:21;28492:3;28497:5;28482:9;:21::i;:::-;28477:327;;28520:3;:11;;28537:5;28520:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28703:3;:11;;:18;;;;28681:3;:12;;:19;28694:5;28681:19;;;;;;;;;;;:40;;;;28743:4;28736:11;;;;28477:327;28787:5;28780:12;;28397:414;;;;;:::o;37942:737::-;38052:4;38168:16;38187:3;:12;;:17;38200:3;38187:17;;;;;;;;;;;;38168:36;;38233:1;38221:8;:13;38217:455;;;38301:3;:12;;38319:36;;;;;;;;38335:3;38319:36;;;;38348:5;38319:36;;;38301:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38514:3;:12;;:19;;;;38494:3;:12;;:17;38507:3;38494:17;;;;;;;;;;;:39;;;;38555:4;38548:11;;;;;38217:455;38628:5;38592:3;:12;;38616:1;38605:8;:12;38592:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;38655:5;38648:12;;;37942:737;;;;;;:::o;28987:1557::-;29053:4;29171:18;29192:3;:12;;:19;29205:5;29192:19;;;;;;;;;;;;29171:40;;29242:1;29228:10;:15;29224:1313;;29603:21;29640:1;29627:10;:14;29603:38;;29656:17;29697:1;29676:3;:11;;:18;;;;:22;29656:42;;29943:17;29963:3;:11;;29975:9;29963:22;;;;;;;;;;;;;;;;29943:42;;30109:9;30080:3;:11;;30092:13;30080:26;;;;;;;;;;;;;;;:38;;;;30228:1;30212:13;:17;30186:3;:12;;:23;30199:9;30186:23;;;;;;;;;;;:43;;;;30338:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30433:3;:12;;:19;30446:5;30433:19;;;;;;;;;;;30426:26;;;30476:4;30469:11;;;;;;;;29224:1313;30520:5;30513:12;;;28987:1557;;;;;:::o;38854:1562::-;38918:4;39034:16;39053:3;:12;;:17;39066:3;39053:17;;;;;;;;;;;;39034:36;;39099:1;39087:8;:13;39083:1326;;39461:21;39496:1;39485:8;:12;39461:36;;39512:17;39554:1;39532:3;:12;;:19;;;;:23;39512:43;;39800:26;39829:3;:12;;39842:9;39829:23;;;;;;;;;;;;;;;;;;39800:52;;39977:9;39947:3;:12;;39960:13;39947:27;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;;40101:1;40085:13;:17;40054:3;:12;;:28;40067:9;:14;;;40054:28;;;;;;;;;;;:48;;;;40211:3;:12;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40307:3;:12;;:17;40320:3;40307:17;;;;;;;;;;;40300:24;;;40348:4;40341:11;;;;;;;;39083:1326;40392:5;40385:12;;;38854:1562;;;;;:::o;19539:444::-;19599:4;19807:12;19931:7;19919:20;19911:28;;19974:1;19967:4;:8;19960:15;;;19539:444;;;:::o;22576:229::-;22713:12;22745:52;22767:6;22775:4;22781:1;22784:12;22745:21;:52::i;:::-;22738:59;;22576:229;;;;;:::o;65674:126::-;;;;:::o;30630:161::-;30730:4;30782:1;30759:3;:12;;:19;30772:5;30759:19;;;;;;;;;;;;:24;;30752:31;;30630:161;;;;:::o;23792:621::-;23962:12;24034:5;24009:21;:30;;23987:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;24124:18;24135:6;24124:10;:18::i;:::-;24116:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;24250:12;24264:23;24304:6;:11;;24323:5;24330:4;24304:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24249:86;;;;24353:52;24371:7;24380:10;24392:12;24353:17;:52::i;:::-;24346:59;;;;23792:621;;;;;;:::o;26704:777::-;26854:12;26883:7;26879:595;;;26914:10;26907:17;;;;26879:595;27048:1;27028:10;:17;:21;27024:439;;;27291:10;27285:17;27352:15;27339:10;27335:2;27331:19;27324:44;27239:148;27434:12;27427:20;;;;;;;;;;;:::i;:::-;;;;;;;;26704:777;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:124::-;;219:6;206:20;197:29;;231:30;255:5;231:30;:::i;:::-;191:75;;;;:::o;273:128::-;;352:6;339:20;330:29;;364:32;390:5;364:32;:::i;:::-;324:77;;;;:::o;408:132::-;;491:6;485:13;476:22;;503:32;529:5;503:32;:::i;:::-;470:70;;;;:::o;548:440::-;;649:3;642:4;634:6;630:17;626:27;616:2;;667:1;664;657:12;616:2;704:6;691:20;726:64;741:48;782:6;741:48;:::i;:::-;726:64;:::i;:::-;717:73;;810:6;803:5;796:21;846:4;838:6;834:17;879:4;872:5;868:16;914:3;905:6;900:3;896:16;893:25;890:2;;;931:1;928;921:12;890:2;941:41;975:6;970:3;965;941:41;:::i;:::-;609:379;;;;;;;:::o;997:442::-;;1099:3;1092:4;1084:6;1080:17;1076:27;1066:2;;1117:1;1114;1107:12;1066:2;1154:6;1141:20;1176:65;1191:49;1233:6;1191:49;:::i;:::-;1176:65;:::i;:::-;1167:74;;1261:6;1254:5;1247:21;1297:4;1289:6;1285:17;1330:4;1323:5;1319:16;1365:3;1356:6;1351:3;1347:16;1344:25;1341:2;;;1382:1;1379;1372:12;1341:2;1392:41;1426:6;1421:3;1416;1392:41;:::i;:::-;1059:380;;;;;;;:::o;1447:130::-;;1527:6;1514:20;1505:29;;1539:33;1566:5;1539:33;:::i;:::-;1499:78;;;;:::o;1584:241::-;;1688:2;1676:9;1667:7;1663:23;1659:32;1656:2;;;1704:1;1701;1694:12;1656:2;1739:1;1756:53;1801:7;1792:6;1781:9;1777:22;1756:53;:::i;:::-;1746:63;;1718:97;1650:175;;;;:::o;1832:366::-;;;1953:2;1941:9;1932:7;1928:23;1924:32;1921:2;;;1969:1;1966;1959:12;1921:2;2004:1;2021:53;2066:7;2057:6;2046:9;2042:22;2021:53;:::i;:::-;2011:63;;1983:97;2111:2;2129:53;2174:7;2165:6;2154:9;2150:22;2129:53;:::i;:::-;2119:63;;2090:98;1915:283;;;;;:::o;2205:491::-;;;;2343:2;2331:9;2322:7;2318:23;2314:32;2311:2;;;2359:1;2356;2349:12;2311:2;2394:1;2411:53;2456:7;2447:6;2436:9;2432:22;2411:53;:::i;:::-;2401:63;;2373:97;2501:2;2519:53;2564:7;2555:6;2544:9;2540:22;2519:53;:::i;:::-;2509:63;;2480:98;2609:2;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2588:98;2305:391;;;;;:::o;2703:721::-;;;;;2867:3;2855:9;2846:7;2842:23;2838:33;2835:2;;;2884:1;2881;2874:12;2835:2;2919:1;2936:53;2981:7;2972:6;2961:9;2957:22;2936:53;:::i;:::-;2926:63;;2898:97;3026:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;3005:98;3134:2;3152:53;3197:7;3188:6;3177:9;3173:22;3152:53;:::i;:::-;3142:63;;3113:98;3270:2;3259:9;3255:18;3242:32;3294:18;3286:6;3283:30;3280:2;;;3326:1;3323;3316:12;3280:2;3346:62;3400:7;3391:6;3380:9;3376:22;3346:62;:::i;:::-;3336:72;;3221:193;2829:595;;;;;;;:::o;3431:360::-;;;3549:2;3537:9;3528:7;3524:23;3520:32;3517:2;;;3565:1;3562;3555:12;3517:2;3600:1;3617:53;3662:7;3653:6;3642:9;3638:22;3617:53;:::i;:::-;3607:63;;3579:97;3707:2;3725:50;3767:7;3758:6;3747:9;3743:22;3725:50;:::i;:::-;3715:60;;3686:95;3511:280;;;;;:::o;3798:366::-;;;3919:2;3907:9;3898:7;3894:23;3890:32;3887:2;;;3935:1;3932;3925:12;3887:2;3970:1;3987:53;4032:7;4023:6;4012:9;4008:22;3987:53;:::i;:::-;3977:63;;3949:97;4077:2;4095:53;4140:7;4131:6;4120:9;4116:22;4095:53;:::i;:::-;4085:63;;4056:98;3881:283;;;;;:::o;4171:239::-;;4274:2;4262:9;4253:7;4249:23;4245:32;4242:2;;;4290:1;4287;4280:12;4242:2;4325:1;4342:52;4386:7;4377:6;4366:9;4362:22;4342:52;:::i;:::-;4332:62;;4304:96;4236:174;;;;:::o;4417:261::-;;4531:2;4519:9;4510:7;4506:23;4502:32;4499:2;;;4547:1;4544;4537:12;4499:2;4582:1;4599:63;4654:7;4645:6;4634:9;4630:22;4599:63;:::i;:::-;4589:73;;4561:107;4493:185;;;;:::o;4685:347::-;;4799:2;4787:9;4778:7;4774:23;4770:32;4767:2;;;4815:1;4812;4805:12;4767:2;4878:1;4867:9;4863:17;4850:31;4901:18;4893:6;4890:30;4887:2;;;4933:1;4930;4923:12;4887:2;4953:63;5008:7;4999:6;4988:9;4984:22;4953:63;:::i;:::-;4943:73;;4829:193;4761:271;;;;:::o;5039:241::-;;5143:2;5131:9;5122:7;5118:23;5114:32;5111:2;;;5159:1;5156;5149:12;5111:2;5194:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5173:97;5105:175;;;;:::o;5287:142::-;5378:45;5417:5;5378:45;:::i;:::-;5373:3;5366:58;5360:69;;:::o;5436:137::-;5535:32;5561:5;5535:32;:::i;:::-;5530:3;5523:45;5517:56;;:::o;5580:113::-;5663:24;5681:5;5663:24;:::i;:::-;5658:3;5651:37;5645:48;;:::o;5700:104::-;5777:21;5792:5;5777:21;:::i;:::-;5772:3;5765:34;5759:45;;:::o;5811:343::-;;5921:38;5953:5;5921:38;:::i;:::-;5971:70;6034:6;6029:3;5971:70;:::i;:::-;5964:77;;6046:52;6091:6;6086:3;6079:4;6072:5;6068:16;6046:52;:::i;:::-;6119:29;6141:6;6119:29;:::i;:::-;6114:3;6110:39;6103:46;;5901:253;;;;;:::o;6161:356::-;;6289:38;6321:5;6289:38;:::i;:::-;6339:88;6420:6;6415:3;6339:88;:::i;:::-;6332:95;;6432:52;6477:6;6472:3;6465:4;6458:5;6454:16;6432:52;:::i;:::-;6505:6;6500:3;6496:16;6489:23;;6269:248;;;;;:::o;6524:347::-;;6636:39;6669:5;6636:39;:::i;:::-;6687:71;6751:6;6746:3;6687:71;:::i;:::-;6680:78;;6763:52;6808:6;6803:3;6796:4;6789:5;6785:16;6763:52;:::i;:::-;6836:29;6858:6;6836:29;:::i;:::-;6831:3;6827:39;6820:46;;6616:255;;;;;:::o;6878:360::-;;7008:39;7041:5;7008:39;:::i;:::-;7059:89;7141:6;7136:3;7059:89;:::i;:::-;7052:96;;7153:52;7198:6;7193:3;7186:4;7179:5;7175:16;7153:52;:::i;:::-;7226:6;7221:3;7217:16;7210:23;;6988:250;;;;;:::o;7246:371::-;;7406:67;7470:2;7465:3;7406:67;:::i;:::-;7399:74;;7506:34;7502:1;7497:3;7493:11;7486:55;7575:4;7570:2;7565:3;7561:12;7554:26;7608:2;7603:3;7599:12;7592:19;;7392:225;;;:::o;7626:380::-;;7786:67;7850:2;7845:3;7786:67;:::i;:::-;7779:74;;7886:34;7882:1;7877:3;7873:11;7866:55;7955:13;7950:2;7945:3;7941:12;7934:35;7997:2;7992:3;7988:12;7981:19;;7772:234;;;:::o;8015:320::-;;8175:67;8239:2;8234:3;8175:67;:::i;:::-;8168:74;;8275:22;8271:1;8266:3;8262:11;8255:43;8326:2;8321:3;8317:12;8310:19;;8161:174;;;:::o;8344:387::-;;8504:67;8568:2;8563:3;8504:67;:::i;:::-;8497:74;;8604:34;8600:1;8595:3;8591:11;8584:55;8673:20;8668:2;8663:3;8659:12;8652:42;8722:2;8717:3;8713:12;8706:19;;8490:241;;;:::o;8740:375::-;;8900:67;8964:2;8959:3;8900:67;:::i;:::-;8893:74;;9000:34;8996:1;8991:3;8987:11;8980:55;9069:8;9064:2;9059:3;9055:12;9048:30;9106:2;9101:3;9097:12;9090:19;;8886:229;;;:::o;9124:328::-;;9284:67;9348:2;9343:3;9284:67;:::i;:::-;9277:74;;9384:30;9380:1;9375:3;9371:11;9364:51;9443:2;9438:3;9434:12;9427:19;;9270:182;;;:::o;9461:373::-;;9621:67;9685:2;9680:3;9621:67;:::i;:::-;9614:74;;9721:34;9717:1;9712:3;9708:11;9701:55;9790:6;9785:2;9780:3;9776:12;9769:28;9825:2;9820:3;9816:12;9809:19;;9607:227;;;:::o;9843:325::-;;10003:67;10067:2;10062:3;10003:67;:::i;:::-;9996:74;;10103:27;10099:1;10094:3;10090:11;10083:48;10159:2;10154:3;10150:12;10143:19;;9989:179;;;:::o;10177:331::-;;10337:67;10401:2;10396:3;10337:67;:::i;:::-;10330:74;;10437:33;10433:1;10428:3;10424:11;10417:54;10499:2;10494:3;10490:12;10483:19;;10323:185;;;:::o;10517:325::-;;10677:67;10741:2;10736:3;10677:67;:::i;:::-;10670:74;;10777:27;10773:1;10768:3;10764:11;10757:48;10833:2;10828:3;10824:12;10817:19;;10663:179;;;:::o;10851:375::-;;11011:67;11075:2;11070:3;11011:67;:::i;:::-;11004:74;;11111:34;11107:1;11102:3;11098:11;11091:55;11180:8;11175:2;11170:3;11166:12;11159:30;11217:2;11212:3;11208:12;11201:19;;10997:229;;;:::o;11235:381::-;;11395:67;11459:2;11454:3;11395:67;:::i;:::-;11388:74;;11495:34;11491:1;11486:3;11482:11;11475:55;11564:14;11559:2;11554:3;11550:12;11543:36;11607:2;11602:3;11598:12;11591:19;;11381:235;;;:::o;11625:326::-;;11785:67;11849:2;11844:3;11785:67;:::i;:::-;11778:74;;11885:28;11881:1;11876:3;11872:11;11865:49;11942:2;11937:3;11933:12;11926:19;;11771:180;;;:::o;11960:316::-;;12120:67;12184:2;12179:3;12120:67;:::i;:::-;12113:74;;12220:18;12216:1;12211:3;12207:11;12200:39;12267:2;12262:3;12258:12;12251:19;;12106:170;;;:::o;12285:393::-;;12445:67;12509:2;12504:3;12445:67;:::i;:::-;12438:74;;12545:34;12541:1;12536:3;12532:11;12525:55;12614:26;12609:2;12604:3;12600:12;12593:48;12669:2;12664:3;12660:12;12653:19;;12431:247;;;:::o;12687:379::-;;12847:67;12911:2;12906:3;12847:67;:::i;:::-;12840:74;;12947:34;12943:1;12938:3;12934:11;12927:55;13016:12;13011:2;13006:3;13002:12;12995:34;13057:2;13052:3;13048:12;13041:19;;12833:233;;;:::o;13075:371::-;;13235:67;13299:2;13294:3;13235:67;:::i;:::-;13228:74;;13335:34;13331:1;13326:3;13322:11;13315:55;13404:4;13399:2;13394:3;13390:12;13383:26;13437:2;13432:3;13428:12;13421:19;;13221:225;;;:::o;13455:332::-;;13615:67;13679:2;13674:3;13615:67;:::i;:::-;13608:74;;13715:34;13711:1;13706:3;13702:11;13695:55;13778:2;13773:3;13769:12;13762:19;;13601:186;;;:::o;13796:376::-;;13956:67;14020:2;14015:3;13956:67;:::i;:::-;13949:74;;14056:34;14052:1;14047:3;14043:11;14036:55;14125:9;14120:2;14115:3;14111:12;14104:31;14163:2;14158:3;14154:12;14147:19;;13942:230;;;:::o;14181:370::-;;14341:67;14405:2;14400:3;14341:67;:::i;:::-;14334:74;;14441:34;14437:1;14432:3;14428:11;14421:55;14510:3;14505:2;14500:3;14496:12;14489:25;14542:2;14537:3;14533:12;14526:19;;14327:224;;;:::o;14560:381::-;;14720:67;14784:2;14779:3;14720:67;:::i;:::-;14713:74;;14820:34;14816:1;14811:3;14807:11;14800:55;14889:14;14884:2;14879:3;14875:12;14868:36;14932:2;14927:3;14923:12;14916:19;;14706:235;;;:::o;14950:332::-;;15110:67;15174:2;15169:3;15110:67;:::i;:::-;15103:74;;15210:34;15206:1;15201:3;15197:11;15190:55;15273:2;15268:3;15264:12;15257:19;;15096:186;;;:::o;15291:378::-;;15451:67;15515:2;15510:3;15451:67;:::i;:::-;15444:74;;15551:34;15547:1;15542:3;15538:11;15531:55;15620:11;15615:2;15610:3;15606:12;15599:33;15660:2;15655:3;15651:12;15644:19;;15437:232;;;:::o;15678:384::-;;15838:67;15902:2;15897:3;15838:67;:::i;:::-;15831:74;;15938:34;15934:1;15929:3;15925:11;15918:55;16007:17;16002:2;15997:3;15993:12;15986:39;16053:2;16048:3;16044:12;16037:19;;15824:238;;;:::o;16071:370::-;;16231:67;16295:2;16290:3;16231:67;:::i;:::-;16224:74;;16331:34;16327:1;16322:3;16318:11;16311:55;16400:3;16395:2;16390:3;16386:12;16379:25;16432:2;16427:3;16423:12;16416:19;;16217:224;;;:::o;16450:386::-;;16610:67;16674:2;16669:3;16610:67;:::i;:::-;16603:74;;16710:34;16706:1;16701:3;16697:11;16690:55;16779:19;16774:2;16769:3;16765:12;16758:41;16827:2;16822:3;16818:12;16811:19;;16596:240;;;:::o;16845:329::-;;17005:67;17069:2;17064:3;17005:67;:::i;:::-;16998:74;;17105:31;17101:1;17096:3;17092:11;17085:52;17165:2;17160:3;17156:12;17149:19;;16991:183;;;:::o;17183:385::-;;17343:67;17407:2;17402:3;17343:67;:::i;:::-;17336:74;;17443:34;17439:1;17434:3;17430:11;17423:55;17512:18;17507:2;17502:3;17498:12;17491:40;17559:2;17554:3;17550:12;17543:19;;17329:239;;;:::o;17576:113::-;17659:24;17677:5;17659:24;:::i;:::-;17654:3;17647:37;17641:48;;:::o;17696:271::-;;17849:93;17938:3;17929:6;17849:93;:::i;:::-;17842:100;;17959:3;17952:10;;17830:137;;;;:::o;17974:436::-;;18177:95;18268:3;18259:6;18177:95;:::i;:::-;18170:102;;18290:95;18381:3;18372:6;18290:95;:::i;:::-;18283:102;;18402:3;18395:10;;18158:252;;;;;:::o;18417:222::-;;18544:2;18533:9;18529:18;18521:26;;18558:71;18626:1;18615:9;18611:17;18602:6;18558:71;:::i;:::-;18515:124;;;;:::o;18646:238::-;;18781:2;18770:9;18766:18;18758:26;;18795:79;18871:1;18860:9;18856:17;18847:6;18795:79;:::i;:::-;18752:132;;;;:::o;18891:672::-;;19136:3;19125:9;19121:19;19113:27;;19151:87;19235:1;19224:9;19220:17;19211:6;19151:87;:::i;:::-;19249:72;19317:2;19306:9;19302:18;19293:6;19249:72;:::i;:::-;19332;19400:2;19389:9;19385:18;19376:6;19332:72;:::i;:::-;19452:9;19446:4;19442:20;19437:2;19426:9;19422:18;19415:48;19477:76;19548:4;19539:6;19477:76;:::i;:::-;19469:84;;19107:456;;;;;;;:::o;19570:210::-;;19691:2;19680:9;19676:18;19668:26;;19705:65;19767:1;19756:9;19752:17;19743:6;19705:65;:::i;:::-;19662:118;;;;:::o;19787:310::-;;19934:2;19923:9;19919:18;19911:26;;19984:9;19978:4;19974:20;19970:1;19959:9;19955:17;19948:47;20009:78;20082:4;20073:6;20009:78;:::i;:::-;20001:86;;19905:192;;;;:::o;20104:416::-;;20304:2;20293:9;20289:18;20281:26;;20354:9;20348:4;20344:20;20340:1;20329:9;20325:17;20318:47;20379:131;20505:4;20379:131;:::i;:::-;20371:139;;20275:245;;;:::o;20527:416::-;;20727:2;20716:9;20712:18;20704:26;;20777:9;20771:4;20767:20;20763:1;20752:9;20748:17;20741:47;20802:131;20928:4;20802:131;:::i;:::-;20794:139;;20698:245;;;:::o;20950:416::-;;21150:2;21139:9;21135:18;21127:26;;21200:9;21194:4;21190:20;21186:1;21175:9;21171:17;21164:47;21225:131;21351:4;21225:131;:::i;:::-;21217:139;;21121:245;;;:::o;21373:416::-;;21573:2;21562:9;21558:18;21550:26;;21623:9;21617:4;21613:20;21609:1;21598:9;21594:17;21587:47;21648:131;21774:4;21648:131;:::i;:::-;21640:139;;21544:245;;;:::o;21796:416::-;;21996:2;21985:9;21981:18;21973:26;;22046:9;22040:4;22036:20;22032:1;22021:9;22017:17;22010:47;22071:131;22197:4;22071:131;:::i;:::-;22063:139;;21967:245;;;:::o;22219:416::-;;22419:2;22408:9;22404:18;22396:26;;22469:9;22463:4;22459:20;22455:1;22444:9;22440:17;22433:47;22494:131;22620:4;22494:131;:::i;:::-;22486:139;;22390:245;;;:::o;22642:416::-;;22842:2;22831:9;22827:18;22819:26;;22892:9;22886:4;22882:20;22878:1;22867:9;22863:17;22856:47;22917:131;23043:4;22917:131;:::i;:::-;22909:139;;22813:245;;;:::o;23065:416::-;;23265:2;23254:9;23250:18;23242:26;;23315:9;23309:4;23305:20;23301:1;23290:9;23286:17;23279:47;23340:131;23466:4;23340:131;:::i;:::-;23332:139;;23236:245;;;:::o;23488:416::-;;23688:2;23677:9;23673:18;23665:26;;23738:9;23732:4;23728:20;23724:1;23713:9;23709:17;23702:47;23763:131;23889:4;23763:131;:::i;:::-;23755:139;;23659:245;;;:::o;23911:416::-;;24111:2;24100:9;24096:18;24088:26;;24161:9;24155:4;24151:20;24147:1;24136:9;24132:17;24125:47;24186:131;24312:4;24186:131;:::i;:::-;24178:139;;24082:245;;;:::o;24334:416::-;;24534:2;24523:9;24519:18;24511:26;;24584:9;24578:4;24574:20;24570:1;24559:9;24555:17;24548:47;24609:131;24735:4;24609:131;:::i;:::-;24601:139;;24505:245;;;:::o;24757:416::-;;24957:2;24946:9;24942:18;24934:26;;25007:9;25001:4;24997:20;24993:1;24982:9;24978:17;24971:47;25032:131;25158:4;25032:131;:::i;:::-;25024:139;;24928:245;;;:::o;25180:416::-;;25380:2;25369:9;25365:18;25357:26;;25430:9;25424:4;25420:20;25416:1;25405:9;25401:17;25394:47;25455:131;25581:4;25455:131;:::i;:::-;25447:139;;25351:245;;;:::o;25603:416::-;;25803:2;25792:9;25788:18;25780:26;;25853:9;25847:4;25843:20;25839:1;25828:9;25824:17;25817:47;25878:131;26004:4;25878:131;:::i;:::-;25870:139;;25774:245;;;:::o;26026:416::-;;26226:2;26215:9;26211:18;26203:26;;26276:9;26270:4;26266:20;26262:1;26251:9;26247:17;26240:47;26301:131;26427:4;26301:131;:::i;:::-;26293:139;;26197:245;;;:::o;26449:416::-;;26649:2;26638:9;26634:18;26626:26;;26699:9;26693:4;26689:20;26685:1;26674:9;26670:17;26663:47;26724:131;26850:4;26724:131;:::i;:::-;26716:139;;26620:245;;;:::o;26872:416::-;;27072:2;27061:9;27057:18;27049:26;;27122:9;27116:4;27112:20;27108:1;27097:9;27093:17;27086:47;27147:131;27273:4;27147:131;:::i;:::-;27139:139;;27043:245;;;:::o;27295:416::-;;27495:2;27484:9;27480:18;27472:26;;27545:9;27539:4;27535:20;27531:1;27520:9;27516:17;27509:47;27570:131;27696:4;27570:131;:::i;:::-;27562:139;;27466:245;;;:::o;27718:416::-;;27918:2;27907:9;27903:18;27895:26;;27968:9;27962:4;27958:20;27954:1;27943:9;27939:17;27932:47;27993:131;28119:4;27993:131;:::i;:::-;27985:139;;27889:245;;;:::o;28141:416::-;;28341:2;28330:9;28326:18;28318:26;;28391:9;28385:4;28381:20;28377:1;28366:9;28362:17;28355:47;28416:131;28542:4;28416:131;:::i;:::-;28408:139;;28312:245;;;:::o;28564:416::-;;28764:2;28753:9;28749:18;28741:26;;28814:9;28808:4;28804:20;28800:1;28789:9;28785:17;28778:47;28839:131;28965:4;28839:131;:::i;:::-;28831:139;;28735:245;;;:::o;28987:416::-;;29187:2;29176:9;29172:18;29164:26;;29237:9;29231:4;29227:20;29223:1;29212:9;29208:17;29201:47;29262:131;29388:4;29262:131;:::i;:::-;29254:139;;29158:245;;;:::o;29410:416::-;;29610:2;29599:9;29595:18;29587:26;;29660:9;29654:4;29650:20;29646:1;29635:9;29631:17;29624:47;29685:131;29811:4;29685:131;:::i;:::-;29677:139;;29581:245;;;:::o;29833:416::-;;30033:2;30022:9;30018:18;30010:26;;30083:9;30077:4;30073:20;30069:1;30058:9;30054:17;30047:47;30108:131;30234:4;30108:131;:::i;:::-;30100:139;;30004:245;;;:::o;30256:416::-;;30456:2;30445:9;30441:18;30433:26;;30506:9;30500:4;30496:20;30492:1;30481:9;30477:17;30470:47;30531:131;30657:4;30531:131;:::i;:::-;30523:139;;30427:245;;;:::o;30679:416::-;;30879:2;30868:9;30864:18;30856:26;;30929:9;30923:4;30919:20;30915:1;30904:9;30900:17;30893:47;30954:131;31080:4;30954:131;:::i;:::-;30946:139;;30850:245;;;:::o;31102:416::-;;31302:2;31291:9;31287:18;31279:26;;31352:9;31346:4;31342:20;31338:1;31327:9;31323:17;31316:47;31377:131;31503:4;31377:131;:::i;:::-;31369:139;;31273:245;;;:::o;31525:416::-;;31725:2;31714:9;31710:18;31702:26;;31775:9;31769:4;31765:20;31761:1;31750:9;31746:17;31739:47;31800:131;31926:4;31800:131;:::i;:::-;31792:139;;31696:245;;;:::o;31948:222::-;;32075:2;32064:9;32060:18;32052:26;;32089:71;32157:1;32146:9;32142:17;32133:6;32089:71;:::i;:::-;32046:124;;;;:::o;32177:256::-;;32239:2;32233:9;32223:19;;32277:4;32269:6;32265:17;32376:6;32364:10;32361:22;32340:18;32328:10;32325:34;32322:62;32319:2;;;32397:1;32394;32387:12;32319:2;32417:10;32413:2;32406:22;32217:216;;;;:::o;32440:321::-;;32583:18;32575:6;32572:30;32569:2;;;32615:1;32612;32605:12;32569:2;32682:4;32678:9;32671:4;32663:6;32659:17;32655:33;32647:41;;32746:4;32740;32736:15;32728:23;;32506:255;;;:::o;32768:322::-;;32912:18;32904:6;32901:30;32898:2;;;32944:1;32941;32934:12;32898:2;33011:4;33007:9;33000:4;32992:6;32988:17;32984:33;32976:41;;33075:4;33069;33065:15;33057:23;;32835:255;;;:::o;33097:121::-;;33190:5;33184:12;33174:22;;33155:63;;;:::o;33225:122::-;;33319:5;33313:12;33303:22;;33284:63;;;:::o;33355:162::-;;33469:6;33464:3;33457:19;33506:4;33501:3;33497:14;33482:29;;33450:67;;;;:::o;33526:144::-;;33661:3;33646:18;;33639:31;;;;:::o;33679:163::-;;33794:6;33789:3;33782:19;33831:4;33826:3;33822:14;33807:29;;33775:67;;;;:::o;33851:145::-;;33987:3;33972:18;;33965:31;;;;:::o;34004:91::-;;34066:24;34084:5;34066:24;:::i;:::-;34055:35;;34049:46;;;:::o;34102:99::-;;34172:24;34190:5;34172:24;:::i;:::-;34161:35;;34155:46;;;:::o;34208:85::-;;34281:5;34274:13;34267:21;34256:32;;34250:43;;;:::o;34300:144::-;;34372:66;34365:5;34361:78;34350:89;;34344:100;;;:::o;34451:121::-;;34524:42;34517:5;34513:54;34502:65;;34496:76;;;:::o;34579:72::-;;34641:5;34630:16;;34624:27;;;:::o;34658:129::-;;34745:37;34776:5;34745:37;:::i;:::-;34732:50;;34726:61;;;:::o;34794:121::-;;34873:37;34904:5;34873:37;:::i;:::-;34860:50;;34854:61;;;:::o;34922:108::-;;35001:24;35019:5;35001:24;:::i;:::-;34988:37;;34982:48;;;:::o;35038:145::-;35119:6;35114:3;35109;35096:30;35175:1;35166:6;35161:3;35157:16;35150:27;35089:94;;;:::o;35192:268::-;35257:1;35264:101;35278:6;35275:1;35272:13;35264:101;;;35354:1;35349:3;35345:11;35339:18;35335:1;35330:3;35326:11;35319:39;35300:2;35297:1;35293:10;35288:15;;35264:101;;;35380:6;35377:1;35374:13;35371:2;;;35445:1;35436:6;35431:3;35427:16;35420:27;35371:2;35241:219;;;;:::o;35468:97::-;;35556:2;35552:7;35547:2;35540:5;35536:14;35532:28;35522:38;;35516:49;;;:::o;35573:117::-;35642:24;35660:5;35642:24;:::i;:::-;35635:5;35632:35;35622:2;;35681:1;35678;35671:12;35622:2;35616:74;:::o;35697:111::-;35763:21;35778:5;35763:21;:::i;:::-;35756:5;35753:32;35743:2;;35799:1;35796;35789:12;35743:2;35737:71;:::o;35815:115::-;35883:23;35900:5;35883:23;:::i;:::-;35876:5;35873:34;35863:2;;35921:1;35918;35911:12;35863:2;35857:73;:::o;35937:117::-;36006:24;36024:5;36006:24;:::i;:::-;35999:5;35996:35;35986:2;;36045:1;36042;36035:12;35986:2;35980:74;:::o

Swarm Source

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