ETH Price: $2,428.73 (+0.25%)

Token

Gang of Ducks (GoD)
 

Overview

Max Total Supply

225 GoD

Holders

75

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 GoD
0x4300624fcd5e839c6a32f985a05f1ae6f8667766
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:
GangOfDucks

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// produced by the Solididy File Flattener (c) David Appleton 2018 - 2020 and beyond
// contact : [email protected]
// source  : https://github.com/DaveAppleton/SolidityFlattery
// released under Apache 2.0 licence
// input  C:\Users\slive\Documents\NFT_Projects\GangOfDucks\contracts\GangOfDucks.sol
// flattened :  Thursday, 19-Aug-21 22:32:09 UTC
pragma solidity 0.8.6;

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

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	string public baseURI = "https://gangofducks.io/api/metadata.php?TokenID=";
	uint256 public tokenPrice = 40000000000000000;   // .04 ETH
	bool public saleActive = false;

	constructor( ) ERC721( "Gang of Ducks", "GoD" ) {
		// Mint 50 tokens for team - Giveaways/Prizes etc
		for( uint i = 0; i < 50; i++ ) {
			_safeMint( msg.sender, i );
		}
	}
	function mintDuck( uint _quantity ) public payable {
		uint totalSupply = totalSupply();
		require( saleActive, "Sale must be active to mint a Duck" );
		require( _quantity < 21, "Can only mint 20 tokens at a time" );
		require( totalSupply + _quantity < 10001, "Purchase would exceed max supply of Ducks");
		require( msg.value >= tokenPrice * _quantity, "Ether value sent is not correct" );
		for( uint i = 0; i < _quantity; i++ ) {
			uint mintIndex = totalSupply + i;
			_safeMint( msg.sender, mintIndex );
		}
	}
	function withdraw() public onlyOwner() {
		uint _balance = address( this ).balance;
		payable( _msgSender() ).transfer( _balance );
	}
	function setBaseURI( string memory _baseURI ) public onlyOwner() {
		baseURI = _baseURI;
	}
	function flipSales() public onlyOwner() {
		saleActive = !saleActive;
				emit SalesFlipped(saleActive);
	}
	function tokenURI( uint256 tokenId ) public override view returns ( string memory ) {
		return string( abi.encodePacked( baseURI, tokenId.toString() ) );
	}
	/**
	 * @dev Emitted when `saleActive` switches.
	 */
	event SalesFlipped(bool saleActive);
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"saleActive","type":"bool"}],"name":"SalesFlipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[],"name":"flipSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintDuck","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","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":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e060405260306080818152906200308360a03980516200002991600b91602090910190620007df565b50668e1bc9bf040000600c55600d805460ff191690553480156200004c57600080fd5b50604080518082018252600d81526c47616e67206f66204475636b7360981b60208083019182528351808501909452600384526211dbd160ea1b9084015281519192916200009d91600091620007df565b508051620000b3906001906020840190620007df565b505050620000d0620000ca6200010560201b60201c565b62000109565b60005b6032811015620000fe57620000e933826200015b565b80620000f581620009a5565b915050620000d3565b5062000a05565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200017d8282604051806020016040528060008152506200018160201b60201c565b5050565b6200018d8383620001fd565b6200019c600084848462000353565b620001f85760405162461bcd60e51b815260206004820152603260248201526000805160206200306383398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084015b60405180910390fd5b505050565b6001600160a01b038216620002555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620001ef565b6000818152600260205260409020546001600160a01b031615620002bc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620001ef565b620002ca60008383620004bc565b6001600160a01b0382166000908152600360205260408120805460019290620002f590849062000933565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600062000374846001600160a01b03166200059860201b6200121f1760201c565b15620004b057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290620003ae903390899088908890600401620008b8565b602060405180830381600087803b158015620003c957600080fd5b505af1925050508015620003fc575060408051601f3d908101601f19168201909252620003f99181019062000885565b60015b62000495573d8080156200042d576040519150601f19603f3d011682016040523d82523d6000602084013e62000432565b606091505b5080516200048d5760405162461bcd60e51b815260206004820152603260248201526000805160206200306383398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620001ef565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050620004b4565b5060015b949350505050565b620004d4838383620001f860201b620007af1760201c565b6001600160a01b03831662000532576200052c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000558565b816001600160a01b0316836001600160a01b03161462000558576200055883826200059e565b6001600160a01b0382166200057257620001f8816200064b565b826001600160a01b0316826001600160a01b031614620001f857620001f8828262000705565b3b151590565b60006001620005b8846200075660201b62000dc41760201c565b620005c491906200094e565b60008381526007602052604090205490915080821462000618576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906200065f906001906200094e565b600083815260096020526040812054600880549394509092849081106200068a576200068a620009ef565b906000526020600020015490508060088381548110620006ae57620006ae620009ef565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480620006e957620006e9620009d9565b6001900381819060005260206000200160009055905550505050565b60006200071d836200075660201b62000dc41760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b038216620007c35760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401620001ef565b506001600160a01b031660009081526003602052604090205490565b828054620007ed9062000968565b90600052602060002090601f0160209004810192826200081157600085556200085c565b82601f106200082c57805160ff19168380011785556200085c565b828001600101855582156200085c579182015b828111156200085c5782518255916020019190600101906200083f565b506200086a9291506200086e565b5090565b5b808211156200086a57600081556001016200086f565b6000602082840312156200089857600080fd5b81516001600160e01b031981168114620008b157600080fd5b9392505050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620009075785810182015185820160a001528101620008e9565b828111156200091a57600060a084870101525b5050601f01601f19169190910160a00195945050505050565b60008219821115620009495762000949620009c3565b500190565b600082821015620009635762000963620009c3565b500390565b600181811c908216806200097d57607f821691505b602082108114156200099f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620009bc57620009bc620009c3565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b61264e8062000a156000396000f3fe6080604052600436106101a15760003560e01c806368428a1b116100e15780638da5cb5b1161008a578063b88d4fde11610064578063b88d4fde14610440578063c87b56dd14610460578063e985e9c514610480578063f2fde38b146104c957600080fd5b80638da5cb5b146103ed57806395d89b411461040b578063a22cb4651461042057600080fd5b8063715018a6116100bb578063715018a6146103ad57806372d5916d146103c25780637ff9b596146103d757600080fd5b806368428a1b1461035e5780636c0360eb1461037857806370a082311461038d57600080fd5b80632f745c591161014e578063451bd5c911610128578063451bd5c9146102eb5780634f6ccce7146102fe57806355f804b31461031e5780636352211e1461033e57600080fd5b80632f745c59146102965780633ccfd60b146102b657806342842e0e146102cb57600080fd5b8063095ea7b31161017f578063095ea7b31461023557806318160ddd1461025757806323b872dd1461027657600080fd5b806301ffc9a7146101a657806306fdde03146101db578063081812fc146101fd575b600080fd5b3480156101b257600080fd5b506101c66101c1366004612183565b6104e9565b60405190151581526020015b60405180910390f35b3480156101e757600080fd5b506101f0610545565b6040516101d2919061239f565b34801561020957600080fd5b5061021d610218366004612206565b6105d7565b6040516001600160a01b0390911681526020016101d2565b34801561024157600080fd5b50610255610250366004612159565b610682565b005b34801561026357600080fd5b506008545b6040519081526020016101d2565b34801561028257600080fd5b50610255610291366004612065565b6107b4565b3480156102a257600080fd5b506102686102b1366004612159565b61083b565b3480156102c257600080fd5b506102556108e3565b3480156102d757600080fd5b506102556102e6366004612065565b610970565b6102556102f9366004612206565b61098b565b34801561030a57600080fd5b50610268610319366004612206565b610b9a565b34801561032a57600080fd5b506102556103393660046121bd565b610c3e565b34801561034a57600080fd5b5061021d610359366004612206565b610cab565b34801561036a57600080fd5b50600d546101c69060ff1681565b34801561038457600080fd5b506101f0610d36565b34801561039957600080fd5b506102686103a8366004612010565b610dc4565b3480156103b957600080fd5b50610255610e5e565b3480156103ce57600080fd5b50610255610ec4565b3480156103e357600080fd5b50610268600c5481565b3480156103f957600080fd5b50600a546001600160a01b031661021d565b34801561041757600080fd5b506101f0610f89565b34801561042c57600080fd5b5061025561043b36600461211d565b610f98565b34801561044c57600080fd5b5061025561045b3660046120a1565b61107b565b34801561046c57600080fd5b506101f061047b366004612206565b611109565b34801561048c57600080fd5b506101c661049b366004612032565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156104d557600080fd5b506102556104e4366004612010565b61113d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061053f575061053f82611225565b92915050565b6060600080546105549061245e565b80601f01602080910402602001604051908101604052809291908181526020018280546105809061245e565b80156105cd5780601f106105a2576101008083540402835291602001916105cd565b820191906000526020600020905b8154815290600101906020018083116105b057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061068d82610cab565b9050806001600160a01b0316836001600160a01b031614156107175760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161065d565b336001600160a01b03821614806107335750610733813361049b565b6107a55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161065d565b6107af8383611308565b505050565b6107be338261138e565b6108305760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161065d565b6107af838383611496565b600061084683610dc4565b82106108ba5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161065d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331461093d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b6040514790339082156108fc029083906000818181858888f1935050505015801561096c573d6000803e3d6000fd5b5050565b6107af8383836040518060200160405280600081525061107b565b600061099660085490565b600d5490915060ff16610a115760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e74206120447560448201527f636b000000000000000000000000000000000000000000000000000000000000606482015260840161065d565b60158210610a875760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161065d565b612711610a9483836123b2565b10610b075760405162461bcd60e51b815260206004820152602960248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f66204475636b730000000000000000000000000000000000000000000000606482015260840161065d565b81600c54610b1591906123de565b341015610b645760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161065d565b60005b828110156107af576000610b7b82846123b2565b9050610b873382611686565b5080610b92816124b2565b915050610b67565b6000610ba560085490565b8210610c195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161065d565b60088281548110610c2c57610c2c61258c565b90600052602060002001549050919050565b600a546001600160a01b03163314610c985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b805161096c90600b906020840190611ec7565b6000818152600260205260408120546001600160a01b03168061053f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161065d565b600b8054610d439061245e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f9061245e565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b505050505081565b60006001600160a01b038216610e425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161065d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610eb85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b610ec260006116a0565b565b600a546001600160a01b03163314610f1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b600d805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092556040519116151581527f1db43677b707321cdfccafe0b6f6f87857b1670eee73e6b93786e18c6136d85c9060200160405180910390a1565b6060600180546105549061245e565b6001600160a01b038216331415610ff15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161065d565b3360008181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611085338361138e565b6110f75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161065d565b6111038484848461170a565b50505050565b6060600b61111683611793565b604051602001611127929190612285565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146111975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b6001600160a01b0381166112135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065d565b61121c816116a0565b50565b3b151590565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806112b857507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061053f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461053f565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061135582610cab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114185760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161065d565b600061142383610cab565b9050806001600160a01b0316846001600160a01b0316148061145e5750836001600160a01b0316611453846105d7565b6001600160a01b0316145b8061148e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166114a982610cab565b6001600160a01b0316146115255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161065d565b6001600160a01b0382166115a05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161065d565b6115ab8383836118c5565b6115b6600082611308565b6001600160a01b03831660009081526003602052604081208054600192906115df90849061241b565b90915550506001600160a01b038216600090815260036020526040812080546001929061160d9084906123b2565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61096c82826040518060200160405280600081525061197d565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611715848484611496565b61172184848484611a06565b6111035760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161065d565b6060816117d357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156117fd57806117e7816124b2565b91506117f69050600a836123ca565b91506117d7565b60008167ffffffffffffffff811115611818576118186125bb565b6040519080825280601f01601f191660200182016040528015611842576020820181803683370190505b5090505b841561148e5761185760018361241b565b9150611864600a866124eb565b61186f9060306123b2565b60f81b8183815181106118845761188461258c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506118be600a866123ca565b9450611846565b6001600160a01b0383166119205761191b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611943565b816001600160a01b0316836001600160a01b031614611943576119438382611bd1565b6001600160a01b03821661195a576107af81611c6e565b826001600160a01b0316826001600160a01b0316146107af576107af8282611d1d565b6119878383611d61565b6119946000848484611a06565b6107af5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161065d565b60006001600160a01b0384163b15611bc6576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611a63903390899088908890600401612363565b602060405180830381600087803b158015611a7d57600080fd5b505af1925050508015611acb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611ac8918101906121a0565b60015b611b7b573d808015611af9576040519150601f19603f3d011682016040523d82523d6000602084013e611afe565b606091505b508051611b735760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161065d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061148e565b506001949350505050565b60006001611bde84610dc4565b611be8919061241b565b600083815260076020526040902054909150808214611c3b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611c809060019061241b565b60008381526009602052604081205460088054939450909284908110611ca857611ca861258c565b906000526020600020015490508060088381548110611cc957611cc961258c565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611d0157611d0161255d565b6001900381819060005260206000200160009055905550505050565b6000611d2883610dc4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611db75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161065d565b6000818152600260205260409020546001600160a01b031615611e1c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161065d565b611e28600083836118c5565b6001600160a01b0382166000908152600360205260408120805460019290611e519084906123b2565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611ed39061245e565b90600052602060002090601f016020900481019282611ef55760008555611f3b565b82601f10611f0e57805160ff1916838001178555611f3b565b82800160010185558215611f3b579182015b82811115611f3b578251825591602001919060010190611f20565b50611f47929150611f4b565b5090565b5b80821115611f475760008155600101611f4c565b600067ffffffffffffffff80841115611f7b57611f7b6125bb565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611fc157611fc16125bb565b81604052809350858152868686011115611fda57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461200b57600080fd5b919050565b60006020828403121561202257600080fd5b61202b82611ff4565b9392505050565b6000806040838503121561204557600080fd5b61204e83611ff4565b915061205c60208401611ff4565b90509250929050565b60008060006060848603121561207a57600080fd5b61208384611ff4565b925061209160208501611ff4565b9150604084013590509250925092565b600080600080608085870312156120b757600080fd5b6120c085611ff4565b93506120ce60208601611ff4565b925060408501359150606085013567ffffffffffffffff8111156120f157600080fd5b8501601f8101871361210257600080fd5b61211187823560208401611f60565b91505092959194509250565b6000806040838503121561213057600080fd5b61213983611ff4565b91506020830135801515811461214e57600080fd5b809150509250929050565b6000806040838503121561216c57600080fd5b61217583611ff4565b946020939093013593505050565b60006020828403121561219557600080fd5b813561202b816125ea565b6000602082840312156121b257600080fd5b815161202b816125ea565b6000602082840312156121cf57600080fd5b813567ffffffffffffffff8111156121e657600080fd5b8201601f810184136121f757600080fd5b61148e84823560208401611f60565b60006020828403121561221857600080fd5b5035919050565b60008151808452612237816020860160208601612432565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815161227b818560208601612432565b9290920192915050565b600080845481600182811c9150808316806122a157607f831692505b60208084108214156122da577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156122ee576001811461231d5761234a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061234a565b60008b81526020902060005b868110156123425781548b820152908501908301612329565b505084890196505b50505050505061235a8185612269565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612395608083018461221f565b9695505050505050565b60208152600061202b602083018461221f565b600082198211156123c5576123c56124ff565b500190565b6000826123d9576123d961252e565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612416576124166124ff565b500290565b60008282101561242d5761242d6124ff565b500390565b60005b8381101561244d578181015183820152602001612435565b838111156111035750506000910152565b600181811c9082168061247257607f821691505b602082108114156124ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156124e4576124e46124ff565b5060010190565b6000826124fa576124fa61252e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461121c57600080fdfea264697066735822122087506e6e68cfbea61fb27bd9a2a4bbd1e57e07bc5f6d49ae3d92ede1d5b17d4c64736f6c634300080600334552433732313a207472616e7366657220746f206e6f6e20455243373231526568747470733a2f2f67616e676f666475636b732e696f2f6170692f6d657461646174612e7068703f546f6b656e49443d

Deployed Bytecode

0x6080604052600436106101a15760003560e01c806368428a1b116100e15780638da5cb5b1161008a578063b88d4fde11610064578063b88d4fde14610440578063c87b56dd14610460578063e985e9c514610480578063f2fde38b146104c957600080fd5b80638da5cb5b146103ed57806395d89b411461040b578063a22cb4651461042057600080fd5b8063715018a6116100bb578063715018a6146103ad57806372d5916d146103c25780637ff9b596146103d757600080fd5b806368428a1b1461035e5780636c0360eb1461037857806370a082311461038d57600080fd5b80632f745c591161014e578063451bd5c911610128578063451bd5c9146102eb5780634f6ccce7146102fe57806355f804b31461031e5780636352211e1461033e57600080fd5b80632f745c59146102965780633ccfd60b146102b657806342842e0e146102cb57600080fd5b8063095ea7b31161017f578063095ea7b31461023557806318160ddd1461025757806323b872dd1461027657600080fd5b806301ffc9a7146101a657806306fdde03146101db578063081812fc146101fd575b600080fd5b3480156101b257600080fd5b506101c66101c1366004612183565b6104e9565b60405190151581526020015b60405180910390f35b3480156101e757600080fd5b506101f0610545565b6040516101d2919061239f565b34801561020957600080fd5b5061021d610218366004612206565b6105d7565b6040516001600160a01b0390911681526020016101d2565b34801561024157600080fd5b50610255610250366004612159565b610682565b005b34801561026357600080fd5b506008545b6040519081526020016101d2565b34801561028257600080fd5b50610255610291366004612065565b6107b4565b3480156102a257600080fd5b506102686102b1366004612159565b61083b565b3480156102c257600080fd5b506102556108e3565b3480156102d757600080fd5b506102556102e6366004612065565b610970565b6102556102f9366004612206565b61098b565b34801561030a57600080fd5b50610268610319366004612206565b610b9a565b34801561032a57600080fd5b506102556103393660046121bd565b610c3e565b34801561034a57600080fd5b5061021d610359366004612206565b610cab565b34801561036a57600080fd5b50600d546101c69060ff1681565b34801561038457600080fd5b506101f0610d36565b34801561039957600080fd5b506102686103a8366004612010565b610dc4565b3480156103b957600080fd5b50610255610e5e565b3480156103ce57600080fd5b50610255610ec4565b3480156103e357600080fd5b50610268600c5481565b3480156103f957600080fd5b50600a546001600160a01b031661021d565b34801561041757600080fd5b506101f0610f89565b34801561042c57600080fd5b5061025561043b36600461211d565b610f98565b34801561044c57600080fd5b5061025561045b3660046120a1565b61107b565b34801561046c57600080fd5b506101f061047b366004612206565b611109565b34801561048c57600080fd5b506101c661049b366004612032565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156104d557600080fd5b506102556104e4366004612010565b61113d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061053f575061053f82611225565b92915050565b6060600080546105549061245e565b80601f01602080910402602001604051908101604052809291908181526020018280546105809061245e565b80156105cd5780601f106105a2576101008083540402835291602001916105cd565b820191906000526020600020905b8154815290600101906020018083116105b057829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106665760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061068d82610cab565b9050806001600160a01b0316836001600160a01b031614156107175760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161065d565b336001600160a01b03821614806107335750610733813361049b565b6107a55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161065d565b6107af8383611308565b505050565b6107be338261138e565b6108305760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161065d565b6107af838383611496565b600061084683610dc4565b82106108ba5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161065d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331461093d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b6040514790339082156108fc029083906000818181858888f1935050505015801561096c573d6000803e3d6000fd5b5050565b6107af8383836040518060200160405280600081525061107b565b600061099660085490565b600d5490915060ff16610a115760405162461bcd60e51b815260206004820152602260248201527f53616c65206d7573742062652061637469766520746f206d696e74206120447560448201527f636b000000000000000000000000000000000000000000000000000000000000606482015260840161065d565b60158210610a875760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161065d565b612711610a9483836123b2565b10610b075760405162461bcd60e51b815260206004820152602960248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201527f206f66204475636b730000000000000000000000000000000000000000000000606482015260840161065d565b81600c54610b1591906123de565b341015610b645760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161065d565b60005b828110156107af576000610b7b82846123b2565b9050610b873382611686565b5080610b92816124b2565b915050610b67565b6000610ba560085490565b8210610c195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161065d565b60088281548110610c2c57610c2c61258c565b90600052602060002001549050919050565b600a546001600160a01b03163314610c985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b805161096c90600b906020840190611ec7565b6000818152600260205260408120546001600160a01b03168061053f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161065d565b600b8054610d439061245e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f9061245e565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b505050505081565b60006001600160a01b038216610e425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161065d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610eb85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b610ec260006116a0565b565b600a546001600160a01b03163314610f1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b600d805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092556040519116151581527f1db43677b707321cdfccafe0b6f6f87857b1670eee73e6b93786e18c6136d85c9060200160405180910390a1565b6060600180546105549061245e565b6001600160a01b038216331415610ff15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161065d565b3360008181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611085338361138e565b6110f75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161065d565b6111038484848461170a565b50505050565b6060600b61111683611793565b604051602001611127929190612285565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146111975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065d565b6001600160a01b0381166112135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065d565b61121c816116a0565b50565b3b151590565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806112b857507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061053f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461053f565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061135582610cab565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114185760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161065d565b600061142383610cab565b9050806001600160a01b0316846001600160a01b0316148061145e5750836001600160a01b0316611453846105d7565b6001600160a01b0316145b8061148e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166114a982610cab565b6001600160a01b0316146115255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161065d565b6001600160a01b0382166115a05760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161065d565b6115ab8383836118c5565b6115b6600082611308565b6001600160a01b03831660009081526003602052604081208054600192906115df90849061241b565b90915550506001600160a01b038216600090815260036020526040812080546001929061160d9084906123b2565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61096c82826040518060200160405280600081525061197d565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611715848484611496565b61172184848484611a06565b6111035760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161065d565b6060816117d357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156117fd57806117e7816124b2565b91506117f69050600a836123ca565b91506117d7565b60008167ffffffffffffffff811115611818576118186125bb565b6040519080825280601f01601f191660200182016040528015611842576020820181803683370190505b5090505b841561148e5761185760018361241b565b9150611864600a866124eb565b61186f9060306123b2565b60f81b8183815181106118845761188461258c565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506118be600a866123ca565b9450611846565b6001600160a01b0383166119205761191b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611943565b816001600160a01b0316836001600160a01b031614611943576119438382611bd1565b6001600160a01b03821661195a576107af81611c6e565b826001600160a01b0316826001600160a01b0316146107af576107af8282611d1d565b6119878383611d61565b6119946000848484611a06565b6107af5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161065d565b60006001600160a01b0384163b15611bc6576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611a63903390899088908890600401612363565b602060405180830381600087803b158015611a7d57600080fd5b505af1925050508015611acb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611ac8918101906121a0565b60015b611b7b573d808015611af9576040519150601f19603f3d011682016040523d82523d6000602084013e611afe565b606091505b508051611b735760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161065d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061148e565b506001949350505050565b60006001611bde84610dc4565b611be8919061241b565b600083815260076020526040902054909150808214611c3b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611c809060019061241b565b60008381526009602052604081205460088054939450909284908110611ca857611ca861258c565b906000526020600020015490508060088381548110611cc957611cc961258c565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611d0157611d0161255d565b6001900381819060005260206000200160009055905550505050565b6000611d2883610dc4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611db75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161065d565b6000818152600260205260409020546001600160a01b031615611e1c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161065d565b611e28600083836118c5565b6001600160a01b0382166000908152600360205260408120805460019290611e519084906123b2565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611ed39061245e565b90600052602060002090601f016020900481019282611ef55760008555611f3b565b82601f10611f0e57805160ff1916838001178555611f3b565b82800160010185558215611f3b579182015b82811115611f3b578251825591602001919060010190611f20565b50611f47929150611f4b565b5090565b5b80821115611f475760008155600101611f4c565b600067ffffffffffffffff80841115611f7b57611f7b6125bb565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611fc157611fc16125bb565b81604052809350858152868686011115611fda57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461200b57600080fd5b919050565b60006020828403121561202257600080fd5b61202b82611ff4565b9392505050565b6000806040838503121561204557600080fd5b61204e83611ff4565b915061205c60208401611ff4565b90509250929050565b60008060006060848603121561207a57600080fd5b61208384611ff4565b925061209160208501611ff4565b9150604084013590509250925092565b600080600080608085870312156120b757600080fd5b6120c085611ff4565b93506120ce60208601611ff4565b925060408501359150606085013567ffffffffffffffff8111156120f157600080fd5b8501601f8101871361210257600080fd5b61211187823560208401611f60565b91505092959194509250565b6000806040838503121561213057600080fd5b61213983611ff4565b91506020830135801515811461214e57600080fd5b809150509250929050565b6000806040838503121561216c57600080fd5b61217583611ff4565b946020939093013593505050565b60006020828403121561219557600080fd5b813561202b816125ea565b6000602082840312156121b257600080fd5b815161202b816125ea565b6000602082840312156121cf57600080fd5b813567ffffffffffffffff8111156121e657600080fd5b8201601f810184136121f757600080fd5b61148e84823560208401611f60565b60006020828403121561221857600080fd5b5035919050565b60008151808452612237816020860160208601612432565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815161227b818560208601612432565b9290920192915050565b600080845481600182811c9150808316806122a157607f831692505b60208084108214156122da577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156122ee576001811461231d5761234a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061234a565b60008b81526020902060005b868110156123425781548b820152908501908301612329565b505084890196505b50505050505061235a8185612269565b95945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612395608083018461221f565b9695505050505050565b60208152600061202b602083018461221f565b600082198211156123c5576123c56124ff565b500190565b6000826123d9576123d961252e565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612416576124166124ff565b500290565b60008282101561242d5761242d6124ff565b500390565b60005b8381101561244d578181015183820152602001612435565b838111156111035750506000910152565b600181811c9082168061247257607f821691505b602082108114156124ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156124e4576124e46124ff565b5060010190565b6000826124fa576124fa61252e565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461121c57600080fdfea264697066735822122087506e6e68cfbea61fb27bd9a2a4bbd1e57e07bc5f6d49ae3d92ede1d5b17d4c64736f6c63430008060033

Deployed Bytecode Sourcemap

39169:1580:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33021:224;;;;;;;;;;-1:-1:-1;33021:224:0;;;;;:::i;:::-;;:::i;:::-;;;6842:14:1;;6835:22;6817:41;;6805:2;6790:18;33021:224:0;;;;;;;;21230:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22789:221::-;;;;;;;;;;-1:-1:-1;22789:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6094:55:1;;;6076:74;;6064:2;6049:18;22789:221:0;6031:125:1;22312:411:0;;;;;;;;;;-1:-1:-1;22312:411:0;;;;;:::i;:::-;;:::i;:::-;;33661:113;;;;;;;;;;-1:-1:-1;33749:10:0;:17;33661:113;;;15605:25:1;;;15593:2;15578:18;33661:113:0;15560:76:1;23679:339:0;;;;;;;;;;-1:-1:-1;23679:339:0;;;;;:::i;:::-;;:::i;33329:256::-;;;;;;;;;;-1:-1:-1;33329:256:0;;;;;:::i;:::-;;:::i;40142:137::-;;;;;;;;;;;;;:::i;24089:185::-;;;;;;;;;;-1:-1:-1;24089:185:0;;;;;:::i;:::-;;:::i;39612:527::-;;;;;;:::i;:::-;;:::i;33851:233::-;;;;;;;;;;-1:-1:-1;33851:233:0;;;;;:::i;:::-;;:::i;40282:93::-;;;;;;;;;;-1:-1:-1;40282:93:0;;;;;:::i;:::-;;:::i;20924:239::-;;;;;;;;;;-1:-1:-1;20924:239:0;;;;;:::i;:::-;;:::i;39394:30::-;;;;;;;;;;-1:-1:-1;39394:30:0;;;;;;;;39254:74;;;;;;;;;;;;;:::i;20654:208::-;;;;;;;;;;-1:-1:-1;20654:208:0;;;;;:::i;:::-;;:::i;17464:94::-;;;;;;;;;;;;;:::i;40378:110::-;;;;;;;;;;;;;:::i;39332:45::-;;;;;;;;;;;;;;;;16813:87;;;;;;;;;;-1:-1:-1;16886:6:0;;-1:-1:-1;;;;;16886:6:0;16813:87;;21399:104;;;;;;;;;;;;;:::i;23082:295::-;;;;;;;;;;-1:-1:-1;23082:295:0;;;;;:::i;:::-;;:::i;24345:328::-;;;;;;;;;;-1:-1:-1;24345:328:0;;;;;:::i;:::-;;:::i;40491:158::-;;;;;;;;;;-1:-1:-1;40491:158:0;;;;;:::i;:::-;;:::i;23448:164::-;;;;;;;;;;-1:-1:-1;23448:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23569:25:0;;;23545:4;23569:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23448:164;17713:192;;;;;;;;;;-1:-1:-1;17713:192:0;;;;;:::i;:::-;;:::i;33021:224::-;33123:4;33147:50;;;33162:35;33147:50;;:90;;;33201:36;33225:11;33201:23;:36::i;:::-;33140:97;33021:224;-1:-1:-1;;33021:224:0:o;21230:100::-;21284:13;21317:5;21310:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21230:100;:::o;22789:221::-;22865:7;26272:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26272:16:0;22885:73;;;;-1:-1:-1;;;22885:73:0;;12841:2:1;22885:73:0;;;12823:21:1;12880:2;12860:18;;;12853:30;12919:34;12899:18;;;12892:62;12990:14;12970:18;;;12963:42;13022:19;;22885:73:0;;;;;;;;;-1:-1:-1;22978:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22978:24:0;;22789:221::o;22312:411::-;22393:13;22409:23;22424:7;22409:14;:23::i;:::-;22393:39;;22457:5;-1:-1:-1;;;;;22451:11:0;:2;-1:-1:-1;;;;;22451:11:0;;;22443:57;;;;-1:-1:-1;;;22443:57:0;;14025:2:1;22443:57:0;;;14007:21:1;14064:2;14044:18;;;14037:30;14103:34;14083:18;;;14076:62;14174:3;14154:18;;;14147:31;14195:19;;22443:57:0;13997:223:1;22443:57:0;3184:10;-1:-1:-1;;;;;22535:21:0;;;;:62;;-1:-1:-1;22560:37:0;22577:5;3184:10;23448:164;:::i;22560:37::-;22513:168;;;;-1:-1:-1;;;22513:168:0;;10824:2:1;22513:168:0;;;10806:21:1;10863:2;10843:18;;;10836:30;10902:34;10882:18;;;10875:62;10973:26;10953:18;;;10946:54;11017:19;;22513:168:0;10796:246:1;22513:168:0;22694:21;22703:2;22707:7;22694:8;:21::i;:::-;22382:341;22312:411;;:::o;23679:339::-;23874:41;3184:10;23907:7;23874:18;:41::i;:::-;23866:103;;;;-1:-1:-1;;;23866:103:0;;14830:2:1;23866:103:0;;;14812:21:1;14869:2;14849:18;;;14842:30;14908:34;14888:18;;;14881:62;14979:19;14959:18;;;14952:47;15016:19;;23866:103:0;14802:239:1;23866:103:0;23982:28;23992:4;23998:2;24002:7;23982:9;:28::i;33329:256::-;33426:7;33462:23;33479:5;33462:16;:23::i;:::-;33454:5;:31;33446:87;;;;-1:-1:-1;;;33446:87:0;;7295:2:1;33446:87:0;;;7277:21:1;7334:2;7314:18;;;7307:30;7373:34;7353:18;;;7346:62;7444:13;7424:18;;;7417:41;7475:19;;33446:87:0;7267:233:1;33446:87:0;-1:-1:-1;;;;;;33551:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;33329:256::o;40142:137::-;16886:6;;-1:-1:-1;;;;;16886:6:0;3184:10;17033:23;17025:68;;;;-1:-1:-1;;;17025:68:0;;13254:2:1;17025:68:0;;;13236:21:1;;;13273:18;;;13266:30;13332:34;13312:18;;;13305:62;13384:18;;17025:68:0;13226:182:1;17025:68:0;40230:44:::1;::::0;40202:23:::1;::::0;3184:10;;40230:44;::::1;;;::::0;40202:23;;40230:44:::1;::::0;;;40202:23;3184:10;40230:44;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;40181:98;40142:137::o:0;24089:185::-;24227:39;24244:4;24250:2;24254:7;24227:39;;;;;;;;;;;;:16;:39::i;39612:527::-;39668:16;39687:13;33749:10;:17;;33661:113;39687:13;39714:10;;39668:32;;-1:-1:-1;39714:10:0;;39705:59;;;;-1:-1:-1;;;39705:59:0;;14427:2:1;39705:59:0;;;14409:21:1;14466:2;14446:18;;;14439:30;14505:34;14485:18;;;14478:62;14576:4;14556:18;;;14549:32;14598:19;;39705:59:0;14399:224:1;39705:59:0;39790:2;39778:9;:14;39769:62;;;;-1:-1:-1;;;39769:62:0;;10422:2:1;39769:62:0;;;10404:21:1;10461:2;10441:18;;;10434:30;10500:34;10480:18;;;10473:62;10571:3;10551:18;;;10544:31;10592:19;;39769:62:0;10394:223:1;39769:62:0;39871:5;39845:23;39859:9;39845:11;:23;:::i;:::-;:31;39836:86;;;;-1:-1:-1;;;39836:86:0;;12431:2:1;39836:86:0;;;12413:21:1;12470:2;12450:18;;;12443:30;12509:34;12489:18;;;12482:62;12580:11;12560:18;;;12553:39;12609:19;;39836:86:0;12403:231:1;39836:86:0;39962:9;39949:10;;:22;;;;:::i;:::-;39936:9;:35;;39927:81;;;;-1:-1:-1;;;39927:81:0;;9649:2:1;39927:81:0;;;9631:21:1;9688:2;9668:18;;;9661:30;9727:33;9707:18;;;9700:61;9778:18;;39927:81:0;9621:181:1;39927:81:0;40018:6;40013:122;40034:9;40030:1;:13;40013:122;;;40057:14;40074:15;40088:1;40074:11;:15;:::i;:::-;40057:32;;40095:34;40106:10;40118:9;40095;:34::i;:::-;-1:-1:-1;40045:3:0;;;;:::i;:::-;;;;40013:122;;33851:233;33926:7;33962:30;33749:10;:17;;33661:113;33962:30;33954:5;:38;33946:95;;;;-1:-1:-1;;;33946:95:0;;15248:2:1;33946:95:0;;;15230:21:1;15287:2;15267:18;;;15260:30;15326:34;15306:18;;;15299:62;15397:14;15377:18;;;15370:42;15429:19;;33946:95:0;15220:234:1;33946:95:0;34059:10;34070:5;34059:17;;;;;;;;:::i;:::-;;;;;;;;;34052:24;;33851:233;;;:::o;40282:93::-;16886:6;;-1:-1:-1;;;;;16886:6:0;3184:10;17033:23;17025:68;;;;-1:-1:-1;;;17025:68:0;;13254:2:1;17025:68:0;;;13236:21:1;;;13273:18;;;13266:30;13332:34;13312:18;;;13305:62;13384:18;;17025:68:0;13226:182:1;17025:68:0;40352:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;20924:239::-:0;20996:7;21032:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21032:16:0;21067:19;21059:73;;;;-1:-1:-1;;;21059:73:0;;11660:2:1;21059:73:0;;;11642:21:1;11699:2;11679:18;;;11672:30;11738:34;11718:18;;;11711:62;11809:11;11789:18;;;11782:39;11838:19;;21059:73:0;11632:231:1;39254:74:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20654:208::-;20726:7;-1:-1:-1;;;;;20754:19:0;;20746:74;;;;-1:-1:-1;;;20746:74:0;;11249:2:1;20746:74:0;;;11231:21:1;11288:2;11268:18;;;11261:30;11327:34;11307:18;;;11300:62;11398:12;11378:18;;;11371:40;11428:19;;20746:74:0;11221:232:1;20746:74:0;-1:-1:-1;;;;;;20838:16:0;;;;;:9;:16;;;;;;;20654:208::o;17464:94::-;16886:6;;-1:-1:-1;;;;;16886:6:0;3184:10;17033:23;17025:68;;;;-1:-1:-1;;;17025:68:0;;13254:2:1;17025:68:0;;;13236:21:1;;;13273:18;;;13266:30;13332:34;13312:18;;;13305:62;13384:18;;17025:68:0;13226:182:1;17025:68:0;17529:21:::1;17547:1;17529:9;:21::i;:::-;17464:94::o:0;40378:110::-;16886:6;;-1:-1:-1;;;;;16886:6:0;3184:10;17033:23;17025:68;;;;-1:-1:-1;;;17025:68:0;;13254:2:1;17025:68:0;;;13236:21:1;;;13273:18;;;13266:30;13332:34;13312:18;;;13305:62;13384:18;;17025:68:0;13226:182:1;17025:68:0;40437:10:::1;::::0;;::::1;::::0;;::::1;40436:11;40423:24:::0;;;::::1;::::0;::::1;::::0;;;40459::::1;::::0;40472:10;;6842:14:1;6835:22;6817:41;;40459:24:0::1;::::0;6805:2:1;6790:18;40459:24:0::1;;;;;;;40378:110::o:0;21399:104::-;21455:13;21488:7;21481:14;;;;;:::i;23082:295::-;-1:-1:-1;;;;;23185:24:0;;3184:10;23185:24;;23177:62;;;;-1:-1:-1;;;23177:62:0;;9295:2:1;23177:62:0;;;9277:21:1;9334:2;9314:18;;;9307:30;9373:27;9353:18;;;9346:55;9418:18;;23177:62:0;9267:175:1;23177:62:0;3184:10;23252:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23252:42:0;;;;;;;;;;;;:53;;;;;;;;;;;;;23321:48;;6817:41:1;;;23252:42:0;;3184:10;23321:48;;6790:18:1;23321:48:0;;;;;;;23082:295;;:::o;24345:328::-;24520:41;3184:10;24553:7;24520:18;:41::i;:::-;24512:103;;;;-1:-1:-1;;;24512:103:0;;14830:2:1;24512:103:0;;;14812:21:1;14869:2;14849:18;;;14842:30;14908:34;14888:18;;;14881:62;14979:19;14959:18;;;14952:47;15016:19;;24512:103:0;14802:239:1;24512:103:0;24626:39;24640:4;24646:2;24650:7;24659:5;24626:13;:39::i;:::-;24345:328;;;;:::o;40491:158::-;40559:13;40613:7;40622:18;:7;:16;:18::i;:::-;40595:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40580:64;;40491:158;;;:::o;17713:192::-;16886:6;;-1:-1:-1;;;;;16886:6:0;3184:10;17033:23;17025:68;;;;-1:-1:-1;;;17025:68:0;;13254:2:1;17025:68:0;;;13236:21:1;;;13273:18;;;13266:30;13332:34;13312:18;;;13305:62;13384:18;;17025:68:0;13226:182:1;17025:68:0;-1:-1:-1;;;;;17802:22:0;::::1;17794:73;;;::::0;-1:-1:-1;;;17794:73:0;;8126:2:1;17794:73:0::1;::::0;::::1;8108:21:1::0;8165:2;8145:18;;;8138:30;8204:34;8184:18;;;8177:62;8275:8;8255:18;;;8248:36;8301:19;;17794:73:0::1;8098:228:1::0;17794:73:0::1;17878:19;17888:8;17878:9;:19::i;:::-;17713:192:::0;:::o;3928:387::-;4251:20;4299:8;;;3928:387::o;20285:305::-;20387:4;20424:40;;;20439:25;20424:40;;:105;;-1:-1:-1;20481:48:0;;;20496:33;20481:48;20424:105;:158;;;-1:-1:-1;16370:25:0;16355:40;;;;20546:36;16246:157;30165:174;30240:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;30240:29:0;;;;;;;;:24;;30294:23;30240:24;30294:14;:23::i;:::-;-1:-1:-1;;;;;30285:46:0;;;;;;;;;;;30165:174;;:::o;26477:348::-;26570:4;26272:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26272:16:0;26587:73;;;;-1:-1:-1;;;26587:73:0;;10009:2:1;26587:73:0;;;9991:21:1;10048:2;10028:18;;;10021:30;10087:34;10067:18;;;10060:62;10158:14;10138:18;;;10131:42;10190:19;;26587:73:0;9981:234:1;26587:73:0;26671:13;26687:23;26702:7;26687:14;:23::i;:::-;26671:39;;26740:5;-1:-1:-1;;;;;26729:16:0;:7;-1:-1:-1;;;;;26729:16:0;;:51;;;;26773:7;-1:-1:-1;;;;;26749:31:0;:20;26761:7;26749:11;:20::i;:::-;-1:-1:-1;;;;;26749:31:0;;26729:51;:87;;;-1:-1:-1;;;;;;23569:25:0;;;23545:4;23569:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26784:32;26721:96;26477:348;-1:-1:-1;;;;26477:348:0:o;29469:578::-;29628:4;-1:-1:-1;;;;;29601:31:0;:23;29616:7;29601:14;:23::i;:::-;-1:-1:-1;;;;;29601:31:0;;29593:85;;;;-1:-1:-1;;;29593:85:0;;13615:2:1;29593:85:0;;;13597:21:1;13654:2;13634:18;;;13627:30;13693:34;13673:18;;;13666:62;13764:11;13744:18;;;13737:39;13793:19;;29593:85:0;13587:231:1;29593:85:0;-1:-1:-1;;;;;29697:16:0;;29689:65;;;;-1:-1:-1;;;29689:65:0;;8890:2:1;29689:65:0;;;8872:21:1;8929:2;8909:18;;;8902:30;8968:34;8948:18;;;8941:62;9039:6;9019:18;;;9012:34;9063:19;;29689:65:0;8862:226:1;29689:65:0;29767:39;29788:4;29794:2;29798:7;29767:20;:39::i;:::-;29871:29;29888:1;29892:7;29871:8;:29::i;:::-;-1:-1:-1;;;;;29913:15:0;;;;;;:9;:15;;;;;:20;;29932:1;;29913:15;:20;;29932:1;;29913:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29944:13:0;;;;;;:9;:13;;;;;:18;;29961:1;;29944:13;:18;;29961:1;;29944:18;:::i;:::-;;;;-1:-1:-1;;29973:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;29973:21:0;;;;;;;;;30012:27;;29973:16;;30012:27;;;;;;;29469:578;;;:::o;27167:110::-;27243:26;27253:2;27257:7;27243:26;;;;;;;;;;;;:9;:26::i;17913:173::-;17988:6;;;-1:-1:-1;;;;;18005:17:0;;;;;;;;;;;18038:40;;17988:6;;;18005:17;17988:6;;18038:40;;17969:16;;18038:40;17958:128;17913:173;:::o;25555:315::-;25712:28;25722:4;25728:2;25732:7;25712:9;:28::i;:::-;25759:48;25782:4;25788:2;25792:7;25801:5;25759:22;:48::i;:::-;25751:111;;;;-1:-1:-1;;;25751:111:0;;7707:2:1;25751:111:0;;;7689:21:1;7746:2;7726:18;;;7719:30;7785:34;7765:18;;;7758:62;7856:20;7836:18;;;7829:48;7894:19;;25751:111:0;7679:240:1;1312:723:0;1368:13;1589:10;1585:53;;-1:-1:-1;;1616:10:0;;;;;;;;;;;;;;;;;;1312:723::o;1585:53::-;1663:5;1648:12;1704:78;1711:9;;1704:78;;1737:8;;;;:::i;:::-;;-1:-1:-1;1760:10:0;;-1:-1:-1;1768:2:0;1760:10;;:::i;:::-;;;1704:78;;;1792:19;1824:6;1814:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1814:17:0;;1792:39;;1842:154;1849:10;;1842:154;;1876:11;1886:1;1876:11;;:::i;:::-;;-1:-1:-1;1945:10:0;1953:2;1945:5;:10;:::i;:::-;1932:24;;:2;:24;:::i;:::-;1919:39;;1902:6;1909;1902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1973:11:0;1982:2;1973:11;;:::i;:::-;;;1842:154;;34697:589;-1:-1:-1;;;;;34903:18:0;;34899:187;;34938:40;34970:7;36113:10;:17;;36086:24;;;;:15;:24;;;;;:44;;;36141:24;;;;;;;;;;;;36009:164;34938:40;34899:187;;;35008:2;-1:-1:-1;;;;;35000:10:0;:4;-1:-1:-1;;;;;35000:10:0;;34996:90;;35027:47;35060:4;35066:7;35027:32;:47::i;:::-;-1:-1:-1;;;;;35100:16:0;;35096:183;;35133:45;35170:7;35133:36;:45::i;35096:183::-;35206:4;-1:-1:-1;;;;;35200:10:0;:2;-1:-1:-1;;;;;35200:10:0;;35196:83;;35227:40;35255:2;35259:7;35227:27;:40::i;27504:321::-;27634:18;27640:2;27644:7;27634:5;:18::i;:::-;27685:54;27716:1;27720:2;27724:7;27733:5;27685:22;:54::i;:::-;27663:154;;;;-1:-1:-1;;;27663:154:0;;7707:2:1;27663:154:0;;;7689:21:1;7746:2;7726:18;;;7719:30;7785:34;7765:18;;;7758:62;7856:20;7836:18;;;7829:48;7894:19;;27663:154:0;7679:240:1;30904:803:0;31059:4;-1:-1:-1;;;;;31080:13:0;;4251:20;4299:8;31076:624;;31116:72;;;;;-1:-1:-1;;;;;31116:36:0;;;;;:72;;3184:10;;31167:4;;31173:7;;31182:5;;31116:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31116:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31112:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31362:13:0;;31358:272;;31405:60;;-1:-1:-1;;;31405:60:0;;7707:2:1;31405:60:0;;;7689:21:1;7746:2;7726:18;;;7719:30;7785:34;7765:18;;;7758:62;7856:20;7836:18;;;7829:48;7894:19;;31405:60:0;7679:240:1;31358:272:0;31580:6;31574:13;31565:6;31561:2;31557:15;31550:38;31112:533;31239:55;;31249:45;31239:55;;-1:-1:-1;31232:62:0;;31076:624;-1:-1:-1;31684:4:0;30904:803;;;;;;:::o;36800:988::-;37066:22;37116:1;37091:22;37108:4;37091:16;:22::i;:::-;:26;;;;:::i;:::-;37128:18;37149:26;;;:17;:26;;;;;;37066:51;;-1:-1:-1;37282:28:0;;;37278:328;;-1:-1:-1;;;;;37349:18:0;;37327:19;37349:18;;;:12;:18;;;;;;;;:34;;;;;;;;;37400:30;;;;;;:44;;;37517:30;;:17;:30;;;;;:43;;;37278:328;-1:-1:-1;37702:26:0;;;;:17;:26;;;;;;;;37695:33;;;-1:-1:-1;;;;;37746:18:0;;;;;:12;:18;;;;;:34;;;;;;;37739:41;36800:988::o;38083:1079::-;38361:10;:17;38336:22;;38361:21;;38381:1;;38361:21;:::i;:::-;38393:18;38414:24;;;:15;:24;;;;;;38787:10;:26;;38336:46;;-1:-1:-1;38414:24:0;;38336:46;;38787:26;;;;;;:::i;:::-;;;;;;;;;38765:48;;38851:11;38826:10;38837;38826:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;38931:28;;;:15;:28;;;;;;;:41;;;39103:24;;;;;39096:31;39138:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;38154:1008;;;38083:1079;:::o;35587:221::-;35672:14;35689:20;35706:2;35689:16;:20::i;:::-;-1:-1:-1;;;;;35720:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;35765:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;35587:221:0:o;28161:382::-;-1:-1:-1;;;;;28241:16:0;;28233:61;;;;-1:-1:-1;;;28233:61:0;;12070:2:1;28233:61:0;;;12052:21:1;;;12089:18;;;12082:30;12148:34;12128:18;;;12121:62;12200:18;;28233:61:0;12042:182:1;28233:61:0;26248:4;26272:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26272:16:0;:30;28305:58;;;;-1:-1:-1;;;28305:58:0;;8533:2:1;28305:58:0;;;8515:21:1;8572:2;8552:18;;;8545:30;8611;8591:18;;;8584:58;8659:18;;28305:58:0;8505:178:1;28305:58:0;28376:45;28405:1;28409:2;28413:7;28376:20;:45::i;:::-;-1:-1:-1;;;;;28434:13:0;;;;;;:9;:13;;;;;:18;;28451:1;;28434:13;:18;;28451:1;;28434:18;:::i;:::-;;;;-1:-1:-1;;28463:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;28463:21:0;;;;;;;;28502:33;;28463:16;;;28502:33;;28463:16;;28502:33;28161:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:690:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;289:2;283:9;355:2;343:15;;194:66;339:24;;;365:2;335:33;331:42;319:55;;;389:18;;;409:22;;;386:46;383:2;;;435:18;;:::i;:::-;475:10;471:2;464:22;504:6;495:15;;534:6;526;519:22;574:3;565:6;560:3;556:16;553:25;550:2;;;591:1;588;581:12;550:2;641:6;636:3;629:4;621:6;617:17;604:44;696:1;689:4;680:6;672;668:19;664:30;657:41;;;;88:616;;;;;:::o;709:196::-;777:20;;-1:-1:-1;;;;;826:54:1;;816:65;;806:2;;895:1;892;885:12;806:2;758:147;;;:::o;910:186::-;969:6;1022:2;1010:9;1001:7;997:23;993:32;990:2;;;1038:1;1035;1028:12;990:2;1061:29;1080:9;1061:29;:::i;:::-;1051:39;980:116;-1:-1:-1;;;980:116:1:o;1101:260::-;1169:6;1177;1230:2;1218:9;1209:7;1205:23;1201:32;1198:2;;;1246:1;1243;1236:12;1198:2;1269:29;1288:9;1269:29;:::i;:::-;1259:39;;1317:38;1351:2;1340:9;1336:18;1317:38;:::i;:::-;1307:48;;1188:173;;;;;:::o;1366:328::-;1443:6;1451;1459;1512:2;1500:9;1491:7;1487:23;1483:32;1480:2;;;1528:1;1525;1518:12;1480:2;1551:29;1570:9;1551:29;:::i;:::-;1541:39;;1599:38;1633:2;1622:9;1618:18;1599:38;:::i;:::-;1589:48;;1684:2;1673:9;1669:18;1656:32;1646:42;;1470:224;;;;;:::o;1699:666::-;1794:6;1802;1810;1818;1871:3;1859:9;1850:7;1846:23;1842:33;1839:2;;;1888:1;1885;1878:12;1839:2;1911:29;1930:9;1911:29;:::i;:::-;1901:39;;1959:38;1993:2;1982:9;1978:18;1959:38;:::i;:::-;1949:48;;2044:2;2033:9;2029:18;2016:32;2006:42;;2099:2;2088:9;2084:18;2071:32;2126:18;2118:6;2115:30;2112:2;;;2158:1;2155;2148:12;2112:2;2181:22;;2234:4;2226:13;;2222:27;-1:-1:-1;2212:2:1;;2263:1;2260;2253:12;2212:2;2286:73;2351:7;2346:2;2333:16;2328:2;2324;2320:11;2286:73;:::i;:::-;2276:83;;;1829:536;;;;;;;:::o;2370:347::-;2435:6;2443;2496:2;2484:9;2475:7;2471:23;2467:32;2464:2;;;2512:1;2509;2502:12;2464:2;2535:29;2554:9;2535:29;:::i;:::-;2525:39;;2614:2;2603:9;2599:18;2586:32;2661:5;2654:13;2647:21;2640:5;2637:32;2627:2;;2683:1;2680;2673:12;2627:2;2706:5;2696:15;;;2454:263;;;;;:::o;2722:254::-;2790:6;2798;2851:2;2839:9;2830:7;2826:23;2822:32;2819:2;;;2867:1;2864;2857:12;2819:2;2890:29;2909:9;2890:29;:::i;:::-;2880:39;2966:2;2951:18;;;;2938:32;;-1:-1:-1;;;2809:167:1:o;2981:245::-;3039:6;3092:2;3080:9;3071:7;3067:23;3063:32;3060:2;;;3108:1;3105;3098:12;3060:2;3147:9;3134:23;3166:30;3190:5;3166:30;:::i;3231:249::-;3300:6;3353:2;3341:9;3332:7;3328:23;3324:32;3321:2;;;3369:1;3366;3359:12;3321:2;3401:9;3395:16;3420:30;3444:5;3420:30;:::i;3485:450::-;3554:6;3607:2;3595:9;3586:7;3582:23;3578:32;3575:2;;;3623:1;3620;3613:12;3575:2;3663:9;3650:23;3696:18;3688:6;3685:30;3682:2;;;3728:1;3725;3718:12;3682:2;3751:22;;3804:4;3796:13;;3792:27;-1:-1:-1;3782:2:1;;3833:1;3830;3823:12;3782:2;3856:73;3921:7;3916:2;3903:16;3898:2;3894;3890:11;3856:73;:::i;3940:180::-;3999:6;4052:2;4040:9;4031:7;4027:23;4023:32;4020:2;;;4068:1;4065;4058:12;4020:2;-1:-1:-1;4091:23:1;;4010:110;-1:-1:-1;4010:110:1:o;4125:316::-;4166:3;4204:5;4198:12;4231:6;4226:3;4219:19;4247:63;4303:6;4296:4;4291:3;4287:14;4280:4;4273:5;4269:16;4247:63;:::i;:::-;4355:2;4343:15;4360:66;4339:88;4330:98;;;;4430:4;4326:109;;4174:267;-1:-1:-1;;4174:267:1:o;4446:185::-;4488:3;4526:5;4520:12;4541:52;4586:6;4581:3;4574:4;4567:5;4563:16;4541:52;:::i;:::-;4609:16;;;;;4496:135;-1:-1:-1;;4496:135:1:o;4636:1289::-;4812:3;4841:1;4874:6;4868:13;4904:3;4926:1;4954:9;4950:2;4946:18;4936:28;;5014:2;5003:9;4999:18;5036;5026:2;;5080:4;5072:6;5068:17;5058:27;;5026:2;5106;5154;5146:6;5143:14;5123:18;5120:38;5117:2;;;5193:77;5188:3;5181:90;5294:4;5291:1;5284:15;5324:4;5319:3;5312:17;5117:2;5355:18;5382:162;;;;5558:1;5553:320;;;;5348:525;;5382:162;5430:66;5419:9;5415:82;5410:3;5403:95;5527:6;5522:3;5518:16;5511:23;;5382:162;;5553:320;15714:1;15707:14;;;15751:4;15738:18;;5648:1;5662:165;5676:6;5673:1;5670:13;5662:165;;;5754:14;;5741:11;;;5734:35;5797:16;;;;5691:10;;5662:165;;;5666:3;;5856:6;5851:3;5847:16;5840:23;;5348:525;;;;;;;5889:30;5915:3;5907:6;5889:30;:::i;:::-;5882:37;4820:1105;-1:-1:-1;;;;;4820:1105:1:o;6161:511::-;6355:4;-1:-1:-1;;;;;6465:2:1;6457:6;6453:15;6442:9;6435:34;6517:2;6509:6;6505:15;6500:2;6489:9;6485:18;6478:43;;6557:6;6552:2;6541:9;6537:18;6530:34;6600:3;6595:2;6584:9;6580:18;6573:31;6621:45;6661:3;6650:9;6646:19;6638:6;6621:45;:::i;:::-;6613:53;6364:308;-1:-1:-1;;;;;;6364:308:1:o;6869:219::-;7018:2;7007:9;7000:21;6981:4;7038:44;7078:2;7067:9;7063:18;7055:6;7038:44;:::i;15767:128::-;15807:3;15838:1;15834:6;15831:1;15828:13;15825:2;;;15844:18;;:::i;:::-;-1:-1:-1;15880:9:1;;15815:80::o;15900:120::-;15940:1;15966;15956:2;;15971:18;;:::i;:::-;-1:-1:-1;16005:9:1;;15946:74::o;16025:228::-;16065:7;16191:1;16123:66;16119:74;16116:1;16113:81;16108:1;16101:9;16094:17;16090:105;16087:2;;;16198:18;;:::i;:::-;-1:-1:-1;16238:9:1;;16077:176::o;16258:125::-;16298:4;16326:1;16323;16320:8;16317:2;;;16331:18;;:::i;:::-;-1:-1:-1;16368:9:1;;16307:76::o;16388:258::-;16460:1;16470:113;16484:6;16481:1;16478:13;16470:113;;;16560:11;;;16554:18;16541:11;;;16534:39;16506:2;16499:10;16470:113;;;16601:6;16598:1;16595:13;16592:2;;;-1:-1:-1;;16636:1:1;16618:16;;16611:27;16441:205::o;16651:437::-;16730:1;16726:12;;;;16773;;;16794:2;;16848:4;16840:6;16836:17;16826:27;;16794:2;16901;16893:6;16890:14;16870:18;16867:38;16864:2;;;16938:77;16935:1;16928:88;17039:4;17036:1;17029:15;17067:4;17064:1;17057:15;16864:2;;16706:382;;;:::o;17093:195::-;17132:3;17163:66;17156:5;17153:77;17150:2;;;17233:18;;:::i;:::-;-1:-1:-1;17280:1:1;17269:13;;17140:148::o;17293:112::-;17325:1;17351;17341:2;;17356:18;;:::i;:::-;-1:-1:-1;17390:9:1;;17331:74::o;17410:184::-;17462:77;17459:1;17452:88;17559:4;17556:1;17549:15;17583:4;17580:1;17573:15;17599:184;17651:77;17648:1;17641:88;17748:4;17745:1;17738:15;17772:4;17769:1;17762:15;17788:184;17840:77;17837:1;17830:88;17937:4;17934:1;17927:15;17961:4;17958:1;17951:15;17977:184;18029:77;18026:1;18019:88;18126:4;18123:1;18116:15;18150:4;18147:1;18140:15;18166:184;18218:77;18215:1;18208:88;18315:4;18312:1;18305:15;18339:4;18336:1;18329:15;18355:177;18440:66;18433:5;18429:78;18422:5;18419:89;18409:2;;18522:1;18519;18512:12

Swarm Source

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