ETH Price: $2,936.42 (-6.21%)
Gas: 7 Gwei

Token

MetaHearts (MH)
 

Overview

Max Total Supply

500 MH

Holders

89

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 MH
0xd5c16e00f53599e619a0695084c56bad3a9bdb3a
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:
MetaHearts

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 15: MetaHeartsContract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./Strings.sol";
import "./IERC20.sol";

/** @dev Contract definition */
contract MetaHearts is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
    /** @dev Contract constructor. Defines mapping between index and atributes.*/
    constructor() ERC721("MetaHearts", "MH") {
        // TODO : To fill
        isWhitelisted[0x3058047bEDe41BA5e9B6f20B9eB30e538546dC56] = true;
        isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true;
        isWhitelisted[0x10f555351f49306828dF23194B9Bbf70f0323331] = true;
        isWhitelisted[0xa9166B04162F77813a02453e392766d0F860c8cF] = true;
        isWhitelisted[0x712ca5956D68A03F4F098791EDdD37E846422b32] = true;
        isWhitelisted[0xc0F6135e81A3bBB3e622d3899780374018EB2052] = true;
        isWhitelisted[0xD96B66ce05462f2EC8625311414D7da396d496a6] = true;
        isWhitelisted[0x470edAb50d941b2f88DaBB182b7C3cfF5d545810] = true;
        isWhitelisted[0x026a36cD623ADAcDc1676DcB3dC4A9D1f32208E2] = true;
        isWhitelisted[0xAf692770eb4600296B1e54a5C3da31e87759E989] = true;
        isWhitelisted[0x6888a5B9B0Fe41f0563895faE710d7EB1F36e64f] = true;
        isWhitelisted[0x930CC2D3B9EfACd0dE50d5353b2b466cebF33B35] = true;
        isWhitelisted[0xF2bf6e03A38199EFbFd8Ef2F169d601db90b244A] = true;
        isWhitelisted[0xe9ab2d53B08647A971B517c8d1B162B0a1E10669] = true;
        isWhitelisted[0x4840a335f717E9c5bD1B2BeFabED6587955546dc] = true;
        isWhitelisted[0x08E50b0aeAC4A4e54876E487A63CCf3f7b8a455F] = true;
        isWhitelisted[0xaEA6ba18620b9F93CEAb77DC5Fb56250444bCb98] = true;
        isWhitelisted[0x755f1A2130A5Fb4874A3dE207C6876f8dE1532Ee] = true;
        isWhitelisted[0xA10D517D591268017c24a4caAB300e9471A8FcaB] = true;
        isWhitelisted[0x379de6aB1E1c06F39F979888FD7dedf9dD1b717e] = true;
        isWhitelisted[0x541b79b200B40D37F91663e40Ca0B05512d0EB05] = true;
        isWhitelisted[0x869E98C25496fc27D235E9Fb547D634171F553E9] = true;
        isWhitelisted[0xfdD0b3f5aA26Cf75f0618689D0f27698Ea1F97F1] = true;
        isWhitelisted[0x9EC03728708423E6F75Eb1502447F7C554d88106] = true;
        isWhitelisted[0x1A67C63582EcD79C4e76177B356C8BEb83fb5685] = true;
        isWhitelisted[0xf997A2687cd52D6Db8885c280C70Fcf7986185f8] = true;
        isWhitelisted[0xD9a28293d20885135251e0eE54111728c28210e7] = true;
        isWhitelisted[0xC3df326A2d3aa5f45147bc61EDFd00cBd4Ab2Fd3] = true;
        isWhitelisted[0xa9166B04162F77813a02453e392766d0F860c8cF] = true;
        isWhitelisted[0x4D80A9C3D75Aa199e41d1781BCE4483be4F2AE31] = true;
        isWhitelisted[0xECb934E87Fb5797b6cD0B9B7dE3B4f9ceafdDe1a] = true;
        isWhitelisted[0x923fbc6B5ba1014cA771E857f8FAA941a51805D7] = true;
        isWhitelisted[0xeB8B45591C6F27299224D1620A85C3D696b7B944] = true;
        isWhitelisted[0x77C56524748bF3F31d7F77C650B10C0964eD99fB] = true;
        isWhitelisted[0x2Ec0161bB50e3c1eB30C1f1Cbf7d95F3083D54b2] = true;
        isWhitelisted[0xE4A46E1e5173a92BBf69c55a1A9B0517ae1a7115] = true;
        isWhitelisted[0x1C732Fb3DCD22d592738106c41f7A3A3Bd45d24C] = true;
        isWhitelisted[0xd5145D7b5186811F134E47830139236f7153Da5B] = true;
        isWhitelisted[0x0E373D1B219c8473B72287B23B36d8b6e43AD72a] = true;
        isWhitelisted[0xE47E168364aD555f74221f61682dA762c7F889dD] = true;
        isWhitelisted[0x098132A7fd334C1877a9563FFD2547eE8bFdBf26] = true;
        isWhitelisted[0x8eb9202CB8608D251e4Ac6683513FF1501AC749B] = true;
        isWhitelisted[0x7Ccd2c8f803Ddf8392aB66FfF7F4B42f9FeD035a] = true;
        isWhitelisted[0x9C19D1e78A4b5b00BC6eE1eD5225352A4a791469] = true;
        isWhitelisted[0xC2adcd1d98fAa880550381A509C741B98406039d] = true;
        isWhitelisted[0xD068f872CFC6B59321a86f5b4727d478FFb02a65] = true;
        isWhitelisted[0x078Be78d01aF868Fcf77eD611aF01b4a3710d428] = true;
        isWhitelisted[0x470edAb50d941b2f88DaBB182b7C3cfF5d545810] = true;
        isWhitelisted[0x6afD748A870B14Ba9000088090f8cb3Ce407D8e3] = true;
        isWhitelisted[0x7C9c6a04342c11C827e87Ce116f06D22d50Aad1b] = true;
        isWhitelisted[0x88200537364161e43e585CC31eeb056F711cef9B] = true;
        isWhitelisted[0x9E5A44F6984D9b90a04dEAB5D24630b9B502cC56] = true;
        isWhitelisted[0xA7BF319D12eefC614CeBaEcde98d41d0335D38E2] = true;
        isWhitelisted[0xdb8A644a6A82bfC818b2014dD8312b1C9aB7Bf19] = true;
        isWhitelisted[0xd2D6a441C2C3E45D1C5213bac7c7da958e931C0E] = true;
        isWhitelisted[0xe8b78E0562D18ab7FeB427E6AC24ed49B4b61EEE] = true;
        isWhitelisted[0x21Ce3ac9162Def133a09582138804eD3A30bE16d] = true;
        isWhitelisted[0xf1bF0130b895F6ef500410CE8C29A9D662290Ebe] = true;
        isWhitelisted[0x2a723aDa4Bd50f9e6B3626ccafF6559c6770c2B5] = true;
        isWhitelisted[0xfdD0b3f5aA26Cf75f0618689D0f27698Ea1F97F1] = true;
        isWhitelisted[0x026a36cD623ADAcDc1676DcB3dC4A9D1f32208E2] = true;
        isWhitelisted[0x70896F42433c446F5D1a36adeB974A029203DE08] = true;
        isWhitelisted[0x03677337AdF578F781cECA288c2A0A0C7CeB5569] = true;
        isWhitelisted[0xE47E168364aD555f74221f61682dA762c7F889dD] = true;
        isWhitelisted[0x27eA3fb4834bdD57b9c6Bd84Eb20d623fb6AfeD5] = true;
        isWhitelisted[0x4735746DB491FA338F6410b6dAE929D5A9E8D7b5] = true;
        isWhitelisted[0x59Ae0e0c64f21f09cb8a1712E53cb25D0e17401C] = true;
        isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true;
        isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true;
        isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true;
        isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true;
        isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true;
        // TODO : To fill
        canMintForFree[0x3058047bEDe41BA5e9B6f20B9eB30e538546dC56] = true;
        canMintForFree[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true;
        canMintForFree[0xaF4A5dabb5d922B4CDAA5fDf2EdDABade6895f85] = true;
        canMintForFree[0x38E14301eB0cfc215b71Af4AE9DaF30ba16052bE] = true;
        canMintForFree[0xB53f5B02090e6474E6B36554aD2EcB279e5A6A2E] = true;
        canMintForFree[0x9976f235803bA233cCb5C3F54A47c5600f2a2353] = true;
        canMintForFree[0xb53c3ba1325128B347CEc5C8B4a57Db9A3f0e8D8] = true;
        canMintForFree[0x82d92424FE1a6E3fa3C706429BeAeB9Db9C5C5b0] = true;
        canMintForFree[0x24adF732C47DE85ca1E4584988307d92e7C0457c] = true;
        canMintForFree[0xD3214bcBf2178753f767E4A4aa29a9C2f37C0d94] = true;
        canMintForFree[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true;
        canMintForFree[0x04767EB4363cDb2fDF9C4c872459b8a4bb50689c] = true;
    }

    /** @dev Will be set to true when reveal is done.*/
    bool isRevealed = false;

    /** @dev Will be set to true when reveal is done.*/
    string beforeRevealMetadata = "";

    /** @dev Defines if an address is whitelisted.*/
    mapping(address => bool) isWhitelisted;

    /** @dev defines address that can mint for free.*/
    mapping(address => bool) canMintForFree;

    /** @dev Devs' addresses. Where token will be sent when withdraw is called.*/
    address payable[2] withdrawAddresses = [
        payable(0x3058047bEDe41BA5e9B6f20B9eB30e538546dC56),
        payable(0x0A2cEb457115fEbf127D6A1902361A2E30949aFd)
    ];

    /** @dev Devs' per thousand tokens sent when withdraw is called.*/
    uint16[2] private perThousandPerAddress = [900, 100];

    /** @dev Price for miniting one NFT, in wei.*/
    uint256 public publicPrice = 7e16;

    /** @dev Maximum miniting possible for public.*/
    uint256 public publicMaxMint = 10;
    uint256 public publicMaxOwned = 100;

    /** @dev Price for miniting one NFT, in wei.*/
    uint256 public whitelistPrice = 5e16;

    /** @dev Maximum miniting possible for whitelisted.*/
    uint256 public whitelistMaxMint = 5;
    uint256 public whitelistMaxOwned = 50;

    /** @dev Extension of base URI. Used to move metadata files if needed.*/
    string private _baseURIextended;

    /** @dev Max number of NFTs to mint.*/
    uint16 public NFTsLimit = 2500;

    /** @dev NFTs minted.*/
    uint16 public NFTsMinted = 0;

    /** @dev _beforeTokenTransfer must be overriden to make compiler happy.*/
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    /** @dev Changing baseUri to move metadata files and images if needed.*/
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }

    /** @dev Changing miniting price if needed.*/
    function setPublicPrice(uint256 newPrice) external onlyOwner {
        publicPrice = newPrice;
    }

    /** @dev Changing miniting price if needed.*/
    function setBeforeRevealMetadata(string memory metadata)
        external
        onlyOwner
    {
        beforeRevealMetadata = metadata;
    }

    /** @dev Changing miniting price if needed.*/
    function setWhitelistPrice(uint256 newPrice) external onlyOwner {
        whitelistPrice = newPrice;
    }

    /** @dev Override of _baseUri().*/
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        if (isRevealed) {
            return super.tokenURI(tokenId);
        }
        return beforeRevealMetadata;
    }

    /** @dev Override of supportsInterface().*/
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    /** @dev withdrawing tokens received from miniting price.*/
    function withdraw() public {
        uint256 balance = address(this).balance;
        uint256 remainingBalance = balance;
        for (uint8 i = 0; i < withdrawAddresses.length - 1; i++) {
            uint256 valueToTransfer = (perThousandPerAddress[i] * balance) /
                1000;
            withdrawAddresses[i].transfer(valueToTransfer);
            remainingBalance -= valueToTransfer;
        }
        withdrawAddresses[withdrawAddresses.length - 1].transfer(
            remainingBalance
        );
    }

    /** @dev withdrawing tokens of an IERC contract.*/
    function withdrawToken(address _tokenContract) public {
        IERC20 tokenContract = IERC20(_tokenContract);
        uint256 balance = tokenContract.balanceOf(address(this));
        uint256 remainingBalance = balance;
        require(remainingBalance > 0, "There is no token to withdraw.");
        for (uint8 i = 0; i < withdrawAddresses.length - 1; i++) {
            uint256 valueToTransfer = (perThousandPerAddress[i] * balance) /
                1000;
            tokenContract.transfer(withdrawAddresses[i], valueToTransfer);
            remainingBalance -= valueToTransfer;
        }
        tokenContract.transfer(
            withdrawAddresses[withdrawAddresses.length - 1],
            remainingBalance
        );
    }

    /** @dev Mint an NFT.*/
    function mint(uint16 numberToMint) public payable nonReentrant {
        require(
            numberToMint <= publicMaxMint,
            "You can't mint as much tokens at a time."
        );
        require(
            NFTsMinted + numberToMint <= NFTsLimit,
            "All NFTs have already been minted"
        );
        require(
            msg.value >= numberToMint * publicPrice,
            string(
                abi.encodePacked(
                    "You must send ",
                    Strings.toString(publicPrice),
                    " wei to mint a token."
                )
            )
        );
        require(
            balanceOf(msg.sender) + numberToMint <= publicMaxOwned,
            "You already have max tokens you can mint."
        );
        for (uint256 index = 0; index < numberToMint; index++) {
            NFTsMinted += 1;
            _safeMint(msg.sender, NFTsMinted);
        }
    }

    /** @dev Mint an NFT.*/
    function mintForFree(uint16 numberToMint) public nonReentrant {
        require(
            numberToMint <= whitelistMaxMint,
            "You can't mint as many tokens at a time."
        );
        require(
            NFTsMinted + numberToMint <= NFTsLimit,
            "All NFTs have already been minted."
        );
        require(
            balanceOf(msg.sender) + numberToMint <= whitelistMaxOwned,
            "You aready have more token than you can mint."
        );
        require(canMintForFree[msg.sender]);
        for (uint256 index = 0; index < numberToMint; index++) {
            NFTsMinted += 1;
            _safeMint(msg.sender, NFTsMinted);
        }
    }

    /** @dev Mint an NFT for whitelisted.*/
    function mintWhitelist(uint16 numberToMint) public payable nonReentrant {
        require(
            numberToMint <= whitelistMaxMint,
            "You can't mint as many tokens at a time."
        );
        require(
            NFTsMinted + numberToMint <= NFTsLimit,
            "All NFTs have already been minted."
        );
        require(isWhitelisted[msg.sender], "You're not whitelisted.");
        require(
            msg.value >= numberToMint * whitelistPrice,
            string(
                abi.encodePacked(
                    "You must send ",
                    Strings.toString(whitelistPrice),
                    " wei to mint a token."
                )
            )
        );
        require(
            balanceOf(msg.sender) + numberToMint <= whitelistMaxOwned,
            "You aready have more token than you can mint."
        );
        for (uint256 index = 0; index < numberToMint; index++) {
            NFTsMinted += 1;
            _safeMint(msg.sender, NFTsMinted);
        }
    }

    /** @dev add in whitelist.*/
    function addWhitelist(address toWhitelist) external onlyOwner {
        isWhitelisted[toWhitelist] = true;
    }

    /** @dev remove of whitelist.*/
    function removeWhitelist(address toWhitelist) external onlyOwner {
        isWhitelisted[toWhitelist] = false;
    }

    /** @dev add in mint for free.*/
    function addMintForFree(address toWhitelist) external onlyOwner {
        canMintForFree[toWhitelist] = true;
    }

    /** @dev remove of whitelist.*/
    function removeMintForFree(address toWhitelist) external onlyOwner {
        canMintForFree[toWhitelist] = false;
    }

    /** @dev reveal tokens by setting the correct baseURI.*/
    function revealNFTs() external onlyOwner {
        isRevealed = true;
    }
}

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 15: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 15: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden 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 {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 5 of 15: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 7 of 15: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 8 of 15: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 10 of 15: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 13 of 15: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 14 of 15: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NFTsLimit","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTsMinted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toWhitelist","type":"address"}],"name":"addMintForFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toWhitelist","type":"address"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint16","name":"numberToMint","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberToMint","type":"uint16"}],"name":"mintForFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberToMint","type":"uint16"}],"name":"mintWhitelist","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":"publicMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toWhitelist","type":"address"}],"name":"removeMintForFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toWhitelist","type":"address"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadata","type":"string"}],"name":"setBeforeRevealMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWhitelistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMaxOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600c805460ff1916905560a06040819052600060808190526200002591600d9162000d99565b5060408051808201909152733058047bede41ba5e9b6f20b9eb30e538546dc568152730a2ceb457115febf127d6a1902361a2e30949afd60208201526200007190601090600262000e28565b50604080518082019091526103848152606460208201526200009890601290600262000e73565b5066f8b0a10e470000601355600a601455606460155566b1a2bc2ec5000060165560056017556032601855601a805463ffffffff19166109c4179055348015620000e157600080fd5b50604080518082018252600a8152694d65746148656172747360b01b60208083019182528351808501909452600284526109a960f31b9084015281519192916200012e9160009162000d99565b5080516200014490600190602084019062000d99565b505050620001616200015b62000d4360201b60201c565b62000d47565b6001600b8190557f6eb261e821edd8c0ec4f75a61442da71689765ff48bbf268056744ccf5702da8805460ff1990811683179091557f418d38441e3f2bf2a18e40aeb915ebb133e6b3134151874d23ab91c122f836f280548216831790557ffb2486e164b083e711d8e0ff0c56a934fd0d7dc18ab19fbf8a6e549c07680f3180548216831790557fc158e261cf4306b0b5b2ba450aeb57baa9694e6fed056a2f106a9980404f55f280548216831790557f24cf125b3dd1ff547e40c3fd5341edfce88283b973408e21b611ae8432653ef280548216831790557f4634d3602bb0e5b92c66123c1b80af257298cf5acbc451afa9a632a8cf6bfdb080548216831790557f4235d5d930b9c392e404edbdd005eefb7dfed254f821a2d156744f4abf7cf4ce80548216831790557fc710949fda19df853fdf9cf7918c6fb892b3b65718aafcda4bdb154cd82370c080548216831790557f3c0e28c3f6c4ade9c9d43b1ebc2ecff5c3d4c191296a9a2564cd0286513e512980548216831790557f6a78633b6b525f6dd7f2252def7ee4ce1b7da80a631da2563385eb2c5abac95f80548216831790557fa3da1aa4acc19de005d7ac2de2c3634964afef3967c3e64e7a6dbc83038b755280548216831790557f2fa69b422cbfeaab6f2e0c4a4abcb29b20c05140316637e21ba8125c892a10ed80548216831790557f9e2027fc2c6021da9757ae63b9eda866436188e35f71d8137cc160929954ad4c80548216831790557f6a065c110cb6a3e05cffbddfb54ac95fc2bed631211d6314dc48aeeba705038f80548216831790557fd5941e91df5b62094f9a19a337a9be0f6fd9471f9b4bc64ee5641d9d0582babb80548216831790557f81d42c9bd36ad6ecc00c658108cded132d0baa44328e5445ba90a84964e0c1f880548216831790557fcb1dc5ec608dbd5a3eeab6b7401421de735be76fc93b94f17fba83eac56362bd80548216831790557f4223a146399145af924cd8a891f433c462fc771f31d30a7d6b562f849d5e4f3580548216831790557f118b9bd7333790335fecb5b0e0035e93e58f015daa0d03869512e3592969ae8c80548216831790557f6c95d0049336f807377665668184fafb791ac827cc6c73827a2a918a43b23b9280548216831790557f11f53205db59adc77b63f97bfb1c77036cbe2bfb25d3bd4413d9b277821d735e80548216831790557fd6ae3506497401e9b0690e85c3066a10ee29f31a20c32cc0be812a8ef0c892e380548216831790557f10312de42a4197d26c5f51b42ba1dac84f961ead15ae878fa5a1b4a6c03826cf80548216831790557fb0c0560c732b3a76e348dbe37dd3a3e341e570c3bddf0836d80fc6a89d8c233580548216831790557fbf07ef4534a4dfa2bcef81c359482b16a1d73ed2d0de21ad4a2510bf79b8141280548216831790557fd8c5b5e5f712116c87e20ded40505b0f81ab58d70b92a91368e586b9778aab3280548216831790557fa4e5f142af77f86aa038fd6e86031f24c20394f8459dbc27e6955aae3c829a4780548216831790557f14efea2e4bd5cc593c9b1178ae63b3356b95f7febaa57b1e6104ac50a3ff124980548216831790557fb9df42c34a54e3dd0b4eb4d0b5de9a0d5b385ce8fd763bddf8030e1d9470e4e880548216831790557ff27531e29681acd44414e7c42c5c281e9f4c544b5d3314bb0459c77c4ae7346680548216831790557f6cd3a7027d686e33d0a66f07972fcb5ad74c6e1f4a2015474ef1ebaa9570cde980548216831790557f4d86e5844aa90a54566190813b1eb8d61d45fc24d9b0d84470b69f0f52234a1280548216831790557f57c70ec817a5e710047f9456a321894d0a41b8b98caf580d81796eb21dd07b7380548216831790557ffa5eb581d2ba6d2bd12dc3baf709d4b9b6618cc44b8b782ec428027e727f91ec80548216831790557f7acf0ba7c4e79540bb69456c4ec2ef62d89410a9276abba22d65e5ae9732861b80548216831790557fc5e6b3dbf84d23d799440aac602d942960fa6f5aa8c636ef657ce9a199ed016e80548216831790557f3bb24cd3718aee1fac658cee435bafa9c12e2c3f114af695410bc8900ebafbca80548216831790557fe1ac92a6903384d7b099487189c37fbcf006bd3f3a1bb0d700991572c54f405a80548216831790557f3bbdaedd3699fd7b07853bf7c1b069949f1819b27a81a2636b2b8d5910f9700780548216831790557f79d53707986dfa22c5e46f93e21a1447d6df137166b05d78d3e9b717b22b8c4d80548216831790557f33f962e7b168a90a83b02000e0ce1cbc18bcaa7ae8edf32cf3e4ba2f5462746980548216831790557ff6081374e6ee5a27b46063e402372c28aeecf3934e7a41cf1064f58d360946e880548216831790557ffd1eac8c19d6668c6cf8455c74ba43dc31d5e3d685294d00c07fe2412d6b38da80548216831790557fcc055543d4028192e3ee92a33c202394753d1d8bee267c3b872087aab462d2a780548216831790557f5eb292f8d771c15deee59feeaf2fdef3db67ab69bfffddbd85221a6853f8d06f80548216831790557ff3f57405ca51722864c25c9d34cbb9137379bde56b4e135a3cb189e7c35bd8fc80548216831790557f87b5b845c25828d254db3a26c32083f3034817e58e9f2f67e53631008d12538c80548216831790557fd15622fd0e74014d81d0fb35568b7cff925701ef857dd9af469e60622176883b80548216831790557fed30c8076b11d989b1fe2d8cf432edf4464e6566ab37a391e62f50ceaca23c8b80548216831790557faa8a406f20e8dba2a3af293be17ce351f9e8f79b110b2beda8b62ac52deedf9f80548216831790557fcd8a7b798ff4da88fa029f3a3c415c5896ea3a03b266b88f9ed2950a5693709680548216831790557ffe3b844230556ccd389503f026b3ecd8a73d6bfda6a9083e2c4995fcbfac778480548216831790557fcc6b09e790fd34642ed125a25d280e40b3050031684082f2ec0f9dcb6844525d80548216831790557fccbea3ef12fa3260f871b835ba8934302e789188380cd614cf24ab934438b12d80548216831790557f7099b212efe9bd22d2fbcfa021f9344c40970f87197363133c837d7134b785ef80548216831790557f66330d3b98f8a9f6e878a6fd1e9767e65b6eeec0341342fafff2110e9ea01be480548216831790557fac145a5fbb5d6d62ad1e70963948a84e7728c37b517a99ce02c58079e067175980548216831790557f71cd2b0e820bd5259b41b7bc0b5254a4cbec8fe7b37072a39940ff96d2f5d29580548216831790557f871e52f5e41daffb4e1e7575d05717e0b0c4faf55b41043474c2fac013be15b380548216831790557f9ac506166f5bd68aded863304f23e416eeaefac2e5ef767b5ab54f0d7e29e98780548216831790557f7f9150513e0bf941ff56cbf479815f8a9f71e0e94ec8f24f50eb6a5f23d1526e80548216831790557f3f07b7925d4f4ad286b622018fd4f327e4c5431e73a2bf583965bce79e8991cc8054821683179055600f6020527f3a1b3168c7cc0c8b069623a6dcb8c2ad8e78991a725b635e6a2a6e6a6c149f4680548216831790557f5f588d873ac7504c3c7bd527f7b0580803fdb3b71a434f57d25b2cc5db6b578780548216831790557f131835fbce63af3a18e7412b3360de7d91436395ee54187504637a0ac23a979580548216831790557f8fc325ed3060917b9ad2238013c481332446d7e38b32d2228eded435197ee00580548216831790557fc417042fbc4bb3b7171cadc2a84d1bcf132dc1307e4a0d910b90601850c175a180548216831790557fa7b2608466d3dc974f53d50e549863d38ef53ae605dddc99fd9fb63084bace4f80548216831790557fac9778ce0c7007d46081233566af2361a5166dc803ade32a262d7cddcfbdf15980548216831790557fb700946a39c40f78157ee8b7bc58e14f7a42553178fa17fdbb94b3983fa799af80548216831790557f13cb2400a191742e0cbefce09ee6c7d4dfd3afaebc590d92eb2f6d958c67374880548216831790557f997e2e44c5cbc0e4b34c70b5145f95ce07af58cdc5ac50a1130f209f5f2ca93180548216831790557304767eb4363cdb2fdf9c4c872459b8a4bb50689c6000527f20d65f4ddb56001f1cd66e7b01cf05307fc2b059ab4782a6f1cda88a494e52788054909116909117905562000f5a565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000da79062000f1d565b90600052602060002090601f01602090048101928262000dcb576000855562000e16565b82601f1062000de657805160ff191683800117855562000e16565b8280016001018555821562000e16579182015b8281111562000e1657825182559160200191906001019062000df9565b5062000e2492915062000f06565b5090565b826002810192821562000e16579160200282015b8281111562000e1657825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000e3c565b60018301918390821562000e165791602002820160005b8382111562000ecc57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000e8a565b801562000efc5782816101000a81549061ffff021916905560020160208160010104928301926001030262000ecc565b505062000e249291505b5b8082111562000e24576000815560010162000f07565b600181811c9082168062000f3257607f821691505b6020821081141562000f5457634e487b7160e01b600052602260045260246000fd5b50919050565b612dab8062000f6a6000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461067a578063e985e9c51461069a578063ea9fbac7146106e3578063f2fde38b146106f9578063f80f5dd514610719578063fc1a1c361461073957600080fd5b8063a22cb465146105e4578063a39ed6c214610604578063a945bf8014610624578063b88d4fde1461063a578063c62752551461065a57600080fd5b806389476069116100fd57806389476069146105515780638da5cb5b146105715780638e96e3cb1461058f57806395d89b41146105af57806396e3fa70146105c457600080fd5b8063715018a6146104c6578063717d57d3146104db578063722e141d146104fb57806374cc30611461051157806378c8cda71461053157600080fd5b80633d3066d7116101c757806355f804b31161018b57806355f804b31461043b5780635bf177731461045b5780635dc70c71146104715780636352211e1461048657806370a08231146104a657600080fd5b80633d3066d71461039957806342842e0e146103cd578063464d31db146103ed57806349eb869c146104005780634f6ccce71461041b57600080fd5b806323b872dd1161020e57806323b872dd1461031b57806323cf0a221461033b5780632f745c591461034e578063305c7d4a1461036e5780633ccfd60b1461038457600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046125ef565b61074f565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610760565b6040516102779190612664565b3480156102ae57600080fd5b506102c26102bd366004612677565b6107f2565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046126ac565b61088c565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa6103363660046126d6565b6109a2565b6102fa610349366004612712565b6109d3565b34801561035a57600080fd5b5061030d6103693660046126ac565b610c34565b34801561037a57600080fd5b5061030d60145481565b34801561039057600080fd5b506102fa610cca565b3480156103a557600080fd5b50601a546103ba9062010000900461ffff1681565b60405161ffff9091168152602001610277565b3480156103d957600080fd5b506102fa6103e83660046126d6565b610dfd565b6102fa6103fb366004612712565b610e18565b34801561040c57600080fd5b50601a546103ba9061ffff1681565b34801561042757600080fd5b5061030d610436366004612677565b611012565b34801561044757600080fd5b506102fa6104563660046127c2565b6110a5565b34801561046757600080fd5b5061030d60185481565b34801561047d57600080fd5b506102fa6110e6565b34801561049257600080fd5b506102c26104a1366004612677565b61111f565b3480156104b257600080fd5b5061030d6104c136600461280b565b611196565b3480156104d257600080fd5b506102fa61121d565b3480156104e757600080fd5b506102fa6104f6366004612677565b611253565b34801561050757600080fd5b5061030d60175481565b34801561051d57600080fd5b506102fa61052c36600461280b565b611282565b34801561053d57600080fd5b506102fa61054c36600461280b565b6112d0565b34801561055d57600080fd5b506102fa61056c36600461280b565b61131b565b34801561057d57600080fd5b50600a546001600160a01b03166102c2565b34801561059b57600080fd5b506102fa6105aa36600461280b565b6115a2565b3480156105bb57600080fd5b506102956115ed565b3480156105d057600080fd5b506102fa6105df3660046127c2565b6115fc565b3480156105f057600080fd5b506102fa6105ff366004612834565b611639565b34801561061057600080fd5b506102fa61061f366004612712565b611644565b34801561063057600080fd5b5061030d60135481565b34801561064657600080fd5b506102fa61065536600461286b565b61179e565b34801561066657600080fd5b506102fa610675366004612677565b6117d6565b34801561068657600080fd5b50610295610695366004612677565b611805565b3480156106a657600080fd5b5061026b6106b53660046128e7565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ef57600080fd5b5061030d60155481565b34801561070557600080fd5b506102fa61071436600461280b565b6118ae565b34801561072557600080fd5b506102fa61073436600461280b565b611949565b34801561074557600080fd5b5061030d60165481565b600061075a82611997565b92915050565b60606000805461076f9061291a565b80601f016020809104026020016040519081016040528092919081815260200182805461079b9061291a565b80156107e85780601f106107bd576101008083540402835291602001916107e8565b820191906000526020600020905b8154815290600101906020018083116107cb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108705760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108978261111f565b9050806001600160a01b0316836001600160a01b031614156109055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610867565b336001600160a01b0382161480610921575061092181336106b5565b6109935760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610867565b61099d83836119bc565b505050565b6109ac3382611a2a565b6109c85760405162461bcd60e51b815260040161086790612955565b61099d838383611b21565b6002600b5414156109f65760405162461bcd60e51b8152600401610867906129a6565b6002600b5560145461ffff82161115610a625760405162461bcd60e51b815260206004820152602860248201527f596f752063616e2774206d696e74206173206d75636820746f6b656e732061746044820152671030903a34b6b29760c11b6064820152608401610867565b601a5461ffff80821691610a7e918491620100009004166129f3565b61ffff161115610ada5760405162461bcd60e51b815260206004820152602160248201527f416c6c204e465473206861766520616c7265616479206265656e206d696e74656044820152601960fa1b6064820152608401610867565b601354610aeb9061ffff8316612a19565b341015610af9601354611cc8565b604051602001610b099190612a38565b60405160208183030381529060405290610b365760405162461bcd60e51b81526004016108679190612664565b506015548161ffff16610b4833611196565b610b529190612a8d565b1115610bb25760405162461bcd60e51b815260206004820152602960248201527f596f7520616c72656164792068617665206d617820746f6b656e7320796f752060448201526831b0b71036b4b73a1760b91b6064820152608401610867565b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff16610be191906129f3565b92506101000a81548161ffff021916908361ffff160217905550610c1933601a60029054906101000a900461ffff1661ffff16611dc6565b80610c2381612aa5565b915050610bb5565b50506001600b55565b6000610c3f83611196565b8210610ca15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610867565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b478060005b610cdb60016002612ac0565b8160ff161015610da55760006103e88460128460ff1660028110610d0157610d01612ad7565b601091828204019190066002029054906101000a900461ffff1661ffff16610d299190612a19565b610d339190612b03565b905060108260ff1660028110610d4b57610d4b612ad7565b01546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610d84573d6000803e3d6000fd5b50610d8f8184612ac0565b9250508080610d9d90612b17565b915050610ccf565b506010610db460016002612ac0565b60028110610dc457610dc4612ad7565b01546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561099d573d6000803e3d6000fd5b61099d8383836040518060200160405280600081525061179e565b6002600b541415610e3b5760405162461bcd60e51b8152600401610867906129a6565b6002600b5560175461ffff82161115610e665760405162461bcd60e51b815260040161086790612b37565b601a5461ffff80821691610e82918491620100009004166129f3565b61ffff161115610ea45760405162461bcd60e51b815260040161086790612b7f565b336000908152600e602052604090205460ff16610f035760405162461bcd60e51b815260206004820152601760248201527f596f75277265206e6f742077686974656c69737465642e0000000000000000006044820152606401610867565b601654610f149061ffff8316612a19565b341015610f22601654611cc8565b604051602001610f329190612a38565b60405160208183030381529060405290610f5f5760405162461bcd60e51b81526004016108679190612664565b506018548161ffff16610f7133611196565b610f7b9190612a8d565b1115610f995760405162461bcd60e51b815260040161086790612bc1565b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff16610fc891906129f3565b92506101000a81548161ffff021916908361ffff16021790555061100033601a60029054906101000a900461ffff1661ffff16611dc6565b8061100a81612aa5565b915050610f9c565b600061101d60085490565b82106110805760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610867565b6008828154811061109357611093612ad7565b90600052602060002001549050919050565b600a546001600160a01b031633146110cf5760405162461bcd60e51b815260040161086790612c0e565b80516110e2906019906020840190612540565b5050565b600a546001600160a01b031633146111105760405162461bcd60e51b815260040161086790612c0e565b600c805460ff19166001179055565b6000818152600260205260408120546001600160a01b03168061075a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610867565b60006001600160a01b0382166112015760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610867565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112475760405162461bcd60e51b815260040161086790612c0e565b6112516000611de0565b565b600a546001600160a01b0316331461127d5760405162461bcd60e51b815260040161086790612c0e565b601655565b600a546001600160a01b031633146112ac5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b600a546001600160a01b031633146112fa5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611364573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113889190612c43565b905080806113d85760405162461bcd60e51b815260206004820152601e60248201527f5468657265206973206e6f20746f6b656e20746f2077697468647261772e00006044820152606401610867565b60005b6113e760016002612ac0565b8160ff1610156114fa5760006103e88460128460ff166002811061140d5761140d612ad7565b601091828204019190066002029054906101000a900461ffff1661ffff166114359190612a19565b61143f9190612b03565b9050846001600160a01b031663a9059cbb60108460ff166002811061146657611466612ad7565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156114b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d99190612c5c565b506114e48184612ac0565b92505080806114f290612b17565b9150506113db565b506001600160a01b03831663a9059cbb601061151860016002612ac0565b6002811061152857611528612ad7565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b9190612c5c565b5050505050565b600a546001600160a01b031633146115cc5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b60606001805461076f9061291a565b600a546001600160a01b031633146116265760405162461bcd60e51b815260040161086790612c0e565b80516110e290600d906020840190612540565b6110e2338383611e32565b6002600b5414156116675760405162461bcd60e51b8152600401610867906129a6565b6002600b5560175461ffff821611156116925760405162461bcd60e51b815260040161086790612b37565b601a5461ffff808216916116ae918491620100009004166129f3565b61ffff1611156116d05760405162461bcd60e51b815260040161086790612b7f565b6018548161ffff166116e133611196565b6116eb9190612a8d565b11156117095760405162461bcd60e51b815260040161086790612bc1565b336000908152600f602052604090205460ff1661172557600080fd5b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff1661175491906129f3565b92506101000a81548161ffff021916908361ffff16021790555061178c33601a60029054906101000a900461ffff1661ffff16611dc6565b8061179681612aa5565b915050611728565b6117a83383611a2a565b6117c45760405162461bcd60e51b815260040161086790612955565b6117d084848484611f01565b50505050565b600a546001600160a01b031633146118005760405162461bcd60e51b815260040161086790612c0e565b601355565b600c5460609060ff161561181c5761075a82611f34565b600d80546118299061291a565b80601f01602080910402602001604051908101604052809291908181526020018280546118559061291a565b80156118a25780601f10611877576101008083540402835291602001916118a2565b820191906000526020600020905b81548152906001019060200180831161188557829003601f168201915b50505050509050919050565b600a546001600160a01b031633146118d85760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03811661193d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610867565b61194681611de0565b50565b600a546001600160a01b031633146119735760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b148061075a575061075a8261200f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119f18261111f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611aa35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610867565b6000611aae8361111f565b9050806001600160a01b0316846001600160a01b03161480611ae95750836001600160a01b0316611ade846107f2565b6001600160a01b0316145b80611b1957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b348261111f565b6001600160a01b031614611b985760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610867565b6001600160a01b038216611bfa5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610867565b611c0583838361205f565b611c106000826119bc565b6001600160a01b0383166000908152600360205260408120805460019290611c39908490612ac0565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c67908490612a8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081611cec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d165780611d0081612aa5565b9150611d0f9050600a83612b03565b9150611cf0565b60008167ffffffffffffffff811115611d3157611d31612736565b6040519080825280601f01601f191660200182016040528015611d5b576020820181803683370190505b5090505b8415611b1957611d70600183612ac0565b9150611d7d600a86612c79565b611d88906030612a8d565b60f81b818381518110611d9d57611d9d612ad7565b60200101906001600160f81b031916908160001a905350611dbf600a86612b03565b9450611d5f565b6110e282826040518060200160405280600081525061206a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611e945760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610867565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f0c848484611b21565b611f188484848461209d565b6117d05760405162461bcd60e51b815260040161086790612c8d565b6000818152600260205260409020546060906001600160a01b0316611fb35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610867565b6000611fbd61219b565b90506000815111611fdd5760405180602001604052806000815250612008565b80611fe784611cc8565b604051602001611ff8929190612cdf565b6040516020818303038152906040525b9392505050565b60006001600160e01b031982166380ac58cd60e01b148061204057506001600160e01b03198216635b5e139f60e01b145b8061075a57506301ffc9a760e01b6001600160e01b031983161461075a565b61099d8383836121aa565b6120748383612262565b612081600084848461209d565b61099d5760405162461bcd60e51b815260040161086790612c8d565b60006001600160a01b0384163b1561219057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120e1903390899088908890600401612d05565b6020604051808303816000875af192505050801561211c575060408051601f3d908101601f1916820190925261211991810190612d42565b60015b612176573d80801561214a576040519150601f19603f3d011682016040523d82523d6000602084013e61214f565b606091505b50805161216e5760405162461bcd60e51b815260040161086790612c8d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b19565b506001949350505050565b60606019805461076f9061291a565b6001600160a01b0383166122055761220081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612228565b816001600160a01b0316836001600160a01b0316146122285761222883826123b0565b6001600160a01b03821661223f5761099d8161244d565b826001600160a01b0316826001600160a01b03161461099d5761099d82826124fc565b6001600160a01b0382166122b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610867565b6000818152600260205260409020546001600160a01b03161561231d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610867565b6123296000838361205f565b6001600160a01b0382166000908152600360205260408120805460019290612352908490612a8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016123bd84611196565b6123c79190612ac0565b60008381526007602052604090205490915080821461241a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061245f90600190612ac0565b6000838152600960205260408120546008805493945090928490811061248757612487612ad7565b9060005260206000200154905080600883815481106124a8576124a8612ad7565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124e0576124e0612d5f565b6001900381819060005260206000200160009055905550505050565b600061250783611196565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461254c9061291a565b90600052602060002090601f01602090048101928261256e57600085556125b4565b82601f1061258757805160ff19168380011785556125b4565b828001600101855582156125b4579182015b828111156125b4578251825591602001919060010190612599565b506125c09291506125c4565b5090565b5b808211156125c057600081556001016125c5565b6001600160e01b03198116811461194657600080fd5b60006020828403121561260157600080fd5b8135612008816125d9565b60005b8381101561262757818101518382015260200161260f565b838111156117d05750506000910152565b6000815180845261265081602086016020860161260c565b601f01601f19169290920160200192915050565b6020815260006120086020830184612638565b60006020828403121561268957600080fd5b5035919050565b80356001600160a01b03811681146126a757600080fd5b919050565b600080604083850312156126bf57600080fd5b6126c883612690565b946020939093013593505050565b6000806000606084860312156126eb57600080fd5b6126f484612690565b925061270260208501612690565b9150604084013590509250925092565b60006020828403121561272457600080fd5b813561ffff8116811461200857600080fd5b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561276757612767612736565b604051601f8501601f19908116603f0116810190828211818310171561278f5761278f612736565b816040528093508581528686860111156127a857600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127d457600080fd5b813567ffffffffffffffff8111156127eb57600080fd5b8201601f810184136127fc57600080fd5b611b198482356020840161274c565b60006020828403121561281d57600080fd5b61200882612690565b801515811461194657600080fd5b6000806040838503121561284757600080fd5b61285083612690565b9150602083013561286081612826565b809150509250929050565b6000806000806080858703121561288157600080fd5b61288a85612690565b935061289860208601612690565b925060408501359150606085013567ffffffffffffffff8111156128bb57600080fd5b8501601f810187136128cc57600080fd5b6128db8782356020840161274c565b91505092959194509250565b600080604083850312156128fa57600080fd5b61290383612690565b915061291160208401612690565b90509250929050565b600181811c9082168061292e57607f821691505b6020821081141561294f57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612a1057612a106129dd565b01949350505050565b6000816000190483118215151615612a3357612a336129dd565b500290565b6d02cb7ba9036bab9ba1039b2b732160951b815260008251612a6181600e85016020870161260c565b74103bb2b4903a379036b4b73a1030903a37b5b2b71760591b600e939091019283015250602301919050565b60008219821115612aa057612aa06129dd565b500190565b6000600019821415612ab957612ab96129dd565b5060010190565b600082821015612ad257612ad26129dd565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082612b1257612b12612aed565b500490565b600060ff821660ff811415612b2e57612b2e6129dd565b60010192915050565b60208082526028908201527f596f752063616e2774206d696e74206173206d616e7920746f6b656e732061746040820152671030903a34b6b29760c11b606082015260800190565b60208082526022908201527f416c6c204e465473206861766520616c7265616479206265656e206d696e7465604082015261321760f11b606082015260800190565b6020808252602d908201527f596f75206172656164792068617665206d6f726520746f6b656e207468616e2060408201526c3cb7ba9031b0b71036b4b73a1760991b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612c5557600080fd5b5051919050565b600060208284031215612c6e57600080fd5b815161200881612826565b600082612c8857612c88612aed565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351612cf181846020880161260c565b835190830190612a1081836020880161260c565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3890830184612638565b9695505050505050565b600060208284031215612d5457600080fd5b8151612008816125d9565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205346cff525f5a52c113378f6db97f84a2b8592831818ec7164c3b5e1ced2a3ad64736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106102465760003560e01c8063715018a611610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461067a578063e985e9c51461069a578063ea9fbac7146106e3578063f2fde38b146106f9578063f80f5dd514610719578063fc1a1c361461073957600080fd5b8063a22cb465146105e4578063a39ed6c214610604578063a945bf8014610624578063b88d4fde1461063a578063c62752551461065a57600080fd5b806389476069116100fd57806389476069146105515780638da5cb5b146105715780638e96e3cb1461058f57806395d89b41146105af57806396e3fa70146105c457600080fd5b8063715018a6146104c6578063717d57d3146104db578063722e141d146104fb57806374cc30611461051157806378c8cda71461053157600080fd5b80633d3066d7116101c757806355f804b31161018b57806355f804b31461043b5780635bf177731461045b5780635dc70c71146104715780636352211e1461048657806370a08231146104a657600080fd5b80633d3066d71461039957806342842e0e146103cd578063464d31db146103ed57806349eb869c146104005780634f6ccce71461041b57600080fd5b806323b872dd1161020e57806323b872dd1461031b57806323cf0a221461033b5780632f745c591461034e578063305c7d4a1461036e5780633ccfd60b1461038457600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046125ef565b61074f565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610760565b6040516102779190612664565b3480156102ae57600080fd5b506102c26102bd366004612677565b6107f2565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046126ac565b61088c565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa6103363660046126d6565b6109a2565b6102fa610349366004612712565b6109d3565b34801561035a57600080fd5b5061030d6103693660046126ac565b610c34565b34801561037a57600080fd5b5061030d60145481565b34801561039057600080fd5b506102fa610cca565b3480156103a557600080fd5b50601a546103ba9062010000900461ffff1681565b60405161ffff9091168152602001610277565b3480156103d957600080fd5b506102fa6103e83660046126d6565b610dfd565b6102fa6103fb366004612712565b610e18565b34801561040c57600080fd5b50601a546103ba9061ffff1681565b34801561042757600080fd5b5061030d610436366004612677565b611012565b34801561044757600080fd5b506102fa6104563660046127c2565b6110a5565b34801561046757600080fd5b5061030d60185481565b34801561047d57600080fd5b506102fa6110e6565b34801561049257600080fd5b506102c26104a1366004612677565b61111f565b3480156104b257600080fd5b5061030d6104c136600461280b565b611196565b3480156104d257600080fd5b506102fa61121d565b3480156104e757600080fd5b506102fa6104f6366004612677565b611253565b34801561050757600080fd5b5061030d60175481565b34801561051d57600080fd5b506102fa61052c36600461280b565b611282565b34801561053d57600080fd5b506102fa61054c36600461280b565b6112d0565b34801561055d57600080fd5b506102fa61056c36600461280b565b61131b565b34801561057d57600080fd5b50600a546001600160a01b03166102c2565b34801561059b57600080fd5b506102fa6105aa36600461280b565b6115a2565b3480156105bb57600080fd5b506102956115ed565b3480156105d057600080fd5b506102fa6105df3660046127c2565b6115fc565b3480156105f057600080fd5b506102fa6105ff366004612834565b611639565b34801561061057600080fd5b506102fa61061f366004612712565b611644565b34801561063057600080fd5b5061030d60135481565b34801561064657600080fd5b506102fa61065536600461286b565b61179e565b34801561066657600080fd5b506102fa610675366004612677565b6117d6565b34801561068657600080fd5b50610295610695366004612677565b611805565b3480156106a657600080fd5b5061026b6106b53660046128e7565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ef57600080fd5b5061030d60155481565b34801561070557600080fd5b506102fa61071436600461280b565b6118ae565b34801561072557600080fd5b506102fa61073436600461280b565b611949565b34801561074557600080fd5b5061030d60165481565b600061075a82611997565b92915050565b60606000805461076f9061291a565b80601f016020809104026020016040519081016040528092919081815260200182805461079b9061291a565b80156107e85780601f106107bd576101008083540402835291602001916107e8565b820191906000526020600020905b8154815290600101906020018083116107cb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108705760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108978261111f565b9050806001600160a01b0316836001600160a01b031614156109055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610867565b336001600160a01b0382161480610921575061092181336106b5565b6109935760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610867565b61099d83836119bc565b505050565b6109ac3382611a2a565b6109c85760405162461bcd60e51b815260040161086790612955565b61099d838383611b21565b6002600b5414156109f65760405162461bcd60e51b8152600401610867906129a6565b6002600b5560145461ffff82161115610a625760405162461bcd60e51b815260206004820152602860248201527f596f752063616e2774206d696e74206173206d75636820746f6b656e732061746044820152671030903a34b6b29760c11b6064820152608401610867565b601a5461ffff80821691610a7e918491620100009004166129f3565b61ffff161115610ada5760405162461bcd60e51b815260206004820152602160248201527f416c6c204e465473206861766520616c7265616479206265656e206d696e74656044820152601960fa1b6064820152608401610867565b601354610aeb9061ffff8316612a19565b341015610af9601354611cc8565b604051602001610b099190612a38565b60405160208183030381529060405290610b365760405162461bcd60e51b81526004016108679190612664565b506015548161ffff16610b4833611196565b610b529190612a8d565b1115610bb25760405162461bcd60e51b815260206004820152602960248201527f596f7520616c72656164792068617665206d617820746f6b656e7320796f752060448201526831b0b71036b4b73a1760b91b6064820152608401610867565b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff16610be191906129f3565b92506101000a81548161ffff021916908361ffff160217905550610c1933601a60029054906101000a900461ffff1661ffff16611dc6565b80610c2381612aa5565b915050610bb5565b50506001600b55565b6000610c3f83611196565b8210610ca15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610867565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b478060005b610cdb60016002612ac0565b8160ff161015610da55760006103e88460128460ff1660028110610d0157610d01612ad7565b601091828204019190066002029054906101000a900461ffff1661ffff16610d299190612a19565b610d339190612b03565b905060108260ff1660028110610d4b57610d4b612ad7565b01546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610d84573d6000803e3d6000fd5b50610d8f8184612ac0565b9250508080610d9d90612b17565b915050610ccf565b506010610db460016002612ac0565b60028110610dc457610dc4612ad7565b01546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561099d573d6000803e3d6000fd5b61099d8383836040518060200160405280600081525061179e565b6002600b541415610e3b5760405162461bcd60e51b8152600401610867906129a6565b6002600b5560175461ffff82161115610e665760405162461bcd60e51b815260040161086790612b37565b601a5461ffff80821691610e82918491620100009004166129f3565b61ffff161115610ea45760405162461bcd60e51b815260040161086790612b7f565b336000908152600e602052604090205460ff16610f035760405162461bcd60e51b815260206004820152601760248201527f596f75277265206e6f742077686974656c69737465642e0000000000000000006044820152606401610867565b601654610f149061ffff8316612a19565b341015610f22601654611cc8565b604051602001610f329190612a38565b60405160208183030381529060405290610f5f5760405162461bcd60e51b81526004016108679190612664565b506018548161ffff16610f7133611196565b610f7b9190612a8d565b1115610f995760405162461bcd60e51b815260040161086790612bc1565b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff16610fc891906129f3565b92506101000a81548161ffff021916908361ffff16021790555061100033601a60029054906101000a900461ffff1661ffff16611dc6565b8061100a81612aa5565b915050610f9c565b600061101d60085490565b82106110805760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610867565b6008828154811061109357611093612ad7565b90600052602060002001549050919050565b600a546001600160a01b031633146110cf5760405162461bcd60e51b815260040161086790612c0e565b80516110e2906019906020840190612540565b5050565b600a546001600160a01b031633146111105760405162461bcd60e51b815260040161086790612c0e565b600c805460ff19166001179055565b6000818152600260205260408120546001600160a01b03168061075a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610867565b60006001600160a01b0382166112015760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610867565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112475760405162461bcd60e51b815260040161086790612c0e565b6112516000611de0565b565b600a546001600160a01b0316331461127d5760405162461bcd60e51b815260040161086790612c0e565b601655565b600a546001600160a01b031633146112ac5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b600a546001600160a01b031633146112fa5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611364573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113889190612c43565b905080806113d85760405162461bcd60e51b815260206004820152601e60248201527f5468657265206973206e6f20746f6b656e20746f2077697468647261772e00006044820152606401610867565b60005b6113e760016002612ac0565b8160ff1610156114fa5760006103e88460128460ff166002811061140d5761140d612ad7565b601091828204019190066002029054906101000a900461ffff1661ffff166114359190612a19565b61143f9190612b03565b9050846001600160a01b031663a9059cbb60108460ff166002811061146657611466612ad7565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156114b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d99190612c5c565b506114e48184612ac0565b92505080806114f290612b17565b9150506113db565b506001600160a01b03831663a9059cbb601061151860016002612ac0565b6002811061152857611528612ad7565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b9190612c5c565b5050505050565b600a546001600160a01b031633146115cc5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b60606001805461076f9061291a565b600a546001600160a01b031633146116265760405162461bcd60e51b815260040161086790612c0e565b80516110e290600d906020840190612540565b6110e2338383611e32565b6002600b5414156116675760405162461bcd60e51b8152600401610867906129a6565b6002600b5560175461ffff821611156116925760405162461bcd60e51b815260040161086790612b37565b601a5461ffff808216916116ae918491620100009004166129f3565b61ffff1611156116d05760405162461bcd60e51b815260040161086790612b7f565b6018548161ffff166116e133611196565b6116eb9190612a8d565b11156117095760405162461bcd60e51b815260040161086790612bc1565b336000908152600f602052604090205460ff1661172557600080fd5b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff1661175491906129f3565b92506101000a81548161ffff021916908361ffff16021790555061178c33601a60029054906101000a900461ffff1661ffff16611dc6565b8061179681612aa5565b915050611728565b6117a83383611a2a565b6117c45760405162461bcd60e51b815260040161086790612955565b6117d084848484611f01565b50505050565b600a546001600160a01b031633146118005760405162461bcd60e51b815260040161086790612c0e565b601355565b600c5460609060ff161561181c5761075a82611f34565b600d80546118299061291a565b80601f01602080910402602001604051908101604052809291908181526020018280546118559061291a565b80156118a25780601f10611877576101008083540402835291602001916118a2565b820191906000526020600020905b81548152906001019060200180831161188557829003601f168201915b50505050509050919050565b600a546001600160a01b031633146118d85760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03811661193d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610867565b61194681611de0565b50565b600a546001600160a01b031633146119735760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b148061075a575061075a8261200f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119f18261111f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611aa35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610867565b6000611aae8361111f565b9050806001600160a01b0316846001600160a01b03161480611ae95750836001600160a01b0316611ade846107f2565b6001600160a01b0316145b80611b1957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b348261111f565b6001600160a01b031614611b985760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610867565b6001600160a01b038216611bfa5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610867565b611c0583838361205f565b611c106000826119bc565b6001600160a01b0383166000908152600360205260408120805460019290611c39908490612ac0565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c67908490612a8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081611cec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d165780611d0081612aa5565b9150611d0f9050600a83612b03565b9150611cf0565b60008167ffffffffffffffff811115611d3157611d31612736565b6040519080825280601f01601f191660200182016040528015611d5b576020820181803683370190505b5090505b8415611b1957611d70600183612ac0565b9150611d7d600a86612c79565b611d88906030612a8d565b60f81b818381518110611d9d57611d9d612ad7565b60200101906001600160f81b031916908160001a905350611dbf600a86612b03565b9450611d5f565b6110e282826040518060200160405280600081525061206a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611e945760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610867565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f0c848484611b21565b611f188484848461209d565b6117d05760405162461bcd60e51b815260040161086790612c8d565b6000818152600260205260409020546060906001600160a01b0316611fb35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610867565b6000611fbd61219b565b90506000815111611fdd5760405180602001604052806000815250612008565b80611fe784611cc8565b604051602001611ff8929190612cdf565b6040516020818303038152906040525b9392505050565b60006001600160e01b031982166380ac58cd60e01b148061204057506001600160e01b03198216635b5e139f60e01b145b8061075a57506301ffc9a760e01b6001600160e01b031983161461075a565b61099d8383836121aa565b6120748383612262565b612081600084848461209d565b61099d5760405162461bcd60e51b815260040161086790612c8d565b60006001600160a01b0384163b1561219057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120e1903390899088908890600401612d05565b6020604051808303816000875af192505050801561211c575060408051601f3d908101601f1916820190925261211991810190612d42565b60015b612176573d80801561214a576040519150601f19603f3d011682016040523d82523d6000602084013e61214f565b606091505b50805161216e5760405162461bcd60e51b815260040161086790612c8d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b19565b506001949350505050565b60606019805461076f9061291a565b6001600160a01b0383166122055761220081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612228565b816001600160a01b0316836001600160a01b0316146122285761222883826123b0565b6001600160a01b03821661223f5761099d8161244d565b826001600160a01b0316826001600160a01b03161461099d5761099d82826124fc565b6001600160a01b0382166122b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610867565b6000818152600260205260409020546001600160a01b03161561231d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610867565b6123296000838361205f565b6001600160a01b0382166000908152600360205260408120805460019290612352908490612a8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016123bd84611196565b6123c79190612ac0565b60008381526007602052604090205490915080821461241a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061245f90600190612ac0565b6000838152600960205260408120546008805493945090928490811061248757612487612ad7565b9060005260206000200154905080600883815481106124a8576124a8612ad7565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124e0576124e0612d5f565b6001900381819060005260206000200160009055905550505050565b600061250783611196565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461254c9061291a565b90600052602060002090601f01602090048101928261256e57600085556125b4565b82601f1061258757805160ff19168380011785556125b4565b828001600101855582156125b4579182015b828111156125b4578251825591602001919060010190612599565b506125c09291506125c4565b5090565b5b808211156125c057600081556001016125c5565b6001600160e01b03198116811461194657600080fd5b60006020828403121561260157600080fd5b8135612008816125d9565b60005b8381101561262757818101518382015260200161260f565b838111156117d05750506000910152565b6000815180845261265081602086016020860161260c565b601f01601f19169290920160200192915050565b6020815260006120086020830184612638565b60006020828403121561268957600080fd5b5035919050565b80356001600160a01b03811681146126a757600080fd5b919050565b600080604083850312156126bf57600080fd5b6126c883612690565b946020939093013593505050565b6000806000606084860312156126eb57600080fd5b6126f484612690565b925061270260208501612690565b9150604084013590509250925092565b60006020828403121561272457600080fd5b813561ffff8116811461200857600080fd5b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561276757612767612736565b604051601f8501601f19908116603f0116810190828211818310171561278f5761278f612736565b816040528093508581528686860111156127a857600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127d457600080fd5b813567ffffffffffffffff8111156127eb57600080fd5b8201601f810184136127fc57600080fd5b611b198482356020840161274c565b60006020828403121561281d57600080fd5b61200882612690565b801515811461194657600080fd5b6000806040838503121561284757600080fd5b61285083612690565b9150602083013561286081612826565b809150509250929050565b6000806000806080858703121561288157600080fd5b61288a85612690565b935061289860208601612690565b925060408501359150606085013567ffffffffffffffff8111156128bb57600080fd5b8501601f810187136128cc57600080fd5b6128db8782356020840161274c565b91505092959194509250565b600080604083850312156128fa57600080fd5b61290383612690565b915061291160208401612690565b90509250929050565b600181811c9082168061292e57607f821691505b6020821081141561294f57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612a1057612a106129dd565b01949350505050565b6000816000190483118215151615612a3357612a336129dd565b500290565b6d02cb7ba9036bab9ba1039b2b732160951b815260008251612a6181600e85016020870161260c565b74103bb2b4903a379036b4b73a1030903a37b5b2b71760591b600e939091019283015250602301919050565b60008219821115612aa057612aa06129dd565b500190565b6000600019821415612ab957612ab96129dd565b5060010190565b600082821015612ad257612ad26129dd565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082612b1257612b12612aed565b500490565b600060ff821660ff811415612b2e57612b2e6129dd565b60010192915050565b60208082526028908201527f596f752063616e2774206d696e74206173206d616e7920746f6b656e732061746040820152671030903a34b6b29760c11b606082015260800190565b60208082526022908201527f416c6c204e465473206861766520616c7265616479206265656e206d696e7465604082015261321760f11b606082015260800190565b6020808252602d908201527f596f75206172656164792068617665206d6f726520746f6b656e207468616e2060408201526c3cb7ba9031b0b71036b4b73a1760991b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612c5557600080fd5b5051919050565b600060208284031215612c6e57600080fd5b815161200881612826565b600082612c8857612c88612aed565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351612cf181846020880161260c565b835190830190612a1081836020880161260c565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3890830184612638565b9695505050505050565b600060208284031215612d5457600080fd5b8151612008816125d9565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205346cff525f5a52c113378f6db97f84a2b8592831818ec7164c3b5e1ced2a3ad64736f6c634300080c0033

Deployed Bytecode Sourcemap

249:14546:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9686:205;;;;;;;;;;-1:-1:-1;9686:205:11;;;;;:::i;:::-;;:::i;:::-;;;565:14:15;;558:22;540:41;;528:2;513:18;9686:205:11;;;;;;;;2408:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3920:217::-;;;;;;;;;;-1:-1:-1;3920:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:15;;;1674:51;;1662:2;1647:18;3920:217:3;1528:203:15;3458:401:3;;;;;;;;;;-1:-1:-1;3458:401:3;;;;;:::i;:::-;;:::i;:::-;;1614:111:4;;;;;;;;;;-1:-1:-1;1701:10:4;:17;1614:111;;;2319:25:15;;;2307:2;2292:18;1614:111:4;2173:177:15;4647:330:3;;;;;;;;;;-1:-1:-1;4647:330:3;;;;;:::i;:::-;;:::i;11306:927:11:-;;;;;;:::i;:::-;;:::i;1290:253:4:-;;;;;;;;;;-1:-1:-1;1290:253:4;;;;;:::i;:::-;;:::i;7655:33:11:-;;;;;;;;;;;;;;;;9961:518;;;;;;;;;;;;;:::i;8196:28::-;;;;;;;;;;-1:-1:-1;8196:28:11;;;;;;;;;;;;;;3139:6:15;3127:19;;;3109:38;;3097:2;3082:18;8196:28:11;2965:188:15;5043:179:3;;;;;;;;;;-1:-1:-1;5043:179:3;;;;;:::i;:::-;;:::i;12999:1024:11:-;;;;;;:::i;:::-;;:::i;8131:30::-;;;;;;;;;;-1:-1:-1;8131:30:11;;;;;;;;1797:230:4;;;;;;;;;;-1:-1:-1;1797:230:4;;;;;:::i;:::-;;:::i;8601:107:11:-;;;;;;;;;;-1:-1:-1;8601:107:11;;;;;:::i;:::-;;:::i;7929:37::-;;;;;;;;;;;;;;;;14718:75;;;;;;;;;;;;;:::i;2111:235:3:-;;;;;;;;;;-1:-1:-1;2111:235:3;;;;;:::i;:::-;;:::i;1849:205::-;;;;;;;;;;-1:-1:-1;1849:205:3;;;;;:::i;:::-;;:::i;1661:101:12:-;;;;;;;;;;;;;:::i;9120:106:11:-;;;;;;;;;;-1:-1:-1;9120:106:11;;;;;:::i;:::-;;:::i;7888:35::-;;;;;;;;;;;;;;;;14375:115;;;;;;;;;;-1:-1:-1;14375:115:11;;;;;:::i;:::-;;:::i;14216:116::-;;;;;;;;;;-1:-1:-1;14216:116:11;;;;;:::i;:::-;;:::i;10540:732::-;;;;;;;;;;-1:-1:-1;10540:732:11;;;;;:::i;:::-;;:::i;1029:85:12:-;;;;;;;;;;-1:-1:-1;1101:6:12;;-1:-1:-1;;;;;1101:6:12;1029:85;;14532:119:11;;;;;;;;;;-1:-1:-1;14532:119:11;;;;;:::i;:::-;;:::i;2570:102:3:-;;;;;;;;;;;;;:::i;8920:144:11:-;;;;;;;;;;-1:-1:-1;8920:144:11;;;;;:::i;:::-;;:::i;4204:153:3:-;;;;;;;;;;-1:-1:-1;4204:153:3;;;;;:::i;:::-;;:::i;12267:682:11:-;;;;;;;;;;-1:-1:-1;12267:682:11;;;;;:::i;:::-;;:::i;7562:33::-;;;;;;;;;;;;;;;;5288:320:3;;;;;;;;;;-1:-1:-1;5288:320:3;;;;;:::i;:::-;;:::i;8764:100:11:-;;;;;;;;;;-1:-1:-1;8764:100:11;;;;;:::i;:::-;;:::i;9392:240::-;;;;;;;;;;-1:-1:-1;9392:240:11;;;;;:::i;:::-;;:::i;4423:162:3:-;;;;;;;;;;-1:-1:-1;4423:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4543:25:3;;;4520:4;4543:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4423:162;7694:35:11;;;;;;;;;;;;;;;;1911:198:12;;;;;;;;;;-1:-1:-1;1911:198:12;;;;;:::i;:::-;;:::i;14062:112:11:-;;;;;;;;;;-1:-1:-1;14062:112:11;;;;;:::i;:::-;;:::i;7787:36::-;;;;;;;;;;;;;;;;9686:205;9821:4;9848:36;9872:11;9848:23;:36::i;:::-;9841:43;9686:205;-1:-1:-1;;9686:205:11:o;2408:98:3:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3920:217::-;3996:7;7168:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7168:16:3;4015:73;;;;-1:-1:-1;;;4015:73:3;;6541:2:15;4015:73:3;;;6523:21:15;6580:2;6560:18;;;6553:30;6619:34;6599:18;;;6592:62;-1:-1:-1;;;6670:18:15;;;6663:42;6722:19;;4015:73:3;;;;;;;;;-1:-1:-1;4106:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4106:24:3;;3920:217::o;3458:401::-;3538:13;3554:23;3569:7;3554:14;:23::i;:::-;3538:39;;3601:5;-1:-1:-1;;;;;3595:11:3;:2;-1:-1:-1;;;;;3595:11:3;;;3587:57;;;;-1:-1:-1;;;3587:57:3;;6954:2:15;3587:57:3;;;6936:21:15;6993:2;6973:18;;;6966:30;7032:34;7012:18;;;7005:62;-1:-1:-1;;;7083:18:15;;;7076:31;7124:19;;3587:57:3;6752:397:15;3587:57:3;719:10:1;-1:-1:-1;;;;;3676:21:3;;;;:62;;-1:-1:-1;3701:37:3;3718:5;719:10:1;4423:162:3;:::i;3701:37::-;3655:165;;;;-1:-1:-1;;;3655:165:3;;7356:2:15;3655:165:3;;;7338:21:15;7395:2;7375:18;;;7368:30;7434:34;7414:18;;;7407:62;7505:26;7485:18;;;7478:54;7549:19;;3655:165:3;7154:420:15;3655:165:3;3831:21;3840:2;3844:7;3831:8;:21::i;:::-;3528:331;3458:401;;:::o;4647:330::-;4836:41;719:10:1;4869:7:3;4836:18;:41::i;:::-;4828:103;;;;-1:-1:-1;;;4828:103:3;;;;;;;:::i;:::-;4942:28;4952:4;4958:2;4962:7;4942:9;:28::i;11306:927:11:-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;;;;;;:::i;:::-;1744:1;2455:7;:18;11416:13:11::1;::::0;11400:29:::1;::::0;::::1;;;11379:116;;;::::0;-1:-1:-1;;;11379:116:11;;8559:2:15;11379:116:11::1;::::0;::::1;8541:21:15::0;8598:2;8578:18;;;8571:30;8637:34;8617:18;;;8610:62;-1:-1:-1;;;8688:18:15;;;8681:38;8736:19;;11379:116:11::1;8357:404:15::0;11379:116:11::1;11555:9;::::0;::::1;::::0;;::::1;::::0;11526:25:::1;::::0;11539:12;;11526:10;;::::1;;:25;:::i;:::-;:38;;;;11505:118;;;::::0;-1:-1:-1;;;11505:118:11;;9329:2:15;11505:118:11::1;::::0;::::1;9311:21:15::0;9368:2;9348:18;;;9341:30;9407:34;9387:18;;;9380:62;-1:-1:-1;;;9458:18:15;;;9451:31;9499:19;;11505:118:11::1;9127:397:15::0;11505:118:11::1;11682:11;::::0;11667:26:::1;::::0;::::1;::::0;::::1;;:::i;:::-;11654:9;:39;;11807:29;11824:11;;11807:16;:29::i;:::-;11731:168;;;;;;;;:::i;:::-;;;;;;;;;;;;;11633:290;;;;;-1:-1:-1::0;;;11633:290:11::1;;;;;;;;:::i;:::-;;11994:14;;11978:12;11954:36;;:21;11964:10;11954:9;:21::i;:::-;:36;;;;:::i;:::-;:54;;11933:142;;;::::0;-1:-1:-1;;;11933:142:11;;10650:2:15;11933:142:11::1;::::0;::::1;10632:21:15::0;10689:2;10669:18;;;10662:30;10728:34;10708:18;;;10701:62;-1:-1:-1;;;10779:18:15;;;10772:39;10828:19;;11933:142:11::1;10448:405:15::0;11933:142:11::1;12090:13;12085:142;12117:12;12109:20;;:5;:20;12085:142;;;12168:1;12154:10;;:15;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12183:33;12193:10;12205;;;;;;;;;;;12183:33;;:9;:33::i;:::-;12131:7:::0;::::1;::::0;::::1;:::i;:::-;;;;12085:142;;;-1:-1:-1::0;;1701:1:13;2628:7;:22;11306:927:11:o;1290:253:4:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;-1:-1:-1;;;1406:87:4;;11200:2:15;1406:87:4;;;11182:21:15;11239:2;11219:18;;;11212:30;11278:34;11258:18;;;11251:62;-1:-1:-1;;;11329:18:15;;;11322:41;11380:19;;1406:87:4;10998:407:15;1406:87:4;-1:-1:-1;;;;;;1510:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1290:253::o;9961:518:11:-;10016:21;;9998:15;10091:276;10113:28;10140:1;10113:24;:28;:::i;:::-;10109:1;:32;;;10091:276;;;10162:23;10243:4;10216:7;10189:21;10211:1;10189:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:34;;;;;;:::i;:::-;10188:59;;;;:::i;:::-;10162:85;;10261:17;10279:1;10261:20;;;;;;;;;:::i;:::-;;;:46;;-1:-1:-1;;;;;10261:20:11;;;;:46;;;;;10291:15;;10261:20;:46;:20;:46;10291:15;10261:20;:46;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10321:35:11;10341:15;10321:35;;:::i;:::-;;;10148:219;10143:3;;;;;:::i;:::-;;;;10091:276;;;-1:-1:-1;10376:17:11;10394:28;10421:1;10394:24;:28;:::i;:::-;10376:47;;;;;;;:::i;:::-;;;:96;;-1:-1:-1;;;;;10376:47:11;;;;:96;;;;;10446:16;;10376:47;:96;:47;:96;10446:16;10376:47;:96;;;;;;;;;;;;;;;;;;;5043:179:3;5176:39;5193:4;5199:2;5203:7;5176:39;;;;;;;;;;;;:16;:39::i;12999:1024:11:-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;;;;;;:::i;:::-;1744:1;2455:7;:18;13118:16:11::1;::::0;13102:32:::1;::::0;::::1;;;13081:119;;;;-1:-1:-1::0;;;13081:119:11::1;;;;;;;:::i;:::-;13260:9;::::0;::::1;::::0;;::::1;::::0;13231:25:::1;::::0;13244:12;;13231:10;;::::1;;:25;:::i;:::-;:38;;;;13210:119;;;;-1:-1:-1::0;;;13210:119:11::1;;;;;;;:::i;:::-;13361:10;13347:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;13339:61;;;::::0;-1:-1:-1;;;13339:61:11;;13123:2:15;13339:61:11::1;::::0;::::1;13105:21:15::0;13162:2;13142:18;;;13135:30;13201:25;13181:18;;;13174:53;13244:18;;13339:61:11::1;12921:347:15::0;13339:61:11::1;13459:14;::::0;13444:29:::1;::::0;::::1;::::0;::::1;;:::i;:::-;13431:9;:42;;13587:32;13604:14;;13587:16;:32::i;:::-;13511:171;;;;;;;;:::i;:::-;;;;;;;;;;;;;13410:296;;;;;-1:-1:-1::0;;;13410:296:11::1;;;;;;;;:::i;:::-;;13777:17;;13761:12;13737:36;;:21;13747:10;13737:9;:21::i;:::-;:36;;;;:::i;:::-;:57;;13716:149;;;;-1:-1:-1::0;;;13716:149:11::1;;;;;;;:::i;:::-;13880:13;13875:142;13907:12;13899:20;;:5;:20;13875:142;;;13958:1;13944:10;;:15;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13973:33;13983:10;13995;;;;;;;;;;;13973:33;;:9;:33::i;:::-;13921:7:::0;::::1;::::0;::::1;:::i;:::-;;;;13875:142;;1797:230:4::0;1872:7;1907:30;1701:10;:17;;1614:111;1907:30;1899:5;:38;1891:95;;;;-1:-1:-1;;;1891:95:4;;13889:2:15;1891:95:4;;;13871:21:15;13928:2;13908:18;;;13901:30;13967:34;13947:18;;;13940:62;-1:-1:-1;;;14018:18:15;;;14011:42;14070:19;;1891:95:4;13687:408:15;1891:95:4;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;1996:24;;1797:230;;;:::o;8601:107:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;8674:27:11;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;8601:107:::0;:::o;14718:75::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;14769:10:11::1;:17:::0;;-1:-1:-1;;14769:17:11::1;14782:4;14769:17;::::0;;14718:75::o;2111:235:3:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:3;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:3;;14663:2:15;2244:73:3;;;14645:21:15;14702:2;14682:18;;;14675:30;14741:34;14721:18;;;14714:62;-1:-1:-1;;;14792:18:15;;;14785:39;14841:19;;2244:73:3;14461:405:15;1849:205:3;1921:7;-1:-1:-1;;;;;1948:19:3;;1940:74;;;;-1:-1:-1;;;1940:74:3;;15073:2:15;1940:74:3;;;15055:21:15;15112:2;15092:18;;;15085:30;15151:34;15131:18;;;15124:62;-1:-1:-1;;;15202:18:15;;;15195:40;15252:19;;1940:74:3;14871:406:15;1940:74:3;-1:-1:-1;;;;;;2031:16:3;;;;;:9;:16;;;;;;;1849:205::o;1661:101:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;9120:106:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;9194:14:11::1;:25:::0;9120:106::o;14375:115::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;14449:27:11::1;;::::0;;;:14:::1;:27;::::0;;;;:34;;-1:-1:-1;;14449:34:11::1;14479:4;14449:34;::::0;;14375:115::o;14216:116::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;14291:26:11::1;14320:5;14291:26:::0;;;:13:::1;:26;::::0;;;;:34;;-1:-1:-1;;14291:34:11::1;::::0;;14216:116::o;10540:732::-;10677:38;;-1:-1:-1;;;10677:38:11;;10709:4;10677:38;;;1674:51:15;10634:14:11;;10604:20;;-1:-1:-1;;;;;10677:23:11;;;;;1647:18:15;;10677:38:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10659:56;-1:-1:-1;10659:56:11;10777:20;10769:63;;;;-1:-1:-1;;;10769:63:11;;15673:2:15;10769:63:11;;;15655:21:15;15712:2;15692:18;;;15685:30;15751:32;15731:18;;;15724:60;15801:18;;10769:63:11;15471:354:15;10769:63:11;10847:7;10842:291;10864:28;10891:1;10864:24;:28;:::i;:::-;10860:1;:32;;;10842:291;;;10913:23;10994:4;10967:7;10940:21;10962:1;10940:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:34;;;;;;:::i;:::-;10939:59;;;;:::i;:::-;10913:85;;11012:13;-1:-1:-1;;;;;11012:22:11;;11035:17;11053:1;11035:20;;;;;;;;;:::i;:::-;;;11012:61;;;;;;-1:-1:-1;;;;;;11012:61:11;;;-1:-1:-1;;;;;11035:20:11;;;11012:61;;;16012:51:15;16079:18;;;16072:34;;;15985:18;;11012:61:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11087:35:11;11107:15;11087:35;;:::i;:::-;;;10899:234;10894:3;;;;;:::i;:::-;;;;10842:291;;;-1:-1:-1;;;;;;11142:22:11;;;11178:17;11196:28;11223:1;11196:24;:28;:::i;:::-;11178:47;;;;;;;:::i;:::-;;;11142:123;;;;;;-1:-1:-1;;;;;;11142:123:11;;;-1:-1:-1;;;;;11178:47:11;;;11142:123;;;16012:51:15;16079:18;;;16072:34;;;15985:18;;11142:123:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10594:678;;;10540:732;:::o;14532:119::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;14609:27:11::1;14639:5;14609:27:::0;;;:14:::1;:27;::::0;;;;:35;;-1:-1:-1;;14609:35:11::1;::::0;;14532:119::o;2570:102:3:-;2626:13;2658:7;2651:14;;;;;:::i;8920:144:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;9026:31:11;;::::1;::::0;:20:::1;::::0;:31:::1;::::0;::::1;::::0;::::1;:::i;4204:153:3:-:0;4298:52;719:10:1;4331:8:3;4341;4298:18;:52::i;12267:682:11:-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;;;;;;:::i;:::-;1744:1;2455:7;:18;12376:16:11::1;::::0;12360:32:::1;::::0;::::1;;;12339:119;;;;-1:-1:-1::0;;;12339:119:11::1;;;;;;;:::i;:::-;12518:9;::::0;::::1;::::0;;::::1;::::0;12489:25:::1;::::0;12502:12;;12489:10;;::::1;;:25;:::i;:::-;:38;;;;12468:119;;;;-1:-1:-1::0;;;12468:119:11::1;;;;;;;:::i;:::-;12658:17;;12642:12;12618:36;;:21;12628:10;12618:9;:21::i;:::-;:36;;;;:::i;:::-;:57;;12597:149;;;;-1:-1:-1::0;;;12597:149:11::1;;;;;;;:::i;:::-;12779:10;12764:26;::::0;;;:14:::1;:26;::::0;;;;;::::1;;12756:35;;;::::0;::::1;;12806:13;12801:142;12833:12;12825:20;;:5;:20;12801:142;;;12884:1;12870:10;;:15;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12899:33;12909:10;12921;;;;;;;;;;;12899:33;;:9;:33::i;:::-;12847:7:::0;::::1;::::0;::::1;:::i;:::-;;;;12801:142;;5288:320:3::0;5457:41;719:10:1;5490:7:3;5457:18;:41::i;:::-;5449:103;;;;-1:-1:-1;;;5449:103:3;;;;;;;:::i;:::-;5562:39;5576:4;5582:2;5586:7;5595:5;5562:13;:39::i;:::-;5288:320;;;;:::o;8764:100:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;8835:11:11::1;:22:::0;8764:100::o;9392:240::-;9522:10;;9489:13;;9522:10;;9518:71;;;9555:23;9570:7;9555:14;:23::i;9518:71::-;9605:20;9598:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9392:240;;;:::o;1911:198:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:12;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:12;;16569:2:15;1991:73:12::1;::::0;::::1;16551:21:15::0;16608:2;16588:18;;;16581:30;16647:34;16627:18;;;16620:62;-1:-1:-1;;;16698:18:15;;;16691:36;16744:19;;1991:73:12::1;16367:402:15::0;1991:73:12::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;14062:112:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;14134:26:11::1;;::::0;;;:13:::1;:26;::::0;;;;:33;;-1:-1:-1;;14134:33:11::1;14163:4;14134:33;::::0;;14062:112::o;989:222:4:-;1091:4;-1:-1:-1;;;;;;1114:50:4;;-1:-1:-1;;;1114:50:4;;:90;;;1168:36;1192:11;1168:23;:36::i;11089:171:3:-;11163:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11163:29:3;-1:-1:-1;;;;;11163:29:3;;;;;;;;:24;;11216:23;11163:24;11216:14;:23::i;:::-;-1:-1:-1;;;;;11207:46:3;;;;;;;;;;;11089:171;;:::o;7363:344::-;7456:4;7168:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7168:16:3;7472:73;;;;-1:-1:-1;;;7472:73:3;;16976:2:15;7472:73:3;;;16958:21:15;17015:2;16995:18;;;16988:30;17054:34;17034:18;;;17027:62;-1:-1:-1;;;17105:18:15;;;17098:42;17157:19;;7472:73:3;16774:408:15;7472:73:3;7555:13;7571:23;7586:7;7571:14;:23::i;:::-;7555:39;;7623:5;-1:-1:-1;;;;;7612:16:3;:7;-1:-1:-1;;;;;7612:16:3;;:51;;;;7656:7;-1:-1:-1;;;;;7632:31:3;:20;7644:7;7632:11;:20::i;:::-;-1:-1:-1;;;;;7632:31:3;;7612:51;:87;;;-1:-1:-1;;;;;;4543:25:3;;;4520:4;4543:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7667:32;7604:96;7363:344;-1:-1:-1;;;;7363:344:3:o;10373:605::-;10527:4;-1:-1:-1;;;;;10500:31:3;:23;10515:7;10500:14;:23::i;:::-;-1:-1:-1;;;;;10500:31:3;;10492:81;;;;-1:-1:-1;;;10492:81:3;;17389:2:15;10492:81:3;;;17371:21:15;17428:2;17408:18;;;17401:30;17467:34;17447:18;;;17440:62;-1:-1:-1;;;17518:18:15;;;17511:35;17563:19;;10492:81:3;17187:401:15;10492:81:3;-1:-1:-1;;;;;10591:16:3;;10583:65;;;;-1:-1:-1;;;10583:65:3;;17795:2:15;10583:65:3;;;17777:21:15;17834:2;17814:18;;;17807:30;17873:34;17853:18;;;17846:62;-1:-1:-1;;;17924:18:15;;;17917:34;17968:19;;10583:65:3;17593:400:15;10583:65:3;10659:39;10680:4;10686:2;10690:7;10659:20;:39::i;:::-;10760:29;10777:1;10781:7;10760:8;:29::i;:::-;-1:-1:-1;;;;;10800:15:3;;;;;;:9;:15;;;;;:20;;10819:1;;10800:15;:20;;10819:1;;10800:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10830:13:3;;;;;;:9;:13;;;;;:18;;10847:1;;10830:13;:18;;10847:1;;10830:18;:::i;:::-;;;;-1:-1:-1;;10858:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10858:21:3;-1:-1:-1;;;;;10858:21:3;;;;;;;;;10895:27;;10858:16;;10895:27;;;;;;;3528:331;3458:401;;:::o;328:703:14:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:14;;;;;;;;;;;;-1:-1:-1;;;627:10:14;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:14;;-1:-1:-1;773:2:14;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:14;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:14;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:14;;;;;;;;-1:-1:-1;972:11:14;981:2;972:11;;:::i;:::-;;;844:150;;8037:108:3;8112:26;8122:2;8126:7;8112:26;;;;;;;;;;;;:9;:26::i;2263:187:12:-;2355:6;;;-1:-1:-1;;;;;2371:17:12;;;-1:-1:-1;;;;;;2371:17:12;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;11395:307:3:-;11545:8;-1:-1:-1;;;;;11536:17:3;:5;-1:-1:-1;;;;;11536:17:3;;;11528:55;;;;-1:-1:-1;;;11528:55:3;;18317:2:15;11528:55:3;;;18299:21:15;18356:2;18336:18;;;18329:30;18395:27;18375:18;;;18368:55;18440:18;;11528:55:3;18115:349:15;11528:55:3;-1:-1:-1;;;;;11593:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11593:46:3;;;;;;;;;;11654:41;;540::15;;;11654::3;;513:18:15;11654:41:3;;;;;;;11395:307;;;:::o;6470:::-;6621:28;6631:4;6637:2;6641:7;6621:9;:28::i;:::-;6667:48;6690:4;6696:2;6700:7;6709:5;6667:22;:48::i;:::-;6659:111;;;;-1:-1:-1;;;6659:111:3;;;;;;;:::i;2738:329::-;7145:4;7168:16;;;:7;:16;;;;;;2811:13;;-1:-1:-1;;;;;7168:16:3;2836:76;;;;-1:-1:-1;;;2836:76:3;;19090:2:15;2836:76:3;;;19072:21:15;19129:2;19109:18;;;19102:30;19168:34;19148:18;;;19141:62;-1:-1:-1;;;19219:18:15;;;19212:45;19274:19;;2836:76:3;18888:411:15;2836:76:3;2923:21;2947:10;:8;:10::i;:::-;2923:34;;2998:1;2980:7;2974:21;:25;:86;;;;;;;;;;;;;;;;;3026:7;3035:18;:7;:16;:18::i;:::-;3009:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2974:86;2967:93;2738:329;-1:-1:-1;;;2738:329:3:o;1490:300::-;1592:4;-1:-1:-1;;;;;;1627:40:3;;-1:-1:-1;;;1627:40:3;;:104;;-1:-1:-1;;;;;;;1683:48:3;;-1:-1:-1;;;1683:48:3;1627:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:2;;;1747:36:3;829:155:2;8309:209:11;8466:45;8493:4;8499:2;8503:7;8466:26;:45::i;8366:311:3:-;8491:18;8497:2;8501:7;8491:5;:18::i;:::-;8540:54;8571:1;8575:2;8579:7;8588:5;8540:22;:54::i;:::-;8519:151;;;;-1:-1:-1;;;8519:151:3;;;;;;;:::i;12255:778::-;12405:4;-1:-1:-1;;;;;12425:13:3;;1450:19:0;:23;12421:606:3;;12460:72;;-1:-1:-1;;;12460:72:3;;-1:-1:-1;;;;;12460:36:3;;;;;:72;;719:10:1;;12511:4:3;;12517:7;;12526:5;;12460:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12460:72:3;;;;;;;;-1:-1:-1;;12460:72:3;;;;;;;;;;;;:::i;:::-;;;12456:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12699:13:3;;12695:266;;12741:60;;-1:-1:-1;;;12741:60:3;;;;;;;:::i;12695:266::-;12913:6;12907:13;12898:6;12894:2;12890:15;12883:38;12456:519;-1:-1:-1;;;;;;12582:51:3;-1:-1:-1;;;12582:51:3;;-1:-1:-1;12575:58:3;;12421:606;-1:-1:-1;13012:4:3;12255:778;;;;;;:::o;9271:115:11:-;9331:13;9363:16;9356:23;;;;;:::i;2623:572:4:-;-1:-1:-1;;;;;2822:18:4;;2818:183;;2856:40;2888:7;4004:10;:17;;3977:24;;;;:15;:24;;;;;:44;;;4031:24;;;;;;;;;;;;3901:161;2856:40;2818:183;;;2925:2;-1:-1:-1;;;;;2917:10:4;:4;-1:-1:-1;;;;;2917:10:4;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;-1:-1:-1;;;;;3014:16:4;;3010:179;;3046:45;3083:7;3046:36;:45::i;3010:179::-;3118:4;-1:-1:-1;;;;;3112:10:4;:2;-1:-1:-1;;;;;3112:10:4;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;8999:427:3:-;-1:-1:-1;;;;;9078:16:3;;9070:61;;;;-1:-1:-1;;;9070:61:3;;20729:2:15;9070:61:3;;;20711:21:15;;;20748:18;;;20741:30;20807:34;20787:18;;;20780:62;20859:18;;9070:61:3;20527:356:15;9070:61:3;7145:4;7168:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7168:16:3;:30;9141:58;;;;-1:-1:-1;;;9141:58:3;;21090:2:15;9141:58:3;;;21072:21:15;21129:2;21109:18;;;21102:30;21168;21148:18;;;21141:58;21216:18;;9141:58:3;20888:352:15;9141:58:3;9210:45;9239:1;9243:2;9247:7;9210:20;:45::i;:::-;-1:-1:-1;;;;;9266:13:3;;;;;;:9;:13;;;;;:18;;9283:1;;9266:13;:18;;9283:1;;9266:18;:::i;:::-;;;;-1:-1:-1;;9294:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9294:21:3;-1:-1:-1;;;;;9294:21:3;;;;;;;;9331:33;;9294:16;;;9331:33;;9294:16;;9331:33;8674:27:11::1;8601:107:::0;:::o;4679:970:4:-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;5002:18;5023:26;;;:17;:26;;;;;;4941:51;;-1:-1:-1;5153:28:4;;;5149:323;;-1:-1:-1;;;;;5219:18:4;;5197:19;5219:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5268:30;;;;;;:44;;;5384:30;;:17;:30;;;;;:43;;;5149:323;-1:-1:-1;5565:26:4;;;;:17;:26;;;;;;;;5558:33;;;-1:-1:-1;;;;;5608:18:4;;;;;:12;:18;;;;;:34;;;;;;;5601:41;4679:970::o;5937:1061::-;6211:10;:17;6186:22;;6211:21;;6231:1;;6211:21;:::i;:::-;6242:18;6263:24;;;:15;:24;;;;;;6631:10;:26;;6186:46;;-1:-1:-1;6263:24:4;;6186:46;;6631:26;;;;;;:::i;:::-;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6772:28;;;:15;:28;;;;;;;:41;;;6941:24;;;;;6934:31;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;-1:-1:-1;;;;;3620:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3664:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3489:217:4:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:15;-1:-1:-1;;;;;;88:32:15;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:15;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:15;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:15:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:15;;1343:180;-1:-1:-1;1343:180:15:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:15;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:15:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:272::-;2746:6;2799:2;2787:9;2778:7;2774:23;2770:32;2767:52;;;2815:1;2812;2805:12;2767:52;2854:9;2841:23;2904:6;2897:5;2893:18;2886:5;2883:29;2873:57;;2926:1;2923;2916:12;3158:127;3219:10;3214:3;3210:20;3207:1;3200:31;3250:4;3247:1;3240:15;3274:4;3271:1;3264:15;3290:632;3355:5;3385:18;3426:2;3418:6;3415:14;3412:40;;;3432:18;;:::i;:::-;3507:2;3501:9;3475:2;3561:15;;-1:-1:-1;;3557:24:15;;;3583:2;3553:33;3549:42;3537:55;;;3607:18;;;3627:22;;;3604:46;3601:72;;;3653:18;;:::i;:::-;3693:10;3689:2;3682:22;3722:6;3713:15;;3752:6;3744;3737:22;3792:3;3783:6;3778:3;3774:16;3771:25;3768:45;;;3809:1;3806;3799:12;3768:45;3859:6;3854:3;3847:4;3839:6;3835:17;3822:44;3914:1;3907:4;3898:6;3890;3886:19;3882:30;3875:41;;;;3290:632;;;;;:::o;3927:451::-;3996:6;4049:2;4037:9;4028:7;4024:23;4020:32;4017:52;;;4065:1;4062;4055:12;4017:52;4105:9;4092:23;4138:18;4130:6;4127:30;4124:50;;;4170:1;4167;4160:12;4124:50;4193:22;;4246:4;4238:13;;4234:27;-1:-1:-1;4224:55:15;;4275:1;4272;4265:12;4224:55;4298:74;4364:7;4359:2;4346:16;4341:2;4337;4333:11;4298:74;:::i;4383:186::-;4442:6;4495:2;4483:9;4474:7;4470:23;4466:32;4463:52;;;4511:1;4508;4501:12;4463:52;4534:29;4553:9;4534:29;:::i;4574:118::-;4660:5;4653:13;4646:21;4639:5;4636:32;4626:60;;4682:1;4679;4672:12;4697:315;4762:6;4770;4823:2;4811:9;4802:7;4798:23;4794:32;4791:52;;;4839:1;4836;4829:12;4791:52;4862:29;4881:9;4862:29;:::i;:::-;4852:39;;4941:2;4930:9;4926:18;4913:32;4954:28;4976:5;4954:28;:::i;:::-;5001:5;4991:15;;;4697:315;;;;;:::o;5017:667::-;5112:6;5120;5128;5136;5189:3;5177:9;5168:7;5164:23;5160:33;5157:53;;;5206:1;5203;5196:12;5157:53;5229:29;5248:9;5229:29;:::i;:::-;5219:39;;5277:38;5311:2;5300:9;5296:18;5277:38;:::i;:::-;5267:48;;5362:2;5351:9;5347:18;5334:32;5324:42;;5417:2;5406:9;5402:18;5389:32;5444:18;5436:6;5433:30;5430:50;;;5476:1;5473;5466:12;5430:50;5499:22;;5552:4;5544:13;;5540:27;-1:-1:-1;5530:55:15;;5581:1;5578;5571:12;5530:55;5604:74;5670:7;5665:2;5652:16;5647:2;5643;5639:11;5604:74;:::i;:::-;5594:84;;;5017:667;;;;;;;:::o;5689:260::-;5757:6;5765;5818:2;5806:9;5797:7;5793:23;5789:32;5786:52;;;5834:1;5831;5824:12;5786:52;5857:29;5876:9;5857:29;:::i;:::-;5847:39;;5905:38;5939:2;5928:9;5924:18;5905:38;:::i;:::-;5895:48;;5689:260;;;;;:::o;5954:380::-;6033:1;6029:12;;;;6076;;;6097:61;;6151:4;6143:6;6139:17;6129:27;;6097:61;6204:2;6196:6;6193:14;6173:18;6170:38;6167:161;;;6250:10;6245:3;6241:20;6238:1;6231:31;6285:4;6282:1;6275:15;6313:4;6310:1;6303:15;6167:161;;5954:380;;;:::o;7579:413::-;7781:2;7763:21;;;7820:2;7800:18;;;7793:30;7859:34;7854:2;7839:18;;7832:62;-1:-1:-1;;;7925:2:15;7910:18;;7903:47;7982:3;7967:19;;7579:413::o;7997:355::-;8199:2;8181:21;;;8238:2;8218:18;;;8211:30;8277:33;8272:2;8257:18;;8250:61;8343:2;8328:18;;7997:355::o;8766:127::-;8827:10;8822:3;8818:20;8815:1;8808:31;8858:4;8855:1;8848:15;8882:4;8879:1;8872:15;8898:224;8937:3;8965:6;8998:2;8995:1;8991:10;9028:2;9025:1;9021:10;9059:3;9055:2;9051:12;9046:3;9043:21;9040:47;;;9067:18;;:::i;:::-;9103:13;;8898:224;-1:-1:-1;;;;8898:224:15:o;9529:168::-;9569:7;9635:1;9631;9627:6;9623:14;9620:1;9617:21;9612:1;9605:9;9598:17;9594:45;9591:71;;;9642:18;;:::i;:::-;-1:-1:-1;9682:9:15;;9529:168::o;9702:608::-;-1:-1:-1;;;10060:3:15;10053:29;10035:3;10111:6;10105:13;10127:62;10182:6;10177:2;10172:3;10168:12;10161:4;10153:6;10149:17;10127:62;:::i;:::-;-1:-1:-1;;;10248:2:15;10208:16;;;;10240:11;;;10233:44;-1:-1:-1;10301:2:15;10293:11;;9702:608;-1:-1:-1;9702:608:15:o;10315:128::-;10355:3;10386:1;10382:6;10379:1;10376:13;10373:39;;;10392:18;;:::i;:::-;-1:-1:-1;10428:9:15;;10315:128::o;10858:135::-;10897:3;-1:-1:-1;;10918:17:15;;10915:43;;;10938:18;;:::i;:::-;-1:-1:-1;10985:1:15;10974:13;;10858:135::o;11410:125::-;11450:4;11478:1;11475;11472:8;11469:34;;;11483:18;;:::i;:::-;-1:-1:-1;11520:9:15;;11410:125::o;11540:127::-;11601:10;11596:3;11592:20;11589:1;11582:31;11632:4;11629:1;11622:15;11656:4;11653:1;11646:15;11672:127;11733:10;11728:3;11724:20;11721:1;11714:31;11764:4;11761:1;11754:15;11788:4;11785:1;11778:15;11804:120;11844:1;11870;11860:35;;11875:18;;:::i;:::-;-1:-1:-1;11909:9:15;;11804:120::o;11929:175::-;11966:3;12010:4;12003:5;11999:16;12039:4;12030:7;12027:17;12024:43;;;12047:18;;:::i;:::-;12096:1;12083:15;;11929:175;-1:-1:-1;;11929:175:15:o;12109:404::-;12311:2;12293:21;;;12350:2;12330:18;;;12323:30;12389:34;12384:2;12369:18;;12362:62;-1:-1:-1;;;12455:2:15;12440:18;;12433:38;12503:3;12488:19;;12109:404::o;12518:398::-;12720:2;12702:21;;;12759:2;12739:18;;;12732:30;12798:34;12793:2;12778:18;;12771:62;-1:-1:-1;;;12864:2:15;12849:18;;12842:32;12906:3;12891:19;;12518:398::o;13273:409::-;13475:2;13457:21;;;13514:2;13494:18;;;13487:30;13553:34;13548:2;13533:18;;13526:62;-1:-1:-1;;;13619:2:15;13604:18;;13597:43;13672:3;13657:19;;13273:409::o;14100:356::-;14302:2;14284:21;;;14321:18;;;14314:30;14380:34;14375:2;14360:18;;14353:62;14447:2;14432:18;;14100:356::o;15282:184::-;15352:6;15405:2;15393:9;15384:7;15380:23;15376:32;15373:52;;;15421:1;15418;15411:12;15373:52;-1:-1:-1;15444:16:15;;15282:184;-1:-1:-1;15282:184:15:o;16117:245::-;16184:6;16237:2;16225:9;16216:7;16212:23;16208:32;16205:52;;;16253:1;16250;16243:12;16205:52;16285:9;16279:16;16304:28;16326:5;16304:28;:::i;17998:112::-;18030:1;18056;18046:35;;18061:18;;:::i;:::-;-1:-1:-1;18095:9:15;;17998:112::o;18469:414::-;18671:2;18653:21;;;18710:2;18690:18;;;18683:30;18749:34;18744:2;18729:18;;18722:62;-1:-1:-1;;;18815:2:15;18800:18;;18793:48;18873:3;18858:19;;18469:414::o;19304:470::-;19483:3;19521:6;19515:13;19537:53;19583:6;19578:3;19571:4;19563:6;19559:17;19537:53;:::i;:::-;19653:13;;19612:16;;;;19675:57;19653:13;19612:16;19709:4;19697:17;;19675:57;:::i;19779:489::-;-1:-1:-1;;;;;20048:15:15;;;20030:34;;20100:15;;20095:2;20080:18;;20073:43;20147:2;20132:18;;20125:34;;;20195:3;20190:2;20175:18;;20168:31;;;19973:4;;20216:46;;20242:19;;20234:6;20216:46;:::i;:::-;20208:54;19779:489;-1:-1:-1;;;;;;19779:489:15:o;20273:249::-;20342:6;20395:2;20383:9;20374:7;20370:23;20366:32;20363:52;;;20411:1;20408;20401:12;20363:52;20443:9;20437:16;20462:30;20486:5;20462:30;:::i;21245:127::-;21306:10;21301:3;21297:20;21294:1;21287:31;21337:4;21334:1;21327:15;21361:4;21358:1;21351:15

Swarm Source

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