ETH Price: $3,046.12 (+2.20%)
Gas: 2 Gwei

Token

RockstarApes (RockStarApe)
 

Overview

Max Total Supply

444 RockStarApe

Holders

114

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 RockStarApe
0xf206edc32dca2b87733bb6661f3305b003ea8a24
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:
RockstarApes

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 13: NFTContract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "./ERC721A.sol";
import "./Ownable.sol";
import "./MerkleProof.sol"; 
import "./IERC20.sol";

//import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
//import "@openzeppelin/contracts/access/Ownable.sol";
//import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

contract RockstarApes is ERC721A, Ownable{
    using Strings for uint256;

    uint256 MAX_SUPPLY = 7777;
    uint256 MAX_MINTS_WHITELIST = 4;
    uint256 MAX_MINTS_TEAM = 2;
    uint256 public mintRate_Public = 0.11 ether;
    uint256 public mintRate_WhiteList = 0.077 ether;

    bool public isPublicSale = false; 
    bool public isWhiteListSale = false;
    bool public isTeamSale = true;
    bool public isRevealed = false; 
    bool public paused = true;

    string public baseURI = "ipfs://QmbgQtFdVBygJr9LaN2LmoC5dvgUPYfJkhXcokp4xkRKds/";  //change
    string public unrevealedBaseURI = "ipfs://QmToazxEuJ1xkpTbf1oKhPf9o1AivmSmkRZTUjbQJPGvAi"; // change
    IERC20 public tokenAddress;

    bytes32 public whitelistMerkleRoot = 0xc5cf254329d8aec70ea742e534bbaf2133a90c4b4a38d577560977f4b83cdc34;
    mapping(address => bool) public teamAddresses;


    constructor() ERC721A("RockstarApes", "RockStarApe"){
        addTeamAddress(0x7C9Ada7B2605b91796A121156Fe03f71E7596ebB);
    }

    modifier callerIsUser(){
        require(tx.origin == _msgSender(), "Only users can interact with this contract!");
        _;
    }

    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist in list"
        );
        _;
    }

    function publicMint(uint256 quantity) external payable callerIsUser{
        require(!paused);
        require(isPublicSale);
        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough Tokens");
        require(msg.value >= (mintRate_Public * quantity), "Not enough ether sent");

        _safeMint(_msgSender(), quantity);

        uint256 tokenQuantity = (777 * quantity) * (10**18);
        tokenAddress.transfer(_msgSender(), tokenQuantity);
        _safeMint(_msgSender(), quantity);
    }

    function whiteListMint(uint256 quantity, bytes32[] calldata merkleProof) external payable callerIsUser 
    isValidMerkleProof(merkleProof, whitelistMerkleRoot)
    {
        require(!paused);
        require(isWhiteListSale);
        require(quantity + _numberMinted(_msgSender()) <= MAX_MINTS_WHITELIST, "Exceeded max mints");
        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough Tokens");
        require(msg.value >= (mintRate_WhiteList * quantity), "Not enough ether sent");

        uint256 tokenQuantity = (777 * quantity) * (10**18);
        tokenAddress.transfer(_msgSender(), tokenQuantity);
        _safeMint(_msgSender(), quantity);
    }

    function teamMint(uint256 quantity) external{
        require(isTeamSale);
        
        require(teamAddresses[_msgSender()], "You are not on the team!");
        require(quantity + _numberMinted(_msgSender()) <= MAX_MINTS_TEAM, "Exceeded max mints");
        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough Tokens");

        uint256 tokenQuantity = (777 * quantity) * (10**18);
        tokenAddress.transfer(_msgSender(), tokenQuantity);
        _safeMint(_msgSender(), quantity);
    }

    function promoMint(uint256 quantity, address addy) external onlyOwner{
        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough Tokens");

        uint256 tokenQuantity = (777 * quantity) * (10**18);
        tokenAddress.transfer(addy, tokenQuantity);
        _safeMint(addy, quantity);
    }

    function withdraw() public onlyOwner{
        address address1 = 0x7C9Ada7B2605b91796A121156Fe03f71E7596ebB;
        address address2 = 0x1fB815a6E03E380b5770320c899Ba66BBAf55BF4;

        (bool payer1, ) = payable(address1).call{value: address(this).balance * 3 / 200}("");
        (bool payer2, ) = payable(address2).call{value: (address(this).balance)}("");
        require(payer1 && payer2, "Nope");
    }

    function _baseURI() internal view virtual override returns(string memory){
        return baseURI;
    }

    function setBaseURI(string memory newURI) public onlyOwner{
        baseURI = newURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns(string memory){
        require(_exists(tokenId), "Non-existant token URI Query");
        uint256 trueId = tokenId + 1;

        if(!isRevealed){
            return unrevealedBaseURI;
        }

        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, trueId.toString(), ".json")) : "";
    }
    
    function addTeamAddress(address teamAddress) public onlyOwner{
        teamAddresses[teamAddress] = true;
    }

    function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        whitelistMerkleRoot = merkleRoot;
    }

    function reveal(bool shouldReveal) public onlyOwner{
        isRevealed = shouldReveal;
    }
    
    function pause(bool shouldPause) public onlyOwner{
        paused = shouldPause;
    }

    function setPublicSale(bool shouldStartPublicSale) public onlyOwner{
        isPublicSale = shouldStartPublicSale;
    }

    function setWhiteListSale(bool shouldStartWhiteListSale) public onlyOwner{
        isWhiteListSale = shouldStartWhiteListSale;
    }

    function setTeamSale(bool shouldStartTeamSale) public onlyOwner{
        isTeamSale = shouldStartTeamSale;
    }

    function burnToken(uint256 tokenId) public onlyOwner{
        _burn(tokenId - 1);
    }

    function setTokenAddress(address addy) public onlyOwner{
        tokenAddress = IERC20(addy);
    }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 4 of 13: ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

/*import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';*/

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

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

pragma solidity ^0.8.0;

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

File 6 of 13: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

File 10 of 13: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"teamAddress","type":"address"}],"name":"addTeamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTeamSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteListSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintRate_Public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintRate_WhiteList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldPause","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"addy","type":"address"}],"name":"promoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldReveal","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldStartPublicSale","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldStartTeamSale","type":"bool"}],"name":"setTeamSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldStartWhiteListSale","type":"bool"}],"name":"setWhiteListSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"teamAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whiteListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611e616009556004600a556002600b55670186cc6acd4b0000600c556701118f178fb48000600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506001600e60026101000a81548160ff0219169083151502179055506000600e60036101000a81548160ff0219169083151502179055506001600e60046101000a81548160ff0219169083151502179055506040518060600160405280603681526020016200568660369139600f9080519060200190620000e492919062000434565b506040518060600160405280603581526020016200565160359139601090805190602001906200011692919062000434565b507fc5cf254329d8aec70ea742e534bbaf2133a90c4b4a38d577560977f4b83cdc3460001b6012553480156200014b57600080fd5b506040518060400160405280600c81526020017f526f636b737461724170657300000000000000000000000000000000000000008152506040518060400160405280600b81526020017f526f636b537461724170650000000000000000000000000000000000000000008152508160029080519060200190620001d092919062000434565b508060039080519060200190620001e992919062000434565b50620001fa6200024d60201b60201c565b600081905550505062000222620002166200025260201b60201c565b6200025a60201b60201c565b62000247737c9ada7b2605b91796a121156fe03f71e7596ebb6200032060201b60201c565b620005cb565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003306200025260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003566200040a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a69062000545565b60405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004429062000596565b90600052602060002090601f016020900481019282620004665760008555620004b2565b82601f106200048157805160ff1916838001178555620004b2565b82800160010185558215620004b2579182015b82811115620004b157825182559160200191906001019062000494565b5b509050620004c19190620004c5565b5090565b5b80821115620004e0576000816000905550600101620004c6565b5090565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200052d602083620004e4565b91506200053a82620004f5565b602082019050919050565b6000602082019050818103600083015262000560816200051e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005af57607f821691505b602082108103620005c557620005c462000567565b5b50919050565b61507680620005db6000396000f3fe6080604052600436106102675760003560e01c80636f42c90111610144578063aa98e0c6116100b6578063c79b25cf1161007a578063c79b25cf146108c4578063c87b56dd146108ed578063ca5910361461092a578063e985e9c514610953578063ecf0209e14610990578063f2fde38b146109bb57610267565b8063aa98e0c6146107f3578063abc45af81461081e578063b88d4fde14610847578063bd32fb6614610870578063c543f09e1461089957610267565b80638da5cb5b116101085780638da5cb5b146106f5578063940cd05b1461072057806395d89b41146107495780639d76ea5814610774578063a22cb4651461079f578063a5a865dc146107c857610267565b80636f42c9011461061257806370a082311461064f578063715018a61461068c578063765dd7a0146106a35780637b47ec1a146106cc57610267565b80632db11544116101dd57806355f804b3116101a157806355f804b31461050257806359d2be671461052b5780635aca1bb6146105565780635c975abb1461057f5780636352211e146105aa5780636c0360eb146105e757610267565b80632db11544146104525780632fbba1151461046e5780633ccfd60b1461049757806342842e0e146104ae57806354214f69146104d757610267565b8063095ea7b31161022f578063095ea7b314610365578063118768751461038e57806318160ddd146103aa5780631cdccaff146103d557806323b872dd1461040057806326a4e8d21461042957610267565b806301ffc9a71461026c57806302329a29146102a957806306fdde03146102d257806307f03367146102fd578063081812fc14610328575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613d8a565b6109e4565b6040516102a09190613dd2565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613e19565b610ac6565b005b3480156102de57600080fd5b506102e7610b5f565b6040516102f49190613edf565b60405180910390f35b34801561030957600080fd5b50610312610bf1565b60405161031f9190613dd2565b60405180910390f35b34801561033457600080fd5b5061034f600480360381019061034a9190613f37565b610c04565b60405161035c9190613fa5565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190613fec565b610c80565b005b6103a860048036038101906103a39190614091565b610d8a565b005b3480156103b657600080fd5b506103bf6110d5565b6040516103cc9190614100565b60405180910390f35b3480156103e157600080fd5b506103ea6110ec565b6040516103f79190613edf565b60405180910390f35b34801561040c57600080fd5b506104276004803603810190610422919061411b565b61117a565b005b34801561043557600080fd5b50610450600480360381019061044b919061416e565b61118a565b005b61046c60048036038101906104679190613f37565b61124a565b005b34801561047a57600080fd5b5061049560048036038101906104909190613f37565b61148c565b005b3480156104a357600080fd5b506104ac6116d0565b005b3480156104ba57600080fd5b506104d560048036038101906104d0919061411b565b6118bd565b005b3480156104e357600080fd5b506104ec6118dd565b6040516104f99190613dd2565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906142cb565b6118f0565b005b34801561053757600080fd5b50610540611986565b60405161054d9190613dd2565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613e19565b611999565b005b34801561058b57600080fd5b50610594611a32565b6040516105a19190613dd2565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc9190613f37565b611a45565b6040516105de9190613fa5565b60405180910390f35b3480156105f357600080fd5b506105fc611a5b565b6040516106099190613edf565b60405180910390f35b34801561061e57600080fd5b506106396004803603810190610634919061416e565b611ae9565b6040516106469190613dd2565b60405180910390f35b34801561065b57600080fd5b506106766004803603810190610671919061416e565b611b09565b6040516106839190614100565b60405180910390f35b34801561069857600080fd5b506106a1611bd8565b005b3480156106af57600080fd5b506106ca60048036038101906106c5919061416e565b611c60565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613f37565b611d37565b005b34801561070157600080fd5b5061070a611dcb565b6040516107179190613fa5565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190613e19565b611df5565b005b34801561075557600080fd5b5061075e611e8e565b60405161076b9190613edf565b60405180910390f35b34801561078057600080fd5b50610789611f20565b6040516107969190614373565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c1919061438e565b611f46565b005b3480156107d457600080fd5b506107dd6120bd565b6040516107ea9190613dd2565b60405180910390f35b3480156107ff57600080fd5b506108086120d0565b60405161081591906143e7565b60405180910390f35b34801561082a57600080fd5b5061084560048036038101906108409190613e19565b6120d6565b005b34801561085357600080fd5b5061086e600480360381019061086991906144a3565b61216f565b005b34801561087c57600080fd5b5061089760048036038101906108929190614552565b6121eb565b005b3480156108a557600080fd5b506108ae612271565b6040516108bb9190614100565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e6919061457f565b612277565b005b3480156108f957600080fd5b50610914600480360381019061090f9190613f37565b61241f565b6040516109219190613edf565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c9190613e19565b612581565b005b34801561095f57600080fd5b5061097a600480360381019061097591906145bf565b61261a565b6040516109879190613dd2565b60405180910390f35b34801561099c57600080fd5b506109a56126ae565b6040516109b29190614100565b60405180910390f35b3480156109c757600080fd5b506109e260048036038101906109dd919061416e565b6126b4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aaf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abf5750610abe826127ab565b5b9050919050565b610ace612815565b73ffffffffffffffffffffffffffffffffffffffff16610aec611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b399061464b565b60405180910390fd5b80600e60046101000a81548160ff02191690831515021790555050565b606060028054610b6e9061469a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9a9061469a565b8015610be75780601f10610bbc57610100808354040283529160200191610be7565b820191906000526020600020905b815481529060010190602001808311610bca57829003601f168201915b5050505050905090565b600e60029054906101000a900460ff1681565b6000610c0f8261281d565b610c45576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8b82611a45565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cf2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d11612815565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d435750610d4181610d3c612815565b61261a565b155b15610d7a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d8583838361286b565b505050565b610d92612815565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df69061473d565b60405180910390fd5b8181601254610e76838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001610e5b91906147a5565b6040516020818303038152906040528051906020012061291d565b610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac9061480c565b60405180910390fd5b600e60049054906101000a900460ff1615610ecf57600080fd5b600e60019054906101000a900460ff16610ee857600080fd5b600a54610efb610ef6612815565b612934565b87610f06919061485b565b1115610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e906148fd565b60405180910390fd5b60095486610f536110d5565b610f5d919061485b565b1115610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9590614969565b60405180910390fd5b85600d54610fac9190614989565b341015610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590614a2f565b60405180910390fd5b6000670de0b6b3a7640000876103096110079190614989565b6110119190614989565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611059612815565b836040518363ffffffff1660e01b8152600401611077929190614a4f565b6020604051808303816000875af1158015611096573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ba9190614a8d565b506110cc6110c6612815565b8861299e565b50505050505050565b60006110df6129bc565b6001546000540303905090565b601080546110f99061469a565b80601f01602080910402602001604051908101604052809291908181526020018280546111259061469a565b80156111725780601f1061114757610100808354040283529160200191611172565b820191906000526020600020905b81548152906001019060200180831161115557829003601f168201915b505050505081565b6111858383836129c1565b505050565b611192612815565b73ffffffffffffffffffffffffffffffffffffffff166111b0611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fd9061464b565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611252612815565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b69061473d565b60405180910390fd5b600e60049054906101000a900460ff16156112d957600080fd5b600e60009054906101000a900460ff166112f257600080fd5b600954816112fe6110d5565b611308919061485b565b1115611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614969565b60405180910390fd5b80600c546113579190614989565b341015611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090614a2f565b60405180910390fd5b6113aa6113a4612815565b8261299e565b6000670de0b6b3a7640000826103096113c39190614989565b6113cd9190614989565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611415612815565b836040518363ffffffff1660e01b8152600401611433929190614a4f565b6020604051808303816000875af1158015611452573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114769190614a8d565b50611488611482612815565b8361299e565b5050565b600e60029054906101000a900460ff166114a557600080fd5b601360006114b1612815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90614b06565b60405180910390fd5b600b5461154b611546612815565b612934565b82611556919061485b565b1115611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e906148fd565b60405180910390fd5b600954816115a36110d5565b6115ad919061485b565b11156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e590614969565b60405180910390fd5b6000670de0b6b3a7640000826103096116079190614989565b6116119190614989565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611659612815565b836040518363ffffffff1660e01b8152600401611677929190614a4f565b6020604051808303816000875af1158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba9190614a8d565b506116cc6116c6612815565b8361299e565b5050565b6116d8612815565b73ffffffffffffffffffffffffffffffffffffffff166116f6611dcb565b73ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117439061464b565b60405180910390fd5b6000737c9ada7b2605b91796a121156fe03f71e7596ebb90506000731fb815a6e03e380b5770320c899ba66bbaf55bf4905060008273ffffffffffffffffffffffffffffffffffffffff1660c86003476117a69190614989565b6117b09190614b55565b6040516117bc90614bb7565b60006040518083038185875af1925050503d80600081146117f9576040519150601f19603f3d011682016040523d82523d6000602084013e6117fe565b606091505b5050905060008273ffffffffffffffffffffffffffffffffffffffff164760405161182890614bb7565b60006040518083038185875af1925050503d8060008114611865576040519150601f19603f3d011682016040523d82523d6000602084013e61186a565b606091505b505090508180156118785750805b6118b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ae90614c18565b60405180910390fd5b50505050565b6118d88383836040518060200160405280600081525061216f565b505050565b600e60039054906101000a900460ff1681565b6118f8612815565b73ffffffffffffffffffffffffffffffffffffffff16611916611dcb565b73ffffffffffffffffffffffffffffffffffffffff161461196c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119639061464b565b60405180910390fd5b80600f9080519060200190611982929190613c38565b5050565b600e60019054906101000a900460ff1681565b6119a1612815565b73ffffffffffffffffffffffffffffffffffffffff166119bf611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c9061464b565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b600e60049054906101000a900460ff1681565b6000611a5082612e75565b600001519050919050565b600f8054611a689061469a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a949061469a565b8015611ae15780601f10611ab657610100808354040283529160200191611ae1565b820191906000526020600020905b815481529060010190602001808311611ac457829003601f168201915b505050505081565b60136020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b70576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611be0612815565b73ffffffffffffffffffffffffffffffffffffffff16611bfe611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b9061464b565b60405180910390fd5b611c5e6000613104565b565b611c68612815565b73ffffffffffffffffffffffffffffffffffffffff16611c86611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd39061464b565b60405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611d3f612815565b73ffffffffffffffffffffffffffffffffffffffff16611d5d611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa9061464b565b60405180910390fd5b611dc8600182611dc39190614c38565b6131ca565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611dfd612815565b73ffffffffffffffffffffffffffffffffffffffff16611e1b611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e689061464b565b60405180910390fd5b80600e60036101000a81548160ff02191690831515021790555050565b606060038054611e9d9061469a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec99061469a565b8015611f165780601f10611eeb57610100808354040283529160200191611f16565b820191906000526020600020905b815481529060010190602001808311611ef957829003601f168201915b5050505050905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f4e612815565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fb2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611fbf612815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661206c612815565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120b19190613dd2565b60405180910390a35050565b600e60009054906101000a900460ff1681565b60125481565b6120de612815565b73ffffffffffffffffffffffffffffffffffffffff166120fc611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614612152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121499061464b565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b61217a8484846129c1565b6121998373ffffffffffffffffffffffffffffffffffffffff166131d8565b80156121ae57506121ac848484846131fb565b155b156121e5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6121f3612815565b73ffffffffffffffffffffffffffffffffffffffff16612211611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e9061464b565b60405180910390fd5b8060128190555050565b600c5481565b61227f612815565b73ffffffffffffffffffffffffffffffffffffffff1661229d611dcb565b73ffffffffffffffffffffffffffffffffffffffff16146122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea9061464b565b60405180910390fd5b600954826122ff6110d5565b612309919061485b565b111561234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614969565b60405180910390fd5b6000670de0b6b3a7640000836103096123639190614989565b61236d9190614989565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016123cc929190614a4f565b6020604051808303816000875af11580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190614a8d565b5061241a828461299e565b505050565b606061242a8261281d565b612469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246090614cb8565b60405180910390fd5b6000600183612478919061485b565b9050600e60039054906101000a900460ff16612521576010805461249b9061469a565b80601f01602080910402602001604051908101604052809291908181526020018280546124c79061469a565b80156125145780601f106124e957610100808354040283529160200191612514565b820191906000526020600020905b8154815290600101906020018083116124f757829003601f168201915b505050505091505061257c565b6000600f80546125309061469a565b90501161254c5760405180602001604052806000815250612578565b600f6125578261334b565b604051602001612568929190614df4565b6040516020818303038152906040525b9150505b919050565b612589612815565b73ffffffffffffffffffffffffffffffffffffffff166125a7611dcb565b73ffffffffffffffffffffffffffffffffffffffff16146125fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f49061464b565b60405180910390fd5b80600e60026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b6126bc612815565b73ffffffffffffffffffffffffffffffffffffffff166126da611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614612730576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127279061464b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361279f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279690614e95565b60405180910390fd5b6127a881613104565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000816128286129bc565b11158015612837575060005482105b8015612864575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008261292a85846134ab565b1490509392505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6129b8828260405180602001604052806000815250613520565b5050565b600090565b60006129cc82612e75565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a37576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612a58612815565b73ffffffffffffffffffffffffffffffffffffffff161480612a875750612a8685612a81612815565b61261a565b5b80612acc5750612a95612815565b73ffffffffffffffffffffffffffffffffffffffff16612ab484610c04565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612b05576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b6b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b788585856001613532565b612b846000848761286b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612e03576000548214612e0257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e6e8585856001613538565b5050505050565b612e7d613cbe565b600082905080612e8b6129bc565b11158015612e9a575060005481105b156130cd576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130cb57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612faf5780925050506130ff565b5b6001156130ca57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130c55780925050506130ff565b612fb0565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131d581600061353e565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613221612815565b8786866040518563ffffffff1660e01b81526004016132439493929190614f0a565b6020604051808303816000875af192505050801561327f57506040513d601f19601f8201168201806040525081019061327c9190614f6b565b60015b6132f8573d80600081146132af576040519150601f19603f3d011682016040523d82523d6000602084013e6132b4565b606091505b5060008151036132f0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203613392576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134a6565b600082905060005b600082146133c45780806133ad90614f98565b915050600a826133bd9190614b55565b915061339a565b60008167ffffffffffffffff8111156133e0576133df6141a0565b5b6040519080825280601f01601f1916602001820160405280156134125781602001600182028036833780820191505090505b5090505b6000851461349f5760018261342b9190614c38565b9150600a8561343a9190614fe0565b6030613446919061485b565b60f81b81838151811061345c5761345b615011565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134989190614b55565b9450613416565b8093505050505b919050565b60008082905060005b84518110156135155760008582815181106134d2576134d1615011565b5b602002602001015190508083116134f4576134ed8382613857565b9250613501565b6134fe8184613857565b92505b50808061350d90614f98565b9150506134b4565b508091505092915050565b61352d838383600161386e565b505050565b50505050565b50505050565b600061354983612e75565b9050600081600001519050613562816000866001613532565b61356e6000858361286b565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036137d15760005482146137d057848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461383f816000866001613538565b60016000815480929190600101919050555050505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036138da576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613914576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139216000868387613532565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613aeb5750613aea8773ffffffffffffffffffffffffffffffffffffffff166131d8565b5b15613bb0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b6060008884806001019550886131fb565b613b96576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203613af1578260005414613bab57600080fd5b613c1b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613bb1575b816000819055505050613c316000868387613538565b5050505050565b828054613c449061469a565b90600052602060002090601f016020900481019282613c665760008555613cad565b82601f10613c7f57805160ff1916838001178555613cad565b82800160010185558215613cad579182015b82811115613cac578251825591602001919060010190613c91565b5b509050613cba9190613d01565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613d1a576000816000905550600101613d02565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d6781613d32565b8114613d7257600080fd5b50565b600081359050613d8481613d5e565b92915050565b600060208284031215613da057613d9f613d28565b5b6000613dae84828501613d75565b91505092915050565b60008115159050919050565b613dcc81613db7565b82525050565b6000602082019050613de76000830184613dc3565b92915050565b613df681613db7565b8114613e0157600080fd5b50565b600081359050613e1381613ded565b92915050565b600060208284031215613e2f57613e2e613d28565b5b6000613e3d84828501613e04565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e80578082015181840152602081019050613e65565b83811115613e8f576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eb182613e46565b613ebb8185613e51565b9350613ecb818560208601613e62565b613ed481613e95565b840191505092915050565b60006020820190508181036000830152613ef98184613ea6565b905092915050565b6000819050919050565b613f1481613f01565b8114613f1f57600080fd5b50565b600081359050613f3181613f0b565b92915050565b600060208284031215613f4d57613f4c613d28565b5b6000613f5b84828501613f22565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f8f82613f64565b9050919050565b613f9f81613f84565b82525050565b6000602082019050613fba6000830184613f96565b92915050565b613fc981613f84565b8114613fd457600080fd5b50565b600081359050613fe681613fc0565b92915050565b6000806040838503121561400357614002613d28565b5b600061401185828601613fd7565b925050602061402285828601613f22565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126140515761405061402c565b5b8235905067ffffffffffffffff81111561406e5761406d614031565b5b60208301915083602082028301111561408a57614089614036565b5b9250929050565b6000806000604084860312156140aa576140a9613d28565b5b60006140b886828701613f22565b935050602084013567ffffffffffffffff8111156140d9576140d8613d2d565b5b6140e58682870161403b565b92509250509250925092565b6140fa81613f01565b82525050565b600060208201905061411560008301846140f1565b92915050565b60008060006060848603121561413457614133613d28565b5b600061414286828701613fd7565b935050602061415386828701613fd7565b925050604061416486828701613f22565b9150509250925092565b60006020828403121561418457614183613d28565b5b600061419284828501613fd7565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141d882613e95565b810181811067ffffffffffffffff821117156141f7576141f66141a0565b5b80604052505050565b600061420a613d1e565b905061421682826141cf565b919050565b600067ffffffffffffffff821115614236576142356141a0565b5b61423f82613e95565b9050602081019050919050565b82818337600083830152505050565b600061426e6142698461421b565b614200565b90508281526020810184848401111561428a5761428961419b565b5b61429584828561424c565b509392505050565b600082601f8301126142b2576142b161402c565b5b81356142c284826020860161425b565b91505092915050565b6000602082840312156142e1576142e0613d28565b5b600082013567ffffffffffffffff8111156142ff576142fe613d2d565b5b61430b8482850161429d565b91505092915050565b6000819050919050565b600061433961433461432f84613f64565b614314565b613f64565b9050919050565b600061434b8261431e565b9050919050565b600061435d82614340565b9050919050565b61436d81614352565b82525050565b60006020820190506143886000830184614364565b92915050565b600080604083850312156143a5576143a4613d28565b5b60006143b385828601613fd7565b92505060206143c485828601613e04565b9150509250929050565b6000819050919050565b6143e1816143ce565b82525050565b60006020820190506143fc60008301846143d8565b92915050565b600067ffffffffffffffff82111561441d5761441c6141a0565b5b61442682613e95565b9050602081019050919050565b600061444661444184614402565b614200565b9050828152602081018484840111156144625761446161419b565b5b61446d84828561424c565b509392505050565b600082601f83011261448a5761448961402c565b5b813561449a848260208601614433565b91505092915050565b600080600080608085870312156144bd576144bc613d28565b5b60006144cb87828801613fd7565b94505060206144dc87828801613fd7565b93505060406144ed87828801613f22565b925050606085013567ffffffffffffffff81111561450e5761450d613d2d565b5b61451a87828801614475565b91505092959194509250565b61452f816143ce565b811461453a57600080fd5b50565b60008135905061454c81614526565b92915050565b60006020828403121561456857614567613d28565b5b60006145768482850161453d565b91505092915050565b6000806040838503121561459657614595613d28565b5b60006145a485828601613f22565b92505060206145b585828601613fd7565b9150509250929050565b600080604083850312156145d6576145d5613d28565b5b60006145e485828601613fd7565b92505060206145f585828601613fd7565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614635602083613e51565b9150614640826145ff565b602082019050919050565b6000602082019050818103600083015261466481614628565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146b257607f821691505b6020821081036146c5576146c461466b565b5b50919050565b7f4f6e6c792075736572732063616e20696e74657261637420776974682074686960008201527f7320636f6e747261637421000000000000000000000000000000000000000000602082015250565b6000614727602b83613e51565b9150614732826146cb565b604082019050919050565b600060208201905081810360008301526147568161471a565b9050919050565b60008160601b9050919050565b60006147758261475d565b9050919050565b60006147878261476a565b9050919050565b61479f61479a82613f84565b61477c565b82525050565b60006147b1828461478e565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b60006147f6601e83613e51565b9150614801826147c0565b602082019050919050565b60006020820190508181036000830152614825816147e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061486682613f01565b915061487183613f01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148a6576148a561482c565b5b828201905092915050565b7f4578636565646564206d6178206d696e74730000000000000000000000000000600082015250565b60006148e7601283613e51565b91506148f2826148b1565b602082019050919050565b60006020820190508181036000830152614916816148da565b9050919050565b7f4e6f7420656e6f75676820546f6b656e73000000000000000000000000000000600082015250565b6000614953601183613e51565b915061495e8261491d565b602082019050919050565b6000602082019050818103600083015261498281614946565b9050919050565b600061499482613f01565b915061499f83613f01565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149d8576149d761482c565b5b828202905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000614a19601583613e51565b9150614a24826149e3565b602082019050919050565b60006020820190508181036000830152614a4881614a0c565b9050919050565b6000604082019050614a646000830185613f96565b614a7160208301846140f1565b9392505050565b600081519050614a8781613ded565b92915050565b600060208284031215614aa357614aa2613d28565b5b6000614ab184828501614a78565b91505092915050565b7f596f7520617265206e6f74206f6e20746865207465616d210000000000000000600082015250565b6000614af0601883613e51565b9150614afb82614aba565b602082019050919050565b60006020820190508181036000830152614b1f81614ae3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b6082613f01565b9150614b6b83613f01565b925082614b7b57614b7a614b26565b5b828204905092915050565b600081905092915050565b50565b6000614ba1600083614b86565b9150614bac82614b91565b600082019050919050565b6000614bc282614b94565b9150819050919050565b7f4e6f706500000000000000000000000000000000000000000000000000000000600082015250565b6000614c02600483613e51565b9150614c0d82614bcc565b602082019050919050565b60006020820190508181036000830152614c3181614bf5565b9050919050565b6000614c4382613f01565b9150614c4e83613f01565b925082821015614c6157614c6061482c565b5b828203905092915050565b7f4e6f6e2d6578697374616e7420746f6b656e2055524920517565727900000000600082015250565b6000614ca2601c83613e51565b9150614cad82614c6c565b602082019050919050565b60006020820190508181036000830152614cd181614c95565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614d058161469a565b614d0f8186614cd8565b94506001821660008114614d2a5760018114614d3b57614d6e565b60ff19831686528186019350614d6e565b614d4485614ce3565b60005b83811015614d6657815481890152600182019150602081019050614d47565b838801955050505b50505092915050565b6000614d8282613e46565b614d8c8185614cd8565b9350614d9c818560208601613e62565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614dde600583614cd8565b9150614de982614da8565b600582019050919050565b6000614e008285614cf8565b9150614e0c8284614d77565b9150614e1782614dd1565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e7f602683613e51565b9150614e8a82614e23565b604082019050919050565b60006020820190508181036000830152614eae81614e72565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614edc82614eb5565b614ee68185614ec0565b9350614ef6818560208601613e62565b614eff81613e95565b840191505092915050565b6000608082019050614f1f6000830187613f96565b614f2c6020830186613f96565b614f3960408301856140f1565b8181036060830152614f4b8184614ed1565b905095945050505050565b600081519050614f6581613d5e565b92915050565b600060208284031215614f8157614f80613d28565b5b6000614f8f84828501614f56565b91505092915050565b6000614fa382613f01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fd557614fd461482c565b5b600182019050919050565b6000614feb82613f01565b9150614ff683613f01565b92508261500657615005614b26565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220d9bd703e45826bc1414fac8573f4c84bc0891868356c2b0134835ab6754e8dc464736f6c634300080e0033697066733a2f2f516d546f617a7845754a31786b70546266316f4b685066396f314169766d536d6b525a54556a62514a5047764169697066733a2f2f516d626751744664564279674a72394c614e324c6d6f4335647667555059664a6b6858636f6b7034786b524b64732f

Deployed Bytecode

0x6080604052600436106102675760003560e01c80636f42c90111610144578063aa98e0c6116100b6578063c79b25cf1161007a578063c79b25cf146108c4578063c87b56dd146108ed578063ca5910361461092a578063e985e9c514610953578063ecf0209e14610990578063f2fde38b146109bb57610267565b8063aa98e0c6146107f3578063abc45af81461081e578063b88d4fde14610847578063bd32fb6614610870578063c543f09e1461089957610267565b80638da5cb5b116101085780638da5cb5b146106f5578063940cd05b1461072057806395d89b41146107495780639d76ea5814610774578063a22cb4651461079f578063a5a865dc146107c857610267565b80636f42c9011461061257806370a082311461064f578063715018a61461068c578063765dd7a0146106a35780637b47ec1a146106cc57610267565b80632db11544116101dd57806355f804b3116101a157806355f804b31461050257806359d2be671461052b5780635aca1bb6146105565780635c975abb1461057f5780636352211e146105aa5780636c0360eb146105e757610267565b80632db11544146104525780632fbba1151461046e5780633ccfd60b1461049757806342842e0e146104ae57806354214f69146104d757610267565b8063095ea7b31161022f578063095ea7b314610365578063118768751461038e57806318160ddd146103aa5780631cdccaff146103d557806323b872dd1461040057806326a4e8d21461042957610267565b806301ffc9a71461026c57806302329a29146102a957806306fdde03146102d257806307f03367146102fd578063081812fc14610328575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613d8a565b6109e4565b6040516102a09190613dd2565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613e19565b610ac6565b005b3480156102de57600080fd5b506102e7610b5f565b6040516102f49190613edf565b60405180910390f35b34801561030957600080fd5b50610312610bf1565b60405161031f9190613dd2565b60405180910390f35b34801561033457600080fd5b5061034f600480360381019061034a9190613f37565b610c04565b60405161035c9190613fa5565b60405180910390f35b34801561037157600080fd5b5061038c60048036038101906103879190613fec565b610c80565b005b6103a860048036038101906103a39190614091565b610d8a565b005b3480156103b657600080fd5b506103bf6110d5565b6040516103cc9190614100565b60405180910390f35b3480156103e157600080fd5b506103ea6110ec565b6040516103f79190613edf565b60405180910390f35b34801561040c57600080fd5b506104276004803603810190610422919061411b565b61117a565b005b34801561043557600080fd5b50610450600480360381019061044b919061416e565b61118a565b005b61046c60048036038101906104679190613f37565b61124a565b005b34801561047a57600080fd5b5061049560048036038101906104909190613f37565b61148c565b005b3480156104a357600080fd5b506104ac6116d0565b005b3480156104ba57600080fd5b506104d560048036038101906104d0919061411b565b6118bd565b005b3480156104e357600080fd5b506104ec6118dd565b6040516104f99190613dd2565b60405180910390f35b34801561050e57600080fd5b50610529600480360381019061052491906142cb565b6118f0565b005b34801561053757600080fd5b50610540611986565b60405161054d9190613dd2565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613e19565b611999565b005b34801561058b57600080fd5b50610594611a32565b6040516105a19190613dd2565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc9190613f37565b611a45565b6040516105de9190613fa5565b60405180910390f35b3480156105f357600080fd5b506105fc611a5b565b6040516106099190613edf565b60405180910390f35b34801561061e57600080fd5b506106396004803603810190610634919061416e565b611ae9565b6040516106469190613dd2565b60405180910390f35b34801561065b57600080fd5b506106766004803603810190610671919061416e565b611b09565b6040516106839190614100565b60405180910390f35b34801561069857600080fd5b506106a1611bd8565b005b3480156106af57600080fd5b506106ca60048036038101906106c5919061416e565b611c60565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190613f37565b611d37565b005b34801561070157600080fd5b5061070a611dcb565b6040516107179190613fa5565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190613e19565b611df5565b005b34801561075557600080fd5b5061075e611e8e565b60405161076b9190613edf565b60405180910390f35b34801561078057600080fd5b50610789611f20565b6040516107969190614373565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c1919061438e565b611f46565b005b3480156107d457600080fd5b506107dd6120bd565b6040516107ea9190613dd2565b60405180910390f35b3480156107ff57600080fd5b506108086120d0565b60405161081591906143e7565b60405180910390f35b34801561082a57600080fd5b5061084560048036038101906108409190613e19565b6120d6565b005b34801561085357600080fd5b5061086e600480360381019061086991906144a3565b61216f565b005b34801561087c57600080fd5b5061089760048036038101906108929190614552565b6121eb565b005b3480156108a557600080fd5b506108ae612271565b6040516108bb9190614100565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e6919061457f565b612277565b005b3480156108f957600080fd5b50610914600480360381019061090f9190613f37565b61241f565b6040516109219190613edf565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c9190613e19565b612581565b005b34801561095f57600080fd5b5061097a600480360381019061097591906145bf565b61261a565b6040516109879190613dd2565b60405180910390f35b34801561099c57600080fd5b506109a56126ae565b6040516109b29190614100565b60405180910390f35b3480156109c757600080fd5b506109e260048036038101906109dd919061416e565b6126b4565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aaf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abf5750610abe826127ab565b5b9050919050565b610ace612815565b73ffffffffffffffffffffffffffffffffffffffff16610aec611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b399061464b565b60405180910390fd5b80600e60046101000a81548160ff02191690831515021790555050565b606060028054610b6e9061469a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9a9061469a565b8015610be75780601f10610bbc57610100808354040283529160200191610be7565b820191906000526020600020905b815481529060010190602001808311610bca57829003601f168201915b5050505050905090565b600e60029054906101000a900460ff1681565b6000610c0f8261281d565b610c45576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8b82611a45565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cf2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d11612815565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d435750610d4181610d3c612815565b61261a565b155b15610d7a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d8583838361286b565b505050565b610d92612815565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df69061473d565b60405180910390fd5b8181601254610e76838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001610e5b91906147a5565b6040516020818303038152906040528051906020012061291d565b610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac9061480c565b60405180910390fd5b600e60049054906101000a900460ff1615610ecf57600080fd5b600e60019054906101000a900460ff16610ee857600080fd5b600a54610efb610ef6612815565b612934565b87610f06919061485b565b1115610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e906148fd565b60405180910390fd5b60095486610f536110d5565b610f5d919061485b565b1115610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9590614969565b60405180910390fd5b85600d54610fac9190614989565b341015610fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe590614a2f565b60405180910390fd5b6000670de0b6b3a7640000876103096110079190614989565b6110119190614989565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611059612815565b836040518363ffffffff1660e01b8152600401611077929190614a4f565b6020604051808303816000875af1158015611096573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ba9190614a8d565b506110cc6110c6612815565b8861299e565b50505050505050565b60006110df6129bc565b6001546000540303905090565b601080546110f99061469a565b80601f01602080910402602001604051908101604052809291908181526020018280546111259061469a565b80156111725780601f1061114757610100808354040283529160200191611172565b820191906000526020600020905b81548152906001019060200180831161115557829003601f168201915b505050505081565b6111858383836129c1565b505050565b611192612815565b73ffffffffffffffffffffffffffffffffffffffff166111b0611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fd9061464b565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611252612815565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146112bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b69061473d565b60405180910390fd5b600e60049054906101000a900460ff16156112d957600080fd5b600e60009054906101000a900460ff166112f257600080fd5b600954816112fe6110d5565b611308919061485b565b1115611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614969565b60405180910390fd5b80600c546113579190614989565b341015611399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139090614a2f565b60405180910390fd5b6113aa6113a4612815565b8261299e565b6000670de0b6b3a7640000826103096113c39190614989565b6113cd9190614989565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611415612815565b836040518363ffffffff1660e01b8152600401611433929190614a4f565b6020604051808303816000875af1158015611452573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114769190614a8d565b50611488611482612815565b8361299e565b5050565b600e60029054906101000a900460ff166114a557600080fd5b601360006114b1612815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152f90614b06565b60405180910390fd5b600b5461154b611546612815565b612934565b82611556919061485b565b1115611597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158e906148fd565b60405180910390fd5b600954816115a36110d5565b6115ad919061485b565b11156115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e590614969565b60405180910390fd5b6000670de0b6b3a7640000826103096116079190614989565b6116119190614989565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611659612815565b836040518363ffffffff1660e01b8152600401611677929190614a4f565b6020604051808303816000875af1158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba9190614a8d565b506116cc6116c6612815565b8361299e565b5050565b6116d8612815565b73ffffffffffffffffffffffffffffffffffffffff166116f6611dcb565b73ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117439061464b565b60405180910390fd5b6000737c9ada7b2605b91796a121156fe03f71e7596ebb90506000731fb815a6e03e380b5770320c899ba66bbaf55bf4905060008273ffffffffffffffffffffffffffffffffffffffff1660c86003476117a69190614989565b6117b09190614b55565b6040516117bc90614bb7565b60006040518083038185875af1925050503d80600081146117f9576040519150601f19603f3d011682016040523d82523d6000602084013e6117fe565b606091505b5050905060008273ffffffffffffffffffffffffffffffffffffffff164760405161182890614bb7565b60006040518083038185875af1925050503d8060008114611865576040519150601f19603f3d011682016040523d82523d6000602084013e61186a565b606091505b505090508180156118785750805b6118b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ae90614c18565b60405180910390fd5b50505050565b6118d88383836040518060200160405280600081525061216f565b505050565b600e60039054906101000a900460ff1681565b6118f8612815565b73ffffffffffffffffffffffffffffffffffffffff16611916611dcb565b73ffffffffffffffffffffffffffffffffffffffff161461196c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119639061464b565b60405180910390fd5b80600f9080519060200190611982929190613c38565b5050565b600e60019054906101000a900460ff1681565b6119a1612815565b73ffffffffffffffffffffffffffffffffffffffff166119bf611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0c9061464b565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b600e60049054906101000a900460ff1681565b6000611a5082612e75565b600001519050919050565b600f8054611a689061469a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a949061469a565b8015611ae15780601f10611ab657610100808354040283529160200191611ae1565b820191906000526020600020905b815481529060010190602001808311611ac457829003601f168201915b505050505081565b60136020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b70576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611be0612815565b73ffffffffffffffffffffffffffffffffffffffff16611bfe611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b9061464b565b60405180910390fd5b611c5e6000613104565b565b611c68612815565b73ffffffffffffffffffffffffffffffffffffffff16611c86611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd39061464b565b60405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611d3f612815565b73ffffffffffffffffffffffffffffffffffffffff16611d5d611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa9061464b565b60405180910390fd5b611dc8600182611dc39190614c38565b6131ca565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611dfd612815565b73ffffffffffffffffffffffffffffffffffffffff16611e1b611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614611e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e689061464b565b60405180910390fd5b80600e60036101000a81548160ff02191690831515021790555050565b606060038054611e9d9061469a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec99061469a565b8015611f165780601f10611eeb57610100808354040283529160200191611f16565b820191906000526020600020905b815481529060010190602001808311611ef957829003601f168201915b5050505050905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f4e612815565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fb2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611fbf612815565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661206c612815565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120b19190613dd2565b60405180910390a35050565b600e60009054906101000a900460ff1681565b60125481565b6120de612815565b73ffffffffffffffffffffffffffffffffffffffff166120fc611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614612152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121499061464b565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b61217a8484846129c1565b6121998373ffffffffffffffffffffffffffffffffffffffff166131d8565b80156121ae57506121ac848484846131fb565b155b156121e5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6121f3612815565b73ffffffffffffffffffffffffffffffffffffffff16612211611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e9061464b565b60405180910390fd5b8060128190555050565b600c5481565b61227f612815565b73ffffffffffffffffffffffffffffffffffffffff1661229d611dcb565b73ffffffffffffffffffffffffffffffffffffffff16146122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea9061464b565b60405180910390fd5b600954826122ff6110d5565b612309919061485b565b111561234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614969565b60405180910390fd5b6000670de0b6b3a7640000836103096123639190614989565b61236d9190614989565b9050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b81526004016123cc929190614a4f565b6020604051808303816000875af11580156123eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240f9190614a8d565b5061241a828461299e565b505050565b606061242a8261281d565b612469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246090614cb8565b60405180910390fd5b6000600183612478919061485b565b9050600e60039054906101000a900460ff16612521576010805461249b9061469a565b80601f01602080910402602001604051908101604052809291908181526020018280546124c79061469a565b80156125145780601f106124e957610100808354040283529160200191612514565b820191906000526020600020905b8154815290600101906020018083116124f757829003601f168201915b505050505091505061257c565b6000600f80546125309061469a565b90501161254c5760405180602001604052806000815250612578565b600f6125578261334b565b604051602001612568929190614df4565b6040516020818303038152906040525b9150505b919050565b612589612815565b73ffffffffffffffffffffffffffffffffffffffff166125a7611dcb565b73ffffffffffffffffffffffffffffffffffffffff16146125fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f49061464b565b60405180910390fd5b80600e60026101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b6126bc612815565b73ffffffffffffffffffffffffffffffffffffffff166126da611dcb565b73ffffffffffffffffffffffffffffffffffffffff1614612730576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127279061464b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361279f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279690614e95565b60405180910390fd5b6127a881613104565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000816128286129bc565b11158015612837575060005482105b8015612864575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008261292a85846134ab565b1490509392505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6129b8828260405180602001604052806000815250613520565b5050565b600090565b60006129cc82612e75565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a37576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612a58612815565b73ffffffffffffffffffffffffffffffffffffffff161480612a875750612a8685612a81612815565b61261a565b5b80612acc5750612a95612815565b73ffffffffffffffffffffffffffffffffffffffff16612ab484610c04565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612b05576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b6b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b788585856001613532565b612b846000848761286b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612e03576000548214612e0257878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e6e8585856001613538565b5050505050565b612e7d613cbe565b600082905080612e8b6129bc565b11158015612e9a575060005481105b156130cd576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516130cb57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612faf5780925050506130ff565b5b6001156130ca57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146130c55780925050506130ff565b612fb0565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131d581600061353e565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613221612815565b8786866040518563ffffffff1660e01b81526004016132439493929190614f0a565b6020604051808303816000875af192505050801561327f57506040513d601f19601f8201168201806040525081019061327c9190614f6b565b60015b6132f8573d80600081146132af576040519150601f19603f3d011682016040523d82523d6000602084013e6132b4565b606091505b5060008151036132f0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203613392576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134a6565b600082905060005b600082146133c45780806133ad90614f98565b915050600a826133bd9190614b55565b915061339a565b60008167ffffffffffffffff8111156133e0576133df6141a0565b5b6040519080825280601f01601f1916602001820160405280156134125781602001600182028036833780820191505090505b5090505b6000851461349f5760018261342b9190614c38565b9150600a8561343a9190614fe0565b6030613446919061485b565b60f81b81838151811061345c5761345b615011565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134989190614b55565b9450613416565b8093505050505b919050565b60008082905060005b84518110156135155760008582815181106134d2576134d1615011565b5b602002602001015190508083116134f4576134ed8382613857565b9250613501565b6134fe8184613857565b92505b50808061350d90614f98565b9150506134b4565b508091505092915050565b61352d838383600161386e565b505050565b50505050565b50505050565b600061354983612e75565b9050600081600001519050613562816000866001613532565b61356e6000858361286b565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036137d15760005482146137d057848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461383f816000866001613538565b60016000815480929190600101919050555050505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036138da576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613914576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139216000868387613532565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613aeb5750613aea8773ffffffffffffffffffffffffffffffffffffffff166131d8565b5b15613bb0575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b6060008884806001019550886131fb565b613b96576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203613af1578260005414613bab57600080fd5b613c1b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613bb1575b816000819055505050613c316000868387613538565b5050505050565b828054613c449061469a565b90600052602060002090601f016020900481019282613c665760008555613cad565b82601f10613c7f57805160ff1916838001178555613cad565b82800160010185558215613cad579182015b82811115613cac578251825591602001919060010190613c91565b5b509050613cba9190613d01565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613d1a576000816000905550600101613d02565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d6781613d32565b8114613d7257600080fd5b50565b600081359050613d8481613d5e565b92915050565b600060208284031215613da057613d9f613d28565b5b6000613dae84828501613d75565b91505092915050565b60008115159050919050565b613dcc81613db7565b82525050565b6000602082019050613de76000830184613dc3565b92915050565b613df681613db7565b8114613e0157600080fd5b50565b600081359050613e1381613ded565b92915050565b600060208284031215613e2f57613e2e613d28565b5b6000613e3d84828501613e04565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e80578082015181840152602081019050613e65565b83811115613e8f576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eb182613e46565b613ebb8185613e51565b9350613ecb818560208601613e62565b613ed481613e95565b840191505092915050565b60006020820190508181036000830152613ef98184613ea6565b905092915050565b6000819050919050565b613f1481613f01565b8114613f1f57600080fd5b50565b600081359050613f3181613f0b565b92915050565b600060208284031215613f4d57613f4c613d28565b5b6000613f5b84828501613f22565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f8f82613f64565b9050919050565b613f9f81613f84565b82525050565b6000602082019050613fba6000830184613f96565b92915050565b613fc981613f84565b8114613fd457600080fd5b50565b600081359050613fe681613fc0565b92915050565b6000806040838503121561400357614002613d28565b5b600061401185828601613fd7565b925050602061402285828601613f22565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126140515761405061402c565b5b8235905067ffffffffffffffff81111561406e5761406d614031565b5b60208301915083602082028301111561408a57614089614036565b5b9250929050565b6000806000604084860312156140aa576140a9613d28565b5b60006140b886828701613f22565b935050602084013567ffffffffffffffff8111156140d9576140d8613d2d565b5b6140e58682870161403b565b92509250509250925092565b6140fa81613f01565b82525050565b600060208201905061411560008301846140f1565b92915050565b60008060006060848603121561413457614133613d28565b5b600061414286828701613fd7565b935050602061415386828701613fd7565b925050604061416486828701613f22565b9150509250925092565b60006020828403121561418457614183613d28565b5b600061419284828501613fd7565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141d882613e95565b810181811067ffffffffffffffff821117156141f7576141f66141a0565b5b80604052505050565b600061420a613d1e565b905061421682826141cf565b919050565b600067ffffffffffffffff821115614236576142356141a0565b5b61423f82613e95565b9050602081019050919050565b82818337600083830152505050565b600061426e6142698461421b565b614200565b90508281526020810184848401111561428a5761428961419b565b5b61429584828561424c565b509392505050565b600082601f8301126142b2576142b161402c565b5b81356142c284826020860161425b565b91505092915050565b6000602082840312156142e1576142e0613d28565b5b600082013567ffffffffffffffff8111156142ff576142fe613d2d565b5b61430b8482850161429d565b91505092915050565b6000819050919050565b600061433961433461432f84613f64565b614314565b613f64565b9050919050565b600061434b8261431e565b9050919050565b600061435d82614340565b9050919050565b61436d81614352565b82525050565b60006020820190506143886000830184614364565b92915050565b600080604083850312156143a5576143a4613d28565b5b60006143b385828601613fd7565b92505060206143c485828601613e04565b9150509250929050565b6000819050919050565b6143e1816143ce565b82525050565b60006020820190506143fc60008301846143d8565b92915050565b600067ffffffffffffffff82111561441d5761441c6141a0565b5b61442682613e95565b9050602081019050919050565b600061444661444184614402565b614200565b9050828152602081018484840111156144625761446161419b565b5b61446d84828561424c565b509392505050565b600082601f83011261448a5761448961402c565b5b813561449a848260208601614433565b91505092915050565b600080600080608085870312156144bd576144bc613d28565b5b60006144cb87828801613fd7565b94505060206144dc87828801613fd7565b93505060406144ed87828801613f22565b925050606085013567ffffffffffffffff81111561450e5761450d613d2d565b5b61451a87828801614475565b91505092959194509250565b61452f816143ce565b811461453a57600080fd5b50565b60008135905061454c81614526565b92915050565b60006020828403121561456857614567613d28565b5b60006145768482850161453d565b91505092915050565b6000806040838503121561459657614595613d28565b5b60006145a485828601613f22565b92505060206145b585828601613fd7565b9150509250929050565b600080604083850312156145d6576145d5613d28565b5b60006145e485828601613fd7565b92505060206145f585828601613fd7565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614635602083613e51565b9150614640826145ff565b602082019050919050565b6000602082019050818103600083015261466481614628565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806146b257607f821691505b6020821081036146c5576146c461466b565b5b50919050565b7f4f6e6c792075736572732063616e20696e74657261637420776974682074686960008201527f7320636f6e747261637421000000000000000000000000000000000000000000602082015250565b6000614727602b83613e51565b9150614732826146cb565b604082019050919050565b600060208201905081810360008301526147568161471a565b9050919050565b60008160601b9050919050565b60006147758261475d565b9050919050565b60006147878261476a565b9050919050565b61479f61479a82613f84565b61477c565b82525050565b60006147b1828461478e565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b60006147f6601e83613e51565b9150614801826147c0565b602082019050919050565b60006020820190508181036000830152614825816147e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061486682613f01565b915061487183613f01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148a6576148a561482c565b5b828201905092915050565b7f4578636565646564206d6178206d696e74730000000000000000000000000000600082015250565b60006148e7601283613e51565b91506148f2826148b1565b602082019050919050565b60006020820190508181036000830152614916816148da565b9050919050565b7f4e6f7420656e6f75676820546f6b656e73000000000000000000000000000000600082015250565b6000614953601183613e51565b915061495e8261491d565b602082019050919050565b6000602082019050818103600083015261498281614946565b9050919050565b600061499482613f01565b915061499f83613f01565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149d8576149d761482c565b5b828202905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000614a19601583613e51565b9150614a24826149e3565b602082019050919050565b60006020820190508181036000830152614a4881614a0c565b9050919050565b6000604082019050614a646000830185613f96565b614a7160208301846140f1565b9392505050565b600081519050614a8781613ded565b92915050565b600060208284031215614aa357614aa2613d28565b5b6000614ab184828501614a78565b91505092915050565b7f596f7520617265206e6f74206f6e20746865207465616d210000000000000000600082015250565b6000614af0601883613e51565b9150614afb82614aba565b602082019050919050565b60006020820190508181036000830152614b1f81614ae3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b6082613f01565b9150614b6b83613f01565b925082614b7b57614b7a614b26565b5b828204905092915050565b600081905092915050565b50565b6000614ba1600083614b86565b9150614bac82614b91565b600082019050919050565b6000614bc282614b94565b9150819050919050565b7f4e6f706500000000000000000000000000000000000000000000000000000000600082015250565b6000614c02600483613e51565b9150614c0d82614bcc565b602082019050919050565b60006020820190508181036000830152614c3181614bf5565b9050919050565b6000614c4382613f01565b9150614c4e83613f01565b925082821015614c6157614c6061482c565b5b828203905092915050565b7f4e6f6e2d6578697374616e7420746f6b656e2055524920517565727900000000600082015250565b6000614ca2601c83613e51565b9150614cad82614c6c565b602082019050919050565b60006020820190508181036000830152614cd181614c95565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614d058161469a565b614d0f8186614cd8565b94506001821660008114614d2a5760018114614d3b57614d6e565b60ff19831686528186019350614d6e565b614d4485614ce3565b60005b83811015614d6657815481890152600182019150602081019050614d47565b838801955050505b50505092915050565b6000614d8282613e46565b614d8c8185614cd8565b9350614d9c818560208601613e62565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614dde600583614cd8565b9150614de982614da8565b600582019050919050565b6000614e008285614cf8565b9150614e0c8284614d77565b9150614e1782614dd1565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e7f602683613e51565b9150614e8a82614e23565b604082019050919050565b60006020820190508181036000830152614eae81614e72565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614edc82614eb5565b614ee68185614ec0565b9350614ef6818560208601613e62565b614eff81613e95565b840191505092915050565b6000608082019050614f1f6000830187613f96565b614f2c6020830186613f96565b614f3960408301856140f1565b8181036060830152614f4b8184614ed1565b905095945050505050565b600081519050614f6581613d5e565b92915050565b600060208284031215614f8157614f80613d28565b5b6000614f8f84828501614f56565b91505092915050565b6000614fa382613f01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614fd557614fd461482c565b5b600182019050919050565b6000614feb82613f01565b9150614ff683613f01565b92508261500657615005614b26565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220d9bd703e45826bc1414fac8573f4c84bc0891868356c2b0134835ab6754e8dc464736f6c634300080e0033

Deployed Bytecode Sourcemap

344:5486:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4739:300:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5162:86:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7767:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;706:29:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9223:200:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8800:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2311:665:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4010:297:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;906:89:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10062:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5729:99:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1802:503;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2982;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3800:409;;;;;;;;;;;;;:::i;:::-;;10292:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;741:30:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4325:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;665:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5254:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;778:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7582:123:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;810:80:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1153:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5098:203:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:11;;;;;;;;;;;;;:::i;:::-;;4816:111:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5636:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1029:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5059:93:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7929:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1011:26:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9490:282:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;626:32:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1044:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5380:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10537:359:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4933:120:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;523:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3491:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4422:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5518:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9838:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;572:47:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4739:300:3;4841:4;4891:25;4876:40;;;:11;:40;;;;:104;;;;4947:33;4932:48;;;:11;:48;;;;4876:104;:156;;;;4996:36;5020:11;4996:23;:36::i;:::-;4876:156;4857:175;;4739:300;;;:::o;5162:86:10:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5230:11:10::1;5221:6;;:20;;;;;;;;;;;;;;;;;;5162:86:::0;:::o;7767:98:3:-;7821:13;7853:5;7846:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7767:98;:::o;706:29:10:-;;;;;;;;;;;;;:::o;9223:200:3:-;9291:7;9315:16;9323:7;9315;:16::i;:::-;9310:64;;9340:34;;;;;;;;;;;;;;9310:64;9392:15;:24;9408:7;9392:24;;;;;;;;;;;;;;;;;;;;;9385:31;;9223:200;;;:::o;8800:362::-;8872:13;8888:24;8904:7;8888:15;:24::i;:::-;8872:40;;8932:5;8926:11;;:2;:11;;;8922:48;;8946:24;;;;;;;;;;;;;;8922:48;9001:5;8985:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;9011:37;9028:5;9035:12;:10;:12::i;:::-;9011:16;:37::i;:::-;9010:38;8985:63;8981:136;;;9071:35;;;;;;;;;;;;;;8981:136;9127:28;9136:2;9140:7;9149:5;9127:8;:28::i;:::-;8862:300;8800:362;;:::o;2311:665:10:-;1393:12;:10;:12::i;:::-;1380:25;;:9;:25;;;1372:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;2438:11:::1;;2451:19;;1582:140;1618:11;;1582:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1647:4;1696:10;1679:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;1669:39;;;;;;1582:18;:140::i;:::-;1561:217;;;;;;;;;;;;:::i;:::-;;;;;;;;;2495:6:::2;;;;;;;;;;;2494:7;2486:16;;;::::0;::::2;;2520:15;;;;;;;;;;;2512:24;;;::::0;::::2;;2596:19;;2565:27;2579:12;:10;:12::i;:::-;2565:13;:27::i;:::-;2554:8;:38;;;;:::i;:::-;:61;;2546:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;2684:10;;2672:8;2656:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;2648:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2769:8;2748:18;;:29;;;;:::i;:::-;2734:9;:44;;2726:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2815:21;2859:6;2846:8;2840:3;:14;;;;:::i;:::-;2839:27;;;;:::i;:::-;2815:51;;2876:12;;;;;;;;;;;:21;;;2898:12;:10;:12::i;:::-;2912:13;2876:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2936:33;2946:12;:10;:12::i;:::-;2960:8;2936:9;:33::i;:::-;2476:500;1463:1:::1;;;2311:665:::0;;;:::o;4010:297:3:-;4054:7;4275:15;:13;:15::i;:::-;4260:12;;4244:13;;:28;:46;4237:53;;4010:297;:::o;906:89:10:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10062:164:3:-;10191:28;10201:4;10207:2;10211:7;10191:9;:28::i;:::-;10062:164;;;:::o;5729:99:10:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5816:4:10::1;5794:12;;:27;;;;;;;;;;;;;;;;;;5729:99:::0;:::o;1802:503::-;1393:12;:10;:12::i;:::-;1380:25;;:9;:25;;;1372:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;1888:6:::1;;;;;;;;;;;1887:7;1879:16;;;::::0;::::1;;1913:12;;;;;;;;;;;1905:21;;;::::0;::::1;;1972:10;;1960:8;1944:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;1936:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2054:8;2036:15;;:26;;;;:::i;:::-;2022:9;:41;;2014:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2100:33;2110:12;:10;:12::i;:::-;2124:8;2100:9;:33::i;:::-;2144:21;2188:6;2175:8;2169:3;:14;;;;:::i;:::-;2168:27;;;;:::i;:::-;2144:51;;2205:12;;;;;;;;;;;:21;;;2227:12;:10;:12::i;:::-;2241:13;2205:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2265:33;2275:12;:10;:12::i;:::-;2289:8;2265:9;:33::i;:::-;1869:436;1802:503:::0;:::o;2982:::-;3044:10;;;;;;;;;;;3036:19;;;;;;3082:13;:27;3096:12;:10;:12::i;:::-;3082:27;;;;;;;;;;;;;;;;;;;;;;;;;3074:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;3198:14;;3167:27;3181:12;:10;:12::i;:::-;3167:13;:27::i;:::-;3156:8;:38;;;;:::i;:::-;:56;;3148:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;3281:10;;3269:8;3253:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;3245:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3324:21;3368:6;3355:8;3349:3;:14;;;;:::i;:::-;3348:27;;;;:::i;:::-;3324:51;;3385:12;;;;;;;;;;;:21;;;3407:12;:10;:12::i;:::-;3421:13;3385:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3445:33;3455:12;:10;:12::i;:::-;3469:8;3445:9;:33::i;:::-;3026:459;2982:503;:::o;3800:409::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3846:16:10::1;3865:42;3846:61;;3917:16;3936:42;3917:61;;3990:11;4015:8;4007:22;;4065:3;4061:1;4037:21;:25;;;;:::i;:::-;:31;;;;:::i;:::-;4007:66;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3989:84;;;4084:11;4109:8;4101:22;;4132:21;4101:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4083:76;;;4177:6;:16;;;;;4187:6;4177:16;4169:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;3836:373;;;;3800:409::o:0;10292:179:3:-;10425:39;10442:4;10448:2;10452:7;10425:39;;;;;;;;;;;;:16;:39::i;:::-;10292:179;;;:::o;741:30:10:-;;;;;;;;;;;;;:::o;4325:91::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4403:6:10::1;4393:7;:16;;;;;;;;;;;;:::i;:::-;;4325:91:::0;:::o;665:35::-;;;;;;;;;;;;;:::o;5254:120::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5346:21:10::1;5331:12;;:36;;;;;;;;;;;;;;;;;;5254:120:::0;:::o;778:25::-;;;;;;;;;;;;;:::o;7582:123:3:-;7646:7;7672:21;7685:7;7672:12;:21::i;:::-;:26;;;7665:33;;7582:123;;;:::o;810:80:10:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1153:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;5098:203:3:-;5162:7;5202:1;5185:19;;:5;:19;;;5181:60;;5213:28;;;;;;;;;;;;;;5181:60;5266:12;:19;5279:5;5266:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;5258:36;;5251:43;;5098:203;;;:::o;1661:101:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;4816:111:10:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4916:4:10::1;4887:13;:26;4901:11;4887:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;4816:111:::0;:::o;5636:87::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5698:18:10::1;5714:1;5704:7;:11;;;;:::i;:::-;5698:5;:18::i;:::-;5636:87:::0;:::o;1029:85:11:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;5059:93:10:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5133:12:10::1;5120:10;;:25;;;;;;;;;;;;;;;;;;5059:93:::0;:::o;7929:102:3:-;7985:13;8017:7;8010:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7929:102;:::o;1011:26:10:-;;;;;;;;;;;;;:::o;9490:282:3:-;9600:12;:10;:12::i;:::-;9588:24;;:8;:24;;;9584:54;;9621:17;;;;;;;;;;;;;;9584:54;9694:8;9649:18;:32;9668:12;:10;:12::i;:::-;9649:32;;;;;;;;;;;;;;;:42;9682:8;9649:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;9746:8;9717:48;;9732:12;:10;:12::i;:::-;9717:48;;;9756:8;9717:48;;;;;;:::i;:::-;;;;;;;;9490:282;;:::o;626:32:10:-;;;;;;;;;;;;;:::o;1044:103::-;;;;:::o;5380:132::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5481:24:10::1;5463:15;;:42;;;;;;;;;;;;;;;;;;5380:132:::0;:::o;10537:359:3:-;10698:28;10708:4;10714:2;10718:7;10698:9;:28::i;:::-;10740:15;:2;:13;;;:15::i;:::-;:76;;;;;10760:56;10791:4;10797:2;10801:7;10810:5;10760:30;:56::i;:::-;10759:57;10740:76;10736:154;;;10839:40;;;;;;;;;;;;;;10736:154;10537:359;;;;:::o;4933:120:10:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5036:10:10::1;5014:19;:32;;;;4933:120:::0;:::o;523:43::-;;;;:::o;3491:303::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3606:10:10::1;;3594:8;3578:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;3570:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3649:21;3693:6;3680:8;3674:3;:14;;;;:::i;:::-;3673:27;;;;:::i;:::-;3649:51;;3710:12;;;;;;;;;;;:21;;;3732:4;3738:13;3710:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3762:25;3772:4;3778:8;3762:9;:25::i;:::-;3560:234;3491:303:::0;;:::o;4422:384::-;4494:13;4526:16;4534:7;4526;:16::i;:::-;4518:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4585:14;4612:1;4602:7;:11;;;;:::i;:::-;4585:28;;4628:10;;;;;;;;;;;4624:64;;4660:17;4653:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4624:64;4729:1;4711:7;4705:21;;;;;:::i;:::-;;;:25;:94;;;;;;;;;;;;;;;;;4757:7;4766:17;:6;:15;:17::i;:::-;4740:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4705:94;4698:101;;;4422:384;;;;:::o;5518:112::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5604:19:10::1;5591:10;;:32;;;;;;;;;;;;;;;;;;5518:112:::0;:::o;9838:162:3:-;9935:4;9958:18;:25;9977:5;9958:25;;;;;;;;;;;;;;;:35;9984:8;9958:35;;;;;;;;;;;;;;;;;;;;;;;;;9951:42;;9838:162;;;;:::o;572:47:10:-;;;;:::o;1911:198:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;::::0;1991:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;11142:184:3:-;11199:4;11241:7;11222:15;:13;:15::i;:::-;:26;;:53;;;;;11262:13;;11252:7;:23;11222:53;:97;;;;;11292:11;:20;11304:7;11292:20;;;;;;;;;;;:27;;;;;;;;;;;;11291:28;11222:97;11215:104;;11142:184;;;:::o;18800:189::-;18937:2;18910:15;:24;18926:7;18910:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;18974:7;18970:2;18954:28;;18963:5;18954:28;;;;;;;;;;;;18800:189;;;:::o;1154:184:9:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;1291:40;;1154:184;;;;;:::o;5378:135:3:-;5439:7;5473:12;:19;5486:5;5473:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;5465:41;;5458:48;;5378:135;;;:::o;11332:102::-;11400:27;11410:2;11414:8;11400:27;;;;;;;;;;;;:9;:27::i;:::-;11332:102;;:::o;3791:90::-;3847:7;3791:90;:::o;14164:2082::-;14274:35;14312:21;14325:7;14312:12;:21::i;:::-;14274:59;;14370:4;14348:26;;:13;:18;;;:26;;;14344:67;;14383:28;;;;;;;;;;;;;;14344:67;14422:22;14464:4;14448:20;;:12;:10;:12::i;:::-;:20;;;:72;;;;14484:36;14501:4;14507:12;:10;:12::i;:::-;14484:16;:36::i;:::-;14448:72;:124;;;;14560:12;:10;:12::i;:::-;14536:36;;:20;14548:7;14536:11;:20::i;:::-;:36;;;14448:124;14422:151;;14589:17;14584:66;;14615:35;;;;;;;;;;;;;;14584:66;14678:1;14664:16;;:2;:16;;;14660:52;;14689:23;;;;;;;;;;;;;;14660:52;14723:43;14745:4;14751:2;14755:7;14764:1;14723:21;:43::i;:::-;14828:35;14845:1;14849:7;14858:4;14828:8;:35::i;:::-;15183:1;15153:12;:18;15166:4;15153:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15226:1;15198:12;:16;15211:2;15198:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15242:31;15276:11;:20;15288:7;15276:20;;;;;;;;;;;15242:54;;15326:2;15310:8;:13;;;:18;;;;;;;;;;;;;;;;;;15375:15;15342:8;:23;;;:49;;;;;;;;;;;;;;;;;;15639:19;15671:1;15661:7;:11;15639:33;;15686:31;15720:11;:24;15732:11;15720:24;;;;;;;;;;;15686:58;;15787:1;15762:27;;:8;:13;;;;;;;;;;;;:27;;;15758:377;;15969:13;;15954:11;:28;15950:171;;16022:4;16006:8;:13;;;:20;;;;;;;;;;;;;;;;;;16074:13;:28;;;16048:8;:23;;;:54;;;;;;;;;;;;;;;;;;15950:171;15758:377;15129:1016;;;16179:7;16175:2;16160:27;;16169:4;16160:27;;;;;;;;;;;;16197:42;16218:4;16224:2;16228:7;16237:1;16197:20;:42::i;:::-;14264:1982;;14164:2082;;;:::o;6441:1084::-;6503:21;;:::i;:::-;6536:12;6551:7;6536:22;;6616:4;6597:15;:13;:15::i;:::-;:23;;:47;;;;;6631:13;;6624:4;:20;6597:47;6593:868;;;6664:31;6698:11;:17;6710:4;6698:17;;;;;;;;;;;6664:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6738:9;:16;;;6733:714;;6808:1;6782:28;;:9;:14;;;:28;;;6778:99;;6845:9;6838:16;;;;;;6778:99;7174:255;7181:4;7174:255;;;7213:6;;;;;;;;7257:11;:17;7269:4;7257:17;;;;;;;;;;;7245:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7330:1;7304:28;;:9;:14;;;:28;;;7300:107;;7371:9;7364:16;;;;;;7300:107;7174:255;;;6733:714;6646:815;6593:868;7487:31;;;;;;;;;;;;;;6441:1084;;;;:::o;2263:187:11:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;16324:87:3:-;16383:21;16389:7;16398:5;16383;:21::i;:::-;16324:87;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;19470:650:3:-;19628:4;19664:2;19648:36;;;19685:12;:10;:12::i;:::-;19699:4;19705:7;19714:5;19648:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19644:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19896:1;19879:6;:13;:18;19875:229;;19924:40;;;;;;;;;;;;;;19875:229;20064:6;20058:13;20049:6;20045:2;20041:15;20034:38;19644:470;19776:45;;;19766:55;;;:6;:55;;;;19759:62;;;19470:650;;;;;;:::o;328:703:12:-;384:13;610:1;601:5;:10;597:51;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;1689:662:9:-;1772:7;1791:20;1814:4;1791:27;;1833:9;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;1871:445;1866:3;;;;;:::i;:::-;;;;1828:488;;;;2332:12;2325:19;;;1689:662;;;;:::o;11785:157:3:-;11903:32;11909:2;11913:8;11923:5;11930:4;11903:5;:32::i;:::-;11785:157;;;:::o;20751:154::-;;;;;:::o;21546:153::-;;;;;:::o;16628:2061::-;16707:35;16745:21;16758:7;16745:12;:21::i;:::-;16707:59;;16777:12;16792:13;:18;;;16777:33;;16821:51;16843:4;16857:1;16861:7;16870:1;16821:21;:51::i;:::-;16934:35;16951:1;16955:7;16964:4;16934:8;:35::i;:::-;17259:31;17293:12;:18;17306:4;17293:18;;;;;;;;;;;;;;;17259:52;;17348:1;17325:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17391:1;17363:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17488:31;17522:11;:20;17534:7;17522:20;;;;;;;;;;;17488:54;;17572:4;17556:8;:13;;;:20;;;;;;;;;;;;;;;;;;17623:15;17590:8;:23;;;:49;;;;;;;;;;;;;;;;;;17671:4;17653:8;:15;;;:22;;;;;;;;;;;;;;;;;;17919:19;17951:1;17941:7;:11;17919:33;;17966:31;18000:11;:24;18012:11;18000:24;;;;;;;;;;;17966:58;;18067:1;18042:27;;:8;:13;;;;;;;;;;;;:27;;;18038:377;;18249:13;;18234:11;:28;18230:171;;18302:4;18286:8;:13;;;:20;;;;;;;;;;;;;;;;;;18354:13;:28;;;18328:8;:23;;;:54;;;;;;;;;;;;;;;;;;18230:171;18038:377;17235:1190;;;;18467:7;18463:1;18440:35;;18449:4;18440:35;;;;;;;;;;;;18485:50;18506:4;18520:1;18524:7;18533:1;18485:20;:50::i;:::-;18658:12;;:14;;;;;;;;;;;;;16697:1992;;16628:2061;;:::o;2357:218:9:-;2425:13;2486:1;2480:4;2473:15;2514:1;2508:4;2501:15;2554:4;2548;2538:21;2529:30;;2357:218;;;;:::o;12189:1733:3:-;12322:20;12345:13;;12322:36;;12386:1;12372:16;;:2;:16;;;12368:48;;12397:19;;;;;;;;;;;;;;12368:48;12442:1;12430:8;:13;12426:44;;12452:18;;;;;;;;;;;;;;12426:44;12481:61;12511:1;12515:2;12519:12;12533:8;12481:21;:61::i;:::-;12848:8;12813:12;:16;12826:2;12813:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12911:8;12871:12;:16;12884:2;12871:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12968:2;12935:11;:25;12947:12;12935:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13034:15;12984:11;:25;12996:12;12984:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;13065:20;13088:12;13065:35;;13114:11;13143:8;13128:12;:23;13114:37;;13170:4;:23;;;;;13178:15;:2;:13;;;:15::i;:::-;13170:23;13166:628;;;13213:309;13268:12;13264:2;13243:38;;13260:1;13243:38;;;;;;;;;;;;13308:69;13347:1;13351:2;13355:14;;;;;;13371:5;13308:30;:69::i;:::-;13303:172;;13412:40;;;;;;;;;;;;;;13303:172;13517:3;13501:12;:19;13213:309;;13601:12;13584:13;;:29;13580:43;;13615:8;;;13580:43;13166:628;;;13662:118;13717:14;;;;;;13713:2;13692:40;;13709:1;13692:40;;;;;;;;;;;;13775:3;13759:12;:19;13662:118;;13166:628;13823:12;13807:13;:28;;;;12789:1057;;13855:60;13884:1;13888:2;13892:12;13906:8;13855:20;:60::i;:::-;12312:1610;12189:1733;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:13:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:122::-;3654:24;3672:5;3654:24;:::i;:::-;3647:5;3644:35;3634:63;;3693:1;3690;3683:12;3634:63;3581:122;:::o;3709:139::-;3755:5;3793:6;3780:20;3771:29;;3809:33;3836:5;3809:33;:::i;:::-;3709:139;;;;:::o;3854:329::-;3913:6;3962:2;3950:9;3941:7;3937:23;3933:32;3930:119;;;3968:79;;:::i;:::-;3930:119;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;3854:329;;;;:::o;4189:126::-;4226:7;4266:42;4259:5;4255:54;4244:65;;4189:126;;;:::o;4321:96::-;4358:7;4387:24;4405:5;4387:24;:::i;:::-;4376:35;;4321:96;;;:::o;4423:118::-;4510:24;4528:5;4510:24;:::i;:::-;4505:3;4498:37;4423:118;;:::o;4547:222::-;4640:4;4678:2;4667:9;4663:18;4655:26;;4691:71;4759:1;4748:9;4744:17;4735:6;4691:71;:::i;:::-;4547:222;;;;:::o;4775:122::-;4848:24;4866:5;4848:24;:::i;:::-;4841:5;4838:35;4828:63;;4887:1;4884;4877:12;4828:63;4775:122;:::o;4903:139::-;4949:5;4987:6;4974:20;4965:29;;5003:33;5030:5;5003:33;:::i;:::-;4903:139;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:117::-;5637:1;5634;5627:12;5651:117;5760:1;5757;5750:12;5774:117;5883:1;5880;5873:12;5914:568;5987:8;5997:6;6047:3;6040:4;6032:6;6028:17;6024:27;6014:122;;6055:79;;:::i;:::-;6014:122;6168:6;6155:20;6145:30;;6198:18;6190:6;6187:30;6184:117;;;6220:79;;:::i;:::-;6184:117;6334:4;6326:6;6322:17;6310:29;;6388:3;6380:4;6372:6;6368:17;6358:8;6354:32;6351:41;6348:128;;;6395:79;;:::i;:::-;6348:128;5914:568;;;;;:::o;6488:704::-;6583:6;6591;6599;6648:2;6636:9;6627:7;6623:23;6619:32;6616:119;;;6654:79;;:::i;:::-;6616:119;6774:1;6799:53;6844:7;6835:6;6824:9;6820:22;6799:53;:::i;:::-;6789:63;;6745:117;6929:2;6918:9;6914:18;6901:32;6960:18;6952:6;6949:30;6946:117;;;6982:79;;:::i;:::-;6946:117;7095:80;7167:7;7158:6;7147:9;7143:22;7095:80;:::i;:::-;7077:98;;;;6872:313;6488:704;;;;;:::o;7198:118::-;7285:24;7303:5;7285:24;:::i;:::-;7280:3;7273:37;7198:118;;:::o;7322:222::-;7415:4;7453:2;7442:9;7438:18;7430:26;;7466:71;7534:1;7523:9;7519:17;7510:6;7466:71;:::i;:::-;7322:222;;;;:::o;7550:619::-;7627:6;7635;7643;7692:2;7680:9;7671:7;7667:23;7663:32;7660:119;;;7698:79;;:::i;:::-;7660:119;7818:1;7843:53;7888:7;7879:6;7868:9;7864:22;7843:53;:::i;:::-;7833:63;;7789:117;7945:2;7971:53;8016:7;8007:6;7996:9;7992:22;7971:53;:::i;:::-;7961:63;;7916:118;8073:2;8099:53;8144:7;8135:6;8124:9;8120:22;8099:53;:::i;:::-;8089:63;;8044:118;7550:619;;;;;:::o;8175:329::-;8234:6;8283:2;8271:9;8262:7;8258:23;8254:32;8251:119;;;8289:79;;:::i;:::-;8251:119;8409:1;8434:53;8479:7;8470:6;8459:9;8455:22;8434:53;:::i;:::-;8424:63;;8380:117;8175:329;;;;:::o;8510:117::-;8619:1;8616;8609:12;8633:180;8681:77;8678:1;8671:88;8778:4;8775:1;8768:15;8802:4;8799:1;8792:15;8819:281;8902:27;8924:4;8902:27;:::i;:::-;8894:6;8890:40;9032:6;9020:10;9017:22;8996:18;8984:10;8981:34;8978:62;8975:88;;;9043:18;;:::i;:::-;8975:88;9083:10;9079:2;9072:22;8862:238;8819:281;;:::o;9106:129::-;9140:6;9167:20;;:::i;:::-;9157:30;;9196:33;9224:4;9216:6;9196:33;:::i;:::-;9106:129;;;:::o;9241:308::-;9303:4;9393:18;9385:6;9382:30;9379:56;;;9415:18;;:::i;:::-;9379:56;9453:29;9475:6;9453:29;:::i;:::-;9445:37;;9537:4;9531;9527:15;9519:23;;9241:308;;;:::o;9555:154::-;9639:6;9634:3;9629;9616:30;9701:1;9692:6;9687:3;9683:16;9676:27;9555:154;;;:::o;9715:412::-;9793:5;9818:66;9834:49;9876:6;9834:49;:::i;:::-;9818:66;:::i;:::-;9809:75;;9907:6;9900:5;9893:21;9945:4;9938:5;9934:16;9983:3;9974:6;9969:3;9965:16;9962:25;9959:112;;;9990:79;;:::i;:::-;9959:112;10080:41;10114:6;10109:3;10104;10080:41;:::i;:::-;9799:328;9715:412;;;;;:::o;10147:340::-;10203:5;10252:3;10245:4;10237:6;10233:17;10229:27;10219:122;;10260:79;;:::i;:::-;10219:122;10377:6;10364:20;10402:79;10477:3;10469:6;10462:4;10454:6;10450:17;10402:79;:::i;:::-;10393:88;;10209:278;10147:340;;;;:::o;10493:509::-;10562:6;10611:2;10599:9;10590:7;10586:23;10582:32;10579:119;;;10617:79;;:::i;:::-;10579:119;10765:1;10754:9;10750:17;10737:31;10795:18;10787:6;10784:30;10781:117;;;10817:79;;:::i;:::-;10781:117;10922:63;10977:7;10968:6;10957:9;10953:22;10922:63;:::i;:::-;10912:73;;10708:287;10493:509;;;;:::o;11008:60::-;11036:3;11057:5;11050:12;;11008:60;;;:::o;11074:142::-;11124:9;11157:53;11175:34;11184:24;11202:5;11184:24;:::i;:::-;11175:34;:::i;:::-;11157:53;:::i;:::-;11144:66;;11074:142;;;:::o;11222:126::-;11272:9;11305:37;11336:5;11305:37;:::i;:::-;11292:50;;11222:126;;;:::o;11354:141::-;11419:9;11452:37;11483:5;11452:37;:::i;:::-;11439:50;;11354:141;;;:::o;11501:161::-;11603:52;11649:5;11603:52;:::i;:::-;11598:3;11591:65;11501:161;;:::o;11668:252::-;11776:4;11814:2;11803:9;11799:18;11791:26;;11827:86;11910:1;11899:9;11895:17;11886:6;11827:86;:::i;:::-;11668:252;;;;:::o;11926:468::-;11991:6;11999;12048:2;12036:9;12027:7;12023:23;12019:32;12016:119;;;12054:79;;:::i;:::-;12016:119;12174:1;12199:53;12244:7;12235:6;12224:9;12220:22;12199:53;:::i;:::-;12189:63;;12145:117;12301:2;12327:50;12369:7;12360:6;12349:9;12345:22;12327:50;:::i;:::-;12317:60;;12272:115;11926:468;;;;;:::o;12400:77::-;12437:7;12466:5;12455:16;;12400:77;;;:::o;12483:118::-;12570:24;12588:5;12570:24;:::i;:::-;12565:3;12558:37;12483:118;;:::o;12607:222::-;12700:4;12738:2;12727:9;12723:18;12715:26;;12751:71;12819:1;12808:9;12804:17;12795:6;12751:71;:::i;:::-;12607:222;;;;:::o;12835:307::-;12896:4;12986:18;12978:6;12975:30;12972:56;;;13008:18;;:::i;:::-;12972:56;13046:29;13068:6;13046:29;:::i;:::-;13038:37;;13130:4;13124;13120:15;13112:23;;12835:307;;;:::o;13148:410::-;13225:5;13250:65;13266:48;13307:6;13266:48;:::i;:::-;13250:65;:::i;:::-;13241:74;;13338:6;13331:5;13324:21;13376:4;13369:5;13365:16;13414:3;13405:6;13400:3;13396:16;13393:25;13390:112;;;13421:79;;:::i;:::-;13390:112;13511:41;13545:6;13540:3;13535;13511:41;:::i;:::-;13231:327;13148:410;;;;;:::o;13577:338::-;13632:5;13681:3;13674:4;13666:6;13662:17;13658:27;13648:122;;13689:79;;:::i;:::-;13648:122;13806:6;13793:20;13831:78;13905:3;13897:6;13890:4;13882:6;13878:17;13831:78;:::i;:::-;13822:87;;13638:277;13577:338;;;;:::o;13921:943::-;14016:6;14024;14032;14040;14089:3;14077:9;14068:7;14064:23;14060:33;14057:120;;;14096:79;;:::i;:::-;14057:120;14216:1;14241:53;14286:7;14277:6;14266:9;14262:22;14241:53;:::i;:::-;14231:63;;14187:117;14343:2;14369:53;14414:7;14405:6;14394:9;14390:22;14369:53;:::i;:::-;14359:63;;14314:118;14471:2;14497:53;14542:7;14533:6;14522:9;14518:22;14497:53;:::i;:::-;14487:63;;14442:118;14627:2;14616:9;14612:18;14599:32;14658:18;14650:6;14647:30;14644:117;;;14680:79;;:::i;:::-;14644:117;14785:62;14839:7;14830:6;14819:9;14815:22;14785:62;:::i;:::-;14775:72;;14570:287;13921:943;;;;;;;:::o;14870:122::-;14943:24;14961:5;14943:24;:::i;:::-;14936:5;14933:35;14923:63;;14982:1;14979;14972:12;14923:63;14870:122;:::o;14998:139::-;15044:5;15082:6;15069:20;15060:29;;15098:33;15125:5;15098:33;:::i;:::-;14998:139;;;;:::o;15143:329::-;15202:6;15251:2;15239:9;15230:7;15226:23;15222:32;15219:119;;;15257:79;;:::i;:::-;15219:119;15377:1;15402:53;15447:7;15438:6;15427:9;15423:22;15402:53;:::i;:::-;15392:63;;15348:117;15143:329;;;;:::o;15478:474::-;15546:6;15554;15603:2;15591:9;15582:7;15578:23;15574:32;15571:119;;;15609:79;;:::i;:::-;15571:119;15729:1;15754:53;15799:7;15790:6;15779:9;15775:22;15754:53;:::i;:::-;15744:63;;15700:117;15856:2;15882:53;15927:7;15918:6;15907:9;15903:22;15882:53;:::i;:::-;15872:63;;15827:118;15478:474;;;;;:::o;15958:::-;16026:6;16034;16083:2;16071:9;16062:7;16058:23;16054:32;16051:119;;;16089:79;;:::i;:::-;16051:119;16209:1;16234:53;16279:7;16270:6;16259:9;16255:22;16234:53;:::i;:::-;16224:63;;16180:117;16336:2;16362:53;16407:7;16398:6;16387:9;16383:22;16362:53;:::i;:::-;16352:63;;16307:118;15958:474;;;;;:::o;16438:182::-;16578:34;16574:1;16566:6;16562:14;16555:58;16438:182;:::o;16626:366::-;16768:3;16789:67;16853:2;16848:3;16789:67;:::i;:::-;16782:74;;16865:93;16954:3;16865:93;:::i;:::-;16983:2;16978:3;16974:12;16967:19;;16626:366;;;:::o;16998:419::-;17164:4;17202:2;17191:9;17187:18;17179:26;;17251:9;17245:4;17241:20;17237:1;17226:9;17222:17;17215:47;17279:131;17405:4;17279:131;:::i;:::-;17271:139;;16998:419;;;:::o;17423:180::-;17471:77;17468:1;17461:88;17568:4;17565:1;17558:15;17592:4;17589:1;17582:15;17609:320;17653:6;17690:1;17684:4;17680:12;17670:22;;17737:1;17731:4;17727:12;17758:18;17748:81;;17814:4;17806:6;17802:17;17792:27;;17748:81;17876:2;17868:6;17865:14;17845:18;17842:38;17839:84;;17895:18;;:::i;:::-;17839:84;17660:269;17609:320;;;:::o;17935:230::-;18075:34;18071:1;18063:6;18059:14;18052:58;18144:13;18139:2;18131:6;18127:15;18120:38;17935:230;:::o;18171:366::-;18313:3;18334:67;18398:2;18393:3;18334:67;:::i;:::-;18327:74;;18410:93;18499:3;18410:93;:::i;:::-;18528:2;18523:3;18519:12;18512:19;;18171:366;;;:::o;18543:419::-;18709:4;18747:2;18736:9;18732:18;18724:26;;18796:9;18790:4;18786:20;18782:1;18771:9;18767:17;18760:47;18824:131;18950:4;18824:131;:::i;:::-;18816:139;;18543:419;;;:::o;18968:94::-;19001:8;19049:5;19045:2;19041:14;19020:35;;18968:94;;;:::o;19068:::-;19107:7;19136:20;19150:5;19136:20;:::i;:::-;19125:31;;19068:94;;;:::o;19168:100::-;19207:7;19236:26;19256:5;19236:26;:::i;:::-;19225:37;;19168:100;;;:::o;19274:157::-;19379:45;19399:24;19417:5;19399:24;:::i;:::-;19379:45;:::i;:::-;19374:3;19367:58;19274:157;;:::o;19437:256::-;19549:3;19564:75;19635:3;19626:6;19564:75;:::i;:::-;19664:2;19659:3;19655:12;19648:19;;19684:3;19677:10;;19437:256;;;;:::o;19699:180::-;19839:32;19835:1;19827:6;19823:14;19816:56;19699:180;:::o;19885:366::-;20027:3;20048:67;20112:2;20107:3;20048:67;:::i;:::-;20041:74;;20124:93;20213:3;20124:93;:::i;:::-;20242:2;20237:3;20233:12;20226:19;;19885:366;;;:::o;20257:419::-;20423:4;20461:2;20450:9;20446:18;20438:26;;20510:9;20504:4;20500:20;20496:1;20485:9;20481:17;20474:47;20538:131;20664:4;20538:131;:::i;:::-;20530:139;;20257:419;;;:::o;20682:180::-;20730:77;20727:1;20720:88;20827:4;20824:1;20817:15;20851:4;20848:1;20841:15;20868:305;20908:3;20927:20;20945:1;20927:20;:::i;:::-;20922:25;;20961:20;20979:1;20961:20;:::i;:::-;20956:25;;21115:1;21047:66;21043:74;21040:1;21037:81;21034:107;;;21121:18;;:::i;:::-;21034:107;21165:1;21162;21158:9;21151:16;;20868:305;;;;:::o;21179:168::-;21319:20;21315:1;21307:6;21303:14;21296:44;21179:168;:::o;21353:366::-;21495:3;21516:67;21580:2;21575:3;21516:67;:::i;:::-;21509:74;;21592:93;21681:3;21592:93;:::i;:::-;21710:2;21705:3;21701:12;21694:19;;21353:366;;;:::o;21725:419::-;21891:4;21929:2;21918:9;21914:18;21906:26;;21978:9;21972:4;21968:20;21964:1;21953:9;21949:17;21942:47;22006:131;22132:4;22006:131;:::i;:::-;21998:139;;21725:419;;;:::o;22150:167::-;22290:19;22286:1;22278:6;22274:14;22267:43;22150:167;:::o;22323:366::-;22465:3;22486:67;22550:2;22545:3;22486:67;:::i;:::-;22479:74;;22562:93;22651:3;22562:93;:::i;:::-;22680:2;22675:3;22671:12;22664:19;;22323:366;;;:::o;22695:419::-;22861:4;22899:2;22888:9;22884:18;22876:26;;22948:9;22942:4;22938:20;22934:1;22923:9;22919:17;22912:47;22976:131;23102:4;22976:131;:::i;:::-;22968:139;;22695:419;;;:::o;23120:348::-;23160:7;23183:20;23201:1;23183:20;:::i;:::-;23178:25;;23217:20;23235:1;23217:20;:::i;:::-;23212:25;;23405:1;23337:66;23333:74;23330:1;23327:81;23322:1;23315:9;23308:17;23304:105;23301:131;;;23412:18;;:::i;:::-;23301:131;23460:1;23457;23453:9;23442:20;;23120:348;;;;:::o;23474:171::-;23614:23;23610:1;23602:6;23598:14;23591:47;23474:171;:::o;23651:366::-;23793:3;23814:67;23878:2;23873:3;23814:67;:::i;:::-;23807:74;;23890:93;23979:3;23890:93;:::i;:::-;24008:2;24003:3;23999:12;23992:19;;23651:366;;;:::o;24023:419::-;24189:4;24227:2;24216:9;24212:18;24204:26;;24276:9;24270:4;24266:20;24262:1;24251:9;24247:17;24240:47;24304:131;24430:4;24304:131;:::i;:::-;24296:139;;24023:419;;;:::o;24448:332::-;24569:4;24607:2;24596:9;24592:18;24584:26;;24620:71;24688:1;24677:9;24673:17;24664:6;24620:71;:::i;:::-;24701:72;24769:2;24758:9;24754:18;24745:6;24701:72;:::i;:::-;24448:332;;;;;:::o;24786:137::-;24840:5;24871:6;24865:13;24856:22;;24887:30;24911:5;24887:30;:::i;:::-;24786:137;;;;:::o;24929:345::-;24996:6;25045:2;25033:9;25024:7;25020:23;25016:32;25013:119;;;25051:79;;:::i;:::-;25013:119;25171:1;25196:61;25249:7;25240:6;25229:9;25225:22;25196:61;:::i;:::-;25186:71;;25142:125;24929:345;;;;:::o;25280:174::-;25420:26;25416:1;25408:6;25404:14;25397:50;25280:174;:::o;25460:366::-;25602:3;25623:67;25687:2;25682:3;25623:67;:::i;:::-;25616:74;;25699:93;25788:3;25699:93;:::i;:::-;25817:2;25812:3;25808:12;25801:19;;25460:366;;;:::o;25832:419::-;25998:4;26036:2;26025:9;26021:18;26013:26;;26085:9;26079:4;26075:20;26071:1;26060:9;26056:17;26049:47;26113:131;26239:4;26113:131;:::i;:::-;26105:139;;25832:419;;;:::o;26257:180::-;26305:77;26302:1;26295:88;26402:4;26399:1;26392:15;26426:4;26423:1;26416:15;26443:185;26483:1;26500:20;26518:1;26500:20;:::i;:::-;26495:25;;26534:20;26552:1;26534:20;:::i;:::-;26529:25;;26573:1;26563:35;;26578:18;;:::i;:::-;26563:35;26620:1;26617;26613:9;26608:14;;26443:185;;;;:::o;26634:147::-;26735:11;26772:3;26757:18;;26634:147;;;;:::o;26787:114::-;;:::o;26907:398::-;27066:3;27087:83;27168:1;27163:3;27087:83;:::i;:::-;27080:90;;27179:93;27268:3;27179:93;:::i;:::-;27297:1;27292:3;27288:11;27281:18;;26907:398;;;:::o;27311:379::-;27495:3;27517:147;27660:3;27517:147;:::i;:::-;27510:154;;27681:3;27674:10;;27311:379;;;:::o;27696:154::-;27836:6;27832:1;27824:6;27820:14;27813:30;27696:154;:::o;27856:365::-;27998:3;28019:66;28083:1;28078:3;28019:66;:::i;:::-;28012:73;;28094:93;28183:3;28094:93;:::i;:::-;28212:2;28207:3;28203:12;28196:19;;27856:365;;;:::o;28227:419::-;28393:4;28431:2;28420:9;28416:18;28408:26;;28480:9;28474:4;28470:20;28466:1;28455:9;28451:17;28444:47;28508:131;28634:4;28508:131;:::i;:::-;28500:139;;28227:419;;;:::o;28652:191::-;28692:4;28712:20;28730:1;28712:20;:::i;:::-;28707:25;;28746:20;28764:1;28746:20;:::i;:::-;28741:25;;28785:1;28782;28779:8;28776:34;;;28790:18;;:::i;:::-;28776:34;28835:1;28832;28828:9;28820:17;;28652:191;;;;:::o;28849:178::-;28989:30;28985:1;28977:6;28973:14;28966:54;28849:178;:::o;29033:366::-;29175:3;29196:67;29260:2;29255:3;29196:67;:::i;:::-;29189:74;;29272:93;29361:3;29272:93;:::i;:::-;29390:2;29385:3;29381:12;29374:19;;29033:366;;;:::o;29405:419::-;29571:4;29609:2;29598:9;29594:18;29586:26;;29658:9;29652:4;29648:20;29644:1;29633:9;29629:17;29622:47;29686:131;29812:4;29686:131;:::i;:::-;29678:139;;29405:419;;;:::o;29830:148::-;29932:11;29969:3;29954:18;;29830:148;;;;:::o;29984:141::-;30033:4;30056:3;30048:11;;30079:3;30076:1;30069:14;30113:4;30110:1;30100:18;30092:26;;29984:141;;;:::o;30155:845::-;30258:3;30295:5;30289:12;30324:36;30350:9;30324:36;:::i;:::-;30376:89;30458:6;30453:3;30376:89;:::i;:::-;30369:96;;30496:1;30485:9;30481:17;30512:1;30507:137;;;;30658:1;30653:341;;;;30474:520;;30507:137;30591:4;30587:9;30576;30572:25;30567:3;30560:38;30627:6;30622:3;30618:16;30611:23;;30507:137;;30653:341;30720:38;30752:5;30720:38;:::i;:::-;30780:1;30794:154;30808:6;30805:1;30802:13;30794:154;;;30882:7;30876:14;30872:1;30867:3;30863:11;30856:35;30932:1;30923:7;30919:15;30908:26;;30830:4;30827:1;30823:12;30818:17;;30794:154;;;30977:6;30972:3;30968:16;30961:23;;30660:334;;30474:520;;30262:738;;30155:845;;;;:::o;31006:377::-;31112:3;31140:39;31173:5;31140:39;:::i;:::-;31195:89;31277:6;31272:3;31195:89;:::i;:::-;31188:96;;31293:52;31338:6;31333:3;31326:4;31319:5;31315:16;31293:52;:::i;:::-;31370:6;31365:3;31361:16;31354:23;;31116:267;31006:377;;;;:::o;31389:155::-;31529:7;31525:1;31517:6;31513:14;31506:31;31389:155;:::o;31550:400::-;31710:3;31731:84;31813:1;31808:3;31731:84;:::i;:::-;31724:91;;31824:93;31913:3;31824:93;:::i;:::-;31942:1;31937:3;31933:11;31926:18;;31550:400;;;:::o;31956:695::-;32234:3;32256:92;32344:3;32335:6;32256:92;:::i;:::-;32249:99;;32365:95;32456:3;32447:6;32365:95;:::i;:::-;32358:102;;32477:148;32621:3;32477:148;:::i;:::-;32470:155;;32642:3;32635:10;;31956:695;;;;;:::o;32657:225::-;32797:34;32793:1;32785:6;32781:14;32774:58;32866:8;32861:2;32853:6;32849:15;32842:33;32657:225;:::o;32888:366::-;33030:3;33051:67;33115:2;33110:3;33051:67;:::i;:::-;33044:74;;33127:93;33216:3;33127:93;:::i;:::-;33245:2;33240:3;33236:12;33229:19;;32888:366;;;:::o;33260:419::-;33426:4;33464:2;33453:9;33449:18;33441:26;;33513:9;33507:4;33503:20;33499:1;33488:9;33484:17;33477:47;33541:131;33667:4;33541:131;:::i;:::-;33533:139;;33260:419;;;:::o;33685:98::-;33736:6;33770:5;33764:12;33754:22;;33685:98;;;:::o;33789:168::-;33872:11;33906:6;33901:3;33894:19;33946:4;33941:3;33937:14;33922:29;;33789:168;;;;:::o;33963:360::-;34049:3;34077:38;34109:5;34077:38;:::i;:::-;34131:70;34194:6;34189:3;34131:70;:::i;:::-;34124:77;;34210:52;34255:6;34250:3;34243:4;34236:5;34232:16;34210:52;:::i;:::-;34287:29;34309:6;34287:29;:::i;:::-;34282:3;34278:39;34271:46;;34053:270;33963:360;;;;:::o;34329:640::-;34524:4;34562:3;34551:9;34547:19;34539:27;;34576:71;34644:1;34633:9;34629:17;34620:6;34576:71;:::i;:::-;34657:72;34725:2;34714:9;34710:18;34701:6;34657:72;:::i;:::-;34739;34807:2;34796:9;34792:18;34783:6;34739:72;:::i;:::-;34858:9;34852:4;34848:20;34843:2;34832:9;34828:18;34821:48;34886:76;34957:4;34948:6;34886:76;:::i;:::-;34878:84;;34329:640;;;;;;;:::o;34975:141::-;35031:5;35062:6;35056:13;35047:22;;35078:32;35104:5;35078:32;:::i;:::-;34975:141;;;;:::o;35122:349::-;35191:6;35240:2;35228:9;35219:7;35215:23;35211:32;35208:119;;;35246:79;;:::i;:::-;35208:119;35366:1;35391:63;35446:7;35437:6;35426:9;35422:22;35391:63;:::i;:::-;35381:73;;35337:127;35122:349;;;;:::o;35477:233::-;35516:3;35539:24;35557:5;35539:24;:::i;:::-;35530:33;;35585:66;35578:5;35575:77;35572:103;;35655:18;;:::i;:::-;35572:103;35702:1;35695:5;35691:13;35684:20;;35477:233;;;:::o;35716:176::-;35748:1;35765:20;35783:1;35765:20;:::i;:::-;35760:25;;35799:20;35817:1;35799:20;:::i;:::-;35794:25;;35838:1;35828:35;;35843:18;;:::i;:::-;35828:35;35884:1;35881;35877:9;35872:14;;35716:176;;;;:::o;35898:180::-;35946:77;35943:1;35936:88;36043:4;36040:1;36033:15;36067:4;36064:1;36057:15

Swarm Source

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