ETH Price: $2,069.48 (-5.47%)
Gas: 0.61 Gwei
 

Overview

Max Total Supply

1,025 digi

Holders

241

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 digi
0xA5c0279cBf5e31A9FD091C9cBf8Ee2E7c640BD1c
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:
DigiPenguin

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 13: DigiPenguin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./ERC721A.sol";
import "./Strings.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";
import "./IERC165.sol";
import "./IERC721.sol";
import "./IERC721Enumerable.sol";
import "./IERC721Metadata.sol";
import "./IERC721Receiver.sol";
interface ContractInterface {
    function ownerOf(uint256 tokenId) external payable returns(address);
    
}

contract DigiPenguin is Ownable, ERC721A, ReentrancyGuard {
  uint256 public immutable maxPer;
  mapping(address => bool) public allowList;

  constructor(
    uint256 maxBatchSize_,
    uint256 collectionSize_

  ) ERC721A("Digi Penguin", "digi", maxBatchSize_, collectionSize_) {
    maxPer = maxBatchSize_;
  }
  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }
  uint256 price = 5000000000000000;
  
  function seedAllowlist(address[] memory addresses)
    external
    onlyOwner
  {  
    for (uint256 i = 0; i < addresses.length; i++) {
      allowList[addresses[i]] = true;
    }
  }

  function publicSaleMint(uint8 quantity)
    external
    payable
    callerIsUser
  {  
    require(totalSupply() + quantity <= collectionSize, "reached max supply");
    require(
      numberMinted(msg.sender) + quantity <= maxPer,
      "can not mint this many"
    );
    uint256 totalprice;
    if(totalSupply() + quantity <= 1000){
      _safeMint(msg.sender, quantity);
    }else{
      if(totalSupply() <= 1000){
        totalprice = (totalSupply() + quantity - 1000) * price;
        _safeMint(msg.sender, quantity);
        refundIfOver(totalprice);
      }else{
        totalprice = quantity * price;
        _safeMint(msg.sender, quantity);
        refundIfOver(totalprice);
      }
    }
  }
  function allowListMint()
    external
    payable
    callerIsUser
  {  
    require(totalSupply() + 1 <= collectionSize, "reached max supply");
    require(allowList[msg.sender] == true, "not eligible for allowlist mint");
    allowList[msg.sender] = false;
    _safeMint(msg.sender, 1);
  }

  function refundIfOver(uint256 cost) private {
    require(msg.value >= cost, "Need to send more ETH.");
    if (msg.value > cost) {
      payable(msg.sender).transfer(msg.value - cost);
  }
  }
  // // metadata URI
  string private _baseTokenURI;

 
  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }
 
  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }

  function withdrawMoney() external onlyOwner nonReentrant {
    (bool success, ) = msg.sender.call{value: address(this).balance}("");
    require(success, "Transfer failed.");
  }



  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }

  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return ownershipOf(tokenId);
  }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 13: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 4 of 13: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 13: ERC721A.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable,
    Ownable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
        bool burned;
    }
    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
        uint128 numberBurned;
    }

    uint256 private currentIndex = 1;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;
    uint256 internal _burnCounter;

    error TransferCallerNotOwnerNorApproved();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error TransferToNonERC721ReceiverImplementer();
    error TransferFromIncorrectOwner();
    error TransferToZeroAddress();

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;
    //
    string private baseExtension = ".json";
 
    // 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) private _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;
    //Mapping from tokenId to burn address
    mapping(uint256 => address) burnedAddress;
    address burnContract;

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }


    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }
    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return currentIndex - _burnCounter - _startTokenId();
        }
    }
    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();
        }
    }

    function setBurnContract(address _burnContract) public onlyOwner{
        burnContract = _burnContract;
    } 
    function isBurnContract() internal view returns(bool){
        return _msgSender() == burnContract;
    }
    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < currentIndex , "ERC721A: global index out of bounds");
        return index;
    }
    
    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(
            index <= balanceOf(owner),
            "ERC721A: owner index out of bounds"
        );
        uint256 numMintedSoFar = currentIndex - 1;
        uint256 tokenIdsIdx = 1;
        address currOwnershipAddr = address(0);
        for (uint256 i = 1; i <= numMintedSoFar; i++) {
          TokenOwnership memory ownership = _ownerships[i];
          if(ownership.burned == false){
            if (ownership.addr != address(0) ) 
            {
            currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) 
            {
                if (tokenIdsIdx == index) {
                  return i;
                }
              tokenIdsIdx++;
            }
          }
            
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @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)
    {
        
            require(
                _exists(tokenId),
                "ERC721Metadata: URI query for nonexistent token"
            );
            require(
                tokenId != 0,
                "ERC721Metadata: URI query for nonexistent token"
            );
            string memory baseURI = _baseURI();
            return
                bytes(baseURI).length > 0
                    ? string(
                        abi.encodePacked(
                            baseURI,
                            tokenId.toString(),
                            baseExtension
                        )
                    )
                    : "";
        
    }

    /**
     * @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);
        require(to != owner, "ERC721A: approval to current owner");

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    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 Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) 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 (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);
    }

    function burn(uint256 tokenId) external virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        address from = prevOwnership.addr;


        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender() || isBurnContract()) ;
        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */


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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

File 6 of 13: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 7 of 13: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 13: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 9 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 10 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 12 of 13: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

API
[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","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":"","type":"address"}],"name":"allowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPer","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":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint8","name":"quantity","type":"uint8"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"seedAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_burnContract","type":"address"}],"name":"setBurnContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052600180556040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506005908051906020019062000055929190620002dd565b506000600c556611c37937e08000600f553480156200007357600080fd5b50604051620054c8380380620054c88339818101604052810190620000999190620003a4565b6040518060400160405280600c81526020017f446967692050656e6775696e00000000000000000000000000000000000000008152506040518060400160405280600481526020017f64696769000000000000000000000000000000000000000000000000000000008152508383620001276200011b6200021160201b60201c565b6200021960201b60201c565b600081116200016d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000164906200045b565b60405180910390fd5b60008211620001b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001aa9062000439565b60405180910390fd5b8360039080519060200190620001cb929190620002dd565b508260049080519060200190620001e4929190620002dd565b508160a081815250508060808181525050505050506001600d819055508160c081815250505050620005ba565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002eb9062000498565b90600052602060002090601f0160209004810192826200030f57600085556200035b565b82601f106200032a57805160ff19168380011785556200035b565b828001600101855582156200035b579182015b828111156200035a5782518255916020019190600101906200033d565b5b5090506200036a91906200036e565b5090565b5b80821115620003895760008160009055506001016200036f565b5090565b6000815190506200039e81620005a0565b92915050565b60008060408385031215620003be57620003bd620004fd565b5b6000620003ce858286016200038d565b9250506020620003e1858286016200038d565b9150509250929050565b6000620003fa6027836200047d565b9150620004078262000502565b604082019050919050565b600062000421602e836200047d565b91506200042e8262000551565b604082019050919050565b600060208201905081810360008301526200045481620003eb565b9050919050565b60006020820190508181036000830152620004768162000412565b9050919050565b600082825260208201905092915050565b6000819050919050565b60006002820490506001821680620004b157607f821691505b60208210811415620004c857620004c7620004ce565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b620005ab816200048e565b8114620005b757600080fd5b50565b60805160a05160c051614ec9620005ff60003960008181610cdb0152611cfe01526000818161279801526127c1015260008181610b560152611c860152614ec96000f3fe6080604052600436106101d85760003560e01c80636352211e11610102578063ac44600211610095578063d7224ba011610064578063d7224ba01461069e578063dc33e681146106c9578063e985e9c514610706578063f2fde38b14610743576101d8565b8063ac44600214610605578063b88d4fde1461061c578063c76df80e14610645578063c87b56dd14610661576101d8565b80638da5cb5b116100d15780638da5cb5b146105495780639231ab2a1461057457806395d89b41146105b1578063a22cb465146105dc576101d8565b80636352211e1461048f57806370a08231146104cc578063715018a61461050957806388c206f714610520576101d8565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103d757806342966c68146104005780634f6ccce71461042957806355f804b314610466576101d8565b806323b872dd1461030b5780632848aeaf146103345780632f745c591461037157806337beafe0146103ae576101d8565b8063095ea7b3116101b6578063095ea7b314610282578063102a6a73146102ab57806318160ddd146102b55780631c53f256146102e0576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff91906139f3565b61076c565b6040516102119190614084565b60405180910390f35b34801561022657600080fd5b5061022f6108b6565b60405161023c919061409f565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190613a9a565b610948565b604051610279919061401d565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061396a565b6109cd565b005b6102b3610ae6565b005b3480156102c157600080fd5b506102ca610cc2565b6040516102d7919061439c565b60405180910390f35b3480156102ec57600080fd5b506102f5610cd9565b604051610302919061439c565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d9190613854565b610cfd565b005b34801561034057600080fd5b5061035b600480360381019061035691906137e7565b610d0d565b6040516103689190614084565b60405180910390f35b34801561037d57600080fd5b506103986004803603810190610393919061396a565b610d2d565b6040516103a5919061439c565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d091906137e7565b610f66565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190613854565b611026565b005b34801561040c57600080fd5b5061042760048036038101906104229190613a9a565b611046565b005b34801561043557600080fd5b50610450600480360381019061044b9190613a9a565b61146d565b60405161045d919061439c565b60405180910390f35b34801561047257600080fd5b5061048d60048036038101906104889190613a4d565b6114bb565b005b34801561049b57600080fd5b506104b660048036038101906104b19190613a9a565b61154d565b6040516104c3919061401d565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee91906137e7565b611563565b604051610500919061439c565b60405180910390f35b34801561051557600080fd5b5061051e61164c565b005b34801561052c57600080fd5b50610547600480360381019061054291906139aa565b6116d4565b005b34801561055557600080fd5b5061055e6117e5565b60405161056b919061401d565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613a9a565b61180e565b6040516105a89190614381565b60405180910390f35b3480156105bd57600080fd5b506105c6611826565b6040516105d3919061409f565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe919061392a565b6118b8565b005b34801561061157600080fd5b5061061a611a39565b005b34801561062857600080fd5b50610643600480360381019061063e91906138a7565b611bba565b005b61065f600480360381019061065a9190613ac7565b611c16565b005b34801561066d57600080fd5b5061068860048036038101906106839190613a9a565b611e33565b604051610695919061409f565b60405180910390f35b3480156106aa57600080fd5b506106b3611f21565b6040516106c0919061439c565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb91906137e7565b611f27565b6040516106fd919061439c565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190613814565b611f39565b60405161073a9190614084565b60405180910390f35b34801561074f57600080fd5b5061076a600480360381019061076591906137e7565b611fcd565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061089f57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108af57506108ae826120c5565b5b9050919050565b6060600380546108c5906146b2565b80601f01602080910402602001604051908101604052809291908181526020018280546108f1906146b2565b801561093e5780601f106109135761010080835404028352916020019161093e565b820191906000526020600020905b81548152906001019060200180831161092157829003601f168201915b5050505050905090565b60006109538261212f565b610992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098990614361565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d88261154d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4090614261565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a6861217d565b73ffffffffffffffffffffffffffffffffffffffff161480610a975750610a9681610a9161217d565b611f39565b5b610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90614181565b60405180910390fd5b610ae1838383612185565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90614161565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001610b7f610cc2565b610b89919061449c565b1115610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc1906141c1565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c54906141e1565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610cc0336001612237565b565b6000610ccc612255565b6002546001540303905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b610d0883838361225e565b505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000610d3883611563565b821115610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906140c1565b60405180910390fd5b600060018054610d8a919061457d565b9050600060019050600080600190505b838111610f24576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905060001515816040015115151415610f1057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610eb757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f0f5786841415610f00578195505050505050610f60565b8380610f0b90614715565b9450505b5b508080610f1c90614715565b915050610d9a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790614301565b60405180910390fd5b92915050565b610f6e61217d565b73ffffffffffffffffffffffffffffffffffffffff16610f8c6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990614201565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61104183838360405180602001604052806000815250611bba565b505050565b600061105182612744565b905060008160000151905060008173ffffffffffffffffffffffffffffffffffffffff1661107d61217d565b73ffffffffffffffffffffffffffffffffffffffff1614806110ac57506110ab826110a661217d565b611f39565b5b806110f157506110ba61217d565b73ffffffffffffffffffffffffffffffffffffffff166110d985610948565b73ffffffffffffffffffffffffffffffffffffffff16145b8061110057506110ff612962565b5b905080611139576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111478260008660016129c1565b61115360008584612185565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060018160010160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506000600660008781526020019081526020016000209050838160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113e75760015482146113e657858160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114558260008660016129c7565b60026000815480929190600101919050555050505050565b600060015482106114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90614121565b60405180910390fd5b819050919050565b6114c361217d565b73ffffffffffffffffffffffffffffffffffffffff166114e16117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90614201565b60405180910390fd5b81816010919061154892919061351f565b505050565b600061155882612744565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cb906141a1565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61165461217d565b73ffffffffffffffffffffffffffffffffffffffff166116726117e5565b73ffffffffffffffffffffffffffffffffffffffff16146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90614201565b60405180910390fd5b6116d260006129cd565b565b6116dc61217d565b73ffffffffffffffffffffffffffffffffffffffff166116fa6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790614201565b60405180910390fd5b60005b81518110156117e1576001600e60008484815181106117755761177461481c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806117d990614715565b915050611753565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118166135a5565b61181f82612744565b9050919050565b606060048054611835906146b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611861906146b2565b80156118ae5780601f10611883576101008083540402835291602001916118ae565b820191906000526020600020905b81548152906001019060200180831161189157829003601f168201915b5050505050905090565b6118c061217d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590614241565b60405180910390fd5b806009600061193b61217d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119e861217d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a2d9190614084565b60405180910390a35050565b611a4161217d565b73ffffffffffffffffffffffffffffffffffffffff16611a5f6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90614201565b60405180910390fd5b6002600d541415611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af290614321565b60405180910390fd5b6002600d8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611b2990614008565b60006040518083038185875af1925050503d8060008114611b66576040519150601f19603f3d011682016040523d82523d6000602084013e611b6b565b606091505b5050905080611baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba690614281565b60405180910390fd5b506001600d81905550565b611bc584848461225e565b611bd184848484612a91565b611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c07906142a1565b60405180910390fd5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90614161565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008160ff16611cb1610cc2565b611cbb919061449c565b1115611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf3906141c1565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008160ff16611d2a33611f27565b611d34919061449c565b1115611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c906142e1565b60405180910390fd5b60006103e88260ff16611d86610cc2565b611d90919061449c565b11611da757611da2338360ff16612237565b611e2f565b6103e8611db2610cc2565b11611e0457600f546103e88360ff16611dc9610cc2565b611dd3919061449c565b611ddd919061457d565b611de79190614523565b9050611df6338360ff16612237565b611dff81612c28565b611e2e565b600f548260ff16611e159190614523565b9050611e24338360ff16612237565b611e2d81612c28565b5b5b5050565b6060611e3e8261212f565b611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490614221565b60405180910390fd5b6000821415611ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb890614221565b60405180910390fd5b6000611ecb612cc9565b90506000815111611eeb5760405180602001604052806000815250611f19565b80611ef584612d5b565b6005604051602001611f0993929190613fd7565b6040516020818303038152906040525b915050919050565b600c5481565b6000611f3282612ebc565b9050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fd561217d565b73ffffffffffffffffffffffffffffffffffffffff16611ff36117e5565b73ffffffffffffffffffffffffffffffffffffffff1614612049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204090614201565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b0906140e1565b60405180910390fd5b6120c2816129cd565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161213a612255565b11158015612149575060015482105b8015612176575060066000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612251828260405180602001604052806000815250612fa5565b5050565b60006001905090565b600061226982612744565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122d4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122f561217d565b73ffffffffffffffffffffffffffffffffffffffff16148061232457506123238561231e61217d565b611f39565b5b80612369575061233261217d565b73ffffffffffffffffffffffffffffffffffffffff1661235184610948565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123a2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612409576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61241685858560016129c1565b61242260008487612185565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506000600660008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126d25760015482146126d157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461273d85858560016129c7565b5050505050565b61274c6135a5565b6127558261212f565b612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b90614101565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106127f85760017f0000000000000000000000000000000000000000000000000000000000000000846127eb919061457d565b6127f5919061449c565b90505b60008390505b818110612921576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461290d5780935050505061295d565b50808061291990614688565b9150506127fe565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295490614341565b60405180910390fd5b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166129a561217d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b50505050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ab28473ffffffffffffffffffffffffffffffffffffffff166133ac565b15612c1b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612adb61217d565b8786866040518563ffffffff1660e01b8152600401612afd9493929190614038565b602060405180830381600087803b158015612b1757600080fd5b505af1925050508015612b4857506040513d601f19601f82011682018060405250810190612b459190613a20565b60015b612bcb573d8060008114612b78576040519150601f19603f3d011682016040523d82523d6000602084013e612b7d565b606091505b50600081511415612bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bba906142a1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c20565b600190505b949350505050565b80341015612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906142c1565b60405180910390fd5b80341115612cc6573373ffffffffffffffffffffffffffffffffffffffff166108fc8234612c99919061457d565b9081150290604051600060405180830381858888f19350505050158015612cc4573d6000803e3d6000fd5b505b50565b606060108054612cd8906146b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612d04906146b2565b8015612d515780601f10612d2657610100808354040283529160200191612d51565b820191906000526020600020905b815481529060010190602001808311612d3457829003601f168201915b5050505050905090565b60606000821415612da3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612eb7565b600082905060005b60008214612dd5578080612dbe90614715565b915050600a82612dce91906144f2565b9150612dab565b60008167ffffffffffffffff811115612df157612df061484b565b5b6040519080825280601f01601f191660200182016040528015612e235781602001600182028036833780820191505090505b5090505b60008514612eb057600182612e3c919061457d565b9150600a85612e4b919061475e565b6030612e57919061449c565b60f81b818381518110612e6d57612e6c61481c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ea991906144f2565b9450612e27565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2490614141565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613013576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141561304e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61305b60008583866129c1565b8267ffffffffffffffff16600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508267ffffffffffffffff16600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506132608673ffffffffffffffffffffffffffffffffffffffff166133ac565b15613325575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132d560008784806001019550876133bf565b61330b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061326657826001541461332057600080fd5b613390565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613326575b8160018190555050506133a660008583866129c7565b50505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133e561217d565b8786866040518563ffffffff1660e01b81526004016134079493929190614038565b602060405180830381600087803b15801561342157600080fd5b505af192505050801561345257506040513d601f19601f8201168201806040525081019061344f9190613a20565b60015b6134cc573d8060008114613482576040519150601f19603f3d011682016040523d82523d6000602084013e613487565b606091505b506000815114156134c4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b82805461352b906146b2565b90600052602060002090601f01602090048101928261354d5760008555613594565b82601f1061356657803560ff1916838001178555613594565b82800160010185558215613594579182015b82811115613593578235825591602001919060010190613578565b5b5090506135a191906135e8565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136015760008160009055506001016135e9565b5090565b6000613618613613846143dc565b6143b7565b9050808382526020820190508285602086028201111561363b5761363a614884565b5b60005b8581101561366b578161365188826136b7565b84526020840193506020830192505060018101905061363e565b5050509392505050565b600061368861368384614408565b6143b7565b9050828152602081018484840111156136a4576136a3614889565b5b6136af848285614646565b509392505050565b6000813590506136c681614e20565b92915050565b600082601f8301126136e1576136e061487f565b5b81356136f1848260208601613605565b91505092915050565b60008135905061370981614e37565b92915050565b60008135905061371e81614e4e565b92915050565b60008151905061373381614e4e565b92915050565b600082601f83011261374e5761374d61487f565b5b813561375e848260208601613675565b91505092915050565b60008083601f84011261377d5761377c61487f565b5b8235905067ffffffffffffffff81111561379a5761379961487a565b5b6020830191508360018202830111156137b6576137b5614884565b5b9250929050565b6000813590506137cc81614e65565b92915050565b6000813590506137e181614e7c565b92915050565b6000602082840312156137fd576137fc614893565b5b600061380b848285016136b7565b91505092915050565b6000806040838503121561382b5761382a614893565b5b6000613839858286016136b7565b925050602061384a858286016136b7565b9150509250929050565b60008060006060848603121561386d5761386c614893565b5b600061387b868287016136b7565b935050602061388c868287016136b7565b925050604061389d868287016137bd565b9150509250925092565b600080600080608085870312156138c1576138c0614893565b5b60006138cf878288016136b7565b94505060206138e0878288016136b7565b93505060406138f1878288016137bd565b925050606085013567ffffffffffffffff8111156139125761391161488e565b5b61391e87828801613739565b91505092959194509250565b6000806040838503121561394157613940614893565b5b600061394f858286016136b7565b9250506020613960858286016136fa565b9150509250929050565b6000806040838503121561398157613980614893565b5b600061398f858286016136b7565b92505060206139a0858286016137bd565b9150509250929050565b6000602082840312156139c0576139bf614893565b5b600082013567ffffffffffffffff8111156139de576139dd61488e565b5b6139ea848285016136cc565b91505092915050565b600060208284031215613a0957613a08614893565b5b6000613a178482850161370f565b91505092915050565b600060208284031215613a3657613a35614893565b5b6000613a4484828501613724565b91505092915050565b60008060208385031215613a6457613a63614893565b5b600083013567ffffffffffffffff811115613a8257613a8161488e565b5b613a8e85828601613767565b92509250509250929050565b600060208284031215613ab057613aaf614893565b5b6000613abe848285016137bd565b91505092915050565b600060208284031215613add57613adc614893565b5b6000613aeb848285016137d2565b91505092915050565b613afd816145b1565b82525050565b613b0c816145b1565b82525050565b613b1b816145c3565b82525050565b613b2a816145c3565b82525050565b6000613b3b8261444e565b613b458185614464565b9350613b55818560208601614655565b613b5e81614898565b840191505092915050565b6000613b7482614459565b613b7e8185614480565b9350613b8e818560208601614655565b613b9781614898565b840191505092915050565b6000613bad82614459565b613bb78185614491565b9350613bc7818560208601614655565b80840191505092915050565b60008154613be0816146b2565b613bea8186614491565b94506001821660008114613c055760018114613c1657613c49565b60ff19831686528186019350613c49565b613c1f85614439565b60005b83811015613c4157815481890152600182019150602081019050613c22565b838801955050505b50505092915050565b6000613c5f602283614480565b9150613c6a826148a9565b604082019050919050565b6000613c82602683614480565b9150613c8d826148f8565b604082019050919050565b6000613ca5602a83614480565b9150613cb082614947565b604082019050919050565b6000613cc8602383614480565b9150613cd382614996565b604082019050919050565b6000613ceb603183614480565b9150613cf6826149e5565b604082019050919050565b6000613d0e601e83614480565b9150613d1982614a34565b602082019050919050565b6000613d31603983614480565b9150613d3c82614a5d565b604082019050919050565b6000613d54602b83614480565b9150613d5f82614aac565b604082019050919050565b6000613d77601283614480565b9150613d8282614afb565b602082019050919050565b6000613d9a601f83614480565b9150613da582614b24565b602082019050919050565b6000613dbd602083614480565b9150613dc882614b4d565b602082019050919050565b6000613de0602f83614480565b9150613deb82614b76565b604082019050919050565b6000613e03601a83614480565b9150613e0e82614bc5565b602082019050919050565b6000613e26602283614480565b9150613e3182614bee565b604082019050919050565b6000613e49600083614475565b9150613e5482614c3d565b600082019050919050565b6000613e6c601083614480565b9150613e7782614c40565b602082019050919050565b6000613e8f603383614480565b9150613e9a82614c69565b604082019050919050565b6000613eb2601683614480565b9150613ebd82614cb8565b602082019050919050565b6000613ed5601683614480565b9150613ee082614ce1565b602082019050919050565b6000613ef8602e83614480565b9150613f0382614d0a565b604082019050919050565b6000613f1b601f83614480565b9150613f2682614d59565b602082019050919050565b6000613f3e602f83614480565b9150613f4982614d82565b604082019050919050565b6000613f61602d83614480565b9150613f6c82614dd1565b604082019050919050565b606082016000820151613f8d6000850182613af4565b506020820151613fa06020850182613fc8565b506040820151613fb36040850182613b12565b50505050565b613fc28161461b565b82525050565b613fd181614625565b82525050565b6000613fe38286613ba2565b9150613fef8285613ba2565b9150613ffb8284613bd3565b9150819050949350505050565b600061401382613e3c565b9150819050919050565b60006020820190506140326000830184613b03565b92915050565b600060808201905061404d6000830187613b03565b61405a6020830186613b03565b6140676040830185613fb9565b81810360608301526140798184613b30565b905095945050505050565b60006020820190506140996000830184613b21565b92915050565b600060208201905081810360008301526140b98184613b69565b905092915050565b600060208201905081810360008301526140da81613c52565b9050919050565b600060208201905081810360008301526140fa81613c75565b9050919050565b6000602082019050818103600083015261411a81613c98565b9050919050565b6000602082019050818103600083015261413a81613cbb565b9050919050565b6000602082019050818103600083015261415a81613cde565b9050919050565b6000602082019050818103600083015261417a81613d01565b9050919050565b6000602082019050818103600083015261419a81613d24565b9050919050565b600060208201905081810360008301526141ba81613d47565b9050919050565b600060208201905081810360008301526141da81613d6a565b9050919050565b600060208201905081810360008301526141fa81613d8d565b9050919050565b6000602082019050818103600083015261421a81613db0565b9050919050565b6000602082019050818103600083015261423a81613dd3565b9050919050565b6000602082019050818103600083015261425a81613df6565b9050919050565b6000602082019050818103600083015261427a81613e19565b9050919050565b6000602082019050818103600083015261429a81613e5f565b9050919050565b600060208201905081810360008301526142ba81613e82565b9050919050565b600060208201905081810360008301526142da81613ea5565b9050919050565b600060208201905081810360008301526142fa81613ec8565b9050919050565b6000602082019050818103600083015261431a81613eeb565b9050919050565b6000602082019050818103600083015261433a81613f0e565b9050919050565b6000602082019050818103600083015261435a81613f31565b9050919050565b6000602082019050818103600083015261437a81613f54565b9050919050565b60006060820190506143966000830184613f77565b92915050565b60006020820190506143b16000830184613fb9565b92915050565b60006143c16143d2565b90506143cd82826146e4565b919050565b6000604051905090565b600067ffffffffffffffff8211156143f7576143f661484b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144235761442261484b565b5b61442c82614898565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144a78261461b565b91506144b28361461b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144e7576144e661478f565b5b828201905092915050565b60006144fd8261461b565b91506145088361461b565b925082614518576145176147be565b5b828204905092915050565b600061452e8261461b565b91506145398361461b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145725761457161478f565b5b828202905092915050565b60006145888261461b565b91506145938361461b565b9250828210156145a6576145a561478f565b5b828203905092915050565b60006145bc826145fb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614673578082015181840152602081019050614658565b83811115614682576000848401525b50505050565b60006146938261461b565b915060008214156146a7576146a661478f565b5b600182039050919050565b600060028204905060018216806146ca57607f821691505b602082108114156146de576146dd6147ed565b5b50919050565b6146ed82614898565b810181811067ffffffffffffffff8211171561470c5761470b61484b565b5b80604052505050565b60006147208261461b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147535761475261478f565b5b600182019050919050565b60006147698261461b565b91506147748361461b565b925082614784576147836147be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f6e6f7420656c696769626c6520666f7220616c6c6f776c697374206d696e7400600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b614e29816145b1565b8114614e3457600080fd5b50565b614e40816145c3565b8114614e4b57600080fd5b50565b614e57816145cf565b8114614e6257600080fd5b50565b614e6e8161461b565b8114614e7957600080fd5b50565b614e8581614639565b8114614e9057600080fd5b5056fea2646970667358221220793011660ccdba8dc85a2520051942f0977426d7974ae73684ca4b65ead69ead64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000001388

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80636352211e11610102578063ac44600211610095578063d7224ba011610064578063d7224ba01461069e578063dc33e681146106c9578063e985e9c514610706578063f2fde38b14610743576101d8565b8063ac44600214610605578063b88d4fde1461061c578063c76df80e14610645578063c87b56dd14610661576101d8565b80638da5cb5b116100d15780638da5cb5b146105495780639231ab2a1461057457806395d89b41146105b1578063a22cb465146105dc576101d8565b80636352211e1461048f57806370a08231146104cc578063715018a61461050957806388c206f714610520576101d8565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103d757806342966c68146104005780634f6ccce71461042957806355f804b314610466576101d8565b806323b872dd1461030b5780632848aeaf146103345780632f745c591461037157806337beafe0146103ae576101d8565b8063095ea7b3116101b6578063095ea7b314610282578063102a6a73146102ab57806318160ddd146102b55780631c53f256146102e0576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff91906139f3565b61076c565b6040516102119190614084565b60405180910390f35b34801561022657600080fd5b5061022f6108b6565b60405161023c919061409f565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190613a9a565b610948565b604051610279919061401d565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061396a565b6109cd565b005b6102b3610ae6565b005b3480156102c157600080fd5b506102ca610cc2565b6040516102d7919061439c565b60405180910390f35b3480156102ec57600080fd5b506102f5610cd9565b604051610302919061439c565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d9190613854565b610cfd565b005b34801561034057600080fd5b5061035b600480360381019061035691906137e7565b610d0d565b6040516103689190614084565b60405180910390f35b34801561037d57600080fd5b506103986004803603810190610393919061396a565b610d2d565b6040516103a5919061439c565b60405180910390f35b3480156103ba57600080fd5b506103d560048036038101906103d091906137e7565b610f66565b005b3480156103e357600080fd5b506103fe60048036038101906103f99190613854565b611026565b005b34801561040c57600080fd5b5061042760048036038101906104229190613a9a565b611046565b005b34801561043557600080fd5b50610450600480360381019061044b9190613a9a565b61146d565b60405161045d919061439c565b60405180910390f35b34801561047257600080fd5b5061048d60048036038101906104889190613a4d565b6114bb565b005b34801561049b57600080fd5b506104b660048036038101906104b19190613a9a565b61154d565b6040516104c3919061401d565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee91906137e7565b611563565b604051610500919061439c565b60405180910390f35b34801561051557600080fd5b5061051e61164c565b005b34801561052c57600080fd5b50610547600480360381019061054291906139aa565b6116d4565b005b34801561055557600080fd5b5061055e6117e5565b60405161056b919061401d565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613a9a565b61180e565b6040516105a89190614381565b60405180910390f35b3480156105bd57600080fd5b506105c6611826565b6040516105d3919061409f565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe919061392a565b6118b8565b005b34801561061157600080fd5b5061061a611a39565b005b34801561062857600080fd5b50610643600480360381019061063e91906138a7565b611bba565b005b61065f600480360381019061065a9190613ac7565b611c16565b005b34801561066d57600080fd5b5061068860048036038101906106839190613a9a565b611e33565b604051610695919061409f565b60405180910390f35b3480156106aa57600080fd5b506106b3611f21565b6040516106c0919061439c565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb91906137e7565b611f27565b6040516106fd919061439c565b60405180910390f35b34801561071257600080fd5b5061072d60048036038101906107289190613814565b611f39565b60405161073a9190614084565b60405180910390f35b34801561074f57600080fd5b5061076a600480360381019061076591906137e7565b611fcd565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061089f57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108af57506108ae826120c5565b5b9050919050565b6060600380546108c5906146b2565b80601f01602080910402602001604051908101604052809291908181526020018280546108f1906146b2565b801561093e5780601f106109135761010080835404028352916020019161093e565b820191906000526020600020905b81548152906001019060200180831161092157829003601f168201915b5050505050905090565b60006109538261212f565b610992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098990614361565b60405180910390fd5b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109d88261154d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4090614261565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a6861217d565b73ffffffffffffffffffffffffffffffffffffffff161480610a975750610a9681610a9161217d565b611f39565b5b610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90614181565b60405180910390fd5b610ae1838383612185565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b90614161565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000013886001610b7f610cc2565b610b89919061449c565b1115610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc1906141c1565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c54906141e1565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610cc0336001612237565b565b6000610ccc612255565b6002546001540303905090565b7f000000000000000000000000000000000000000000000000000000000000000581565b610d0883838361225e565b505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000610d3883611563565b821115610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d71906140c1565b60405180910390fd5b600060018054610d8a919061457d565b9050600060019050600080600190505b838111610f24576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905060001515816040015115151415610f1057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610eb757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f0f5786841415610f00578195505050505050610f60565b8380610f0b90614715565b9450505b5b508080610f1c90614715565b915050610d9a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790614301565b60405180910390fd5b92915050565b610f6e61217d565b73ffffffffffffffffffffffffffffffffffffffff16610f8c6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd990614201565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61104183838360405180602001604052806000815250611bba565b505050565b600061105182612744565b905060008160000151905060008173ffffffffffffffffffffffffffffffffffffffff1661107d61217d565b73ffffffffffffffffffffffffffffffffffffffff1614806110ac57506110ab826110a661217d565b611f39565b5b806110f157506110ba61217d565b73ffffffffffffffffffffffffffffffffffffffff166110d985610948565b73ffffffffffffffffffffffffffffffffffffffff16145b8061110057506110ff612962565b5b905080611139576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111478260008660016129c1565b61115360008584612185565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060018160010160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506000600660008781526020019081526020016000209050838160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113e75760015482146113e657858160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114558260008660016129c7565b60026000815480929190600101919050555050505050565b600060015482106114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90614121565b60405180910390fd5b819050919050565b6114c361217d565b73ffffffffffffffffffffffffffffffffffffffff166114e16117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90614201565b60405180910390fd5b81816010919061154892919061351f565b505050565b600061155882612744565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cb906141a1565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61165461217d565b73ffffffffffffffffffffffffffffffffffffffff166116726117e5565b73ffffffffffffffffffffffffffffffffffffffff16146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90614201565b60405180910390fd5b6116d260006129cd565b565b6116dc61217d565b73ffffffffffffffffffffffffffffffffffffffff166116fa6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790614201565b60405180910390fd5b60005b81518110156117e1576001600e60008484815181106117755761177461481c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806117d990614715565b915050611753565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118166135a5565b61181f82612744565b9050919050565b606060048054611835906146b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611861906146b2565b80156118ae5780601f10611883576101008083540402835291602001916118ae565b820191906000526020600020905b81548152906001019060200180831161189157829003601f168201915b5050505050905090565b6118c061217d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590614241565b60405180910390fd5b806009600061193b61217d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119e861217d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a2d9190614084565b60405180910390a35050565b611a4161217d565b73ffffffffffffffffffffffffffffffffffffffff16611a5f6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aac90614201565b60405180910390fd5b6002600d541415611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af290614321565b60405180910390fd5b6002600d8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611b2990614008565b60006040518083038185875af1925050503d8060008114611b66576040519150601f19603f3d011682016040523d82523d6000602084013e611b6b565b606091505b5050905080611baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba690614281565b60405180910390fd5b506001600d81905550565b611bc584848461225e565b611bd184848484612a91565b611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c07906142a1565b60405180910390fd5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90614161565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000013888160ff16611cb1610cc2565b611cbb919061449c565b1115611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf3906141c1565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000058160ff16611d2a33611f27565b611d34919061449c565b1115611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c906142e1565b60405180910390fd5b60006103e88260ff16611d86610cc2565b611d90919061449c565b11611da757611da2338360ff16612237565b611e2f565b6103e8611db2610cc2565b11611e0457600f546103e88360ff16611dc9610cc2565b611dd3919061449c565b611ddd919061457d565b611de79190614523565b9050611df6338360ff16612237565b611dff81612c28565b611e2e565b600f548260ff16611e159190614523565b9050611e24338360ff16612237565b611e2d81612c28565b5b5b5050565b6060611e3e8261212f565b611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490614221565b60405180910390fd5b6000821415611ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb890614221565b60405180910390fd5b6000611ecb612cc9565b90506000815111611eeb5760405180602001604052806000815250611f19565b80611ef584612d5b565b6005604051602001611f0993929190613fd7565b6040516020818303038152906040525b915050919050565b600c5481565b6000611f3282612ebc565b9050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fd561217d565b73ffffffffffffffffffffffffffffffffffffffff16611ff36117e5565b73ffffffffffffffffffffffffffffffffffffffff1614612049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204090614201565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b0906140e1565b60405180910390fd5b6120c2816129cd565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161213a612255565b11158015612149575060015482105b8015612176575060066000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612251828260405180602001604052806000815250612fa5565b5050565b60006001905090565b600061226982612744565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122d4576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166122f561217d565b73ffffffffffffffffffffffffffffffffffffffff16148061232457506123238561231e61217d565b611f39565b5b80612369575061233261217d565b73ffffffffffffffffffffffffffffffffffffffff1661235184610948565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806123a2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612409576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61241685858560016129c1565b61242260008487612185565b6001600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506000600660008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600660008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126d25760015482146126d157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461273d85858560016129c7565b5050505050565b61274c6135a5565b6127558261212f565b612794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278b90614101565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000583106127f85760017f0000000000000000000000000000000000000000000000000000000000000005846127eb919061457d565b6127f5919061449c565b90505b60008390505b818110612921576000600660008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461290d5780935050505061295d565b50808061291990614688565b9150506127fe565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295490614341565b60405180910390fd5b919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166129a561217d565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b50505050565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ab28473ffffffffffffffffffffffffffffffffffffffff166133ac565b15612c1b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612adb61217d565b8786866040518563ffffffff1660e01b8152600401612afd9493929190614038565b602060405180830381600087803b158015612b1757600080fd5b505af1925050508015612b4857506040513d601f19601f82011682018060405250810190612b459190613a20565b60015b612bcb573d8060008114612b78576040519150601f19603f3d011682016040523d82523d6000602084013e612b7d565b606091505b50600081511415612bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bba906142a1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c20565b600190505b949350505050565b80341015612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906142c1565b60405180910390fd5b80341115612cc6573373ffffffffffffffffffffffffffffffffffffffff166108fc8234612c99919061457d565b9081150290604051600060405180830381858888f19350505050158015612cc4573d6000803e3d6000fd5b505b50565b606060108054612cd8906146b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612d04906146b2565b8015612d515780601f10612d2657610100808354040283529160200191612d51565b820191906000526020600020905b815481529060010190602001808311612d3457829003601f168201915b5050505050905090565b60606000821415612da3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612eb7565b600082905060005b60008214612dd5578080612dbe90614715565b915050600a82612dce91906144f2565b9150612dab565b60008167ffffffffffffffff811115612df157612df061484b565b5b6040519080825280601f01601f191660200182016040528015612e235781602001600182028036833780820191505090505b5090505b60008514612eb057600182612e3c919061457d565b9150600a85612e4b919061475e565b6030612e57919061449c565b60f81b818381518110612e6d57612e6c61481c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ea991906144f2565b9450612e27565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2490614141565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613013576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141561304e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61305b60008583866129c1565b8267ffffffffffffffff16600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508267ffffffffffffffff16600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836006600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426006600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506132608673ffffffffffffffffffffffffffffffffffffffff166133ac565b15613325575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132d560008784806001019550876133bf565b61330b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061326657826001541461332057600080fd5b613390565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613326575b8160018190555050506133a660008583866129c7565b50505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133e561217d565b8786866040518563ffffffff1660e01b81526004016134079493929190614038565b602060405180830381600087803b15801561342157600080fd5b505af192505050801561345257506040513d601f19601f8201168201806040525081019061344f9190613a20565b60015b6134cc573d8060008114613482576040519150601f19603f3d011682016040523d82523d6000602084013e613487565b606091505b506000815114156134c4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b82805461352b906146b2565b90600052602060002090601f01602090048101928261354d5760008555613594565b82601f1061356657803560ff1916838001178555613594565b82800160010185558215613594579182015b82811115613593578235825591602001919060010190613578565b5b5090506135a191906135e8565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136015760008160009055506001016135e9565b5090565b6000613618613613846143dc565b6143b7565b9050808382526020820190508285602086028201111561363b5761363a614884565b5b60005b8581101561366b578161365188826136b7565b84526020840193506020830192505060018101905061363e565b5050509392505050565b600061368861368384614408565b6143b7565b9050828152602081018484840111156136a4576136a3614889565b5b6136af848285614646565b509392505050565b6000813590506136c681614e20565b92915050565b600082601f8301126136e1576136e061487f565b5b81356136f1848260208601613605565b91505092915050565b60008135905061370981614e37565b92915050565b60008135905061371e81614e4e565b92915050565b60008151905061373381614e4e565b92915050565b600082601f83011261374e5761374d61487f565b5b813561375e848260208601613675565b91505092915050565b60008083601f84011261377d5761377c61487f565b5b8235905067ffffffffffffffff81111561379a5761379961487a565b5b6020830191508360018202830111156137b6576137b5614884565b5b9250929050565b6000813590506137cc81614e65565b92915050565b6000813590506137e181614e7c565b92915050565b6000602082840312156137fd576137fc614893565b5b600061380b848285016136b7565b91505092915050565b6000806040838503121561382b5761382a614893565b5b6000613839858286016136b7565b925050602061384a858286016136b7565b9150509250929050565b60008060006060848603121561386d5761386c614893565b5b600061387b868287016136b7565b935050602061388c868287016136b7565b925050604061389d868287016137bd565b9150509250925092565b600080600080608085870312156138c1576138c0614893565b5b60006138cf878288016136b7565b94505060206138e0878288016136b7565b93505060406138f1878288016137bd565b925050606085013567ffffffffffffffff8111156139125761391161488e565b5b61391e87828801613739565b91505092959194509250565b6000806040838503121561394157613940614893565b5b600061394f858286016136b7565b9250506020613960858286016136fa565b9150509250929050565b6000806040838503121561398157613980614893565b5b600061398f858286016136b7565b92505060206139a0858286016137bd565b9150509250929050565b6000602082840312156139c0576139bf614893565b5b600082013567ffffffffffffffff8111156139de576139dd61488e565b5b6139ea848285016136cc565b91505092915050565b600060208284031215613a0957613a08614893565b5b6000613a178482850161370f565b91505092915050565b600060208284031215613a3657613a35614893565b5b6000613a4484828501613724565b91505092915050565b60008060208385031215613a6457613a63614893565b5b600083013567ffffffffffffffff811115613a8257613a8161488e565b5b613a8e85828601613767565b92509250509250929050565b600060208284031215613ab057613aaf614893565b5b6000613abe848285016137bd565b91505092915050565b600060208284031215613add57613adc614893565b5b6000613aeb848285016137d2565b91505092915050565b613afd816145b1565b82525050565b613b0c816145b1565b82525050565b613b1b816145c3565b82525050565b613b2a816145c3565b82525050565b6000613b3b8261444e565b613b458185614464565b9350613b55818560208601614655565b613b5e81614898565b840191505092915050565b6000613b7482614459565b613b7e8185614480565b9350613b8e818560208601614655565b613b9781614898565b840191505092915050565b6000613bad82614459565b613bb78185614491565b9350613bc7818560208601614655565b80840191505092915050565b60008154613be0816146b2565b613bea8186614491565b94506001821660008114613c055760018114613c1657613c49565b60ff19831686528186019350613c49565b613c1f85614439565b60005b83811015613c4157815481890152600182019150602081019050613c22565b838801955050505b50505092915050565b6000613c5f602283614480565b9150613c6a826148a9565b604082019050919050565b6000613c82602683614480565b9150613c8d826148f8565b604082019050919050565b6000613ca5602a83614480565b9150613cb082614947565b604082019050919050565b6000613cc8602383614480565b9150613cd382614996565b604082019050919050565b6000613ceb603183614480565b9150613cf6826149e5565b604082019050919050565b6000613d0e601e83614480565b9150613d1982614a34565b602082019050919050565b6000613d31603983614480565b9150613d3c82614a5d565b604082019050919050565b6000613d54602b83614480565b9150613d5f82614aac565b604082019050919050565b6000613d77601283614480565b9150613d8282614afb565b602082019050919050565b6000613d9a601f83614480565b9150613da582614b24565b602082019050919050565b6000613dbd602083614480565b9150613dc882614b4d565b602082019050919050565b6000613de0602f83614480565b9150613deb82614b76565b604082019050919050565b6000613e03601a83614480565b9150613e0e82614bc5565b602082019050919050565b6000613e26602283614480565b9150613e3182614bee565b604082019050919050565b6000613e49600083614475565b9150613e5482614c3d565b600082019050919050565b6000613e6c601083614480565b9150613e7782614c40565b602082019050919050565b6000613e8f603383614480565b9150613e9a82614c69565b604082019050919050565b6000613eb2601683614480565b9150613ebd82614cb8565b602082019050919050565b6000613ed5601683614480565b9150613ee082614ce1565b602082019050919050565b6000613ef8602e83614480565b9150613f0382614d0a565b604082019050919050565b6000613f1b601f83614480565b9150613f2682614d59565b602082019050919050565b6000613f3e602f83614480565b9150613f4982614d82565b604082019050919050565b6000613f61602d83614480565b9150613f6c82614dd1565b604082019050919050565b606082016000820151613f8d6000850182613af4565b506020820151613fa06020850182613fc8565b506040820151613fb36040850182613b12565b50505050565b613fc28161461b565b82525050565b613fd181614625565b82525050565b6000613fe38286613ba2565b9150613fef8285613ba2565b9150613ffb8284613bd3565b9150819050949350505050565b600061401382613e3c565b9150819050919050565b60006020820190506140326000830184613b03565b92915050565b600060808201905061404d6000830187613b03565b61405a6020830186613b03565b6140676040830185613fb9565b81810360608301526140798184613b30565b905095945050505050565b60006020820190506140996000830184613b21565b92915050565b600060208201905081810360008301526140b98184613b69565b905092915050565b600060208201905081810360008301526140da81613c52565b9050919050565b600060208201905081810360008301526140fa81613c75565b9050919050565b6000602082019050818103600083015261411a81613c98565b9050919050565b6000602082019050818103600083015261413a81613cbb565b9050919050565b6000602082019050818103600083015261415a81613cde565b9050919050565b6000602082019050818103600083015261417a81613d01565b9050919050565b6000602082019050818103600083015261419a81613d24565b9050919050565b600060208201905081810360008301526141ba81613d47565b9050919050565b600060208201905081810360008301526141da81613d6a565b9050919050565b600060208201905081810360008301526141fa81613d8d565b9050919050565b6000602082019050818103600083015261421a81613db0565b9050919050565b6000602082019050818103600083015261423a81613dd3565b9050919050565b6000602082019050818103600083015261425a81613df6565b9050919050565b6000602082019050818103600083015261427a81613e19565b9050919050565b6000602082019050818103600083015261429a81613e5f565b9050919050565b600060208201905081810360008301526142ba81613e82565b9050919050565b600060208201905081810360008301526142da81613ea5565b9050919050565b600060208201905081810360008301526142fa81613ec8565b9050919050565b6000602082019050818103600083015261431a81613eeb565b9050919050565b6000602082019050818103600083015261433a81613f0e565b9050919050565b6000602082019050818103600083015261435a81613f31565b9050919050565b6000602082019050818103600083015261437a81613f54565b9050919050565b60006060820190506143966000830184613f77565b92915050565b60006020820190506143b16000830184613fb9565b92915050565b60006143c16143d2565b90506143cd82826146e4565b919050565b6000604051905090565b600067ffffffffffffffff8211156143f7576143f661484b565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144235761442261484b565b5b61442c82614898565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144a78261461b565b91506144b28361461b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144e7576144e661478f565b5b828201905092915050565b60006144fd8261461b565b91506145088361461b565b925082614518576145176147be565b5b828204905092915050565b600061452e8261461b565b91506145398361461b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145725761457161478f565b5b828202905092915050565b60006145888261461b565b91506145938361461b565b9250828210156145a6576145a561478f565b5b828203905092915050565b60006145bc826145fb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614673578082015181840152602081019050614658565b83811115614682576000848401525b50505050565b60006146938261461b565b915060008214156146a7576146a661478f565b5b600182039050919050565b600060028204905060018216806146ca57607f821691505b602082108114156146de576146dd6147ed565b5b50919050565b6146ed82614898565b810181811067ffffffffffffffff8211171561470c5761470b61484b565b5b80604052505050565b60006147208261461b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147535761475261478f565b5b600182019050919050565b60006147698261461b565b91506147748361461b565b925082614784576147836147be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f6e6f7420656c696769626c6520666f7220616c6c6f776c697374206d696e7400600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b614e29816145b1565b8114614e3457600080fd5b50565b614e40816145c3565b8114614e4b57600080fd5b50565b614e57816145cf565b8114614e6257600080fd5b50565b614e6e8161461b565b8114614e7957600080fd5b50565b614e8581614639565b8114614e9057600080fd5b5056fea2646970667358221220793011660ccdba8dc85a2520051942f0977426d7974ae73684ca4b65ead69ead64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000001388

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 5
Arg [1] : collectionSize_ (uint256): 5000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [1] : 0000000000000000000000000000000000000000000000000000000000001388


Deployed Bytecode Sourcemap

511:2655:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5824:422:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7785:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9847:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9368:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1922:301:2;;;:::i;:::-;;3316:311:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;574:31:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10874:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;610:41:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4758:994:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3923:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11107:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14558:2349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4223:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2606:100:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7594:124:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6310:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:10;;;;;;;;;;;;;:::i;:::-;;994:191:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;999:87:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3016:147:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7954:104:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10211:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2712:181:2;;;;;;;;;;;;;:::i;:::-;;11355:355:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1191:727:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8129:835:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20288:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2903:107:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10593:214:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5824:422:4;5971:4;6028:25;6013:40;;;:11;:40;;;;:105;;;;6085:33;6070:48;;;:11;:48;;;;6013:105;:172;;;;6150:35;6135:50;;;:11;:50;;;;6013:172;:225;;;;6202:36;6226:11;6202:23;:36::i;:::-;6013:225;5993:245;;5824:422;;;:::o;7785:100::-;7839:13;7872:5;7865:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7785:100;:::o;9847:292::-;9951:7;9998:16;10006:7;9998;:16::i;:::-;9976:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;10107:15;:24;10123:7;10107:24;;;;;;;;;;;;;;;;;;;;;10100:31;;9847:292;;;:::o;9368:413::-;9441:13;9457:24;9473:7;9457:15;:24::i;:::-;9441:40;;9506:5;9500:11;;:2;:11;;;;9492:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9601:5;9585:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;9610:37;9627:5;9634:12;:10;:12::i;:::-;9610:16;:37::i;:::-;9585:62;9563:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;9745:28;9754:2;9758:7;9767:5;9745:8;:28::i;:::-;9430:351;9368:413;;:::o;1922:301:2:-;890:10;877:23;;:9;:23;;;869:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2033:14:::1;2028:1;2012:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:35;;2004:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2110:4;2085:29;;:9;:21;2095:10;2085:21;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;2077:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2181:5;2157:9;:21;2167:10;2157:21;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;2193:24;2203:10;2215:1;2193:9;:24::i;:::-;1922:301::o:0;3316:311:4:-;3369:7;3593:15;:13;:15::i;:::-;3578:12;;3563;;:27;:45;3556:52;;3316:311;:::o;574:31:2:-;;;:::o;10874:162:4:-;11000:28;11010:4;11016:2;11020:7;11000:9;:28::i;:::-;10874:162;;;:::o;610:41:2:-;;;;;;;;;;;;;;;;;;;;;;:::o;4758:994:4:-;4883:7;4939:16;4949:5;4939:9;:16::i;:::-;4930:5;:25;;4908:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;5028:22;5068:1;5053:12;;:16;;;;:::i;:::-;5028:41;;5080:19;5102:1;5080:23;;5114:25;5168:9;5180:1;5168:13;;5163:515;5188:14;5183:1;:19;5163:515;;5222:31;5256:11;:14;5268:1;5256:14;;;;;;;;;;;5222:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5306:5;5286:25;;:9;:16;;;:25;;;5283:370;;;5357:1;5331:28;;:9;:14;;;:28;;;5327:114;;5411:9;:14;;;5391:34;;5327:114;5480:5;5459:26;;:17;:26;;;5455:185;;;5539:5;5524:11;:20;5520:75;;;5574:1;5567:8;;;;;;;;;5520:75;5611:13;;;;;:::i;:::-;;;;5455:185;5283:370;5209:469;5204:3;;;;;:::i;:::-;;;;5163:515;;;;5688:56;;;;;;;;;;:::i;:::-;;;;;;;;4758:994;;;;;:::o;3923:111::-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4013:13:4::1;3998:12;;:28;;;;;;;;;;;;;;;;;;3923:111:::0;:::o;11107:177::-;11237:39;11254:4;11260:2;11264:7;11237:39;;;;;;;;;;;;:16;:39::i;:::-;11107:177;;;:::o;14558:2349::-;14617:35;14655:20;14667:7;14655:11;:20::i;:::-;14617:58;;14688:12;14703:13;:18;;;14688:33;;14736:22;14778:4;14762:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;14799:36;14816:4;14822:12;:10;:12::i;:::-;14799:16;:36::i;:::-;14762:73;:126;;;;14876:12;:10;:12::i;:::-;14852:36;;:20;14864:7;14852:11;:20::i;:::-;:36;;;14762:126;:146;;;;14892:16;:14;:16::i;:::-;14762:146;14736:173;;14926:17;14921:66;;14952:35;;;;;;;;;;;;;;14921:66;15000:51;15022:4;15036:1;15040:7;15049:1;15000:21;:51::i;:::-;15116:35;15133:1;15137:7;15146:4;15116:8;:35::i;:::-;15447:31;15481:12;:18;15494:4;15481:18;;;;;;;;;;;;;;;15447:52;;15537:1;15514:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15581:1;15553:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15681:31;15715:11;:20;15727:7;15715:20;;;;;;;;;;;15681:54;;15766:4;15750:8;:13;;;:20;;;;;;;;;;;;;;;;;;15818:15;15785:8;:23;;;:49;;;;;;;;;;;;;;;;;;15867:4;15849:8;:15;;;:22;;;;;;;;;;;;;;;;;;16119:19;16151:1;16141:7;:11;16119:33;;16167:31;16201:11;:24;16213:11;16201:24;;;;;;;;;;;16167:58;;16269:1;16244:27;;:8;:13;;;;;;;;;;;;:27;;;16240:383;;;16454:12;;16439:11;:27;16435:173;;16507:4;16491:8;:13;;;:20;;;;;;;;;;;;;;;;;;16560:13;:28;;;16534:8;:23;;;:54;;;;;;;;;;;;;;;;;;16435:173;16240:383;15422:1212;;;;16678:7;16674:1;16651:35;;16660:4;16651:35;;;;;;;;;;;;16697:50;16718:4;16732:1;16736:7;16745:1;16697:20;:50::i;:::-;16874:12;;:14;;;;;;;;;;;;;14606:2301;;;14558:2349;:::o;4223:228::-;4326:7;4367:12;;4359:5;:20;4351:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4438:5;4431:12;;4223:228;;;:::o;2606:100:2:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2693:7:2::1;;2677:13;:23;;;;;;;:::i;:::-;;2606:100:::0;;:::o;7594:124:4:-;7658:7;7685:20;7697:7;7685:11;:20::i;:::-;:25;;;7678:32;;7594:124;;;:::o;6310:258::-;6374:7;6433:1;6416:19;;:5;:19;;;;6394:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;6532:12;:19;6545:5;6532:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;6524:36;;6517:43;;6310:258;;;:::o;1650:94:10:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;994:191:2:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1091:9:2::1;1086:94;1110:9;:16;1106:1;:20;1086:94;;;1168:4;1142:9;:23;1152:9;1162:1;1152:12;;;;;;;;:::i;:::-;;;;;;;;1142:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;1128:3;;;;;:::i;:::-;;;;1086:94;;;;994:191:::0;:::o;999:87:10:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;3016:147:2:-;3097:21;;:::i;:::-;3137:20;3149:7;3137:11;:20::i;:::-;3130:27;;3016:147;;;:::o;7954:104:4:-;8010:13;8043:7;8036:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7954:104;:::o;10211:311::-;10341:12;:10;:12::i;:::-;10329:24;;:8;:24;;;;10321:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10442:8;10397:18;:32;10416:12;:10;:12::i;:::-;10397:32;;;;;;;;;;;;;;;:42;10430:8;10397:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10495:8;10466:48;;10481:12;:10;:12::i;:::-;10466:48;;;10505:8;10466:48;;;;;;:::i;:::-;;;;;;;;10211:311;;:::o;2712:181:2:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1713:1:11::1;2309:7;;:19;;2301:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1713:1;2442:7;:18;;;;2777:12:2::2;2795:10;:15;;2818:21;2795:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2776:68;;;2859:7;2851:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;2769:124;1669:1:11::1;2621:7;:22;;;;2712:181:2:o:0;11355:355:4:-;11514:28;11524:4;11530:2;11534:7;11514:9;:28::i;:::-;11575:48;11598:4;11604:2;11608:7;11617:5;11575:22;:48::i;:::-;11553:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;11355:355;;;;:::o;1191:727:2:-;890:10;877:23;;:9;:23;;;869:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1324:14:::1;1312:8;1296:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;1288:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1423:6;1411:8;1384:35;;:24;1397:10;1384:12;:24::i;:::-;:35;;;;:::i;:::-;:45;;1368:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;1476:18;1532:4;1520:8;1504:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:32;1501:412;;1546:31;1556:10;1568:8;1546:31;;:9;:31::i;:::-;1501:412;;;1618:4;1601:13;:11;:13::i;:::-;:21;1598:308;;1683:5;;1675:4;1664:8;1648:24;;:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:31;;;;:::i;:::-;1647:41;;;;:::i;:::-;1634:54;;1699:31;1709:10;1721:8;1699:31;;:9;:31::i;:::-;1741:24;1754:10;1741:12;:24::i;:::-;1598:308;;;1814:5;;1803:8;:16;;;;;;:::i;:::-;1790:29;;1830:31;1840:10;1852:8;1830:31;;:9;:31::i;:::-;1872:24;1885:10;1872:12;:24::i;:::-;1598:308;1501:412;1279:639;1191:727:::0;:::o;8129:835:4:-;8247:13;8318:16;8326:7;8318;:16::i;:::-;8292:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;8469:1;8458:7;:12;;8432:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;8568:21;8592:10;:8;:10::i;:::-;8568:34;;8665:1;8647:7;8641:21;:25;:305;;;;;;;;;;;;;;;;;8770:7;8808:18;:7;:16;:18::i;:::-;8857:13;8723:174;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8641:305;8617:329;;;8129:835;;;:::o;20288:43::-;;;;:::o;2903:107:2:-;2961:7;2984:20;2998:5;2984:13;:20::i;:::-;2977:27;;2903:107;;;:::o;10593:214:4:-;10735:4;10764:18;:25;10783:5;10764:25;;;;;;;;;;;;;;;:35;10790:8;10764:35;;;;;;;;;;;;;;;;;;;;;;;;;10757:42;;10593:214;;;;:::o;1899:192:10:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;787:157:3:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;11965:173:4:-;12022:4;12065:7;12046:15;:13;:15::i;:::-;:26;;:52;;;;;12086:12;;12076:7;:22;12046:52;:84;;;;;12103:11;:20;12115:7;12103:20;;;;;;;;;;;:27;;;;;;;;;;;;12102:28;12046:84;12039:91;;11965:173;;;:::o;601:98:1:-;654:7;681:10;674:17;;601:98;:::o;20084:196:4:-;20226:2;20199:15;:24;20215:7;20199:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20264:7;20260:2;20244:28;;20253:5;20244:28;;;;;;;;;;;;20084:196;;;:::o;12146:104::-;12215:27;12225:2;12229:8;12215:27;;;;;;;;;;;;:9;:27::i;:::-;12146:104;;:::o;3150:92::-;3206:7;3233:1;3226:8;;3150:92;:::o;17838:2128::-;17953:35;17991:20;18003:7;17991:11;:20::i;:::-;17953:58;;18050:4;18028:26;;:13;:18;;;:26;;;18024:67;;18063:28;;;;;;;;;;;;;;18024:67;18104:22;18146:4;18130:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;18167:36;18184:4;18190:12;:10;:12::i;:::-;18167:16;:36::i;:::-;18130:73;:126;;;;18244:12;:10;:12::i;:::-;18220:36;;:20;18232:7;18220:11;:20::i;:::-;:36;;;18130:126;18104:153;;18275:17;18270:66;;18301:35;;;;;;;;;;;;;;18270:66;18365:1;18351:16;;:2;:16;;;18347:52;;;18376:23;;;;;;;;;;;;;;18347:52;18412:43;18434:4;18440:2;18444:7;18453:1;18412:21;:43::i;:::-;18520:35;18537:1;18541:7;18550:4;18520:8;:35::i;:::-;18881:1;18851:12;:18;18864:4;18851:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18925:1;18897:12;:16;18910:2;18897:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18943:31;18977:11;:20;18989:7;18977:20;;;;;;;;;;;18943:54;;19028:2;19012:8;:13;;;:18;;;;;;;;;;;;;;;;;;19078:15;19045:8;:23;;;:49;;;;;;;;;;;;;;;;;;19346:19;19378:1;19368:7;:11;19346:33;;19394:31;19428:11;:24;19440:11;19428:24;;;;;;;;;;;19394:58;;19496:1;19471:27;;:8;:13;;;;;;;;;;;;:27;;;19467:383;;;19681:12;;19666:11;:27;19662:173;;19734:4;19718:8;:13;;;:20;;;;;;;;;;;;;;;;;;19787:13;:28;;;19761:8;:23;;;:54;;;;;;;;;;;;;;;;;;19662:173;19467:383;18826:1035;;;19897:7;19893:2;19878:27;;19887:4;19878:27;;;;;;;;;;;;19916:42;19937:4;19943:2;19947:7;19956:1;19916:20;:42::i;:::-;17942:2024;;17838:2128;;;:::o;6850:682::-;6938:21;;:::i;:::-;6985:16;6993:7;6985;:16::i;:::-;6977:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;7061:26;7113:12;7102:7;:23;7098:103;;7188:1;7173:12;7163:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;7142:47;;7098:103;7218:12;7233:7;7218:22;;7213:242;7250:18;7242:4;:26;7213:242;;7293:31;7327:11;:17;7339:4;7327:17;;;;;;;;;;;7293:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7389:1;7363:28;;:9;:14;;;:28;;;7359:85;;7419:9;7412:16;;;;;;;7359:85;7278:177;7270:6;;;;;:::i;:::-;;;;7213:242;;;;7467:57;;;;;;;;;;:::i;:::-;;;;;;;;6850:682;;;;:::o;4041:107::-;4089:4;4128:12;;;;;;;;;;;4112:28;;:12;:10;:12::i;:::-;:28;;;4105:35;;4041:107;:::o;22478:159::-;;;;;:::o;23049:158::-;;;;;:::o;2099:173:10:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2144:128;2099:173;:::o;21005:985:4:-;21160:4;21181:15;:2;:13;;;:15::i;:::-;21177:806;;;21250:2;21234:36;;;21293:12;:10;:12::i;:::-;21328:4;21355:7;21385:5;21234:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;21213:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21613:1;21596:6;:13;:18;21592:321;;;21639:109;;;;;;;;;;:::i;:::-;;;;;;;;21592:321;21863:6;21857:13;21848:6;21844:2;21840:15;21833:38;21213:715;21483:45;;;21473:55;;;:6;:55;;;;21466:62;;;;;21177:806;21967:4;21960:11;;21005:985;;;;;;;:::o;2229:198:2:-;2301:4;2288:9;:17;;2280:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;2355:4;2343:9;:16;2339:83;;;2378:10;2370:28;;:46;2411:4;2399:9;:16;;;;:::i;:::-;2370:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2339:83;2229:198;:::o;2491:108::-;2551:13;2580;2573:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2491:108;:::o;288:723:12:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;6576:266:4:-;6637:7;6696:1;6679:19;;:5;:19;;;;6657:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;6801:12;:19;6814:5;6801:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;6793:41;;6786:48;;6576:266;;;:::o;12613:1937::-;12736:20;12759:12;;12736:35;;12800:1;12786:16;;:2;:16;;;12782:48;;;12811:19;;;;;;;;;;;;;;12782:48;12857:1;12845:8;:13;12841:44;;;12867:18;;;;;;;;;;;;;;12841:44;12898:61;12928:1;12932:2;12936:12;12950:8;12898:21;:61::i;:::-;13271:8;13236:44;;:12;:16;13249:2;13236:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13335:8;13295:49;;:12;:16;13308:2;13295:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13394:2;13361:11;:25;13373:12;13361:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13461:15;13411:11;:25;13423:12;13411:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;13494:20;13517:12;13494:35;;13544:11;13573:8;13558:12;:23;13544:37;;13602:15;:2;:13;;;:15::i;:::-;13598:821;;;13638:504;13694:12;13690:2;13669:38;;13686:1;13669:38;;;;;;;;;;;;13761:212;13830:1;13863:2;13896:14;;;;;;13941:5;13761:30;:212::i;:::-;13730:365;;14031:40;;;;;;;;;;;;;;13730:365;14137:3;14122:12;:18;13638:504;;14222:12;14206;;:28;14202:42;;14236:8;;;14202:42;13598:821;;;14285:119;14341:14;;;;;;14337:2;14316:40;;14333:1;14316:40;;;;;;;;;;;;14399:3;14384:12;:18;14285:119;;13598:821;14448:12;14433;:27;;;;13211:1261;;14482:60;14511:1;14515:2;14519:12;14533:8;14482:20;:60::i;:::-;12725:1825;12613:1937;;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;16917:667:4:-;17080:4;17117:2;17101:36;;;17138:12;:10;:12::i;:::-;17152:4;17158:7;17167:5;17101:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;17097:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17352:1;17335:6;:13;:18;17331:235;;;17381:40;;;;;;;;;;;;;;17331:235;17524:6;17518:13;17509:6;17505:2;17501:15;17494:38;17097:480;17230:45;;;17220:55;;;:6;:55;;;;17213:62;;;16917:667;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:13:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:139::-;1214:5;1252:6;1239:20;1230:29;;1268:33;1295:5;1268:33;:::i;:::-;1168:139;;;;:::o;1330:370::-;1401:5;1450:3;1443:4;1435:6;1431:17;1427:27;1417:122;;1458:79;;:::i;:::-;1417:122;1575:6;1562:20;1600:94;1690:3;1682:6;1675:4;1667:6;1663:17;1600:94;:::i;:::-;1591:103;;1407:293;1330:370;;;;:::o;1706:133::-;1749:5;1787:6;1774:20;1765:29;;1803:30;1827:5;1803:30;:::i;:::-;1706:133;;;;:::o;1845:137::-;1890:5;1928:6;1915:20;1906:29;;1944:32;1970:5;1944:32;:::i;:::-;1845:137;;;;:::o;1988:141::-;2044:5;2075:6;2069:13;2060:22;;2091:32;2117:5;2091:32;:::i;:::-;1988:141;;;;:::o;2148:338::-;2203:5;2252:3;2245:4;2237:6;2233:17;2229:27;2219:122;;2260:79;;:::i;:::-;2219:122;2377:6;2364:20;2402:78;2476:3;2468:6;2461:4;2453:6;2449:17;2402:78;:::i;:::-;2393:87;;2209:277;2148:338;;;;:::o;2506:553::-;2564:8;2574:6;2624:3;2617:4;2609:6;2605:17;2601:27;2591:122;;2632:79;;:::i;:::-;2591:122;2745:6;2732:20;2722:30;;2775:18;2767:6;2764:30;2761:117;;;2797:79;;:::i;:::-;2761:117;2911:4;2903:6;2899:17;2887:29;;2965:3;2957:4;2949:6;2945:17;2935:8;2931:32;2928:41;2925:128;;;2972:79;;:::i;:::-;2925:128;2506:553;;;;;:::o;3065:139::-;3111:5;3149:6;3136:20;3127:29;;3165:33;3192:5;3165:33;:::i;:::-;3065:139;;;;:::o;3210:135::-;3254:5;3292:6;3279:20;3270:29;;3308:31;3333:5;3308:31;:::i;:::-;3210:135;;;;:::o;3351:329::-;3410:6;3459:2;3447:9;3438:7;3434:23;3430:32;3427:119;;;3465:79;;:::i;:::-;3427:119;3585:1;3610:53;3655:7;3646:6;3635:9;3631:22;3610:53;:::i;:::-;3600:63;;3556:117;3351:329;;;;:::o;3686:474::-;3754:6;3762;3811:2;3799:9;3790:7;3786:23;3782:32;3779:119;;;3817:79;;:::i;:::-;3779:119;3937:1;3962:53;4007:7;3998:6;3987:9;3983:22;3962:53;:::i;:::-;3952:63;;3908:117;4064:2;4090:53;4135:7;4126:6;4115:9;4111:22;4090:53;:::i;:::-;4080:63;;4035:118;3686:474;;;;;:::o;4166:619::-;4243:6;4251;4259;4308:2;4296:9;4287:7;4283:23;4279:32;4276:119;;;4314:79;;:::i;:::-;4276:119;4434:1;4459:53;4504:7;4495:6;4484:9;4480:22;4459:53;:::i;:::-;4449:63;;4405:117;4561:2;4587:53;4632:7;4623:6;4612:9;4608:22;4587:53;:::i;:::-;4577:63;;4532:118;4689:2;4715:53;4760:7;4751:6;4740:9;4736:22;4715:53;:::i;:::-;4705:63;;4660:118;4166:619;;;;;:::o;4791:943::-;4886:6;4894;4902;4910;4959:3;4947:9;4938:7;4934:23;4930:33;4927:120;;;4966:79;;:::i;:::-;4927:120;5086:1;5111:53;5156:7;5147:6;5136:9;5132:22;5111:53;:::i;:::-;5101:63;;5057:117;5213:2;5239:53;5284:7;5275:6;5264:9;5260:22;5239:53;:::i;:::-;5229:63;;5184:118;5341:2;5367:53;5412:7;5403:6;5392:9;5388:22;5367:53;:::i;:::-;5357:63;;5312:118;5497:2;5486:9;5482:18;5469:32;5528:18;5520:6;5517:30;5514:117;;;5550:79;;:::i;:::-;5514:117;5655:62;5709:7;5700:6;5689:9;5685:22;5655:62;:::i;:::-;5645:72;;5440:287;4791:943;;;;;;;:::o;5740:468::-;5805:6;5813;5862:2;5850:9;5841:7;5837:23;5833:32;5830:119;;;5868:79;;:::i;:::-;5830:119;5988:1;6013:53;6058:7;6049:6;6038:9;6034:22;6013:53;:::i;:::-;6003:63;;5959:117;6115:2;6141:50;6183:7;6174:6;6163:9;6159:22;6141:50;:::i;:::-;6131:60;;6086:115;5740:468;;;;;:::o;6214:474::-;6282:6;6290;6339:2;6327:9;6318:7;6314:23;6310:32;6307:119;;;6345:79;;:::i;:::-;6307:119;6465:1;6490:53;6535:7;6526:6;6515:9;6511:22;6490:53;:::i;:::-;6480:63;;6436:117;6592:2;6618:53;6663:7;6654:6;6643:9;6639:22;6618:53;:::i;:::-;6608:63;;6563:118;6214:474;;;;;:::o;6694:539::-;6778:6;6827:2;6815:9;6806:7;6802:23;6798:32;6795:119;;;6833:79;;:::i;:::-;6795:119;6981:1;6970:9;6966:17;6953:31;7011:18;7003:6;7000:30;6997:117;;;7033:79;;:::i;:::-;6997:117;7138:78;7208:7;7199:6;7188:9;7184:22;7138:78;:::i;:::-;7128:88;;6924:302;6694:539;;;;:::o;7239:327::-;7297:6;7346:2;7334:9;7325:7;7321:23;7317:32;7314:119;;;7352:79;;:::i;:::-;7314:119;7472:1;7497:52;7541:7;7532:6;7521:9;7517:22;7497:52;:::i;:::-;7487:62;;7443:116;7239:327;;;;:::o;7572:349::-;7641:6;7690:2;7678:9;7669:7;7665:23;7661:32;7658:119;;;7696:79;;:::i;:::-;7658:119;7816:1;7841:63;7896:7;7887:6;7876:9;7872:22;7841:63;:::i;:::-;7831:73;;7787:127;7572:349;;;;:::o;7927:529::-;7998:6;8006;8055:2;8043:9;8034:7;8030:23;8026:32;8023:119;;;8061:79;;:::i;:::-;8023:119;8209:1;8198:9;8194:17;8181:31;8239:18;8231:6;8228:30;8225:117;;;8261:79;;:::i;:::-;8225:117;8374:65;8431:7;8422:6;8411:9;8407:22;8374:65;:::i;:::-;8356:83;;;;8152:297;7927:529;;;;;:::o;8462:329::-;8521:6;8570:2;8558:9;8549:7;8545:23;8541:32;8538:119;;;8576:79;;:::i;:::-;8538:119;8696:1;8721:53;8766:7;8757:6;8746:9;8742:22;8721:53;:::i;:::-;8711:63;;8667:117;8462:329;;;;:::o;8797:325::-;8854:6;8903:2;8891:9;8882:7;8878:23;8874:32;8871:119;;;8909:79;;:::i;:::-;8871:119;9029:1;9054:51;9097:7;9088:6;9077:9;9073:22;9054:51;:::i;:::-;9044:61;;9000:115;8797:325;;;;:::o;9128:108::-;9205:24;9223:5;9205:24;:::i;:::-;9200:3;9193:37;9128:108;;:::o;9242:118::-;9329:24;9347:5;9329:24;:::i;:::-;9324:3;9317:37;9242:118;;:::o;9366:99::-;9437:21;9452:5;9437:21;:::i;:::-;9432:3;9425:34;9366:99;;:::o;9471:109::-;9552:21;9567:5;9552:21;:::i;:::-;9547:3;9540:34;9471:109;;:::o;9586:360::-;9672:3;9700:38;9732:5;9700:38;:::i;:::-;9754:70;9817:6;9812:3;9754:70;:::i;:::-;9747:77;;9833:52;9878:6;9873:3;9866:4;9859:5;9855:16;9833:52;:::i;:::-;9910:29;9932:6;9910:29;:::i;:::-;9905:3;9901:39;9894:46;;9676:270;9586:360;;;;:::o;9952:364::-;10040:3;10068:39;10101:5;10068:39;:::i;:::-;10123:71;10187:6;10182:3;10123:71;:::i;:::-;10116:78;;10203:52;10248:6;10243:3;10236:4;10229:5;10225:16;10203:52;:::i;:::-;10280:29;10302:6;10280:29;:::i;:::-;10275:3;10271:39;10264:46;;10044:272;9952:364;;;;:::o;10322:377::-;10428:3;10456:39;10489:5;10456:39;:::i;:::-;10511:89;10593:6;10588:3;10511:89;:::i;:::-;10504:96;;10609:52;10654:6;10649:3;10642:4;10635:5;10631:16;10609:52;:::i;:::-;10686:6;10681:3;10677:16;10670:23;;10432:267;10322:377;;;;:::o;10729:845::-;10832:3;10869:5;10863:12;10898:36;10924:9;10898:36;:::i;:::-;10950:89;11032:6;11027:3;10950:89;:::i;:::-;10943:96;;11070:1;11059:9;11055:17;11086:1;11081:137;;;;11232:1;11227:341;;;;11048:520;;11081:137;11165:4;11161:9;11150;11146:25;11141:3;11134:38;11201:6;11196:3;11192:16;11185:23;;11081:137;;11227:341;11294:38;11326:5;11294:38;:::i;:::-;11354:1;11368:154;11382:6;11379:1;11376:13;11368:154;;;11456:7;11450:14;11446:1;11441:3;11437:11;11430:35;11506:1;11497:7;11493:15;11482:26;;11404:4;11401:1;11397:12;11392:17;;11368:154;;;11551:6;11546:3;11542:16;11535:23;;11234:334;;11048:520;;10836:738;;10729:845;;;;:::o;11580:366::-;11722:3;11743:67;11807:2;11802:3;11743:67;:::i;:::-;11736:74;;11819:93;11908:3;11819:93;:::i;:::-;11937:2;11932:3;11928:12;11921:19;;11580:366;;;:::o;11952:::-;12094:3;12115:67;12179:2;12174:3;12115:67;:::i;:::-;12108:74;;12191:93;12280:3;12191:93;:::i;:::-;12309:2;12304:3;12300:12;12293:19;;11952:366;;;:::o;12324:::-;12466:3;12487:67;12551:2;12546:3;12487:67;:::i;:::-;12480:74;;12563:93;12652:3;12563:93;:::i;:::-;12681:2;12676:3;12672:12;12665:19;;12324:366;;;:::o;12696:::-;12838:3;12859:67;12923:2;12918:3;12859:67;:::i;:::-;12852:74;;12935:93;13024:3;12935:93;:::i;:::-;13053:2;13048:3;13044:12;13037:19;;12696:366;;;:::o;13068:::-;13210:3;13231:67;13295:2;13290:3;13231:67;:::i;:::-;13224:74;;13307:93;13396:3;13307:93;:::i;:::-;13425:2;13420:3;13416:12;13409:19;;13068:366;;;:::o;13440:::-;13582:3;13603:67;13667:2;13662:3;13603:67;:::i;:::-;13596:74;;13679:93;13768:3;13679:93;:::i;:::-;13797:2;13792:3;13788:12;13781:19;;13440:366;;;:::o;13812:::-;13954:3;13975:67;14039:2;14034:3;13975:67;:::i;:::-;13968:74;;14051:93;14140:3;14051:93;:::i;:::-;14169:2;14164:3;14160:12;14153:19;;13812:366;;;:::o;14184:::-;14326:3;14347:67;14411:2;14406:3;14347:67;:::i;:::-;14340:74;;14423:93;14512:3;14423:93;:::i;:::-;14541:2;14536:3;14532:12;14525:19;;14184:366;;;:::o;14556:::-;14698:3;14719:67;14783:2;14778:3;14719:67;:::i;:::-;14712:74;;14795:93;14884:3;14795:93;:::i;:::-;14913:2;14908:3;14904:12;14897:19;;14556:366;;;:::o;14928:::-;15070:3;15091:67;15155:2;15150:3;15091:67;:::i;:::-;15084:74;;15167:93;15256:3;15167:93;:::i;:::-;15285:2;15280:3;15276:12;15269:19;;14928:366;;;:::o;15300:::-;15442:3;15463:67;15527:2;15522:3;15463:67;:::i;:::-;15456:74;;15539:93;15628:3;15539:93;:::i;:::-;15657:2;15652:3;15648:12;15641:19;;15300:366;;;:::o;15672:::-;15814:3;15835:67;15899:2;15894:3;15835:67;:::i;:::-;15828:74;;15911:93;16000:3;15911:93;:::i;:::-;16029:2;16024:3;16020:12;16013:19;;15672:366;;;:::o;16044:::-;16186:3;16207:67;16271:2;16266:3;16207:67;:::i;:::-;16200:74;;16283:93;16372:3;16283:93;:::i;:::-;16401:2;16396:3;16392:12;16385:19;;16044:366;;;:::o;16416:::-;16558:3;16579:67;16643:2;16638:3;16579:67;:::i;:::-;16572:74;;16655:93;16744:3;16655:93;:::i;:::-;16773:2;16768:3;16764:12;16757:19;;16416:366;;;:::o;16788:398::-;16947:3;16968:83;17049:1;17044:3;16968:83;:::i;:::-;16961:90;;17060:93;17149:3;17060:93;:::i;:::-;17178:1;17173:3;17169:11;17162:18;;16788:398;;;:::o;17192:366::-;17334:3;17355:67;17419:2;17414:3;17355:67;:::i;:::-;17348:74;;17431:93;17520:3;17431:93;:::i;:::-;17549:2;17544:3;17540:12;17533:19;;17192:366;;;:::o;17564:::-;17706:3;17727:67;17791:2;17786:3;17727:67;:::i;:::-;17720:74;;17803:93;17892:3;17803:93;:::i;:::-;17921:2;17916:3;17912:12;17905:19;;17564:366;;;:::o;17936:::-;18078:3;18099:67;18163:2;18158:3;18099:67;:::i;:::-;18092:74;;18175:93;18264:3;18175:93;:::i;:::-;18293:2;18288:3;18284:12;18277:19;;17936:366;;;:::o;18308:::-;18450:3;18471:67;18535:2;18530:3;18471:67;:::i;:::-;18464:74;;18547:93;18636:3;18547:93;:::i;:::-;18665:2;18660:3;18656:12;18649:19;;18308:366;;;:::o;18680:::-;18822:3;18843:67;18907:2;18902:3;18843:67;:::i;:::-;18836:74;;18919:93;19008:3;18919:93;:::i;:::-;19037:2;19032:3;19028:12;19021:19;;18680:366;;;:::o;19052:::-;19194:3;19215:67;19279:2;19274:3;19215:67;:::i;:::-;19208:74;;19291:93;19380:3;19291:93;:::i;:::-;19409:2;19404:3;19400:12;19393:19;;19052:366;;;:::o;19424:::-;19566:3;19587:67;19651:2;19646:3;19587:67;:::i;:::-;19580:74;;19663:93;19752:3;19663:93;:::i;:::-;19781:2;19776:3;19772:12;19765:19;;19424:366;;;:::o;19796:::-;19938:3;19959:67;20023:2;20018:3;19959:67;:::i;:::-;19952:74;;20035:93;20124:3;20035:93;:::i;:::-;20153:2;20148:3;20144:12;20137:19;;19796:366;;;:::o;20238:697::-;20397:4;20392:3;20388:14;20484:4;20477:5;20473:16;20467:23;20503:63;20560:4;20555:3;20551:14;20537:12;20503:63;:::i;:::-;20412:164;20668:4;20661:5;20657:16;20651:23;20687:61;20742:4;20737:3;20733:14;20719:12;20687:61;:::i;:::-;20586:172;20842:4;20835:5;20831:16;20825:23;20861:57;20912:4;20907:3;20903:14;20889:12;20861:57;:::i;:::-;20768:160;20366:569;20238:697;;:::o;20941:118::-;21028:24;21046:5;21028:24;:::i;:::-;21023:3;21016:37;20941:118;;:::o;21065:105::-;21140:23;21157:5;21140:23;:::i;:::-;21135:3;21128:36;21065:105;;:::o;21176:589::-;21401:3;21423:95;21514:3;21505:6;21423:95;:::i;:::-;21416:102;;21535:95;21626:3;21617:6;21535:95;:::i;:::-;21528:102;;21647:92;21735:3;21726:6;21647:92;:::i;:::-;21640:99;;21756:3;21749:10;;21176:589;;;;;;:::o;21771:379::-;21955:3;21977:147;22120:3;21977:147;:::i;:::-;21970:154;;22141:3;22134:10;;21771:379;;;:::o;22156:222::-;22249:4;22287:2;22276:9;22272:18;22264:26;;22300:71;22368:1;22357:9;22353:17;22344:6;22300:71;:::i;:::-;22156:222;;;;:::o;22384:640::-;22579:4;22617:3;22606:9;22602:19;22594:27;;22631:71;22699:1;22688:9;22684:17;22675:6;22631:71;:::i;:::-;22712:72;22780:2;22769:9;22765:18;22756:6;22712:72;:::i;:::-;22794;22862:2;22851:9;22847:18;22838:6;22794:72;:::i;:::-;22913:9;22907:4;22903:20;22898:2;22887:9;22883:18;22876:48;22941:76;23012:4;23003:6;22941:76;:::i;:::-;22933:84;;22384:640;;;;;;;:::o;23030:210::-;23117:4;23155:2;23144:9;23140:18;23132:26;;23168:65;23230:1;23219:9;23215:17;23206:6;23168:65;:::i;:::-;23030:210;;;;:::o;23246:313::-;23359:4;23397:2;23386:9;23382:18;23374:26;;23446:9;23440:4;23436:20;23432:1;23421:9;23417:17;23410:47;23474:78;23547:4;23538:6;23474:78;:::i;:::-;23466:86;;23246:313;;;;:::o;23565:419::-;23731:4;23769:2;23758:9;23754:18;23746:26;;23818:9;23812:4;23808:20;23804:1;23793:9;23789:17;23782:47;23846:131;23972:4;23846:131;:::i;:::-;23838:139;;23565:419;;;:::o;23990:::-;24156:4;24194:2;24183:9;24179:18;24171:26;;24243:9;24237:4;24233:20;24229:1;24218:9;24214:17;24207:47;24271:131;24397:4;24271:131;:::i;:::-;24263:139;;23990:419;;;:::o;24415:::-;24581:4;24619:2;24608:9;24604:18;24596:26;;24668:9;24662:4;24658:20;24654:1;24643:9;24639:17;24632:47;24696:131;24822:4;24696:131;:::i;:::-;24688:139;;24415:419;;;:::o;24840:::-;25006:4;25044:2;25033:9;25029:18;25021:26;;25093:9;25087:4;25083:20;25079:1;25068:9;25064:17;25057:47;25121:131;25247:4;25121:131;:::i;:::-;25113:139;;24840:419;;;:::o;25265:::-;25431:4;25469:2;25458:9;25454:18;25446:26;;25518:9;25512:4;25508:20;25504:1;25493:9;25489:17;25482:47;25546:131;25672:4;25546:131;:::i;:::-;25538:139;;25265:419;;;:::o;25690:::-;25856:4;25894:2;25883:9;25879:18;25871:26;;25943:9;25937:4;25933:20;25929:1;25918:9;25914:17;25907:47;25971:131;26097:4;25971:131;:::i;:::-;25963:139;;25690:419;;;:::o;26115:::-;26281:4;26319:2;26308:9;26304:18;26296:26;;26368:9;26362:4;26358:20;26354:1;26343:9;26339:17;26332:47;26396:131;26522:4;26396:131;:::i;:::-;26388:139;;26115:419;;;:::o;26540:::-;26706:4;26744:2;26733:9;26729:18;26721:26;;26793:9;26787:4;26783:20;26779:1;26768:9;26764:17;26757:47;26821:131;26947:4;26821:131;:::i;:::-;26813:139;;26540:419;;;:::o;26965:::-;27131:4;27169:2;27158:9;27154:18;27146:26;;27218:9;27212:4;27208:20;27204:1;27193:9;27189:17;27182:47;27246:131;27372:4;27246:131;:::i;:::-;27238:139;;26965:419;;;:::o;27390:::-;27556:4;27594:2;27583:9;27579:18;27571:26;;27643:9;27637:4;27633:20;27629:1;27618:9;27614:17;27607:47;27671:131;27797:4;27671:131;:::i;:::-;27663:139;;27390:419;;;:::o;27815:::-;27981:4;28019:2;28008:9;28004:18;27996:26;;28068:9;28062:4;28058:20;28054:1;28043:9;28039:17;28032:47;28096:131;28222:4;28096:131;:::i;:::-;28088:139;;27815:419;;;:::o;28240:::-;28406:4;28444:2;28433:9;28429:18;28421:26;;28493:9;28487:4;28483:20;28479:1;28468:9;28464:17;28457:47;28521:131;28647:4;28521:131;:::i;:::-;28513:139;;28240:419;;;:::o;28665:::-;28831:4;28869:2;28858:9;28854:18;28846:26;;28918:9;28912:4;28908:20;28904:1;28893:9;28889:17;28882:47;28946:131;29072:4;28946:131;:::i;:::-;28938:139;;28665:419;;;:::o;29090:::-;29256:4;29294:2;29283:9;29279:18;29271:26;;29343:9;29337:4;29333:20;29329:1;29318:9;29314:17;29307:47;29371:131;29497:4;29371:131;:::i;:::-;29363:139;;29090:419;;;:::o;29515:::-;29681:4;29719:2;29708:9;29704:18;29696:26;;29768:9;29762:4;29758:20;29754:1;29743:9;29739:17;29732:47;29796:131;29922:4;29796:131;:::i;:::-;29788:139;;29515:419;;;:::o;29940:::-;30106:4;30144:2;30133:9;30129:18;30121:26;;30193:9;30187:4;30183:20;30179:1;30168:9;30164:17;30157:47;30221:131;30347:4;30221:131;:::i;:::-;30213:139;;29940:419;;;:::o;30365:::-;30531:4;30569:2;30558:9;30554:18;30546:26;;30618:9;30612:4;30608:20;30604:1;30593:9;30589:17;30582:47;30646:131;30772:4;30646:131;:::i;:::-;30638:139;;30365:419;;;:::o;30790:::-;30956:4;30994:2;30983:9;30979:18;30971:26;;31043:9;31037:4;31033:20;31029:1;31018:9;31014:17;31007:47;31071:131;31197:4;31071:131;:::i;:::-;31063:139;;30790:419;;;:::o;31215:::-;31381:4;31419:2;31408:9;31404:18;31396:26;;31468:9;31462:4;31458:20;31454:1;31443:9;31439:17;31432:47;31496:131;31622:4;31496:131;:::i;:::-;31488:139;;31215:419;;;:::o;31640:::-;31806:4;31844:2;31833:9;31829:18;31821:26;;31893:9;31887:4;31883:20;31879:1;31868:9;31864:17;31857:47;31921:131;32047:4;31921:131;:::i;:::-;31913:139;;31640:419;;;:::o;32065:::-;32231:4;32269:2;32258:9;32254:18;32246:26;;32318:9;32312:4;32308:20;32304:1;32293:9;32289:17;32282:47;32346:131;32472:4;32346:131;:::i;:::-;32338:139;;32065:419;;;:::o;32490:::-;32656:4;32694:2;32683:9;32679:18;32671:26;;32743:9;32737:4;32733:20;32729:1;32718:9;32714:17;32707:47;32771:131;32897:4;32771:131;:::i;:::-;32763:139;;32490:419;;;:::o;32915:346::-;33070:4;33108:2;33097:9;33093:18;33085:26;;33121:133;33251:1;33240:9;33236:17;33227:6;33121:133;:::i;:::-;32915:346;;;;:::o;33267:222::-;33360:4;33398:2;33387:9;33383:18;33375:26;;33411:71;33479:1;33468:9;33464:17;33455:6;33411:71;:::i;:::-;33267:222;;;;:::o;33495:129::-;33529:6;33556:20;;:::i;:::-;33546:30;;33585:33;33613:4;33605:6;33585:33;:::i;:::-;33495:129;;;:::o;33630:75::-;33663:6;33696:2;33690:9;33680:19;;33630:75;:::o;33711:311::-;33788:4;33878:18;33870:6;33867:30;33864:56;;;33900:18;;:::i;:::-;33864:56;33950:4;33942:6;33938:17;33930:25;;34010:4;34004;34000:15;33992:23;;33711:311;;;:::o;34028:307::-;34089:4;34179:18;34171:6;34168:30;34165:56;;;34201:18;;:::i;:::-;34165:56;34239:29;34261:6;34239:29;:::i;:::-;34231:37;;34323:4;34317;34313:15;34305:23;;34028:307;;;:::o;34341:141::-;34390:4;34413:3;34405:11;;34436:3;34433:1;34426:14;34470:4;34467:1;34457:18;34449:26;;34341:141;;;:::o;34488:98::-;34539:6;34573:5;34567:12;34557:22;;34488:98;;;:::o;34592:99::-;34644:6;34678:5;34672:12;34662:22;;34592:99;;;:::o;34697:168::-;34780:11;34814:6;34809:3;34802:19;34854:4;34849:3;34845:14;34830:29;;34697:168;;;;:::o;34871:147::-;34972:11;35009:3;34994:18;;34871:147;;;;:::o;35024:169::-;35108:11;35142:6;35137:3;35130:19;35182:4;35177:3;35173:14;35158:29;;35024:169;;;;:::o;35199:148::-;35301:11;35338:3;35323:18;;35199:148;;;;:::o;35353:305::-;35393:3;35412:20;35430:1;35412:20;:::i;:::-;35407:25;;35446:20;35464:1;35446:20;:::i;:::-;35441:25;;35600:1;35532:66;35528:74;35525:1;35522:81;35519:107;;;35606:18;;:::i;:::-;35519:107;35650:1;35647;35643:9;35636:16;;35353:305;;;;:::o;35664:185::-;35704:1;35721:20;35739:1;35721:20;:::i;:::-;35716:25;;35755:20;35773:1;35755:20;:::i;:::-;35750:25;;35794:1;35784:35;;35799:18;;:::i;:::-;35784:35;35841:1;35838;35834:9;35829:14;;35664:185;;;;:::o;35855:348::-;35895:7;35918:20;35936:1;35918:20;:::i;:::-;35913:25;;35952:20;35970:1;35952:20;:::i;:::-;35947:25;;36140:1;36072:66;36068:74;36065:1;36062:81;36057:1;36050:9;36043:17;36039:105;36036:131;;;36147:18;;:::i;:::-;36036:131;36195:1;36192;36188:9;36177:20;;35855:348;;;;:::o;36209:191::-;36249:4;36269:20;36287:1;36269:20;:::i;:::-;36264:25;;36303:20;36321:1;36303:20;:::i;:::-;36298:25;;36342:1;36339;36336:8;36333:34;;;36347:18;;:::i;:::-;36333:34;36392:1;36389;36385:9;36377:17;;36209:191;;;;:::o;36406:96::-;36443:7;36472:24;36490:5;36472:24;:::i;:::-;36461:35;;36406:96;;;:::o;36508:90::-;36542:7;36585:5;36578:13;36571:21;36560:32;;36508:90;;;:::o;36604:149::-;36640:7;36680:66;36673:5;36669:78;36658:89;;36604:149;;;:::o;36759:126::-;36796:7;36836:42;36829:5;36825:54;36814:65;;36759:126;;;:::o;36891:77::-;36928:7;36957:5;36946:16;;36891:77;;;:::o;36974:101::-;37010:7;37050:18;37043:5;37039:30;37028:41;;36974:101;;;:::o;37081:86::-;37116:7;37156:4;37149:5;37145:16;37134:27;;37081:86;;;:::o;37173:154::-;37257:6;37252:3;37247;37234:30;37319:1;37310:6;37305:3;37301:16;37294:27;37173:154;;;:::o;37333:307::-;37401:1;37411:113;37425:6;37422:1;37419:13;37411:113;;;37510:1;37505:3;37501:11;37495:18;37491:1;37486:3;37482:11;37475:39;37447:2;37444:1;37440:10;37435:15;;37411:113;;;37542:6;37539:1;37536:13;37533:101;;;37622:1;37613:6;37608:3;37604:16;37597:27;37533:101;37382:258;37333:307;;;:::o;37646:171::-;37685:3;37708:24;37726:5;37708:24;:::i;:::-;37699:33;;37754:4;37747:5;37744:15;37741:41;;;37762:18;;:::i;:::-;37741:41;37809:1;37802:5;37798:13;37791:20;;37646:171;;;:::o;37823:320::-;37867:6;37904:1;37898:4;37894:12;37884:22;;37951:1;37945:4;37941:12;37972:18;37962:81;;38028:4;38020:6;38016:17;38006:27;;37962:81;38090:2;38082:6;38079:14;38059:18;38056:38;38053:84;;;38109:18;;:::i;:::-;38053:84;37874:269;37823:320;;;:::o;38149:281::-;38232:27;38254:4;38232:27;:::i;:::-;38224:6;38220:40;38362:6;38350:10;38347:22;38326:18;38314:10;38311:34;38308:62;38305:88;;;38373:18;;:::i;:::-;38305:88;38413:10;38409:2;38402:22;38192:238;38149:281;;:::o;38436:233::-;38475:3;38498:24;38516:5;38498:24;:::i;:::-;38489:33;;38544:66;38537:5;38534:77;38531:103;;;38614:18;;:::i;:::-;38531:103;38661:1;38654:5;38650:13;38643:20;;38436:233;;;:::o;38675:176::-;38707:1;38724:20;38742:1;38724:20;:::i;:::-;38719:25;;38758:20;38776:1;38758:20;:::i;:::-;38753:25;;38797:1;38787:35;;38802:18;;:::i;:::-;38787:35;38843:1;38840;38836:9;38831:14;;38675:176;;;;:::o;38857:180::-;38905:77;38902:1;38895:88;39002:4;38999:1;38992:15;39026:4;39023:1;39016:15;39043:180;39091:77;39088:1;39081:88;39188:4;39185:1;39178:15;39212:4;39209:1;39202:15;39229:180;39277:77;39274:1;39267:88;39374:4;39371:1;39364:15;39398:4;39395:1;39388:15;39415:180;39463:77;39460:1;39453:88;39560:4;39557:1;39550:15;39584:4;39581:1;39574:15;39601:180;39649:77;39646:1;39639:88;39746:4;39743:1;39736:15;39770:4;39767:1;39760:15;39787:117;39896:1;39893;39886:12;39910:117;40019:1;40016;40009:12;40033:117;40142:1;40139;40132:12;40156:117;40265:1;40262;40255:12;40279:117;40388:1;40385;40378:12;40402:117;40511:1;40508;40501:12;40525:102;40566:6;40617:2;40613:7;40608:2;40601:5;40597:14;40593:28;40583:38;;40525:102;;;:::o;40633:221::-;40773:34;40769:1;40761:6;40757:14;40750:58;40842:4;40837:2;40829:6;40825:15;40818:29;40633:221;:::o;40860:225::-;41000:34;40996:1;40988:6;40984:14;40977:58;41069:8;41064:2;41056:6;41052:15;41045:33;40860:225;:::o;41091:229::-;41231:34;41227:1;41219:6;41215:14;41208:58;41300:12;41295:2;41287:6;41283:15;41276:37;41091:229;:::o;41326:222::-;41466:34;41462:1;41454:6;41450:14;41443:58;41535:5;41530:2;41522:6;41518:15;41511:30;41326:222;:::o;41554:236::-;41694:34;41690:1;41682:6;41678:14;41671:58;41763:19;41758:2;41750:6;41746:15;41739:44;41554:236;:::o;41796:180::-;41936:32;41932:1;41924:6;41920:14;41913:56;41796:180;:::o;41982:244::-;42122:34;42118:1;42110:6;42106:14;42099:58;42191:27;42186:2;42178:6;42174:15;42167:52;41982:244;:::o;42232:230::-;42372:34;42368:1;42360:6;42356:14;42349:58;42441:13;42436:2;42428:6;42424:15;42417:38;42232:230;:::o;42468:168::-;42608:20;42604:1;42596:6;42592:14;42585:44;42468:168;:::o;42642:181::-;42782:33;42778:1;42770:6;42766:14;42759:57;42642:181;:::o;42829:182::-;42969:34;42965:1;42957:6;42953:14;42946:58;42829:182;:::o;43017:234::-;43157:34;43153:1;43145:6;43141:14;43134:58;43226:17;43221:2;43213:6;43209:15;43202:42;43017:234;:::o;43257:176::-;43397:28;43393:1;43385:6;43381:14;43374:52;43257:176;:::o;43439:221::-;43579:34;43575:1;43567:6;43563:14;43556:58;43648:4;43643:2;43635:6;43631:15;43624:29;43439:221;:::o;43666:114::-;;:::o;43786:166::-;43926:18;43922:1;43914:6;43910:14;43903:42;43786:166;:::o;43958:238::-;44098:34;44094:1;44086:6;44082:14;44075:58;44167:21;44162:2;44154:6;44150:15;44143:46;43958:238;:::o;44202:172::-;44342:24;44338:1;44330:6;44326:14;44319:48;44202:172;:::o;44380:::-;44520:24;44516:1;44508:6;44504:14;44497:48;44380:172;:::o;44558:233::-;44698:34;44694:1;44686:6;44682:14;44675:58;44767:16;44762:2;44754:6;44750:15;44743:41;44558:233;:::o;44797:181::-;44937:33;44933:1;44925:6;44921:14;44914:57;44797:181;:::o;44984:234::-;45124:34;45120:1;45112:6;45108:14;45101:58;45193:17;45188:2;45180:6;45176:15;45169:42;44984:234;:::o;45224:232::-;45364:34;45360:1;45352:6;45348:14;45341:58;45433:15;45428:2;45420:6;45416:15;45409:40;45224:232;:::o;45462:122::-;45535:24;45553:5;45535:24;:::i;:::-;45528:5;45525:35;45515:63;;45574:1;45571;45564:12;45515:63;45462:122;:::o;45590:116::-;45660:21;45675:5;45660:21;:::i;:::-;45653:5;45650:32;45640:60;;45696:1;45693;45686:12;45640:60;45590:116;:::o;45712:120::-;45784:23;45801:5;45784:23;:::i;:::-;45777:5;45774:34;45764:62;;45822:1;45819;45812:12;45764:62;45712:120;:::o;45838:122::-;45911:24;45929:5;45911:24;:::i;:::-;45904:5;45901:35;45891:63;;45950:1;45947;45940:12;45891:63;45838:122;:::o;45966:118::-;46037:22;46053:5;46037:22;:::i;:::-;46030:5;46027:33;46017:61;;46074:1;46071;46064:12;46017:61;45966:118;:::o

Swarm Source

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