ETH Price: $2,314.14 (+0.30%)

Token

ChilliSwap NFT (CHLINFT)
 

Overview

Max Total Supply

0 CHLINFT

Holders

7

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CHLINFT
0x0f985daa4b51862ef71522943c2fb8a373cf4b57
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:
ChilliSwapNFT

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Counters.sol";
import "./Ownable.sol";

import "./IChilliSwap.sol";

contract ChilliSwapNFT is ERC721, IChilliSwap,Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    
    mapping(string => uint8) hashes;
    mapping(uint256 => Artwork) private artworks;
    mapping(address => uint8) private creators;

    address public nftMarketContract;


    constructor() ERC721("ChilliSwap NFT", "CHLINFT") {}


    function mintNFT(address recipient, string memory metadata, string memory artwork,  uint256 royalty ) public override returns (uint256) {
        require(hashes[metadata] != 1);
        require(hashes[artwork] != 1);
        require(creators[msg.sender] == 1, "ChilliSwapNFT: be a creator");
        require(royalty <= 50);

        hashes[metadata] = 1;
        hashes[artwork] = 1;
      
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        artworks[newItemId] = Artwork(block.timestamp, msg.sender, artwork, metadata, royalty);
        _mint(recipient, newItemId);
       // _setTokenURI(newItemId, tokenURI);
        emit Mint(recipient, newItemId, artwork);
        return newItemId;

    }



  function mintAndApproveNFT(address recipient, string memory metadata, string memory artwork,  uint256 royalty ) public override returns (uint256) {
        
        require(hashes[metadata] != 1);
        require(hashes[artwork] != 1);
        require(creators[msg.sender] == 1, "ChilliSwapNFT: be a creator");
        require(royalty <= 50);

        hashes[metadata] = 1;
        hashes[artwork] = 1;
      
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        artworks[newItemId] = Artwork(block.timestamp, msg.sender, artwork, metadata, royalty);
        _mint(recipient, newItemId);

        emit Mint(recipient, newItemId, artwork);
        _approve(nftMarketContract, newItemId);

        return newItemId;

    }



    function burnNFT(uint256 tokenId) public override returns(bool){
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        Artwork memory artwork = artworks[tokenId];

        delete artworks[tokenId];
        delete hashes[artwork.metadata];
        delete hashes[artwork.artwork];

       _burn(tokenId);

       return true;

    }

    function getArtwork(uint256 tokenId) public view override returns (Artwork memory){
        require( _exists(tokenId), "ERC721: approved query for nonexistent token" );
        return artworks[tokenId];
    }

    function isCreator(address creator) public view override returns(bool){
        return creators[creator] == 1;
    }


    function addCreator(address creator) public override onlyOwner returns(bool){
        require(creators[creator] != 1, "ChilliSwapNFT: creator already exist");
        creators[creator] = 1;
        return true;
    }
    function removeCreator(address creator)  public  override onlyOwner returns(bool){
        require(creators[creator] == 1, "ChilliSwapNFT: creator doesn't exist");
        creators[creator] = 0;
        return true;
    }
    
    function setNftMarketContract(address marketContract) public  override onlyOwner returns(bool){
       nftMarketContract = marketContract;
        return true;
    }

    

  }

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

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _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 || ERC721.isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.0;

interface IChilliSwap {

//    enum CURRENCY{ ETH, TOKEN}

    struct Artwork {
        uint256 date;
        address creator;
        string artwork;
        string metadata;
        uint256 royalty;
    }



    function mintNFT( address recipient, string memory metadata,  string memory artwork,  uint256 royalty) external returns (uint256);
    function mintAndApproveNFT( address recipient, string memory metadata,  string memory artwork,  uint256 royalty) external returns (uint256);

    function burnNFT(uint256 tokenId)  external  returns(bool);

    function getArtwork(uint256 tokenId) external view returns (Artwork memory);
  
    function isCreator(address creator)  external view returns(bool);


    function addCreator(address creator)  external returns(bool);    
    function removeCreator(address creator)  external returns(bool);

    function setNftMarketContract(address marketContract) external  returns(bool);


     event Mint(address indexed to, uint256  tokenId, string artwork);


}

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[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":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"artwork","type":"string"}],"name":"Mint","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":[{"internalType":"address","name":"creator","type":"address"}],"name":"addCreator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"burnNFT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getArtwork","outputs":[{"components":[{"internalType":"uint256","name":"date","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"string","name":"artwork","type":"string"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"uint256","name":"royalty","type":"uint256"}],"internalType":"struct IChilliSwap.Artwork","name":"","type":"tuple"}],"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":"address","name":"creator","type":"address"}],"name":"isCreator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"string","name":"artwork","type":"string"},{"internalType":"uint256","name":"royalty","type":"uint256"}],"name":"mintAndApproveNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"string","name":"metadata","type":"string"},{"internalType":"string","name":"artwork","type":"string"},{"internalType":"uint256","name":"royalty","type":"uint256"}],"name":"mintNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftMarketContract","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"creator","type":"address"}],"name":"removeCreator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketContract","type":"address"}],"name":"setNftMarketContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]

60806040523480156200001157600080fd5b50604080518082018252600e81526d10da1a5b1b1a54ddd85c0813919560921b60208083019182528351808501909452600784526610d2131253919560ca1b9084015281519192916200006791600091620000ea565b5080516200007d906001906020840190620000ea565b505050600062000092620000e660201b60201c565b600680546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001cd565b3390565b828054620000f89062000190565b90600052602060002090601f0160209004810192826200011c576000855562000167565b82601f106200013757805160ff191683800117855562000167565b8280016001018555821562000167579182015b82811115620001675782518255916020019190600101906200014a565b506200017592915062000179565b5090565b5b808211156200017557600081556001016200017a565b600281046001821680620001a557607f821691505b60208210811415620001c757634e487b7160e01b600052602260045260246000fd5b50919050565b6125bb80620001dd6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80636352211e116100de578063b88d4fde11610097578063cdd1e9ba11610071578063cdd1e9ba1461031c578063e985e9c51461032f578063efd4606514610342578063f2fde38b1461035557610173565b8063b88d4fde146102e3578063bd6018bb146102f6578063c87b56dd1461030957610173565b80636352211e1461029257806370a08231146102a5578063715018a6146102b85780638da5cb5b146102c057806395d89b41146102c8578063a22cb465146102d057610173565b806323b872dd1161013057806323b872dd146102135780632890e0d7146102265780633b9dce051461023957806342842e0e1461024c5780634979684c1461025f57806351f8fefe1461027f57610173565b806301ffc9a71461017857806306fdde03146101a1578063081812fc146101b6578063095ea7b3146101d6578063167ddf6e146101eb5780631a7438091461020b575b600080fd5b61018b610186366004611d1b565b610368565b6040516101989190611e33565b60405180910390f35b6101a96103b0565b6040516101989190611e3e565b6101c96101c4366004611d53565b610442565b6040516101989190611de2565b6101e96101e4366004611cf2565b61048e565b005b6101fe6101f9366004611d53565b610526565b60405161019891906123c6565b6101c96106c2565b6101e9610221366004611b8b565b6106d1565b61018b610234366004611d53565b610709565b61018b610247366004611b3f565b61094e565b6101e961025a366004611b8b565b6109f4565b61027261026d366004611c79565b610a0f565b6040516101989190612432565b61027261028d366004611c79565b610c46565b6101c96102a0366004611d53565b610e65565b6102726102b3366004611b3f565b610e9a565b6101e9610ede565b6101c9610f67565b6101a9610f76565b6101e96102de366004611c3f565b610f85565b6101e96102f1366004611bc6565b611053565b61018b610304366004611b3f565b61108c565b6101a9610317366004611d53565b61112d565b61018b61032a366004611b3f565b6111b0565b61018b61033d366004611b59565b611216565b61018b610350366004611b3f565b611244565b6101e9610363366004611b3f565b611265565b60006001600160e01b031982166380ac58cd60e01b148061039957506001600160e01b03198216635b5e139f60e01b145b806103a857506103a882611326565b90505b919050565b6060600080546103bf906124c3565b80601f01602080910402602001604051908101604052809291908181526020018280546103eb906124c3565b80156104385780601f1061040d57610100808354040283529160200191610438565b820191906000526020600020905b81548152906001019060200180831161041b57829003601f168201915b5050505050905090565b600061044d8261133f565b6104725760405162461bcd60e51b815260040161046990612194565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061049982610e65565b9050806001600160a01b0316836001600160a01b031614156104cd5760405162461bcd60e51b8152600401610469906122e4565b806001600160a01b03166104df61135c565b6001600160a01b031614806104fb57506104fb8161033d61135c565b6105175760405162461bcd60e51b81526004016104699061202b565b6105218383611360565b505050565b61052e611989565b6105378261133f565b6105535760405162461bcd60e51b815260040161046990612194565b600082815260096020908152604091829020825160a0810184528154815260018201546001600160a01b031692810192909252600281018054929391929184019161059d906124c3565b80601f01602080910402602001604051908101604052809291908181526020018280546105c9906124c3565b80156106165780601f106105eb57610100808354040283529160200191610616565b820191906000526020600020905b8154815290600101906020018083116105f957829003601f168201915b5050505050815260200160038201805461062f906124c3565b80601f016020809104026020016040519081016040528092919081815260200182805461065b906124c3565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b505050505081526020016004820154815250509050919050565b600b546001600160a01b031681565b6106e26106dc61135c565b826113ce565b6106fe5760405162461bcd60e51b815260040161046990612325565b61052183838361144b565b600061071c61071661135c565b836113ce565b6107385760405162461bcd60e51b815260040161046990612376565b6000828152600960209081526040808320815160a0810183528154815260018201546001600160a01b031693810193909352600281018054919284019161077e906124c3565b80601f01602080910402602001604051908101604052809291908181526020018280546107aa906124c3565b80156107f75780601f106107cc576101008083540402835291602001916107f7565b820191906000526020600020905b8154815290600101906020018083116107da57829003601f168201915b50505050508152602001600382018054610810906124c3565b80601f016020809104026020016040519081016040528092919081815260200182805461083c906124c3565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505091835250506004919091015460209182015260008581526009909152604081208181556001810180546001600160a01b03191690559192506108d160028301826119c1565b6108df6003830160006119c1565b60048201600090555050600881606001516040516108fd9190611d97565b90815260408051918290036020018220805460ff191690558201516008916109259190611d97565b908152604051908190036020019020805460ff1916905561094583611578565b50600192915050565b600061095861135c565b6001600160a01b0316610969610f67565b6001600160a01b03161461098f5760405162461bcd60e51b8152600401610469906121e0565b6001600160a01b0382166000908152600a602052604090205460ff16600114156109cb5760405162461bcd60e51b81526004016104699061211b565b506001600160a01b03166000908152600a60205260409020805460ff1916600190811790915590565b61052183838360405180602001604052806000815250611053565b6000600884604051610a219190611d97565b9081526040519081900360200190205460ff1660011415610a4157600080fd5b600883604051610a519190611d97565b9081526040519081900360200190205460ff1660011415610a7157600080fd5b336000908152600a602052604090205460ff16600114610aa35760405162461bcd60e51b815260040161046990612215565b6032821115610ab157600080fd5b6001600885604051610ac39190611d97565b908152602001604051809103902060006101000a81548160ff021916908360ff1602179055506001600884604051610afb9190611d97565b908152604051908190036020019020805460ff9290921660ff19909216919091179055610b28600761161f565b6000610b346007611628565b6040805160a081018252428152336020808301918252828401898152606084018b905260808401899052600086815260098352949094208351815591516001830180546001600160a01b0319166001600160a01b039092169190911790559251805194955091939092610bae926002850192910190611a00565b5060608201518051610bca916003840191602090910190611a00565b5060808201518160040155905050610be2868261162c565b856001600160a01b03167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a8286604051610c1d92919061243b565b60405180910390a2600b54610c3b906001600160a01b031682611360565b90505b949350505050565b6000600884604051610c589190611d97565b9081526040519081900360200190205460ff1660011415610c7857600080fd5b600883604051610c889190611d97565b9081526040519081900360200190205460ff1660011415610ca857600080fd5b336000908152600a602052604090205460ff16600114610cda5760405162461bcd60e51b815260040161046990612215565b6032821115610ce857600080fd5b6001600885604051610cfa9190611d97565b908152602001604051809103902060006101000a81548160ff021916908360ff1602179055506001600884604051610d329190611d97565b908152604051908190036020019020805460ff9290921660ff19909216919091179055610d5f600761161f565b6000610d6b6007611628565b6040805160a081018252428152336020808301918252828401898152606084018b905260808401899052600086815260098352949094208351815591516001830180546001600160a01b0319166001600160a01b039092169190911790559251805194955091939092610de5926002850192910190611a00565b5060608201518051610e01916003840191602090910190611a00565b5060808201518160040155905050610e19868261162c565b856001600160a01b03167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a8286604051610e5492919061243b565b60405180910390a295945050505050565b6000818152600260205260408120546001600160a01b0316806103a85760405162461bcd60e51b8152600401610469906120d2565b60006001600160a01b038216610ec25760405162461bcd60e51b815260040161046990612088565b506001600160a01b031660009081526003602052604090205490565b610ee661135c565b6001600160a01b0316610ef7610f67565b6001600160a01b031614610f1d5760405162461bcd60e51b8152600401610469906121e0565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b6006546001600160a01b031690565b6060600180546103bf906124c3565b610f8d61135c565b6001600160a01b0316826001600160a01b03161415610fbe5760405162461bcd60e51b815260040161046990611fa8565b8060056000610fcb61135c565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561100f61135c565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110479190611e33565b60405180910390a35050565b61105e61071661135c565b61107a5760405162461bcd60e51b815260040161046990612325565b6110868484848461170b565b50505050565b600061109661135c565b6001600160a01b03166110a7610f67565b6001600160a01b0316146110cd5760405162461bcd60e51b8152600401610469906121e0565b6001600160a01b0382166000908152600a602052604090205460ff166001146111085760405162461bcd60e51b815260040161046990611f20565b506001600160a01b03166000908152600a60205260409020805460ff19169055600190565b60606111388261133f565b6111545760405162461bcd60e51b815260040161046990612295565b600061115e61173e565b9050600081511161117e57604051806020016040528060008152506111a9565b8061118884611750565b604051602001611199929190611db3565b6040516020818303038152906040525b9392505050565b60006111ba61135c565b6001600160a01b03166111cb610f67565b6001600160a01b0316146111f15760405162461bcd60e51b8152600401610469906121e0565b50600b80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6001600160a01b03166000908152600a602052604090205460ff1660011490565b61126d61135c565b6001600160a01b031661127e610f67565b6001600160a01b0316146112a45760405162461bcd60e51b8152600401610469906121e0565b6001600160a01b0381166112ca5760405162461bcd60e51b815260040161046990611ea3565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061139582610e65565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113d98261133f565b6113f55760405162461bcd60e51b815260040161046990611fdf565b600061140083610e65565b9050806001600160a01b0316846001600160a01b0316148061143b5750836001600160a01b031661143084610442565b6001600160a01b0316145b80610c3e5750610c3e8185611216565b826001600160a01b031661145e82610e65565b6001600160a01b0316146114845760405162461bcd60e51b81526004016104699061224c565b6001600160a01b0382166114aa5760405162461bcd60e51b815260040161046990611f64565b6114b5838383610521565b6114c0600082611360565b6001600160a01b03831660009081526003602052604081208054600192906114e9908490612480565b90915550506001600160a01b0382166000908152600360205260408120805460019290611517908490612454565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061158382610e65565b905061159181600084610521565b61159c600083611360565b6001600160a01b03811660009081526003602052604081208054600192906115c5908490612480565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b80546001019055565b5490565b6001600160a01b0382166116525760405162461bcd60e51b81526004016104699061215f565b61165b8161133f565b156116785760405162461bcd60e51b815260040161046990611ee9565b61168460008383610521565b6001600160a01b03821660009081526003602052604081208054600192906116ad908490612454565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61171684848461144b565b6117228484848461186b565b6110865760405162461bcd60e51b815260040161046990611e51565b60408051602081019091526000815290565b60608161177557506040805180820190915260018152600360fc1b60208201526103ab565b8160005b811561179f5780611789816124fe565b91506117989050600a8361246c565b9150611779565b60008167ffffffffffffffff8111156117c857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156117f2576020820181803683370190505b5090505b8415610c3e57611807600183612480565b9150611814600a86612519565b61181f906030612454565b60f81b81838151811061184257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611864600a8661246c565b94506117f6565b600061187f846001600160a01b0316611983565b1561197b57836001600160a01b031663150b7a0261189b61135c565b8786866040518563ffffffff1660e01b81526004016118bd9493929190611df6565b602060405180830381600087803b1580156118d757600080fd5b505af1925050508015611907575060408051601f3d908101601f1916820190925261190491810190611d37565b60015b611961573d808015611935576040519150601f19603f3d011682016040523d82523d6000602084013e61193a565b606091505b5080516119595760405162461bcd60e51b815260040161046990611e51565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610c3e565b506001610c3e565b3b151590565b6040518060a001604052806000815260200160006001600160a01b031681526020016060815260200160608152602001600081525090565b5080546119cd906124c3565b6000825580601f106119df57506119fd565b601f0160209004906000526020600020908101906119fd9190611a84565b50565b828054611a0c906124c3565b90600052602060002090601f016020900481019282611a2e5760008555611a74565b82601f10611a4757805160ff1916838001178555611a74565b82800160010185558215611a74579182015b82811115611a74578251825591602001919060010190611a59565b50611a80929150611a84565b5090565b5b80821115611a805760008155600101611a85565b600067ffffffffffffffff80841115611ab457611ab4612559565b604051601f8501601f191681016020018281118282101715611ad857611ad8612559565b604052848152915081838501861015611af057600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146103ab57600080fd5b600082601f830112611b30578081fd5b6111a983833560208501611a99565b600060208284031215611b50578081fd5b6111a982611b09565b60008060408385031215611b6b578081fd5b611b7483611b09565b9150611b8260208401611b09565b90509250929050565b600080600060608486031215611b9f578081fd5b611ba884611b09565b9250611bb660208501611b09565b9150604084013590509250925092565b60008060008060808587031215611bdb578081fd5b611be485611b09565b9350611bf260208601611b09565b925060408501359150606085013567ffffffffffffffff811115611c14578182fd5b8501601f81018713611c24578182fd5b611c3387823560208401611a99565b91505092959194509250565b60008060408385031215611c51578182fd5b611c5a83611b09565b915060208301358015158114611c6e578182fd5b809150509250929050565b60008060008060808587031215611c8e578384fd5b611c9785611b09565b9350602085013567ffffffffffffffff80821115611cb3578485fd5b611cbf88838901611b20565b94506040870135915080821115611cd4578384fd5b50611ce187828801611b20565b949793965093946060013593505050565b60008060408385031215611d04578182fd5b611d0d83611b09565b946020939093013593505050565b600060208284031215611d2c578081fd5b81356111a98161256f565b600060208284031215611d48578081fd5b81516111a98161256f565b600060208284031215611d64578081fd5b5035919050565b60008151808452611d83816020860160208601612497565b601f01601f19169290920160200192915050565b60008251611da9818460208701612497565b9190910192915050565b60008351611dc5818460208801612497565b835190830190611dd9818360208801612497565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e2990830184611d6b565b9695505050505050565b901515815260200190565b6000602082526111a96020830184611d6b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4368696c6c69537761704e46543a2063726561746f7220646f65736e277420656040820152631e1a5cdd60e21b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526024908201527f4368696c6c69537761704e46543a2063726561746f7220616c726561647920656040820152631e1a5cdd60e21b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4368696c6c69537761704e46543a20626520612063726561746f720000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b6000602082528251602083015260018060a01b036020840151166040830152604083015160a060608401526123fe60c0840182611d6b565b90506060840151601f1984830301608085015261241b8282611d6b565b915050608084015160a08401528091505092915050565b90815260200190565b600083825260406020830152610c3e6040830184611d6b565b600082198211156124675761246761252d565b500190565b60008261247b5761247b612543565b500490565b6000828210156124925761249261252d565b500390565b60005b838110156124b257818101518382015260200161249a565b838111156110865750506000910152565b6002810460018216806124d757607f821691505b602082108114156124f857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125125761251261252d565b5060010190565b60008261252857612528612543565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146119fd57600080fdfea26469706673582212202d79b3dab4ebe2dcbaaa47f4661010d87749a14c8ba0ba5e0923d5ec346f1ec864736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c80636352211e116100de578063b88d4fde11610097578063cdd1e9ba11610071578063cdd1e9ba1461031c578063e985e9c51461032f578063efd4606514610342578063f2fde38b1461035557610173565b8063b88d4fde146102e3578063bd6018bb146102f6578063c87b56dd1461030957610173565b80636352211e1461029257806370a08231146102a5578063715018a6146102b85780638da5cb5b146102c057806395d89b41146102c8578063a22cb465146102d057610173565b806323b872dd1161013057806323b872dd146102135780632890e0d7146102265780633b9dce051461023957806342842e0e1461024c5780634979684c1461025f57806351f8fefe1461027f57610173565b806301ffc9a71461017857806306fdde03146101a1578063081812fc146101b6578063095ea7b3146101d6578063167ddf6e146101eb5780631a7438091461020b575b600080fd5b61018b610186366004611d1b565b610368565b6040516101989190611e33565b60405180910390f35b6101a96103b0565b6040516101989190611e3e565b6101c96101c4366004611d53565b610442565b6040516101989190611de2565b6101e96101e4366004611cf2565b61048e565b005b6101fe6101f9366004611d53565b610526565b60405161019891906123c6565b6101c96106c2565b6101e9610221366004611b8b565b6106d1565b61018b610234366004611d53565b610709565b61018b610247366004611b3f565b61094e565b6101e961025a366004611b8b565b6109f4565b61027261026d366004611c79565b610a0f565b6040516101989190612432565b61027261028d366004611c79565b610c46565b6101c96102a0366004611d53565b610e65565b6102726102b3366004611b3f565b610e9a565b6101e9610ede565b6101c9610f67565b6101a9610f76565b6101e96102de366004611c3f565b610f85565b6101e96102f1366004611bc6565b611053565b61018b610304366004611b3f565b61108c565b6101a9610317366004611d53565b61112d565b61018b61032a366004611b3f565b6111b0565b61018b61033d366004611b59565b611216565b61018b610350366004611b3f565b611244565b6101e9610363366004611b3f565b611265565b60006001600160e01b031982166380ac58cd60e01b148061039957506001600160e01b03198216635b5e139f60e01b145b806103a857506103a882611326565b90505b919050565b6060600080546103bf906124c3565b80601f01602080910402602001604051908101604052809291908181526020018280546103eb906124c3565b80156104385780601f1061040d57610100808354040283529160200191610438565b820191906000526020600020905b81548152906001019060200180831161041b57829003601f168201915b5050505050905090565b600061044d8261133f565b6104725760405162461bcd60e51b815260040161046990612194565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061049982610e65565b9050806001600160a01b0316836001600160a01b031614156104cd5760405162461bcd60e51b8152600401610469906122e4565b806001600160a01b03166104df61135c565b6001600160a01b031614806104fb57506104fb8161033d61135c565b6105175760405162461bcd60e51b81526004016104699061202b565b6105218383611360565b505050565b61052e611989565b6105378261133f565b6105535760405162461bcd60e51b815260040161046990612194565b600082815260096020908152604091829020825160a0810184528154815260018201546001600160a01b031692810192909252600281018054929391929184019161059d906124c3565b80601f01602080910402602001604051908101604052809291908181526020018280546105c9906124c3565b80156106165780601f106105eb57610100808354040283529160200191610616565b820191906000526020600020905b8154815290600101906020018083116105f957829003601f168201915b5050505050815260200160038201805461062f906124c3565b80601f016020809104026020016040519081016040528092919081815260200182805461065b906124c3565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b505050505081526020016004820154815250509050919050565b600b546001600160a01b031681565b6106e26106dc61135c565b826113ce565b6106fe5760405162461bcd60e51b815260040161046990612325565b61052183838361144b565b600061071c61071661135c565b836113ce565b6107385760405162461bcd60e51b815260040161046990612376565b6000828152600960209081526040808320815160a0810183528154815260018201546001600160a01b031693810193909352600281018054919284019161077e906124c3565b80601f01602080910402602001604051908101604052809291908181526020018280546107aa906124c3565b80156107f75780601f106107cc576101008083540402835291602001916107f7565b820191906000526020600020905b8154815290600101906020018083116107da57829003601f168201915b50505050508152602001600382018054610810906124c3565b80601f016020809104026020016040519081016040528092919081815260200182805461083c906124c3565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b50505091835250506004919091015460209182015260008581526009909152604081208181556001810180546001600160a01b03191690559192506108d160028301826119c1565b6108df6003830160006119c1565b60048201600090555050600881606001516040516108fd9190611d97565b90815260408051918290036020018220805460ff191690558201516008916109259190611d97565b908152604051908190036020019020805460ff1916905561094583611578565b50600192915050565b600061095861135c565b6001600160a01b0316610969610f67565b6001600160a01b03161461098f5760405162461bcd60e51b8152600401610469906121e0565b6001600160a01b0382166000908152600a602052604090205460ff16600114156109cb5760405162461bcd60e51b81526004016104699061211b565b506001600160a01b03166000908152600a60205260409020805460ff1916600190811790915590565b61052183838360405180602001604052806000815250611053565b6000600884604051610a219190611d97565b9081526040519081900360200190205460ff1660011415610a4157600080fd5b600883604051610a519190611d97565b9081526040519081900360200190205460ff1660011415610a7157600080fd5b336000908152600a602052604090205460ff16600114610aa35760405162461bcd60e51b815260040161046990612215565b6032821115610ab157600080fd5b6001600885604051610ac39190611d97565b908152602001604051809103902060006101000a81548160ff021916908360ff1602179055506001600884604051610afb9190611d97565b908152604051908190036020019020805460ff9290921660ff19909216919091179055610b28600761161f565b6000610b346007611628565b6040805160a081018252428152336020808301918252828401898152606084018b905260808401899052600086815260098352949094208351815591516001830180546001600160a01b0319166001600160a01b039092169190911790559251805194955091939092610bae926002850192910190611a00565b5060608201518051610bca916003840191602090910190611a00565b5060808201518160040155905050610be2868261162c565b856001600160a01b03167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a8286604051610c1d92919061243b565b60405180910390a2600b54610c3b906001600160a01b031682611360565b90505b949350505050565b6000600884604051610c589190611d97565b9081526040519081900360200190205460ff1660011415610c7857600080fd5b600883604051610c889190611d97565b9081526040519081900360200190205460ff1660011415610ca857600080fd5b336000908152600a602052604090205460ff16600114610cda5760405162461bcd60e51b815260040161046990612215565b6032821115610ce857600080fd5b6001600885604051610cfa9190611d97565b908152602001604051809103902060006101000a81548160ff021916908360ff1602179055506001600884604051610d329190611d97565b908152604051908190036020019020805460ff9290921660ff19909216919091179055610d5f600761161f565b6000610d6b6007611628565b6040805160a081018252428152336020808301918252828401898152606084018b905260808401899052600086815260098352949094208351815591516001830180546001600160a01b0319166001600160a01b039092169190911790559251805194955091939092610de5926002850192910190611a00565b5060608201518051610e01916003840191602090910190611a00565b5060808201518160040155905050610e19868261162c565b856001600160a01b03167f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a8286604051610e5492919061243b565b60405180910390a295945050505050565b6000818152600260205260408120546001600160a01b0316806103a85760405162461bcd60e51b8152600401610469906120d2565b60006001600160a01b038216610ec25760405162461bcd60e51b815260040161046990612088565b506001600160a01b031660009081526003602052604090205490565b610ee661135c565b6001600160a01b0316610ef7610f67565b6001600160a01b031614610f1d5760405162461bcd60e51b8152600401610469906121e0565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b6006546001600160a01b031690565b6060600180546103bf906124c3565b610f8d61135c565b6001600160a01b0316826001600160a01b03161415610fbe5760405162461bcd60e51b815260040161046990611fa8565b8060056000610fcb61135c565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561100f61135c565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110479190611e33565b60405180910390a35050565b61105e61071661135c565b61107a5760405162461bcd60e51b815260040161046990612325565b6110868484848461170b565b50505050565b600061109661135c565b6001600160a01b03166110a7610f67565b6001600160a01b0316146110cd5760405162461bcd60e51b8152600401610469906121e0565b6001600160a01b0382166000908152600a602052604090205460ff166001146111085760405162461bcd60e51b815260040161046990611f20565b506001600160a01b03166000908152600a60205260409020805460ff19169055600190565b60606111388261133f565b6111545760405162461bcd60e51b815260040161046990612295565b600061115e61173e565b9050600081511161117e57604051806020016040528060008152506111a9565b8061118884611750565b604051602001611199929190611db3565b6040516020818303038152906040525b9392505050565b60006111ba61135c565b6001600160a01b03166111cb610f67565b6001600160a01b0316146111f15760405162461bcd60e51b8152600401610469906121e0565b50600b80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6001600160a01b03166000908152600a602052604090205460ff1660011490565b61126d61135c565b6001600160a01b031661127e610f67565b6001600160a01b0316146112a45760405162461bcd60e51b8152600401610469906121e0565b6001600160a01b0381166112ca5760405162461bcd60e51b815260040161046990611ea3565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061139582610e65565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113d98261133f565b6113f55760405162461bcd60e51b815260040161046990611fdf565b600061140083610e65565b9050806001600160a01b0316846001600160a01b0316148061143b5750836001600160a01b031661143084610442565b6001600160a01b0316145b80610c3e5750610c3e8185611216565b826001600160a01b031661145e82610e65565b6001600160a01b0316146114845760405162461bcd60e51b81526004016104699061224c565b6001600160a01b0382166114aa5760405162461bcd60e51b815260040161046990611f64565b6114b5838383610521565b6114c0600082611360565b6001600160a01b03831660009081526003602052604081208054600192906114e9908490612480565b90915550506001600160a01b0382166000908152600360205260408120805460019290611517908490612454565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061158382610e65565b905061159181600084610521565b61159c600083611360565b6001600160a01b03811660009081526003602052604081208054600192906115c5908490612480565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b80546001019055565b5490565b6001600160a01b0382166116525760405162461bcd60e51b81526004016104699061215f565b61165b8161133f565b156116785760405162461bcd60e51b815260040161046990611ee9565b61168460008383610521565b6001600160a01b03821660009081526003602052604081208054600192906116ad908490612454565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61171684848461144b565b6117228484848461186b565b6110865760405162461bcd60e51b815260040161046990611e51565b60408051602081019091526000815290565b60608161177557506040805180820190915260018152600360fc1b60208201526103ab565b8160005b811561179f5780611789816124fe565b91506117989050600a8361246c565b9150611779565b60008167ffffffffffffffff8111156117c857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156117f2576020820181803683370190505b5090505b8415610c3e57611807600183612480565b9150611814600a86612519565b61181f906030612454565b60f81b81838151811061184257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611864600a8661246c565b94506117f6565b600061187f846001600160a01b0316611983565b1561197b57836001600160a01b031663150b7a0261189b61135c565b8786866040518563ffffffff1660e01b81526004016118bd9493929190611df6565b602060405180830381600087803b1580156118d757600080fd5b505af1925050508015611907575060408051601f3d908101601f1916820190925261190491810190611d37565b60015b611961573d808015611935576040519150601f19603f3d011682016040523d82523d6000602084013e61193a565b606091505b5080516119595760405162461bcd60e51b815260040161046990611e51565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610c3e565b506001610c3e565b3b151590565b6040518060a001604052806000815260200160006001600160a01b031681526020016060815260200160608152602001600081525090565b5080546119cd906124c3565b6000825580601f106119df57506119fd565b601f0160209004906000526020600020908101906119fd9190611a84565b50565b828054611a0c906124c3565b90600052602060002090601f016020900481019282611a2e5760008555611a74565b82601f10611a4757805160ff1916838001178555611a74565b82800160010185558215611a74579182015b82811115611a74578251825591602001919060010190611a59565b50611a80929150611a84565b5090565b5b80821115611a805760008155600101611a85565b600067ffffffffffffffff80841115611ab457611ab4612559565b604051601f8501601f191681016020018281118282101715611ad857611ad8612559565b604052848152915081838501861015611af057600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146103ab57600080fd5b600082601f830112611b30578081fd5b6111a983833560208501611a99565b600060208284031215611b50578081fd5b6111a982611b09565b60008060408385031215611b6b578081fd5b611b7483611b09565b9150611b8260208401611b09565b90509250929050565b600080600060608486031215611b9f578081fd5b611ba884611b09565b9250611bb660208501611b09565b9150604084013590509250925092565b60008060008060808587031215611bdb578081fd5b611be485611b09565b9350611bf260208601611b09565b925060408501359150606085013567ffffffffffffffff811115611c14578182fd5b8501601f81018713611c24578182fd5b611c3387823560208401611a99565b91505092959194509250565b60008060408385031215611c51578182fd5b611c5a83611b09565b915060208301358015158114611c6e578182fd5b809150509250929050565b60008060008060808587031215611c8e578384fd5b611c9785611b09565b9350602085013567ffffffffffffffff80821115611cb3578485fd5b611cbf88838901611b20565b94506040870135915080821115611cd4578384fd5b50611ce187828801611b20565b949793965093946060013593505050565b60008060408385031215611d04578182fd5b611d0d83611b09565b946020939093013593505050565b600060208284031215611d2c578081fd5b81356111a98161256f565b600060208284031215611d48578081fd5b81516111a98161256f565b600060208284031215611d64578081fd5b5035919050565b60008151808452611d83816020860160208601612497565b601f01601f19169290920160200192915050565b60008251611da9818460208701612497565b9190910192915050565b60008351611dc5818460208801612497565b835190830190611dd9818360208801612497565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e2990830184611d6b565b9695505050505050565b901515815260200190565b6000602082526111a96020830184611d6b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4368696c6c69537761704e46543a2063726561746f7220646f65736e277420656040820152631e1a5cdd60e21b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526024908201527f4368696c6c69537761704e46543a2063726561746f7220616c726561647920656040820152631e1a5cdd60e21b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4368696c6c69537761704e46543a20626520612063726561746f720000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b6000602082528251602083015260018060a01b036020840151166040830152604083015160a060608401526123fe60c0840182611d6b565b90506060840151601f1984830301608085015261241b8282611d6b565b915050608084015160a08401528091505092915050565b90815260200190565b600083825260406020830152610c3e6040830184611d6b565b600082198211156124675761246761252d565b500190565b60008261247b5761247b612543565b500490565b6000828210156124925761249261252d565b500390565b60005b838110156124b257818101518382015260200161249a565b838111156110865750506000910152565b6002810460018216806124d757607f821691505b602082108114156124f857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125125761251261252d565b5060010190565b60008261252857612528612543565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146119fd57600080fdfea26469706673582212202d79b3dab4ebe2dcbaaa47f4661010d87749a14c8ba0ba5e0923d5ec346f1ec864736f6c63430008000033

Deployed Bytecode Sourcemap

160:3248:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1522:292:5;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2454:100;;;:::i;:::-;;;;;;;:::i;3921:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3451:404::-;;;;;;:::i;:::-;;:::i;:::-;;2443:208:1;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;442:32::-;;;:::i;4811:305:5:-;;;;;;:::i;:::-;;:::i;2041:396:1:-;;;;;;:::i;:::-;;:::i;2780:216::-;;;;;;:::i;:::-;;:::i;5187:151:5:-;;;;;;:::i;:::-;;:::i;1278:755:1:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;541:731::-;;;;;;:::i;:::-;;:::i;2148:239:5:-;;;;;;:::i;:::-;;:::i;1878:208::-;;;;;;:::i;:::-;;:::i;1746:148:12:-;;;:::i;1095:87::-;;;:::i;2623:104:5:-;;;:::i;4214:295::-;;;;;;:::i;:::-;;:::i;5409:285::-;;;;;;:::i;:::-;;:::i;3001:221:1:-;;;;;;:::i;:::-;;:::i;2798:360:5:-;;;;;;:::i;:::-;;:::i;3232:165:1:-;;;;;;:::i;:::-;;:::i;4580:164:5:-;;;;;;:::i;:::-;;:::i;2657:116:1:-;;;;;;:::i;:::-;;:::i;2049:244:12:-;;;;;;:::i;:::-;;:::i;1522:292:5:-;1624:4;-1:-1:-1;;;;;;1648:40:5;;-1:-1:-1;;;1648:40:5;;:105;;-1:-1:-1;;;;;;;1705:48:5;;-1:-1:-1;;;1705:48:5;1648:105;:158;;;;1770:36;1794:11;1770:23;:36::i;:::-;1641:165;;1522:292;;;;:::o;2454:100::-;2508:13;2541:5;2534:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2454:100;:::o;3921:221::-;3997:7;4025:16;4033:7;4025;:16::i;:::-;4017:73;;;;-1:-1:-1;;;4017:73:5;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;4110:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4110:24:5;;3921:221::o;3451:404::-;3532:13;3548:23;3563:7;3548:14;:23::i;:::-;3532:39;;3596:5;-1:-1:-1;;;;;3590:11:5;:2;-1:-1:-1;;;;;3590:11:5;;;3582:57;;;;-1:-1:-1;;;3582:57:5;;;;;;;:::i;:::-;3676:5;-1:-1:-1;;;;;3660:21:5;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3660:21:5;;:69;;;;3685:44;3709:5;3716:12;:10;:12::i;3685:44::-;3652:161;;;;-1:-1:-1;;;3652:161:5;;;;;;;:::i;:::-;3826:21;3835:2;3839:7;3826:8;:21::i;:::-;3451:404;;;:::o;2443:208:1:-;2510:14;;:::i;:::-;2544:16;2552:7;2544;:16::i;:::-;2535:75;;;;-1:-1:-1;;;2535:75:1;;;;;;;:::i;:::-;2627:17;;;;:8;:17;;;;;;;;;2620:24;;;;;;;;;;;;;;;-1:-1:-1;;;;;2620:24:1;;;;;;;;;;;;;;;2627:17;;2620:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2443:208;;;:::o;442:32::-;;;-1:-1:-1;;;;;442:32:1;;:::o;4811:305:5:-;4972:41;4991:12;:10;:12::i;:::-;5005:7;4972:18;:41::i;:::-;4964:103;;;;-1:-1:-1;;;4964:103:5;;;;;;;:::i;:::-;5080:28;5090:4;5096:2;5100:7;5080:9;:28::i;2041:396:1:-;2099:4;2122:41;2141:12;:10;:12::i;:::-;2155:7;2122:18;:41::i;:::-;2114:102;;;;-1:-1:-1;;;2114:102:1;;;;;;;:::i;:::-;2226:22;2251:17;;;:8;:17;;;;;;;;2226:42;;;;;;;;;;;;;;;-1:-1:-1;;;;;2226:42:1;;;;;;;;;;;;;2251:17;;2226:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2226:42:1;;;-1:-1:-1;;2226:42:1;;;;;;;;;;;-1:-1:-1;2286:17:1;;;:8;:17;;;;;;2279:24;;;;;;;;-1:-1:-1;;;;;;2279:24:1;;;2226:42;;-1:-1:-1;2279:24:1;;;;-1:-1:-1;2279:24:1;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;2320:6;2327:7;:16;;;2320:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;2313:31;;-1:-1:-1;;2313:31:1;;;2368:15;;;2361:6;;:23;;2368:15;2361:23;:::i;:::-;;;;;;;;;;;;;;2354:30;;-1:-1:-1;;2354:30:1;;;2394:14;2400:7;2394:5;:14::i;:::-;-1:-1:-1;2425:4:1;;2041:396;-1:-1:-1;;2041:396:1:o;2780:216::-;2851:4;1326:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1315:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1315:23:12;;1307:68;;;;-1:-1:-1;;;1307:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;2874:17:1;::::1;;::::0;;;:8:::1;:17;::::0;;;;;::::1;;::::0;:22:::1;;2866:71;;;;-1:-1:-1::0;;;2866:71:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;2947:17:1::1;;::::0;;;:8:::1;:17;::::0;;;;:21;;-1:-1:-1;;2947:21:1::1;2967:1;2947:21:::0;;::::1;::::0;;;2967:1;2780:216::o;5187:151:5:-;5291:39;5308:4;5314:2;5318:7;5291:39;;;;;;;;;;;;:16;:39::i;1278:755:1:-;1415:7;1451:6;1458:8;1451:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:21;;1443:30;;;;;;1491:6;1498:7;1491:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:20;;1483:29;;;;;;1539:10;1530:20;;;;:8;:20;;;;;;;;;:25;1522:65;;;;-1:-1:-1;;;1522:65:1;;;;;;;:::i;:::-;1616:2;1605:7;:13;;1597:22;;;;;;1649:1;1630:6;1637:8;1630:16;;;;;;:::i;:::-;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;1678:1;1660:6;1667:7;1660:15;;;;;;:::i;:::-;;;;;;;;;;;;;;:19;;;;;;;-1:-1:-1;;1660:19:1;;;;;;;;;1696:21;:9;:19;:21::i;:::-;1727:17;1747:19;:9;:17;:19::i;:::-;1798:64;;;;;;;;1806:15;1798:64;;1823:10;1798:64;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1776:19:1;;;:8;:19;;;;;;:86;;;;;;;;;;;-1:-1:-1;;;;;;1776:86:1;-1:-1:-1;;;;;1776:86:1;;;;;;;;;;;;;:19;;-1:-1:-1;1798:64:1;;1776:19;;:86;;;;;;;;;;:::i;:::-;-1:-1:-1;1776:86:1;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1872:27;1878:9;1889;1872:5;:27::i;:::-;1920:9;-1:-1:-1;;;;;1915:35:1;;1931:9;1942:7;1915:35;;;;;;;:::i;:::-;;;;;;;;1969:17;;1960:38;;-1:-1:-1;;;;;1969:17:1;1988:9;1960:8;:38::i;:::-;2016:9;-1:-1:-1;1278:755:1;;;;;;;:::o;541:731::-;668:7;695:6;702:8;695:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:21;;687:30;;;;;;735:6;742:7;735:15;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:20;;727:29;;;;;;783:10;774:20;;;;:8;:20;;;;;;;;;:25;766:65;;;;-1:-1:-1;;;766:65:1;;;;;;;:::i;:::-;860:2;849:7;:13;;841:22;;;;;;893:1;874:6;881:8;874:16;;;;;;:::i;:::-;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;922:1;904:6;911:7;904:15;;;;;;:::i;:::-;;;;;;;;;;;;;;:19;;;;;;;-1:-1:-1;;904:19:1;;;;;;;;;940:21;:9;:19;:21::i;:::-;971:17;991:19;:9;:17;:19::i;:::-;1042:64;;;;;;;;1050:15;1042:64;;1067:10;1042:64;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1020:19:1;;;:8;:19;;;;;;:86;;;;;;;;;;;-1:-1:-1;;;;;;1020:86:1;-1:-1:-1;;;;;1020:86:1;;;;;;;;;;;;;:19;;-1:-1:-1;1042:64:1;;1020:19;;:86;;;;;;;;;;:::i;:::-;-1:-1:-1;1020:86:1;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1116:27;1122:9;1133;1116:5;:27::i;:::-;1208:9;-1:-1:-1;;;;;1203:35:1;;1219:9;1230:7;1203:35;;;;;;;:::i;:::-;;;;;;;;1255:9;541:731;-1:-1:-1;;;;;541:731:1:o;2148:239:5:-;2220:7;2256:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2256:16:5;2291:19;2283:73;;;;-1:-1:-1;;;2283:73:5;;;;;;;:::i;1878:208::-;1950:7;-1:-1:-1;;;;;1978:19:5;;1970:74;;;;-1:-1:-1;;;1970:74:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;;2062:16:5;;;;;:9;:16;;;;;;;1878:208::o;1746:148:12:-;1326:12;:10;:12::i;:::-;-1:-1:-1;;;;;1315:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1315:23:12;;1307:68;;;;-1:-1:-1;;;1307:68:12;;;;;;;:::i;:::-;1837:6:::1;::::0;1816:40:::1;::::0;1853:1:::1;::::0;-1:-1:-1;;;;;1837:6:12::1;::::0;1816:40:::1;::::0;1853:1;;1816:40:::1;1867:6;:19:::0;;-1:-1:-1;;;;;;1867:19:12::1;::::0;;1746:148::o;1095:87::-;1168:6;;-1:-1:-1;;;;;1168:6:12;1095:87;:::o;2623:104:5:-;2679:13;2712:7;2705:14;;;;;:::i;4214:295::-;4329:12;:10;:12::i;:::-;-1:-1:-1;;;;;4317:24:5;:8;-1:-1:-1;;;;;4317:24:5;;;4309:62;;;;-1:-1:-1;;;4309:62:5;;;;;;;:::i;:::-;4429:8;4384:18;:32;4403:12;:10;:12::i;:::-;-1:-1:-1;;;;;4384:32:5;;;;;;;;;;;;;;;;;-1:-1:-1;4384:32:5;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4384:53:5;;;;;;;;;;;4468:12;:10;:12::i;:::-;-1:-1:-1;;;;;4453:48:5;;4492:8;4453:48;;;;;;:::i;:::-;;;;;;;;4214:295;;:::o;5409:285::-;5541:41;5560:12;:10;:12::i;5541:41::-;5533:103;;;;-1:-1:-1;;;5533:103:5;;;;;;;:::i;:::-;5647:39;5661:4;5667:2;5671:7;5680:5;5647:13;:39::i;:::-;5409:285;;;;:::o;3001:221:1:-;3077:4;1326:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1315:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1315:23:12;;1307:68;;;;-1:-1:-1;;;1307:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;3100:17:1;::::1;;::::0;;;:8:::1;:17;::::0;;;;;::::1;;::::0;:22:::1;3092:71;;;;-1:-1:-1::0;;;3092:71:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;3173:17:1::1;3193:1;3173:17:::0;;;:8:::1;:17;::::0;;;;:21;;-1:-1:-1;;3173:21:1::1;::::0;;-1:-1:-1;;3001:221:1:o;2798:360:5:-;2871:13;2905:16;2913:7;2905;:16::i;:::-;2897:76;;;;-1:-1:-1;;;2897:76:5;;;;;;;:::i;:::-;2986:21;3010:10;:8;:10::i;:::-;2986:34;;3062:1;3044:7;3038:21;:25;:112;;;;;;;;;;;;;;;;;3103:7;3112:18;:7;:16;:18::i;:::-;3086:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3038:112;3031:119;2798:360;-1:-1:-1;;;2798:360:5:o;3232:165:1:-;3321:4;1326:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1315:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1315:23:12;;1307:68;;;;-1:-1:-1;;;1307:68:12;;;;;;;:::i;:::-;-1:-1:-1;3335:17:1::1;:34:::0;;-1:-1:-1;;;;;3335:34:1;::::1;-1:-1:-1::0;;;;;;3335:34:1;;::::1;;::::0;;;3232:165;;;:::o;4580:164:5:-;-1:-1:-1;;;;;4701:25:5;;;4677:4;4701:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4580:164::o;2657:116:1:-;-1:-1:-1;;;;;2744:17:1;2722:4;2744:17;;;:8;:17;;;;;;;;;:22;;2657:116::o;2049:244:12:-;1326:12;:10;:12::i;:::-;-1:-1:-1;;;;;1315:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1315:23:12;;1307:68;;;;-1:-1:-1;;;1307:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;2138:22:12;::::1;2130:73;;;;-1:-1:-1::0;;;2130:73:12::1;;;;;;;:::i;:::-;2240:6;::::0;2219:38:::1;::::0;-1:-1:-1;;;;;2219:38:12;;::::1;::::0;2240:6:::1;::::0;2219:38:::1;::::0;2240:6:::1;::::0;2219:38:::1;2268:6;:17:::0;;-1:-1:-1;;;;;;2268:17:12::1;-1:-1:-1::0;;;;;2268:17:12;;;::::1;::::0;;;::::1;::::0;;2049:244::o;787:157:4:-;-1:-1:-1;;;;;;896:40:4;;-1:-1:-1;;;896:40:4;787:157;;;:::o;7161:127:5:-;7226:4;7250:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7250:16:5;:30;;;7161:127::o;601:98:2:-;681:10;601:98;:::o;11045:174:5:-;11120:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11120:29:5;-1:-1:-1;;;;;11120:29:5;;;;;;;;:24;;11174:23;11120:24;11174:14;:23::i;:::-;-1:-1:-1;;;;;11165:46:5;;;;;;;;;;;11045:174;;:::o;7455:355::-;7548:4;7573:16;7581:7;7573;:16::i;:::-;7565:73;;;;-1:-1:-1;;;7565:73:5;;;;;;;:::i;:::-;7649:13;7665:23;7680:7;7665:14;:23::i;:::-;7649:39;;7718:5;-1:-1:-1;;;;;7707:16:5;:7;-1:-1:-1;;;;;7707:16:5;;:51;;;;7751:7;-1:-1:-1;;;;;7727:31:5;:20;7739:7;7727:11;:20::i;:::-;-1:-1:-1;;;;;7727:31:5;;7707:51;:94;;;;7762:39;7786:5;7793:7;7762:23;:39::i;10383:544::-;10508:4;-1:-1:-1;;;;;10481:31:5;:23;10496:7;10481:14;:23::i;:::-;-1:-1:-1;;;;;10481:31:5;;10473:85;;;;-1:-1:-1;;;10473:85:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;10577:16:5;;10569:65;;;;-1:-1:-1;;;10569:65:5;;;;;;;:::i;:::-;10647:39;10668:4;10674:2;10678:7;10647:20;:39::i;:::-;10751:29;10768:1;10772:7;10751:8;:29::i;:::-;-1:-1:-1;;;;;10793:15:5;;;;;;:9;:15;;;;;:20;;10812:1;;10793:15;:20;;10812:1;;10793:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10824:13:5;;;;;;:9;:13;;;;;:18;;10841:1;;10824:13;:18;;10841:1;;10824:18;:::i;:::-;;;;-1:-1:-1;;10853:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10853:21:5;-1:-1:-1;;;;;10853:21:5;;;;;;;;;10892:27;;10853:16;;10892:27;;;;;;;10383:544;;;:::o;9686:360::-;9746:13;9762:23;9777:7;9762:14;:23::i;:::-;9746:39;;9798:48;9819:5;9834:1;9838:7;9798:20;:48::i;:::-;9887:29;9904:1;9908:7;9887:8;:29::i;:::-;-1:-1:-1;;;;;9929:16:5;;;;;;:9;:16;;;;;:21;;9949:1;;9929:16;:21;;9949:1;;9929:21;:::i;:::-;;;;-1:-1:-1;;9968:16:5;;;;:7;:16;;;;;;9961:23;;-1:-1:-1;;;;;;9961:23:5;;;10002:36;9976:7;;9968:16;-1:-1:-1;;;;;10002:36:5;;;;;9968:16;;10002:36;9686:360;;:::o;915:127:3:-;1004:19;;1022:1;1004:19;;;915:127::o;793:114::-;885:14;;793:114::o;9075:382:5:-;-1:-1:-1;;;;;9155:16:5;;9147:61;;;;-1:-1:-1;;;9147:61:5;;;;;;;:::i;:::-;9228:16;9236:7;9228;:16::i;:::-;9227:17;9219:58;;;;-1:-1:-1;;;9219:58:5;;;;;;;:::i;:::-;9290:45;9319:1;9323:2;9327:7;9290:20;:45::i;:::-;-1:-1:-1;;;;;9348:13:5;;;;;;:9;:13;;;;;:18;;9365:1;;9348:13;:18;;9365:1;;9348:18;:::i;:::-;;;;-1:-1:-1;;9377:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9377:21:5;-1:-1:-1;;;;;9377:21:5;;;;;;;;9416:33;;9377:16;;;9416:33;;9377:16;;9416:33;9075:382;;:::o;6576:272::-;6690:28;6700:4;6706:2;6710:7;6690:9;:28::i;:::-;6737:48;6760:4;6766:2;6770:7;6779:5;6737:22;:48::i;:::-;6729:111;;;;-1:-1:-1;;;6729:111:5;;;;;;;:::i;3295:94::-;3372:9;;;;;;;;;-1:-1:-1;3372:9:5;;3295:94;:::o;284:723:13:-;340:13;561:10;557:53;;-1:-1:-1;588:10:13;;;;;;;;;;;;-1:-1:-1;;;588:10:13;;;;;;557:53;635:5;620:12;676:78;683:9;;676:78;;709:8;;;;:::i;:::-;;-1:-1:-1;732:10:13;;-1:-1:-1;740:2:13;732:10;;:::i;:::-;;;676:78;;;764:19;796:6;786:17;;;;;;-1:-1:-1;;;786:17:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;786:17:13;;764:39;;814:154;821:10;;814:154;;848:11;858:1;848:11;;:::i;:::-;;-1:-1:-1;917:10:13;925:2;917:5;:10;:::i;:::-;904:24;;:2;:24;:::i;:::-;891:39;;874:6;881;874:14;;;;;;-1:-1:-1;;;874:14:13;;;;;;;;;;;;:56;-1:-1:-1;;;;;874:56:13;;;;;;;;-1:-1:-1;945:11:13;954:2;945:11;;:::i;:::-;;;814:154;;11784:843:5;11905:4;11931:15;:2;-1:-1:-1;;;;;11931:13:5;;:15::i;:::-;11927:693;;;11983:2;-1:-1:-1;;;;;11967:36:5;;12004:12;:10;:12::i;:::-;12018:4;12024:7;12033:5;11967:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11967:72:5;;;;;;;;-1:-1:-1;;11967:72:5;;;;;;;;;;;;:::i;:::-;;;11963:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12213:13:5;;12209:341;;12256:60;;-1:-1:-1;;;12256:60:5;;;;;;;:::i;12209:341::-;12500:6;12494:13;12485:6;12481:2;12477:15;12470:38;11963:602;-1:-1:-1;;;;;;12090:55:5;-1:-1:-1;;;12090:55:5;;-1:-1:-1;12083:62:5;;11927:693;-1:-1:-1;12604:4:5;12597:11;;743:422:0;1110:20;1149:8;;;743:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:14;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:14;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:14;473:16;;;470:25;-1:-1:-1;467:2:14;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:14;;735:42;;725:2;;791:1;788;781:12;806:233;;904:3;897:4;889:6;885:17;881:27;871:2;;926:5;919;912:20;871:2;952:81;1029:3;1020:6;1007:20;1000:4;992:6;988:17;952:81;:::i;1044:198::-;;1156:2;1144:9;1135:7;1131:23;1127:32;1124:2;;;1177:6;1169;1162:22;1124:2;1205:31;1226:9;1205:31;:::i;1247:274::-;;;1376:2;1364:9;1355:7;1351:23;1347:32;1344:2;;;1397:6;1389;1382:22;1344:2;1425:31;1446:9;1425:31;:::i;:::-;1415:41;;1475:40;1511:2;1500:9;1496:18;1475:40;:::i;:::-;1465:50;;1334:187;;;;;:::o;1526:342::-;;;;1672:2;1660:9;1651:7;1647:23;1643:32;1640:2;;;1693:6;1685;1678:22;1640:2;1721:31;1742:9;1721:31;:::i;:::-;1711:41;;1771:40;1807:2;1796:9;1792:18;1771:40;:::i;:::-;1761:50;;1858:2;1847:9;1843:18;1830:32;1820:42;;1630:238;;;;;:::o;1873:702::-;;;;;2045:3;2033:9;2024:7;2020:23;2016:33;2013:2;;;2067:6;2059;2052:22;2013:2;2095:31;2116:9;2095:31;:::i;:::-;2085:41;;2145:40;2181:2;2170:9;2166:18;2145:40;:::i;:::-;2135:50;;2232:2;2221:9;2217:18;2204:32;2194:42;;2287:2;2276:9;2272:18;2259:32;2314:18;2306:6;2303:30;2300:2;;;2351:6;2343;2336:22;2300:2;2379:22;;2432:4;2424:13;;2420:27;-1:-1:-1;2410:2:14;;2466:6;2458;2451:22;2410:2;2494:75;2561:7;2556:2;2543:16;2538:2;2534;2530:11;2494:75;:::i;:::-;2484:85;;;2003:572;;;;;;;:::o;2580:369::-;;;2706:2;2694:9;2685:7;2681:23;2677:32;2674:2;;;2727:6;2719;2712:22;2674:2;2755:31;2776:9;2755:31;:::i;:::-;2745:41;;2836:2;2825:9;2821:18;2808:32;2883:5;2876:13;2869:21;2862:5;2859:32;2849:2;;2910:6;2902;2895:22;2849:2;2938:5;2928:15;;;2664:285;;;;;:::o;2954:722::-;;;;;3137:3;3125:9;3116:7;3112:23;3108:33;3105:2;;;3159:6;3151;3144:22;3105:2;3187:31;3208:9;3187:31;:::i;:::-;3177:41;;3269:2;3258:9;3254:18;3241:32;3292:18;3333:2;3325:6;3322:14;3319:2;;;3354:6;3346;3339:22;3319:2;3382:52;3426:7;3417:6;3406:9;3402:22;3382:52;:::i;:::-;3372:62;;3487:2;3476:9;3472:18;3459:32;3443:48;;3516:2;3506:8;3503:16;3500:2;;;3537:6;3529;3522:22;3500:2;;3565:54;3611:7;3600:8;3589:9;3585:24;3565:54;:::i;:::-;3095:581;;;;-1:-1:-1;3555:64:14;;3666:2;3651:18;3638:32;;-1:-1:-1;;;3095:581:14:o;3681:266::-;;;3810:2;3798:9;3789:7;3785:23;3781:32;3778:2;;;3831:6;3823;3816:22;3778:2;3859:31;3880:9;3859:31;:::i;:::-;3849:41;3937:2;3922:18;;;;3909:32;;-1:-1:-1;;;3768:179:14:o;3952:257::-;;4063:2;4051:9;4042:7;4038:23;4034:32;4031:2;;;4084:6;4076;4069:22;4031:2;4128:9;4115:23;4147:32;4173:5;4147:32;:::i;4214:261::-;;4336:2;4324:9;4315:7;4311:23;4307:32;4304:2;;;4357:6;4349;4342:22;4304:2;4394:9;4388:16;4413:32;4439:5;4413:32;:::i;4480:190::-;;4592:2;4580:9;4571:7;4567:23;4563:32;4560:2;;;4613:6;4605;4598:22;4560:2;-1:-1:-1;4641:23:14;;4550:120;-1:-1:-1;4550:120:14:o;4675:259::-;;4756:5;4750:12;4783:6;4778:3;4771:19;4799:63;4855:6;4848:4;4843:3;4839:14;4832:4;4825:5;4821:16;4799:63;:::i;:::-;4916:2;4895:15;-1:-1:-1;;4891:29:14;4882:39;;;;4923:4;4878:50;;4726:208;-1:-1:-1;;4726:208:14:o;4939:276::-;;5108:6;5102:13;5124:53;5170:6;5165:3;5158:4;5150:6;5146:17;5124:53;:::i;:::-;5193:16;;;;;5078:137;-1:-1:-1;;5078:137:14:o;5220:470::-;;5437:6;5431:13;5453:53;5499:6;5494:3;5487:4;5479:6;5475:17;5453:53;:::i;:::-;5569:13;;5528:16;;;;5591:57;5569:13;5528:16;5625:4;5613:17;;5591:57;:::i;:::-;5664:20;;5407:283;-1:-1:-1;;;;5407:283:14:o;5695:203::-;-1:-1:-1;;;;;5859:32:14;;;;5841:51;;5829:2;5814:18;;5796:102::o;5903:490::-;-1:-1:-1;;;;;6172:15:14;;;6154:34;;6224:15;;6219:2;6204:18;;6197:43;6271:2;6256:18;;6249:34;;;6319:3;6314:2;6299:18;;6292:31;;;5903:490;;6340:47;;6367:19;;6359:6;6340:47;:::i;:::-;6332:55;6106:287;-1:-1:-1;;;;;;6106:287:14:o;6398:187::-;6563:14;;6556:22;6538:41;;6526:2;6511:18;;6493:92::o;6590:221::-;;6739:2;6728:9;6721:21;6759:46;6801:2;6790:9;6786:18;6778:6;6759:46;:::i;6816:414::-;7018:2;7000:21;;;7057:2;7037:18;;;7030:30;7096:34;7091:2;7076:18;;7069:62;-1:-1:-1;;;7162:2:14;7147:18;;7140:48;7220:3;7205:19;;6990:240::o;7235:402::-;7437:2;7419:21;;;7476:2;7456:18;;;7449:30;7515:34;7510:2;7495:18;;7488:62;-1:-1:-1;;;7581:2:14;7566:18;;7559:36;7627:3;7612:19;;7409:228::o;7642:352::-;7844:2;7826:21;;;7883:2;7863:18;;;7856:30;7922;7917:2;7902:18;;7895:58;7985:2;7970:18;;7816:178::o;7999:400::-;8201:2;8183:21;;;8240:2;8220:18;;;8213:30;8279:34;8274:2;8259:18;;8252:62;-1:-1:-1;;;8345:2:14;8330:18;;8323:34;8389:3;8374:19;;8173:226::o;8404:400::-;8606:2;8588:21;;;8645:2;8625:18;;;8618:30;8684:34;8679:2;8664:18;;8657:62;-1:-1:-1;;;8750:2:14;8735:18;;8728:34;8794:3;8779:19;;8578:226::o;8809:349::-;9011:2;8993:21;;;9050:2;9030:18;;;9023:30;9089:27;9084:2;9069:18;;9062:55;9149:2;9134:18;;8983:175::o;9163:408::-;9365:2;9347:21;;;9404:2;9384:18;;;9377:30;9443:34;9438:2;9423:18;;9416:62;-1:-1:-1;;;9509:2:14;9494:18;;9487:42;9561:3;9546:19;;9337:234::o;9576:420::-;9778:2;9760:21;;;9817:2;9797:18;;;9790:30;9856:34;9851:2;9836:18;;9829:62;9927:26;9922:2;9907:18;;9900:54;9986:3;9971:19;;9750:246::o;10001:406::-;10203:2;10185:21;;;10242:2;10222:18;;;10215:30;10281:34;10276:2;10261:18;;10254:62;-1:-1:-1;;;10347:2:14;10332:18;;10325:40;10397:3;10382:19;;10175:232::o;10412:405::-;10614:2;10596:21;;;10653:2;10633:18;;;10626:30;10692:34;10687:2;10672:18;;10665:62;-1:-1:-1;;;10758:2:14;10743:18;;10736:39;10807:3;10792:19;;10586:231::o;10822:400::-;11024:2;11006:21;;;11063:2;11043:18;;;11036:30;11102:34;11097:2;11082:18;;11075:62;-1:-1:-1;;;11168:2:14;11153:18;;11146:34;11212:3;11197:19;;10996:226::o;11227:356::-;11429:2;11411:21;;;11448:18;;;11441:30;11507:34;11502:2;11487:18;;11480:62;11574:2;11559:18;;11401:182::o;11588:408::-;11790:2;11772:21;;;11829:2;11809:18;;;11802:30;11868:34;11863:2;11848:18;;11841:62;-1:-1:-1;;;11934:2:14;11919:18;;11912:42;11986:3;11971:19;;11762:234::o;12001:356::-;12203:2;12185:21;;;12222:18;;;12215:30;12281:34;12276:2;12261:18;;12254:62;12348:2;12333:18;;12175:182::o;12362:351::-;12564:2;12546:21;;;12603:2;12583:18;;;12576:30;12642:29;12637:2;12622:18;;12615:57;12704:2;12689:18;;12536:177::o;12718:405::-;12920:2;12902:21;;;12959:2;12939:18;;;12932:30;12998:34;12993:2;12978:18;;12971:62;-1:-1:-1;;;13064:2:14;13049:18;;13042:39;13113:3;13098:19;;12892:231::o;13128:411::-;13330:2;13312:21;;;13369:2;13349:18;;;13342:30;13408:34;13403:2;13388:18;;13381:62;-1:-1:-1;;;13474:2:14;13459:18;;13452:45;13529:3;13514:19;;13302:237::o;13544:397::-;13746:2;13728:21;;;13785:2;13765:18;;;13758:30;13824:34;13819:2;13804:18;;13797:62;-1:-1:-1;;;13890:2:14;13875:18;;13868:31;13931:3;13916:19;;13718:223::o;13946:413::-;14148:2;14130:21;;;14187:2;14167:18;;;14160:30;14226:34;14221:2;14206:18;;14199:62;-1:-1:-1;;;14292:2:14;14277:18;;14270:47;14349:3;14334:19;;14120:239::o;14364:412::-;14566:2;14548:21;;;14605:2;14585:18;;;14578:30;14644:34;14639:2;14624:18;;14617:62;-1:-1:-1;;;14710:2:14;14695:18;;14688:46;14766:3;14751:19;;14538:238::o;14781:768::-;;14960:2;14949:9;14942:21;15005:6;14999:13;14994:2;14983:9;14979:18;14972:41;15094:1;15090;15085:3;15081:11;15077:19;15071:2;15063:6;15059:15;15053:22;15049:48;15044:2;15033:9;15029:18;15022:76;15145:2;15137:6;15133:15;15127:22;15185:4;15180:2;15169:9;15165:18;15158:32;15213:53;15261:3;15250:9;15246:19;15232:12;15213:53;:::i;:::-;15199:67;;15315:2;15307:6;15303:15;15297:22;15388:2;15384:7;15372:9;15364:6;15360:22;15356:36;15350:3;15339:9;15335:19;15328:65;15416:42;15451:6;15435:14;15416:42;:::i;:::-;15402:56;;;15514:3;15506:6;15502:16;15496:23;15489:4;15478:9;15474:20;15467:53;15537:6;15529:14;;;14932:617;;;;:::o;15554:177::-;15700:25;;;15688:2;15673:18;;15655:76::o;15736:292::-;;15913:6;15902:9;15895:25;15956:2;15951;15940:9;15936:18;15929:30;15976:46;16018:2;16007:9;16003:18;15995:6;15976:46;:::i;16033:128::-;;16104:1;16100:6;16097:1;16094:13;16091:2;;;16110:18;;:::i;:::-;-1:-1:-1;16146:9:14;;16081:80::o;16166:120::-;;16232:1;16222:2;;16237:18;;:::i;:::-;-1:-1:-1;16271:9:14;;16212:74::o;16291:125::-;;16359:1;16356;16353:8;16350:2;;;16364:18;;:::i;:::-;-1:-1:-1;16401:9:14;;16340:76::o;16421:258::-;16493:1;16503:113;16517:6;16514:1;16511:13;16503:113;;;16593:11;;;16587:18;16574:11;;;16567:39;16539:2;16532:10;16503:113;;;16634:6;16631:1;16628:13;16625:2;;;-1:-1:-1;;16669:1:14;16651:16;;16644:27;16474:205::o;16684:380::-;16769:1;16759:12;;16816:1;16806:12;;;16827:2;;16881:4;16873:6;16869:17;16859:27;;16827:2;16934;16926:6;16923:14;16903:18;16900:38;16897:2;;;16980:10;16975:3;16971:20;16968:1;16961:31;17015:4;17012:1;17005:15;17043:4;17040:1;17033:15;16897:2;;16739:325;;;:::o;17069:135::-;;-1:-1:-1;;17129:17:14;;17126:2;;;17149:18;;:::i;:::-;-1:-1:-1;17196:1:14;17185:13;;17116:88::o;17209:112::-;;17267:1;17257:2;;17272:18;;:::i;:::-;-1:-1:-1;17306:9:14;;17247:74::o;17326:127::-;17387:10;17382:3;17378:20;17375:1;17368:31;17418:4;17415:1;17408:15;17442:4;17439:1;17432:15;17458:127;17519:10;17514:3;17510:20;17507:1;17500:31;17550:4;17547:1;17540:15;17574:4;17571:1;17564:15;17590:127;17651:10;17646:3;17642:20;17639:1;17632:31;17682:4;17679:1;17672:15;17706:4;17703:1;17696:15;17722:133;-1:-1:-1;;;;;;17798:32:14;;17788:43;;17778:2;;17845:1;17842;17835:12

Swarm Source

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