ETH Price: $3,523.22 (+6.85%)

Token

Hoz4CryptoBroz (H4CB)
 

Overview

Max Total Supply

2,377 H4CB

Holders

650

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
20 H4CB
0xe900cf3721742c8e14ef0c38dd07be7562a970a4
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:
Hoz4CryptoBroz

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 5 of 13: Hoz4CryptoBroz.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

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

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

    string public baseURI;

    string public notRevealedUri;

    uint256 public MAX_SUPPLY = 10000;

    bool public revealed = true;

    uint256 public whitelistCost = 0 ether;
    uint256 public publicSaleCost = 0.055 ether;

    uint256 public publicMintLimit_pw = 9000;
    uint256 public whitelistLimit_pw = 2;

    uint256 public whitelistLimit = 1000;
    uint256 public freeMintLimit = 1000;
    uint256 public publicSaleLimit = 9000;

    uint256 public freeMintCount;
    uint256 public whitelistCount;
    uint256 public publicMintCount;

    bytes32 public whitelistSigner;

    mapping(address => uint256) public whitelist_claimed;
    mapping(address => uint256) public publicmint_claimed;

    uint256 public startDate = 1658160000;

    bool public whitelist_status = true;
    bool public public_mint_status = true;

    constructor(string memory _initBaseURI, string memory _initNotRevealedUri) ERC721A("Hoz4CryptoBroz", "H4CB") {
    
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
    }

    function mint(uint256 quantity) public payable  {

        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left");

        if (msg.sender != owner()) {
      
            require(startDate <= block.timestamp, "Minting Not Yet Started");
            require(public_mint_status, "Public Mint Not Allowed");
            require(publicmint_claimed[msg.sender] + quantity <= publicMintLimit_pw, "Public Mint Limit Reached");
            require(publicMintCount + quantity <= publicSaleLimit, "Public Mint Limit Exceeded");

                if(publicmint_claimed[msg.sender] > 0){
                    
                  require(msg.value >= (publicSaleCost * quantity), "Not enough ether sent");     

                } else if(freeMintCount < freeMintLimit){                  

                    require(msg.value >= (publicSaleCost * (quantity-1)), "Not enough ether sent"); 
                    freeMintCount = freeMintCount + 1;

                  } else{

                    require(msg.value >= (publicSaleCost * quantity), "Not enough ether sent");     

                  }                 

                }

            _safeMint(msg.sender, quantity);
            publicmint_claimed[msg.sender] =  publicmint_claimed[msg.sender] + quantity;
            publicMintCount =  publicMintCount + quantity;

        }
         
   

   
    // whitelist minting 

   function whitelistMint(bytes32[] calldata  _proof, uint256 quantity) payable public{

        require(startDate <= block.timestamp, "Minting Not Yet Started");

        require(whitelist_status, "Whitelist Mint Not Allowed");

        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left");

        require(whitelist_claimed[msg.sender] + quantity <= whitelistLimit_pw, "Limit Exceed");
        require(msg.value >= whitelistCost * quantity, "insufficient funds");
        require(whitelistCount + quantity <= whitelistLimit, "Whitelist Limit Exceeded");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_proof,leaf,whitelistSigner),"Invalid Proof");
    
        _safeMint(msg.sender, quantity);
        whitelist_claimed[msg.sender] =  whitelist_claimed[msg.sender] + quantity;   
        whitelistCount = whitelistCount + quantity;    
  
  }


     // Free Mint

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        if(revealed == false) {
        return notRevealedUri;
        }
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : '';
    }

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

    //only owner    

      function toggleReveal() public onlyOwner {
        
        if(revealed == false){
            revealed = true;
        }else{
            revealed = false;
        }
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setStatus_publicmint() public onlyOwner {
        if(public_mint_status == true){

            public_mint_status = false;

        } else {

        public_mint_status = true;
      
        }

    }

     function setStatus_whitelist() public onlyOwner {
        if(whitelist_status == true){

            whitelist_status = false;
           

        } else {

        whitelist_status = true;

         }

    }      
    
  
    function setWhitelistSigner(bytes32 newWhitelistSigner) public onlyOwner {
        whitelistSigner = newWhitelistSigner;
    }

   
    function withdraw() public payable onlyOwner {
    (bool main, ) = payable(owner()).call{value: address(this).balance}("");
    require(main);
    }
    

    function setWhitelistCost(uint256 _whitelistCost) public onlyOwner {
        whitelistCost = _whitelistCost;
    }
    
    function setPublicSaleCost(uint256 _publicSaleCost) public onlyOwner {
        publicSaleCost = _publicSaleCost;
    }

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

    function setpublicMintLimit_pw(uint256 _publicMintLimit_pw) public onlyOwner {
        publicMintLimit_pw = _publicMintLimit_pw;
    }

    function setwhitelistLimit_pw(uint256 _whitelistLimit_pw) public onlyOwner {
        whitelistLimit_pw = _whitelistLimit_pw;
    }

    function setwhitelistLimit(uint256 _whitelistLimit) public onlyOwner {
        whitelistLimit = _whitelistLimit;
    }

    function setfreeMintLimit(uint256 _freeMintLimit) public onlyOwner {
        freeMintLimit = _freeMintLimit;
    }

    function setpublicSaleLimit(uint256 _publicSaleLimit) public onlyOwner {
        publicSaleLimit = _publicSaleLimit;
    }

    function setStartDate(uint256 _startDate) public onlyOwner {
        startDate = _startDate;
    }
       
}


/*

                           _ _     ____   __  __ _      _       _ 
     /\                   | | |   / __ \ / _|/ _(_)    (_)     | |
    /  \   _ __  _ __  ___| | | _| |  | | |_| |_ _  ___ _  __ _| |
   / /\ \ | '_ \| '_ \/ __| | |/ / |  | |  _|  _| |/ __| |/ _` | |
  / ____ \| |_) | |_) \__ \ |   <| |__| | | | | | | (__| | (_| | | 
 /_/    \_\ .__/| .__/|___/_|_|\_\\____/|_| |_| |_|\___|_|\__,_|_|
          | |   | |                                               
          |_|   |_|                                               


               https://www.fiverr.com/appslkofficial


*/

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "IERC165.sol";

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

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

pragma solidity ^0.8.4;

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

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata 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 that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**128 - 1 (max value of uint128).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). 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 tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). 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) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

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

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 3.4e38 (2**128) - 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;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = uint128(updatedIndex);
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // 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**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 TransferToNonERC721ReceiverImplementer();
                } 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.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 13: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

import "IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

File 11 of 13: MerkleProof.sol
// contracts/MerkleProofVerify.sol
// SPDX-License-Identifier: MIT
// based upon https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.1/contracts/mocks/MerkleProofWrapper.sol

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle trees (hash trees),
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] calldata proof, bytes32 leaf, bytes32 root) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}


/*

pragma solidity ^0.8.0;



contract MerkleProofVerify {
    function verify(bytes32[] calldata proof, bytes32 root)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        return MerkleProof.verify(proof, root, leaf);
    }
}
*/

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

pragma solidity ^0.8.0;

import "Context.sol";

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintLimit_pw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_mint_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicmint_claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleCost","type":"uint256"}],"name":"setPublicSaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startDate","type":"uint256"}],"name":"setStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStatus_publicmint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStatus_whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistCost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newWhitelistSigner","type":"bytes32"}],"name":"setWhitelistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeMintLimit","type":"uint256"}],"name":"setfreeMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMintLimit_pw","type":"uint256"}],"name":"setpublicMintLimit_pw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleLimit","type":"uint256"}],"name":"setpublicSaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistLimit","type":"uint256"}],"name":"setwhitelistLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistLimit_pw","type":"uint256"}],"name":"setwhitelistLimit_pw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","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":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistLimit_pw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSigner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist_claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelist_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052612710600a556001600b60006101000a81548160ff0219169083151502179055506000600c5566c3663566a58000600d55612328600e556002600f556103e86010556103e86011556123286012556362d583806019556001601a60006101000a81548160ff0219169083151502179055506001601a60016101000a81548160ff0219169083151502179055503480156200009d57600080fd5b5060405162005b7c38038062005b7c8339818101604052810190620000c3919062000529565b6040518060400160405280600e81526020017f486f7a3443727970746f42726f7a0000000000000000000000000000000000008152506040518060400160405280600481526020017f4834434200000000000000000000000000000000000000000000000000000000815250816001908051906020019062000147929190620003fb565b50806002908051906020019062000160929190620003fb565b5050506200018362000177620001ad60201b60201c565b620001b560201b60201c565b62000194826200027b60201b60201c565b620001a5816200032660201b60201c565b5050620007b5565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200028b620001ad60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002b1620003d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200030a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030190620005d5565b60405180910390fd5b806008908051906020019062000322929190620003fb565b5050565b62000336620001ad60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200035c620003d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ac90620005d5565b60405180910390fd5b8060099080519060200190620003cd929190620003fb565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b82805462000409906200069d565b90600052602060002090601f0160209004810192826200042d576000855562000479565b82601f106200044857805160ff191683800117855562000479565b8280016001018555821562000479579182015b82811115620004785782518255916020019190600101906200045b565b5b5090506200048891906200048c565b5090565b5b80821115620004a75760008160009055506001016200048d565b5090565b6000620004c2620004bc8462000620565b620005f7565b905082815260208101848484011115620004e157620004e06200076c565b5b620004ee84828562000667565b509392505050565b600082601f8301126200050e576200050d62000767565b5b815162000520848260208601620004ab565b91505092915050565b6000806040838503121562000543576200054262000776565b5b600083015167ffffffffffffffff81111562000564576200056362000771565b5b6200057285828601620004f6565b925050602083015167ffffffffffffffff81111562000596576200059562000771565b5b620005a485828601620004f6565b9150509250929050565b6000620005bd60208362000656565b9150620005ca826200078c565b602082019050919050565b60006020820190508181036000830152620005f081620005ae565b9050919050565b60006200060362000616565b9050620006118282620006d3565b919050565b6000604051905090565b600067ffffffffffffffff8211156200063e576200063d62000738565b5b62000649826200077b565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620006875780820151818401526020810190506200066a565b8381111562000697576000848401525b50505050565b60006002820490506001821680620006b657607f821691505b60208210811415620006cd57620006cc62000709565b5b50919050565b620006de826200077b565b810181811067ffffffffffffffff821117156200070057620006ff62000738565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6153b780620007c56000396000f3fe60806040526004361061036b5760003560e01c80636c0360eb116101c6578063c87b56dd116100f7578063e985e9c511610095578063f2624b5d1161006f578063f2624b5d14610c35578063f2c4ce1e14610c60578063f2fde38b14610c89578063fe16ad4114610cb25761036b565b8063e985e9c514610b90578063ef81b4d414610bcd578063f0d2319214610bf85761036b565b8063d49479eb116100d1578063d49479eb14610ae8578063e123e7b714610b11578063e55f58bb14610b3a578063e7b99ec714610b655761036b565b8063c87b56dd14610a69578063cf53dfde14610aa6578063d2785a3814610abd5761036b565b80638916332e1161016457806395d89b411161013e57806395d89b41146109d0578063a0712d68146109fb578063a22cb46514610a17578063b88d4fde14610a405761036b565b80638916332e146109535780638da5cb5b1461097c5780638dbb7c06146109a75761036b565b8063715018a6116101a0578063715018a6146108d15780637fbbf887146108e857806381c4cede146108ff57806382d95df51461092a5761036b565b80636c0360eb1461083e5780636e3de87c1461086957806370a08231146108945761036b565b806325389421116102a057806342842e0e1161023e5780635183022711610218578063518302271461079657806355f804b3146107c15780635b8ad429146107ea5780636352211e146108015761036b565b806342842e0e14610705578063453afb0f1461072e5780634f6ccce7146107595761036b565b8063302150e51161027a578063302150e51461066857806332cb6b0c1461069357806335ce5395146106be5780633ccfd60b146106fb5761036b565b806325389421146105e65780632904e6d91461060f5780632f745c591461062b5761036b565b8063095ea7b31161030d57806318160ddd116102e757806318160ddd1461053e5780631b3fda0b146105695780631da666f31461059257806323b872dd146105bd5761036b565b8063095ea7b3146104bf5780630b97bc86146104e85780630d84d1ce146105135761036b565b806307f13cc61161034957806307f13cc614610401578063081812fc1461042c578063081c8c441461046957806308346d85146104945761036b565b806301ffc9a71461037057806306775f44146103ad57806306fdde03146103d6575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190614448565b610cdb565b6040516103a491906149a3565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf91906144eb565b610e25565b005b3480156103e257600080fd5b506103eb610eab565b6040516103f891906149d9565b60405180910390f35b34801561040d57600080fd5b50610416610f3d565b6040516104239190614b9b565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906144eb565b610f43565b604051610460919061493c565b60405180910390f35b34801561047557600080fd5b5061047e610fbf565b60405161048b91906149d9565b60405180910390f35b3480156104a057600080fd5b506104a961104d565b6040516104b69190614b9b565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e1919061437b565b611053565b005b3480156104f457600080fd5b506104fd61115e565b60405161050a9190614b9b565b60405180910390f35b34801561051f57600080fd5b50610528611164565b6040516105359190614b9b565b60405180910390f35b34801561054a57600080fd5b5061055361116a565b6040516105609190614b9b565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b91906144eb565b6111bf565b005b34801561059e57600080fd5b506105a7611245565b6040516105b49190614b9b565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190614265565b61124b565b005b3480156105f257600080fd5b5061060d6004803603810190610608919061441b565b61125b565b005b610629600480360381019061062491906143bb565b6112e1565b005b34801561063757600080fd5b50610652600480360381019061064d919061437b565b611627565b60405161065f9190614b9b565b60405180910390f35b34801561067457600080fd5b5061067d61182e565b60405161068a9190614b9b565b60405180910390f35b34801561069f57600080fd5b506106a8611834565b6040516106b59190614b9b565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e091906141f8565b61183a565b6040516106f29190614b9b565b60405180910390f35b610703611852565b005b34801561071157600080fd5b5061072c60048036038101906107279190614265565b61194e565b005b34801561073a57600080fd5b5061074361196e565b6040516107509190614b9b565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b91906144eb565b611974565b60405161078d9190614b9b565b60405180910390f35b3480156107a257600080fd5b506107ab611ae5565b6040516107b891906149a3565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e391906144a2565b611af8565b005b3480156107f657600080fd5b506107ff611b8e565b005b34801561080d57600080fd5b50610828600480360381019061082391906144eb565b611c64565b604051610835919061493c565b60405180910390f35b34801561084a57600080fd5b50610853611c7a565b60405161086091906149d9565b60405180910390f35b34801561087557600080fd5b5061087e611d08565b60405161088b9190614b9b565b60405180910390f35b3480156108a057600080fd5b506108bb60048036038101906108b691906141f8565b611d0e565b6040516108c89190614b9b565b60405180910390f35b3480156108dd57600080fd5b506108e6611dde565b005b3480156108f457600080fd5b506108fd611e66565b005b34801561090b57600080fd5b50610914611f3c565b60405161092191906149a3565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c91906144eb565b611f4f565b005b34801561095f57600080fd5b5061097a600480360381019061097591906144eb565b611fd5565b005b34801561098857600080fd5b5061099161205b565b60405161099e919061493c565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c991906144eb565b612085565b005b3480156109dc57600080fd5b506109e561210b565b6040516109f291906149d9565b60405180910390f35b610a156004803603810190610a1091906144eb565b61219d565b005b348015610a2357600080fd5b50610a3e6004803603810190610a39919061433b565b6125c4565b005b348015610a4c57600080fd5b50610a676004803603810190610a6291906142b8565b61273c565b005b348015610a7557600080fd5b50610a906004803603810190610a8b91906144eb565b61278f565b604051610a9d91906149d9565b60405180910390f35b348015610ab257600080fd5b50610abb6128de565b005b348015610ac957600080fd5b50610ad26129b4565b604051610adf91906149a3565b60405180910390f35b348015610af457600080fd5b50610b0f6004803603810190610b0a91906144eb565b6129c7565b005b348015610b1d57600080fd5b50610b386004803603810190610b3391906144eb565b612a4d565b005b348015610b4657600080fd5b50610b4f612ad3565b604051610b5c9190614b9b565b60405180910390f35b348015610b7157600080fd5b50610b7a612ad9565b604051610b879190614b9b565b60405180910390f35b348015610b9c57600080fd5b50610bb76004803603810190610bb29190614225565b612adf565b604051610bc491906149a3565b60405180910390f35b348015610bd957600080fd5b50610be2612b73565b604051610bef91906149be565b60405180910390f35b348015610c0457600080fd5b50610c1f6004803603810190610c1a91906141f8565b612b79565b604051610c2c9190614b9b565b60405180910390f35b348015610c4157600080fd5b50610c4a612b91565b604051610c579190614b9b565b60405180910390f35b348015610c6c57600080fd5b50610c876004803603810190610c8291906144a2565b612b97565b005b348015610c9557600080fd5b50610cb06004803603810190610cab91906141f8565b612c2d565b005b348015610cbe57600080fd5b50610cd96004803603810190610cd491906144eb565b612d25565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610da657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e0e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e1e5750610e1d82612dab565b5b9050919050565b610e2d612e15565b73ffffffffffffffffffffffffffffffffffffffff16610e4b61205b565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890614adb565b60405180910390fd5b80600f8190555050565b606060018054610eba90614e75565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee690614e75565b8015610f335780601f10610f0857610100808354040283529160200191610f33565b820191906000526020600020905b815481529060010190602001808311610f1657829003601f168201915b5050505050905090565b600e5481565b6000610f4e82612e1d565b610f84576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610fcc90614e75565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff890614e75565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b505050505081565b60115481565b600061105e82611c64565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110c6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110e5612e15565b73ffffffffffffffffffffffffffffffffffffffff1614158015611117575061111581611110612e15565b612adf565b155b1561114e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611159838383612e85565b505050565b60195481565b60155481565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b6111c7612e15565b73ffffffffffffffffffffffffffffffffffffffff166111e561205b565b73ffffffffffffffffffffffffffffffffffffffff161461123b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123290614adb565b60405180910390fd5b8060128190555050565b600f5481565b611256838383612f37565b505050565b611263612e15565b73ffffffffffffffffffffffffffffffffffffffff1661128161205b565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90614adb565b60405180910390fd5b8060168190555050565b426019541115611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90614a9b565b60405180910390fd5b601a60009054906101000a900460ff16611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90614abb565b60405180910390fd5b600a548161138161116a565b61138b9190614ca0565b11156113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390614a7b565b60405180910390fd5b600f5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461141a9190614ca0565b111561145b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145290614a5b565b60405180910390fd5b80600c546114699190614d27565b3410156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614b1b565b60405180910390fd5b601054816014546114bc9190614ca0565b11156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490614a1b565b60405180910390fd5b60003360405160200161151091906148b1565b604051602081830303815290604052805190602001209050611536848483601654613454565b611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90614b5b565b60405180910390fd5b61157f338361350c565b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115ca9190614ca0565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160145461161b9190614ca0565b60148190555050505050565b600061163283611d0e565b821061166a576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015611822576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156117815750611815565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146117c157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611813578684141561180a578195505050505050611828565b83806001019450505b505b80806001019150506116a4565b50600080fd5b92915050565b60105481565b600a5481565b60176020528060005260406000206000915090505481565b61185a612e15565b73ffffffffffffffffffffffffffffffffffffffff1661187861205b565b73ffffffffffffffffffffffffffffffffffffffff16146118ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c590614adb565b60405180910390fd5b60006118d861205b565b73ffffffffffffffffffffffffffffffffffffffff16476040516118fb90614927565b60006040518083038185875af1925050503d8060008114611938576040519150601f19603f3d011682016040523d82523d6000602084013e61193d565b606091505b505090508061194b57600080fd5b50565b6119698383836040518060200160405280600081525061273c565b505050565b600d5481565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611aad576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611a9f5785831415611a965781945050505050611ae0565b82806001019350505b5080806001019150506119ac565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600b60009054906101000a900460ff1681565b611b00612e15565b73ffffffffffffffffffffffffffffffffffffffff16611b1e61205b565b73ffffffffffffffffffffffffffffffffffffffff1614611b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6b90614adb565b60405180910390fd5b8060089080519060200190611b8a929190613f5e565b5050565b611b96612e15565b73ffffffffffffffffffffffffffffffffffffffff16611bb461205b565b73ffffffffffffffffffffffffffffffffffffffff1614611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190614adb565b60405180910390fd5b60001515600b60009054906101000a900460ff1615151415611c46576001600b60006101000a81548160ff021916908315150217905550611c62565b6000600b60006101000a81548160ff0219169083151502179055505b565b6000611c6f8261352a565b600001519050919050565b60088054611c8790614e75565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb390614e75565b8015611d005780601f10611cd557610100808354040283529160200191611d00565b820191906000526020600020905b815481529060010190602001808311611ce357829003601f168201915b505050505081565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d76576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611de6612e15565b73ffffffffffffffffffffffffffffffffffffffff16611e0461205b565b73ffffffffffffffffffffffffffffffffffffffff1614611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5190614adb565b60405180910390fd5b611e6460006137d2565b565b611e6e612e15565b73ffffffffffffffffffffffffffffffffffffffff16611e8c61205b565b73ffffffffffffffffffffffffffffffffffffffff1614611ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed990614adb565b60405180910390fd5b60011515601a60019054906101000a900460ff1615151415611f1e576000601a60016101000a81548160ff021916908315150217905550611f3a565b6001601a60016101000a81548160ff0219169083151502179055505b565b601a60019054906101000a900460ff1681565b611f57612e15565b73ffffffffffffffffffffffffffffffffffffffff16611f7561205b565b73ffffffffffffffffffffffffffffffffffffffff1614611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc290614adb565b60405180910390fd5b8060198190555050565b611fdd612e15565b73ffffffffffffffffffffffffffffffffffffffff16611ffb61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204890614adb565b60405180910390fd5b8060108190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61208d612e15565b73ffffffffffffffffffffffffffffffffffffffff166120ab61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f890614adb565b60405180910390fd5b80600d8190555050565b60606002805461211a90614e75565b80601f016020809104026020016040519081016040528092919081815260200182805461214690614e75565b80156121935780601f1061216857610100808354040283529160200191612193565b820191906000526020600020905b81548152906001019060200180831161217657829003601f168201915b5050505050905090565b600a54816121a961116a565b6121b39190614ca0565b11156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90614a7b565b60405180910390fd5b6121fc61205b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251557426019541115612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90614a9b565b60405180910390fd5b601a60019054906101000a900460ff166122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b990614a3b565b60405180910390fd5b600e5481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123109190614ca0565b1115612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890614afb565b60405180910390fd5b601254816015546123629190614ca0565b11156123a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239a90614b7b565b60405180910390fd5b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156124405780600d546123f99190614d27565b34101561243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243290614b3b565b60405180910390fd5b612514565b60115460135410156124c2576001816124599190614d81565b600d546124669190614d27565b3410156124a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249f90614b3b565b60405180910390fd5b60016013546124b79190614ca0565b601381905550612513565b80600d546124d09190614d27565b341015612512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250990614b3b565b60405180910390fd5b5b5b5b61251f338261350c565b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461256a9190614ca0565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806015546125bb9190614ca0565b60158190555050565b6125cc612e15565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612631576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006600061263e612e15565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166126eb612e15565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161273091906149a3565b60405180910390a35050565b612747848484612f37565b61275384848484613898565b612789576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061279a82612e1d565b6127d0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600b60009054906101000a900460ff161515141561287e57600980546127f990614e75565b80601f016020809104026020016040519081016040528092919081815260200182805461282590614e75565b80156128725780601f1061284757610100808354040283529160200191612872565b820191906000526020600020905b81548152906001019060200180831161285557829003601f168201915b505050505090506128d9565b60006008805461288d90614e75565b905014156128aa57604051806020016040528060008152506128d6565b60086128b583613a26565b6040516020016128c69291906148f8565b6040516020818303038152906040525b90505b919050565b6128e6612e15565b73ffffffffffffffffffffffffffffffffffffffff1661290461205b565b73ffffffffffffffffffffffffffffffffffffffff161461295a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295190614adb565b60405180910390fd5b60011515601a60009054906101000a900460ff1615151415612996576000601a60006101000a81548160ff0219169083151502179055506129b2565b6001601a60006101000a81548160ff0219169083151502179055505b565b601a60009054906101000a900460ff1681565b6129cf612e15565b73ffffffffffffffffffffffffffffffffffffffff166129ed61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3a90614adb565b60405180910390fd5b80600c8190555050565b612a55612e15565b73ffffffffffffffffffffffffffffffffffffffff16612a7361205b565b73ffffffffffffffffffffffffffffffffffffffff1614612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac090614adb565b60405180910390fd5b8060118190555050565b60135481565b600c5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60165481565b60186020528060005260406000206000915090505481565b60145481565b612b9f612e15565b73ffffffffffffffffffffffffffffffffffffffff16612bbd61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0a90614adb565b60405180910390fd5b8060099080519060200190612c29929190613f5e565b5050565b612c35612e15565b73ffffffffffffffffffffffffffffffffffffffff16612c5361205b565b73ffffffffffffffffffffffffffffffffffffffff1614612ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca090614adb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d10906149fb565b60405180910390fd5b612d22816137d2565b50565b612d2d612e15565b73ffffffffffffffffffffffffffffffffffffffff16612d4b61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9890614adb565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612e7e575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612f428261352a565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612f69612e15565b73ffffffffffffffffffffffffffffffffffffffff161480612f9c5750612f9b8260000151612f96612e15565b612adf565b5b80612fe15750612faa612e15565b73ffffffffffffffffffffffffffffffffffffffff16612fc984610f43565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061301a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614613083576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130ea576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130f78585856001613b87565b6131076000848460000151612e85565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156133e45760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156133e35782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461344d8585856001613b8d565b5050505050565b60008083905060005b868690508110156134fd57600087878381811061347d5761347c61500d565b5b9050602002013590508083116134bd5782816040516020016134a09291906148cc565b6040516020818303038152906040528051906020012092506134e9565b80836040516020016134d09291906148cc565b6040516020818303038152906040528051906020012092505b5080806134f590614ed8565b91505061345d565b50828114915050949350505050565b613526828260405180602001604052806000815250613b93565b5050565b613532613fe4565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681101561379b576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161379957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461367d5780925050506137cd565b5b60011561379857818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146137935780925050506137cd565b61367e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006138b98473ffffffffffffffffffffffffffffffffffffffff16613ba5565b15613a19578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138e2612e15565b8786866040518563ffffffff1660e01b81526004016139049493929190614957565b602060405180830381600087803b15801561391e57600080fd5b505af192505050801561394f57506040513d601f19601f8201168201806040525081019061394c9190614475565b60015b6139c9573d806000811461397f576040519150601f19603f3d011682016040523d82523d6000602084013e613984565b606091505b506000815114156139c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a1e565b600190505b949350505050565b60606000821415613a6e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b82565b600082905060005b60008214613aa0578080613a8990614ed8565b915050600a82613a999190614cf6565b9150613a76565b60008167ffffffffffffffff811115613abc57613abb61503c565b5b6040519080825280601f01601f191660200182016040528015613aee5781602001600182028036833780820191505090505b5090505b60008514613b7b57600182613b079190614d81565b9150600a85613b169190614f4f565b6030613b229190614ca0565b60f81b818381518110613b3857613b3761500d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b749190614cf6565b9450613af2565b8093505050505b919050565b50505050565b50505050565b613ba08383836001613bc8565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613c63576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613c9e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cab6000868387613b87565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613f1057818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613ec45750613ec26000888488613898565b155b15613efb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613e49565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050613f576000868387613b8d565b5050505050565b828054613f6a90614e75565b90600052602060002090601f016020900481019282613f8c5760008555613fd3565b82601f10613fa557805160ff1916838001178555613fd3565b82800160010185558215613fd3579182015b82811115613fd2578251825591602001919060010190613fb7565b5b509050613fe09190614027565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115614040576000816000905550600101614028565b5090565b600061405761405284614bdb565b614bb6565b9050828152602081018484840111156140735761407261507a565b5b61407e848285614e33565b509392505050565b600061409961409484614c0c565b614bb6565b9050828152602081018484840111156140b5576140b461507a565b5b6140c0848285614e33565b509392505050565b6000813590506140d78161530e565b92915050565b60008083601f8401126140f3576140f2615070565b5b8235905067ffffffffffffffff8111156141105761410f61506b565b5b60208301915083602082028301111561412c5761412b615075565b5b9250929050565b60008135905061414281615325565b92915050565b6000813590506141578161533c565b92915050565b60008135905061416c81615353565b92915050565b60008151905061418181615353565b92915050565b600082601f83011261419c5761419b615070565b5b81356141ac848260208601614044565b91505092915050565b600082601f8301126141ca576141c9615070565b5b81356141da848260208601614086565b91505092915050565b6000813590506141f28161536a565b92915050565b60006020828403121561420e5761420d615084565b5b600061421c848285016140c8565b91505092915050565b6000806040838503121561423c5761423b615084565b5b600061424a858286016140c8565b925050602061425b858286016140c8565b9150509250929050565b60008060006060848603121561427e5761427d615084565b5b600061428c868287016140c8565b935050602061429d868287016140c8565b92505060406142ae868287016141e3565b9150509250925092565b600080600080608085870312156142d2576142d1615084565b5b60006142e0878288016140c8565b94505060206142f1878288016140c8565b9350506040614302878288016141e3565b925050606085013567ffffffffffffffff8111156143235761432261507f565b5b61432f87828801614187565b91505092959194509250565b6000806040838503121561435257614351615084565b5b6000614360858286016140c8565b925050602061437185828601614133565b9150509250929050565b6000806040838503121561439257614391615084565b5b60006143a0858286016140c8565b92505060206143b1858286016141e3565b9150509250929050565b6000806000604084860312156143d4576143d3615084565b5b600084013567ffffffffffffffff8111156143f2576143f161507f565b5b6143fe868287016140dd565b93509350506020614411868287016141e3565b9150509250925092565b60006020828403121561443157614430615084565b5b600061443f84828501614148565b91505092915050565b60006020828403121561445e5761445d615084565b5b600061446c8482850161415d565b91505092915050565b60006020828403121561448b5761448a615084565b5b600061449984828501614172565b91505092915050565b6000602082840312156144b8576144b7615084565b5b600082013567ffffffffffffffff8111156144d6576144d561507f565b5b6144e2848285016141b5565b91505092915050565b60006020828403121561450157614500615084565b5b600061450f848285016141e3565b91505092915050565b61452181614db5565b82525050565b61453861453382614db5565b614f21565b82525050565b61454781614dc7565b82525050565b61455681614dd3565b82525050565b61456d61456882614dd3565b614f33565b82525050565b600061457e82614c52565b6145888185614c68565b9350614598818560208601614e42565b6145a181615089565b840191505092915050565b60006145b782614c5d565b6145c18185614c84565b93506145d1818560208601614e42565b6145da81615089565b840191505092915050565b60006145f082614c5d565b6145fa8185614c95565b935061460a818560208601614e42565b80840191505092915050565b6000815461462381614e75565b61462d8186614c95565b9450600182166000811461464857600181146146595761468c565b60ff1983168652818601935061468c565b61466285614c3d565b60005b8381101561468457815481890152600182019150602081019050614665565b838801955050505b50505092915050565b60006146a2602683614c84565b91506146ad826150a7565b604082019050919050565b60006146c5601883614c84565b91506146d0826150f6565b602082019050919050565b60006146e8601783614c84565b91506146f38261511f565b602082019050919050565b600061470b600c83614c84565b915061471682615148565b602082019050919050565b600061472e601683614c84565b915061473982615171565b602082019050919050565b6000614751601783614c84565b915061475c8261519a565b602082019050919050565b6000614774601a83614c84565b915061477f826151c3565b602082019050919050565b6000614797600583614c95565b91506147a2826151ec565b600582019050919050565b60006147ba602083614c84565b91506147c582615215565b602082019050919050565b60006147dd601983614c84565b91506147e88261523e565b602082019050919050565b6000614800600083614c79565b915061480b82615267565b600082019050919050565b6000614823601283614c84565b915061482e8261526a565b602082019050919050565b6000614846601583614c84565b915061485182615293565b602082019050919050565b6000614869600d83614c84565b9150614874826152bc565b602082019050919050565b600061488c601a83614c84565b9150614897826152e5565b602082019050919050565b6148ab81614e29565b82525050565b60006148bd8284614527565b60148201915081905092915050565b60006148d8828561455c565b6020820191506148e8828461455c565b6020820191508190509392505050565b60006149048285614616565b915061491082846145e5565b915061491b8261478a565b91508190509392505050565b6000614932826147f3565b9150819050919050565b60006020820190506149516000830184614518565b92915050565b600060808201905061496c6000830187614518565b6149796020830186614518565b61498660408301856148a2565b81810360608301526149988184614573565b905095945050505050565b60006020820190506149b8600083018461453e565b92915050565b60006020820190506149d3600083018461454d565b92915050565b600060208201905081810360008301526149f381846145ac565b905092915050565b60006020820190508181036000830152614a1481614695565b9050919050565b60006020820190508181036000830152614a34816146b8565b9050919050565b60006020820190508181036000830152614a54816146db565b9050919050565b60006020820190508181036000830152614a74816146fe565b9050919050565b60006020820190508181036000830152614a9481614721565b9050919050565b60006020820190508181036000830152614ab481614744565b9050919050565b60006020820190508181036000830152614ad481614767565b9050919050565b60006020820190508181036000830152614af4816147ad565b9050919050565b60006020820190508181036000830152614b14816147d0565b9050919050565b60006020820190508181036000830152614b3481614816565b9050919050565b60006020820190508181036000830152614b5481614839565b9050919050565b60006020820190508181036000830152614b748161485c565b9050919050565b60006020820190508181036000830152614b948161487f565b9050919050565b6000602082019050614bb060008301846148a2565b92915050565b6000614bc0614bd1565b9050614bcc8282614ea7565b919050565b6000604051905090565b600067ffffffffffffffff821115614bf657614bf561503c565b5b614bff82615089565b9050602081019050919050565b600067ffffffffffffffff821115614c2757614c2661503c565b5b614c3082615089565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cab82614e29565b9150614cb683614e29565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ceb57614cea614f80565b5b828201905092915050565b6000614d0182614e29565b9150614d0c83614e29565b925082614d1c57614d1b614faf565b5b828204905092915050565b6000614d3282614e29565b9150614d3d83614e29565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d7657614d75614f80565b5b828202905092915050565b6000614d8c82614e29565b9150614d9783614e29565b925082821015614daa57614da9614f80565b5b828203905092915050565b6000614dc082614e09565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e60578082015181840152602081019050614e45565b83811115614e6f576000848401525b50505050565b60006002820490506001821680614e8d57607f821691505b60208210811415614ea157614ea0614fde565b5b50919050565b614eb082615089565b810181811067ffffffffffffffff82111715614ecf57614ece61503c565b5b80604052505050565b6000614ee382614e29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f1657614f15614f80565b5b600182019050919050565b6000614f2c82614f3d565b9050919050565b6000819050919050565b6000614f488261509a565b9050919050565b6000614f5a82614e29565b9150614f6583614e29565b925082614f7557614f74614faf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57686974656c697374204c696d69742045786365656465640000000000000000600082015250565b7f5075626c6963204d696e74204e6f7420416c6c6f776564000000000000000000600082015250565b7f4c696d6974204578636565640000000000000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4d696e74696e67204e6f74205965742053746172746564000000000000000000600082015250565b7f57686974656c697374204d696e74204e6f7420416c6c6f776564000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5075626c6963204d696e74204c696d6974205265616368656400000000000000600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b7f5075626c6963204d696e74204c696d6974204578636565646564000000000000600082015250565b61531781614db5565b811461532257600080fd5b50565b61532e81614dc7565b811461533957600080fd5b50565b61534581614dd3565b811461535057600080fd5b50565b61535c81614ddd565b811461536757600080fd5b50565b61537381614e29565b811461537e57600080fd5b5056fea26469706673582212204f8d48584284826b4ab7f90c2faf3a55d548547b15c5e505c420d4013580edd364736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d65425a63724b587838485956314c566971617362757244477551443969665a354a516f4c6358334e75624e672f000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061036b5760003560e01c80636c0360eb116101c6578063c87b56dd116100f7578063e985e9c511610095578063f2624b5d1161006f578063f2624b5d14610c35578063f2c4ce1e14610c60578063f2fde38b14610c89578063fe16ad4114610cb25761036b565b8063e985e9c514610b90578063ef81b4d414610bcd578063f0d2319214610bf85761036b565b8063d49479eb116100d1578063d49479eb14610ae8578063e123e7b714610b11578063e55f58bb14610b3a578063e7b99ec714610b655761036b565b8063c87b56dd14610a69578063cf53dfde14610aa6578063d2785a3814610abd5761036b565b80638916332e1161016457806395d89b411161013e57806395d89b41146109d0578063a0712d68146109fb578063a22cb46514610a17578063b88d4fde14610a405761036b565b80638916332e146109535780638da5cb5b1461097c5780638dbb7c06146109a75761036b565b8063715018a6116101a0578063715018a6146108d15780637fbbf887146108e857806381c4cede146108ff57806382d95df51461092a5761036b565b80636c0360eb1461083e5780636e3de87c1461086957806370a08231146108945761036b565b806325389421116102a057806342842e0e1161023e5780635183022711610218578063518302271461079657806355f804b3146107c15780635b8ad429146107ea5780636352211e146108015761036b565b806342842e0e14610705578063453afb0f1461072e5780634f6ccce7146107595761036b565b8063302150e51161027a578063302150e51461066857806332cb6b0c1461069357806335ce5395146106be5780633ccfd60b146106fb5761036b565b806325389421146105e65780632904e6d91461060f5780632f745c591461062b5761036b565b8063095ea7b31161030d57806318160ddd116102e757806318160ddd1461053e5780631b3fda0b146105695780631da666f31461059257806323b872dd146105bd5761036b565b8063095ea7b3146104bf5780630b97bc86146104e85780630d84d1ce146105135761036b565b806307f13cc61161034957806307f13cc614610401578063081812fc1461042c578063081c8c441461046957806308346d85146104945761036b565b806301ffc9a71461037057806306775f44146103ad57806306fdde03146103d6575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190614448565b610cdb565b6040516103a491906149a3565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf91906144eb565b610e25565b005b3480156103e257600080fd5b506103eb610eab565b6040516103f891906149d9565b60405180910390f35b34801561040d57600080fd5b50610416610f3d565b6040516104239190614b9b565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906144eb565b610f43565b604051610460919061493c565b60405180910390f35b34801561047557600080fd5b5061047e610fbf565b60405161048b91906149d9565b60405180910390f35b3480156104a057600080fd5b506104a961104d565b6040516104b69190614b9b565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e1919061437b565b611053565b005b3480156104f457600080fd5b506104fd61115e565b60405161050a9190614b9b565b60405180910390f35b34801561051f57600080fd5b50610528611164565b6040516105359190614b9b565b60405180910390f35b34801561054a57600080fd5b5061055361116a565b6040516105609190614b9b565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b91906144eb565b6111bf565b005b34801561059e57600080fd5b506105a7611245565b6040516105b49190614b9b565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190614265565b61124b565b005b3480156105f257600080fd5b5061060d6004803603810190610608919061441b565b61125b565b005b610629600480360381019061062491906143bb565b6112e1565b005b34801561063757600080fd5b50610652600480360381019061064d919061437b565b611627565b60405161065f9190614b9b565b60405180910390f35b34801561067457600080fd5b5061067d61182e565b60405161068a9190614b9b565b60405180910390f35b34801561069f57600080fd5b506106a8611834565b6040516106b59190614b9b565b60405180910390f35b3480156106ca57600080fd5b506106e560048036038101906106e091906141f8565b61183a565b6040516106f29190614b9b565b60405180910390f35b610703611852565b005b34801561071157600080fd5b5061072c60048036038101906107279190614265565b61194e565b005b34801561073a57600080fd5b5061074361196e565b6040516107509190614b9b565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b91906144eb565b611974565b60405161078d9190614b9b565b60405180910390f35b3480156107a257600080fd5b506107ab611ae5565b6040516107b891906149a3565b60405180910390f35b3480156107cd57600080fd5b506107e860048036038101906107e391906144a2565b611af8565b005b3480156107f657600080fd5b506107ff611b8e565b005b34801561080d57600080fd5b50610828600480360381019061082391906144eb565b611c64565b604051610835919061493c565b60405180910390f35b34801561084a57600080fd5b50610853611c7a565b60405161086091906149d9565b60405180910390f35b34801561087557600080fd5b5061087e611d08565b60405161088b9190614b9b565b60405180910390f35b3480156108a057600080fd5b506108bb60048036038101906108b691906141f8565b611d0e565b6040516108c89190614b9b565b60405180910390f35b3480156108dd57600080fd5b506108e6611dde565b005b3480156108f457600080fd5b506108fd611e66565b005b34801561090b57600080fd5b50610914611f3c565b60405161092191906149a3565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c91906144eb565b611f4f565b005b34801561095f57600080fd5b5061097a600480360381019061097591906144eb565b611fd5565b005b34801561098857600080fd5b5061099161205b565b60405161099e919061493c565b60405180910390f35b3480156109b357600080fd5b506109ce60048036038101906109c991906144eb565b612085565b005b3480156109dc57600080fd5b506109e561210b565b6040516109f291906149d9565b60405180910390f35b610a156004803603810190610a1091906144eb565b61219d565b005b348015610a2357600080fd5b50610a3e6004803603810190610a39919061433b565b6125c4565b005b348015610a4c57600080fd5b50610a676004803603810190610a6291906142b8565b61273c565b005b348015610a7557600080fd5b50610a906004803603810190610a8b91906144eb565b61278f565b604051610a9d91906149d9565b60405180910390f35b348015610ab257600080fd5b50610abb6128de565b005b348015610ac957600080fd5b50610ad26129b4565b604051610adf91906149a3565b60405180910390f35b348015610af457600080fd5b50610b0f6004803603810190610b0a91906144eb565b6129c7565b005b348015610b1d57600080fd5b50610b386004803603810190610b3391906144eb565b612a4d565b005b348015610b4657600080fd5b50610b4f612ad3565b604051610b5c9190614b9b565b60405180910390f35b348015610b7157600080fd5b50610b7a612ad9565b604051610b879190614b9b565b60405180910390f35b348015610b9c57600080fd5b50610bb76004803603810190610bb29190614225565b612adf565b604051610bc491906149a3565b60405180910390f35b348015610bd957600080fd5b50610be2612b73565b604051610bef91906149be565b60405180910390f35b348015610c0457600080fd5b50610c1f6004803603810190610c1a91906141f8565b612b79565b604051610c2c9190614b9b565b60405180910390f35b348015610c4157600080fd5b50610c4a612b91565b604051610c579190614b9b565b60405180910390f35b348015610c6c57600080fd5b50610c876004803603810190610c8291906144a2565b612b97565b005b348015610c9557600080fd5b50610cb06004803603810190610cab91906141f8565b612c2d565b005b348015610cbe57600080fd5b50610cd96004803603810190610cd491906144eb565b612d25565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610da657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e0e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e1e5750610e1d82612dab565b5b9050919050565b610e2d612e15565b73ffffffffffffffffffffffffffffffffffffffff16610e4b61205b565b73ffffffffffffffffffffffffffffffffffffffff1614610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9890614adb565b60405180910390fd5b80600f8190555050565b606060018054610eba90614e75565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee690614e75565b8015610f335780601f10610f0857610100808354040283529160200191610f33565b820191906000526020600020905b815481529060010190602001808311610f1657829003601f168201915b5050505050905090565b600e5481565b6000610f4e82612e1d565b610f84576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60098054610fcc90614e75565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff890614e75565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b505050505081565b60115481565b600061105e82611c64565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110c6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166110e5612e15565b73ffffffffffffffffffffffffffffffffffffffff1614158015611117575061111581611110612e15565b612adf565b155b1561114e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611159838383612e85565b505050565b60195481565b60155481565b60008060109054906101000a90046fffffffffffffffffffffffffffffffff1660008054906101000a90046fffffffffffffffffffffffffffffffff16036fffffffffffffffffffffffffffffffff16905090565b6111c7612e15565b73ffffffffffffffffffffffffffffffffffffffff166111e561205b565b73ffffffffffffffffffffffffffffffffffffffff161461123b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123290614adb565b60405180910390fd5b8060128190555050565b600f5481565b611256838383612f37565b505050565b611263612e15565b73ffffffffffffffffffffffffffffffffffffffff1661128161205b565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90614adb565b60405180910390fd5b8060168190555050565b426019541115611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90614a9b565b60405180910390fd5b601a60009054906101000a900460ff16611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90614abb565b60405180910390fd5b600a548161138161116a565b61138b9190614ca0565b11156113cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c390614a7b565b60405180910390fd5b600f5481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461141a9190614ca0565b111561145b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145290614a5b565b60405180910390fd5b80600c546114699190614d27565b3410156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614b1b565b60405180910390fd5b601054816014546114bc9190614ca0565b11156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490614a1b565b60405180910390fd5b60003360405160200161151091906148b1565b604051602081830303815290604052805190602001209050611536848483601654613454565b611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90614b5b565b60405180910390fd5b61157f338361350c565b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115ca9190614ca0565b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160145461161b9190614ca0565b60148190555050505050565b600061163283611d0e565b821061166a576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16905060008060005b83811015611822576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156117815750611815565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146117c157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611813578684141561180a578195505050505050611828565b83806001019450505b505b80806001019150506116a4565b50600080fd5b92915050565b60105481565b600a5481565b60176020528060005260406000206000915090505481565b61185a612e15565b73ffffffffffffffffffffffffffffffffffffffff1661187861205b565b73ffffffffffffffffffffffffffffffffffffffff16146118ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c590614adb565b60405180910390fd5b60006118d861205b565b73ffffffffffffffffffffffffffffffffffffffff16476040516118fb90614927565b60006040518083038185875af1925050503d8060008114611938576040519150601f19603f3d011682016040523d82523d6000602084013e61193d565b606091505b505090508061194b57600080fd5b50565b6119698383836040518060200160405280600081525061273c565b505050565b600d5481565b60008060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000805b82811015611aad576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611a9f5785831415611a965781945050505050611ae0565b82806001019350505b5080806001019150506119ac565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600b60009054906101000a900460ff1681565b611b00612e15565b73ffffffffffffffffffffffffffffffffffffffff16611b1e61205b565b73ffffffffffffffffffffffffffffffffffffffff1614611b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6b90614adb565b60405180910390fd5b8060089080519060200190611b8a929190613f5e565b5050565b611b96612e15565b73ffffffffffffffffffffffffffffffffffffffff16611bb461205b565b73ffffffffffffffffffffffffffffffffffffffff1614611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190614adb565b60405180910390fd5b60001515600b60009054906101000a900460ff1615151415611c46576001600b60006101000a81548160ff021916908315150217905550611c62565b6000600b60006101000a81548160ff0219169083151502179055505b565b6000611c6f8261352a565b600001519050919050565b60088054611c8790614e75565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb390614e75565b8015611d005780601f10611cd557610100808354040283529160200191611d00565b820191906000526020600020905b815481529060010190602001808311611ce357829003601f168201915b505050505081565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d76576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611de6612e15565b73ffffffffffffffffffffffffffffffffffffffff16611e0461205b565b73ffffffffffffffffffffffffffffffffffffffff1614611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5190614adb565b60405180910390fd5b611e6460006137d2565b565b611e6e612e15565b73ffffffffffffffffffffffffffffffffffffffff16611e8c61205b565b73ffffffffffffffffffffffffffffffffffffffff1614611ee2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed990614adb565b60405180910390fd5b60011515601a60019054906101000a900460ff1615151415611f1e576000601a60016101000a81548160ff021916908315150217905550611f3a565b6001601a60016101000a81548160ff0219169083151502179055505b565b601a60019054906101000a900460ff1681565b611f57612e15565b73ffffffffffffffffffffffffffffffffffffffff16611f7561205b565b73ffffffffffffffffffffffffffffffffffffffff1614611fcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc290614adb565b60405180910390fd5b8060198190555050565b611fdd612e15565b73ffffffffffffffffffffffffffffffffffffffff16611ffb61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204890614adb565b60405180910390fd5b8060108190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61208d612e15565b73ffffffffffffffffffffffffffffffffffffffff166120ab61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f890614adb565b60405180910390fd5b80600d8190555050565b60606002805461211a90614e75565b80601f016020809104026020016040519081016040528092919081815260200182805461214690614e75565b80156121935780601f1061216857610100808354040283529160200191612193565b820191906000526020600020905b81548152906001019060200180831161217657829003601f168201915b5050505050905090565b600a54816121a961116a565b6121b39190614ca0565b11156121f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121eb90614a7b565b60405180910390fd5b6121fc61205b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251557426019541115612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90614a9b565b60405180910390fd5b601a60019054906101000a900460ff166122c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b990614a3b565b60405180910390fd5b600e5481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123109190614ca0565b1115612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890614afb565b60405180910390fd5b601254816015546123629190614ca0565b11156123a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239a90614b7b565b60405180910390fd5b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156124405780600d546123f99190614d27565b34101561243b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243290614b3b565b60405180910390fd5b612514565b60115460135410156124c2576001816124599190614d81565b600d546124669190614d27565b3410156124a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249f90614b3b565b60405180910390fd5b60016013546124b79190614ca0565b601381905550612513565b80600d546124d09190614d27565b341015612512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250990614b3b565b60405180910390fd5b5b5b5b61251f338261350c565b80601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461256a9190614ca0565b601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806015546125bb9190614ca0565b60158190555050565b6125cc612e15565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612631576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806006600061263e612e15565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166126eb612e15565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161273091906149a3565b60405180910390a35050565b612747848484612f37565b61275384848484613898565b612789576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061279a82612e1d565b6127d0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600b60009054906101000a900460ff161515141561287e57600980546127f990614e75565b80601f016020809104026020016040519081016040528092919081815260200182805461282590614e75565b80156128725780601f1061284757610100808354040283529160200191612872565b820191906000526020600020905b81548152906001019060200180831161285557829003601f168201915b505050505090506128d9565b60006008805461288d90614e75565b905014156128aa57604051806020016040528060008152506128d6565b60086128b583613a26565b6040516020016128c69291906148f8565b6040516020818303038152906040525b90505b919050565b6128e6612e15565b73ffffffffffffffffffffffffffffffffffffffff1661290461205b565b73ffffffffffffffffffffffffffffffffffffffff161461295a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295190614adb565b60405180910390fd5b60011515601a60009054906101000a900460ff1615151415612996576000601a60006101000a81548160ff0219169083151502179055506129b2565b6001601a60006101000a81548160ff0219169083151502179055505b565b601a60009054906101000a900460ff1681565b6129cf612e15565b73ffffffffffffffffffffffffffffffffffffffff166129ed61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3a90614adb565b60405180910390fd5b80600c8190555050565b612a55612e15565b73ffffffffffffffffffffffffffffffffffffffff16612a7361205b565b73ffffffffffffffffffffffffffffffffffffffff1614612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac090614adb565b60405180910390fd5b8060118190555050565b60135481565b600c5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60165481565b60186020528060005260406000206000915090505481565b60145481565b612b9f612e15565b73ffffffffffffffffffffffffffffffffffffffff16612bbd61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0a90614adb565b60405180910390fd5b8060099080519060200190612c29929190613f5e565b5050565b612c35612e15565b73ffffffffffffffffffffffffffffffffffffffff16612c5361205b565b73ffffffffffffffffffffffffffffffffffffffff1614612ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca090614adb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d10906149fb565b60405180910390fd5b612d22816137d2565b50565b612d2d612e15565b73ffffffffffffffffffffffffffffffffffffffff16612d4b61205b565b73ffffffffffffffffffffffffffffffffffffffff1614612da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9890614adb565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682108015612e7e575060036000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612f428261352a565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612f69612e15565b73ffffffffffffffffffffffffffffffffffffffff161480612f9c5750612f9b8260000151612f96612e15565b612adf565b5b80612fe15750612faa612e15565b73ffffffffffffffffffffffffffffffffffffffff16612fc984610f43565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061301a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614613083576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130ea576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130f78585856001613b87565b6131076000848460000151612e85565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156133e45760008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168110156133e35782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461344d8585856001613b8d565b5050505050565b60008083905060005b868690508110156134fd57600087878381811061347d5761347c61500d565b5b9050602002013590508083116134bd5782816040516020016134a09291906148cc565b6040516020818303038152906040528051906020012092506134e9565b80836040516020016134d09291906148cc565b6040516020818303038152906040528051906020012092505b5080806134f590614ed8565b91505061345d565b50828114915050949350505050565b613526828260405180602001604052806000815250613b93565b5050565b613532613fe4565b600082905060008054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681101561379b576000600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161379957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461367d5780925050506137cd565b5b60011561379857818060019003925050600360008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146137935780925050506137cd565b61367e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006138b98473ffffffffffffffffffffffffffffffffffffffff16613ba5565b15613a19578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138e2612e15565b8786866040518563ffffffff1660e01b81526004016139049493929190614957565b602060405180830381600087803b15801561391e57600080fd5b505af192505050801561394f57506040513d601f19601f8201168201806040525081019061394c9190614475565b60015b6139c9573d806000811461397f576040519150601f19603f3d011682016040523d82523d6000602084013e613984565b606091505b506000815114156139c1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a1e565b600190505b949350505050565b60606000821415613a6e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613b82565b600082905060005b60008214613aa0578080613a8990614ed8565b915050600a82613a999190614cf6565b9150613a76565b60008167ffffffffffffffff811115613abc57613abb61503c565b5b6040519080825280601f01601f191660200182016040528015613aee5781602001600182028036833780820191505090505b5090505b60008514613b7b57600182613b079190614d81565b9150600a85613b169190614f4f565b6030613b229190614ca0565b60f81b818381518110613b3857613b3761500d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613b749190614cf6565b9450613af2565b8093505050505b919050565b50505050565b50505050565b613ba08383836001613bc8565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613c63576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613c9e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cab6000868387613b87565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613f1057818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015613ec45750613ec26000888488613898565b155b15613efb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613e49565b50806000806101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050613f576000868387613b8d565b5050505050565b828054613f6a90614e75565b90600052602060002090601f016020900481019282613f8c5760008555613fd3565b82601f10613fa557805160ff1916838001178555613fd3565b82800160010185558215613fd3579182015b82811115613fd2578251825591602001919060010190613fb7565b5b509050613fe09190614027565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115614040576000816000905550600101614028565b5090565b600061405761405284614bdb565b614bb6565b9050828152602081018484840111156140735761407261507a565b5b61407e848285614e33565b509392505050565b600061409961409484614c0c565b614bb6565b9050828152602081018484840111156140b5576140b461507a565b5b6140c0848285614e33565b509392505050565b6000813590506140d78161530e565b92915050565b60008083601f8401126140f3576140f2615070565b5b8235905067ffffffffffffffff8111156141105761410f61506b565b5b60208301915083602082028301111561412c5761412b615075565b5b9250929050565b60008135905061414281615325565b92915050565b6000813590506141578161533c565b92915050565b60008135905061416c81615353565b92915050565b60008151905061418181615353565b92915050565b600082601f83011261419c5761419b615070565b5b81356141ac848260208601614044565b91505092915050565b600082601f8301126141ca576141c9615070565b5b81356141da848260208601614086565b91505092915050565b6000813590506141f28161536a565b92915050565b60006020828403121561420e5761420d615084565b5b600061421c848285016140c8565b91505092915050565b6000806040838503121561423c5761423b615084565b5b600061424a858286016140c8565b925050602061425b858286016140c8565b9150509250929050565b60008060006060848603121561427e5761427d615084565b5b600061428c868287016140c8565b935050602061429d868287016140c8565b92505060406142ae868287016141e3565b9150509250925092565b600080600080608085870312156142d2576142d1615084565b5b60006142e0878288016140c8565b94505060206142f1878288016140c8565b9350506040614302878288016141e3565b925050606085013567ffffffffffffffff8111156143235761432261507f565b5b61432f87828801614187565b91505092959194509250565b6000806040838503121561435257614351615084565b5b6000614360858286016140c8565b925050602061437185828601614133565b9150509250929050565b6000806040838503121561439257614391615084565b5b60006143a0858286016140c8565b92505060206143b1858286016141e3565b9150509250929050565b6000806000604084860312156143d4576143d3615084565b5b600084013567ffffffffffffffff8111156143f2576143f161507f565b5b6143fe868287016140dd565b93509350506020614411868287016141e3565b9150509250925092565b60006020828403121561443157614430615084565b5b600061443f84828501614148565b91505092915050565b60006020828403121561445e5761445d615084565b5b600061446c8482850161415d565b91505092915050565b60006020828403121561448b5761448a615084565b5b600061449984828501614172565b91505092915050565b6000602082840312156144b8576144b7615084565b5b600082013567ffffffffffffffff8111156144d6576144d561507f565b5b6144e2848285016141b5565b91505092915050565b60006020828403121561450157614500615084565b5b600061450f848285016141e3565b91505092915050565b61452181614db5565b82525050565b61453861453382614db5565b614f21565b82525050565b61454781614dc7565b82525050565b61455681614dd3565b82525050565b61456d61456882614dd3565b614f33565b82525050565b600061457e82614c52565b6145888185614c68565b9350614598818560208601614e42565b6145a181615089565b840191505092915050565b60006145b782614c5d565b6145c18185614c84565b93506145d1818560208601614e42565b6145da81615089565b840191505092915050565b60006145f082614c5d565b6145fa8185614c95565b935061460a818560208601614e42565b80840191505092915050565b6000815461462381614e75565b61462d8186614c95565b9450600182166000811461464857600181146146595761468c565b60ff1983168652818601935061468c565b61466285614c3d565b60005b8381101561468457815481890152600182019150602081019050614665565b838801955050505b50505092915050565b60006146a2602683614c84565b91506146ad826150a7565b604082019050919050565b60006146c5601883614c84565b91506146d0826150f6565b602082019050919050565b60006146e8601783614c84565b91506146f38261511f565b602082019050919050565b600061470b600c83614c84565b915061471682615148565b602082019050919050565b600061472e601683614c84565b915061473982615171565b602082019050919050565b6000614751601783614c84565b915061475c8261519a565b602082019050919050565b6000614774601a83614c84565b915061477f826151c3565b602082019050919050565b6000614797600583614c95565b91506147a2826151ec565b600582019050919050565b60006147ba602083614c84565b91506147c582615215565b602082019050919050565b60006147dd601983614c84565b91506147e88261523e565b602082019050919050565b6000614800600083614c79565b915061480b82615267565b600082019050919050565b6000614823601283614c84565b915061482e8261526a565b602082019050919050565b6000614846601583614c84565b915061485182615293565b602082019050919050565b6000614869600d83614c84565b9150614874826152bc565b602082019050919050565b600061488c601a83614c84565b9150614897826152e5565b602082019050919050565b6148ab81614e29565b82525050565b60006148bd8284614527565b60148201915081905092915050565b60006148d8828561455c565b6020820191506148e8828461455c565b6020820191508190509392505050565b60006149048285614616565b915061491082846145e5565b915061491b8261478a565b91508190509392505050565b6000614932826147f3565b9150819050919050565b60006020820190506149516000830184614518565b92915050565b600060808201905061496c6000830187614518565b6149796020830186614518565b61498660408301856148a2565b81810360608301526149988184614573565b905095945050505050565b60006020820190506149b8600083018461453e565b92915050565b60006020820190506149d3600083018461454d565b92915050565b600060208201905081810360008301526149f381846145ac565b905092915050565b60006020820190508181036000830152614a1481614695565b9050919050565b60006020820190508181036000830152614a34816146b8565b9050919050565b60006020820190508181036000830152614a54816146db565b9050919050565b60006020820190508181036000830152614a74816146fe565b9050919050565b60006020820190508181036000830152614a9481614721565b9050919050565b60006020820190508181036000830152614ab481614744565b9050919050565b60006020820190508181036000830152614ad481614767565b9050919050565b60006020820190508181036000830152614af4816147ad565b9050919050565b60006020820190508181036000830152614b14816147d0565b9050919050565b60006020820190508181036000830152614b3481614816565b9050919050565b60006020820190508181036000830152614b5481614839565b9050919050565b60006020820190508181036000830152614b748161485c565b9050919050565b60006020820190508181036000830152614b948161487f565b9050919050565b6000602082019050614bb060008301846148a2565b92915050565b6000614bc0614bd1565b9050614bcc8282614ea7565b919050565b6000604051905090565b600067ffffffffffffffff821115614bf657614bf561503c565b5b614bff82615089565b9050602081019050919050565b600067ffffffffffffffff821115614c2757614c2661503c565b5b614c3082615089565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cab82614e29565b9150614cb683614e29565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ceb57614cea614f80565b5b828201905092915050565b6000614d0182614e29565b9150614d0c83614e29565b925082614d1c57614d1b614faf565b5b828204905092915050565b6000614d3282614e29565b9150614d3d83614e29565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d7657614d75614f80565b5b828202905092915050565b6000614d8c82614e29565b9150614d9783614e29565b925082821015614daa57614da9614f80565b5b828203905092915050565b6000614dc082614e09565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e60578082015181840152602081019050614e45565b83811115614e6f576000848401525b50505050565b60006002820490506001821680614e8d57607f821691505b60208210811415614ea157614ea0614fde565b5b50919050565b614eb082615089565b810181811067ffffffffffffffff82111715614ecf57614ece61503c565b5b80604052505050565b6000614ee382614e29565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f1657614f15614f80565b5b600182019050919050565b6000614f2c82614f3d565b9050919050565b6000819050919050565b6000614f488261509a565b9050919050565b6000614f5a82614e29565b9150614f6583614e29565b925082614f7557614f74614faf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57686974656c697374204c696d69742045786365656465640000000000000000600082015250565b7f5075626c6963204d696e74204e6f7420416c6c6f776564000000000000000000600082015250565b7f4c696d6974204578636565640000000000000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f4d696e74696e67204e6f74205965742053746172746564000000000000000000600082015250565b7f57686974656c697374204d696e74204e6f7420416c6c6f776564000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5075626c6963204d696e74204c696d6974205265616368656400000000000000600082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b7f5075626c6963204d696e74204c696d6974204578636565646564000000000000600082015250565b61531781614db5565b811461532257600080fd5b50565b61532e81614dc7565b811461533957600080fd5b50565b61534581614dd3565b811461535057600080fd5b50565b61535c81614ddd565b811461536757600080fd5b50565b61537381614e29565b811461537e57600080fd5b5056fea26469706673582212204f8d48584284826b4ab7f90c2faf3a55d548547b15c5e505c420d4013580edd364736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d65425a63724b587838485956314c566971617362757244477551443969665a354a516f4c6358334e75624e672f000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmeBZcrKXx8HYV1LViqasburDGuQD9ifZ5JQoLcX3NubNg/
Arg [1] : _initNotRevealedUri (string):

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d65425a63724b587838485956314c566971617362757244
Arg [4] : 477551443969665a354a516f4c6358334e75624e672f00000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

135:6300:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6211:372:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5799:132:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8821:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;462:40:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10324:204:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;250:28:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;597:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9887:371:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;955:37:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;756:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3448:280:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6191:124:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;509:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11181:170:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4982:128:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2724:935;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5034:1105:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;554:36:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;287:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;834:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5123:151;;;:::i;:::-;;11422:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;410:43:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4021:713:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;329:27:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5544:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4189:179;;;;;;;;;;;;;:::i;:::-;;8630:124:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;220:21:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;639:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6647:206:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1712:103:11;;;;;;;;;;;;;:::i;:::-;;4510:220:4;;;;;;;;;;;;;:::i;:::-;;1043:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6323:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5939:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1061:87:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5416:120:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8990:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1296:1371:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10600:279:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11678:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3690:357:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4739:221;;;;;;;;;;;;;:::i;:::-;;1001:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5288:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6067;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;685:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;365:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10950:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;795:30:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;893:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;720:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4376:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1970:201:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5655:136:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6211:372:3;6313:4;6365:25;6350:40;;;:11;:40;;;;:105;;;;6422:33;6407:48;;;:11;:48;;;;6350:105;:172;;;;6487:35;6472:50;;;:11;:50;;;;6350:172;:225;;;;6539:36;6563:11;6539:23;:36::i;:::-;6350:225;6330:245;;6211:372;;;:::o;5799:132:4:-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5905:18:4::1;5885:17;:38;;;;5799:132:::0;:::o;8821:100:3:-;8875:13;8908:5;8901:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8821:100;:::o;462:40:4:-;;;;:::o;10324:204:3:-;10392:7;10417:16;10425:7;10417;:16::i;:::-;10412:64;;10442:34;;;;;;;;;;;;;;10412:64;10496:15;:24;10512:7;10496:24;;;;;;;;;;;;;;;;;;;;;10489:31;;10324:204;;;:::o;250:28:4:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;597:35::-;;;;:::o;9887:371:3:-;9960:13;9976:24;9992:7;9976:15;:24::i;:::-;9960:40;;10021:5;10015:11;;:2;:11;;;10011:48;;;10035:24;;;;;;;;;;;;;;10011:48;10092:5;10076:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;10102:37;10119:5;10126:12;:10;:12::i;:::-;10102:16;:37::i;:::-;10101:38;10076:63;10072:138;;;10163:35;;;;;;;;;;;;;;10072:138;10222:28;10231:2;10235:7;10244:5;10222:8;:28::i;:::-;9949:309;9887:371;;:::o;955:37:4:-;;;;:::o;756:30::-;;;;:::o;3448:280:3:-;3501:7;3693:12;;;;;;;;;;;3677:13;;;;;;;;;;:28;3670:35;;;;3448:280;:::o;6191:124:4:-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6291:16:4::1;6273:15;:34;;;;6191:124:::0;:::o;509:36::-;;;;:::o;11181:170:3:-;11315:28;11325:4;11331:2;11335:7;11315:9;:28::i;:::-;11181:170;;;:::o;4982:128:4:-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5084:18:4::1;5066:15;:36;;;;4982:128:::0;:::o;2724:935::-;2841:15;2828:9;;:28;;2820:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;2905:16;;;;;;;;;;;2897:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3001:10;;2989:8;2973:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;2965:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3103:17;;3091:8;3059:17;:29;3077:10;3059:29;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:61;;3051:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;3185:8;3169:13;;:24;;;;:::i;:::-;3156:9;:37;;3148:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3264:14;;3252:8;3235:14;;:25;;;;:::i;:::-;:43;;3227:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;3320:12;3362:10;3345:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;3335:39;;;;;;3320:54;;3393:47;3412:6;;3419:4;3424:15;;3393:18;:47::i;:::-;3385:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;3474:31;3484:10;3496:8;3474:9;:31::i;:::-;3581:8;3549:17;:29;3567:10;3549:29;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;3516:17;:29;3534:10;3516:29;;;;;;;;;;;;;;;:73;;;;3637:8;3620:14;;:25;;;;:::i;:::-;3603:14;:42;;;;2807:852;2724:935;;;:::o;5034:1105:3:-;5123:7;5156:16;5166:5;5156:9;:16::i;:::-;5147:5;:25;5143:61;;5181:23;;;;;;;;;;;;;;5143:61;5215:22;5240:13;;;;;;;;;;;5215:38;;;;5264:19;5294:25;5495:9;5490:557;5510:14;5506:1;:18;5490:557;;;5550:31;5584:11;:14;5596:1;5584:14;;;;;;;;;;;5550:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5621:9;:16;;;5617:73;;;5662:8;;;5617:73;5738:1;5712:28;;:9;:14;;;:28;;;5708:111;;5785:9;:14;;;5765:34;;5708:111;5862:5;5841:26;;:17;:26;;;5837:195;;;5911:5;5896:11;:20;5892:85;;;5952:1;5945:8;;;;;;;;;5892:85;5999:13;;;;;;;5837:195;5531:516;5490:557;5526:3;;;;;;;5490:557;;;;6123:8;;;5034:1105;;;;;:::o;554:36:4:-;;;;:::o;287:33::-;;;;:::o;834:52::-;;;;;;;;;;;;;;;;;:::o;5123:151::-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5176:9:4::1;5199:7;:5;:7::i;:::-;5191:21;;5220;5191:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5175:71;;;5261:4;5253:13;;;::::0;::::1;;5168:106;5123:151::o:0;11422:185:3:-;11560:39;11577:4;11583:2;11587:7;11560:39;;;;;;;;;;;;:16;:39::i;:::-;11422:185;;;:::o;410:43:4:-;;;;:::o;4021:713:3:-;4088:7;4108:22;4133:13;;;;;;;;;;4108:38;;;;4157:19;4352:9;4347:328;4367:14;4363:1;:18;4347:328;;;4407:31;4441:11;:14;4453:1;4441:14;;;;;;;;;;;4407:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4479:9;:16;;;4474:186;;4539:5;4524:11;:20;4520:85;;;4580:1;4573:8;;;;;;;;4520:85;4627:13;;;;;;;4474:186;4388:287;4383:3;;;;;;;4347:328;;;;4703:23;;;;;;;;;;;;;;4021:713;;;;:::o;329:27:4:-;;;;;;;;;;;;;:::o;5544:103::-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5629:11:4::1;5619:7;:21;;;;;;;;;;;;:::i;:::-;;5544:103:::0;:::o;4189:179::-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4266:5:4::1;4254:17;;:8;;;;;;;;;;;:17;;;4251:110;;;4298:4;4287:8;;:15;;;;;;;;;;;;;;;;;;4251:110;;;4344:5;4333:8;;:16;;;;;;;;;;;;;;;;;;4251:110;4189:179::o:0;8630:124:3:-;8694:7;8721:20;8733:7;8721:11;:20::i;:::-;:25;;;8714:32;;8630:124;;;:::o;220:21:4:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;639:37::-;;;;:::o;6647:206:3:-;6711:7;6752:1;6735:19;;:5;:19;;;6731:60;;;6763:28;;;;;;;;;;;;;;6731:60;6817:12;:19;6830:5;6817:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;6809:36;;6802:43;;6647:206;;;:::o;1712:103:11:-;1292:12;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1777:30:::1;1804:1;1777:18;:30::i;:::-;1712:103::o:0;4510:220:4:-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4595:4:4::1;4573:26;;:18;;;;;;;;;;;:26;;;4570:151;;;4638:5;4617:18;;:26;;;;;;;;;;;;;;;;;;4570:151;;;4697:4;4676:18;;:25;;;;;;;;;;;;;;;;;;4570:151;4510:220::o:0;1043:37::-;;;;;;;;;;;;;:::o;6323:100::-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6405:10:4::1;6393:9;:22;;;;6323:100:::0;:::o;5939:120::-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6036:15:4::1;6019:14;:32;;;;5939:120:::0;:::o;1061:87:11:-;1107:7;1134:6;;;;;;;;;;;1127:13;;1061:87;:::o;5416:120:4:-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5513:15:4::1;5496:14;:32;;;;5416:120:::0;:::o;8990:104:3:-;9046:13;9079:7;9072:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8990:104;:::o;1296:1371:4:-;1393:10;;1381:8;1365:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;1357:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1461:7;:5;:7::i;:::-;1447:21;;:10;:21;;;1443:1013;;1514:15;1501:9;;:28;;1493:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1580:18;;;;;;;;;;;1572:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;1694:18;;1682:8;1649:18;:30;1668:10;1649:30;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;:63;;1641:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;1795:15;;1783:8;1765:15;;:26;;;;:::i;:::-;:45;;1757:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;1898:1;1865:18;:30;1884:10;1865:30;;;;;;;;;;;;;;;;:34;1862:556;;;1982:8;1965:14;;:25;;;;:::i;:::-;1951:9;:40;;1943:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1862:556;;;2069:13;;2053;;:29;2050:368;;;2175:1;2166:8;:10;;;;:::i;:::-;2148:14;;:29;;;;:::i;:::-;2134:9;:44;;2126:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2260:1;2244:13;;:17;;;;:::i;:::-;2228:13;:33;;;;2050:368;;;2354:8;2337:14;;:25;;;;:::i;:::-;2323:9;:40;;2315:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2050:368;1862:556;1443:1013;2472:31;2482:10;2494:8;2472:9;:31::i;:::-;2585:8;2552:18;:30;2571:10;2552:30;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;2518:18;:30;2537:10;2518:30;;;;;;;;;;;;;;;:75;;;;2645:8;2627:15;;:26;;;;:::i;:::-;2608:15;:45;;;;1296:1371;:::o;10600:279:3:-;10703:12;:10;:12::i;:::-;10691:24;;:8;:24;;;10687:54;;;10724:17;;;;;;;;;;;;;;10687:54;10799:8;10754:18;:32;10773:12;:10;:12::i;:::-;10754:32;;;;;;;;;;;;;;;:42;10787:8;10754:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10852:8;10823:48;;10838:12;:10;:12::i;:::-;10823:48;;;10862:8;10823:48;;;;;;:::i;:::-;;;;;;;;10600:279;;:::o;11678:342::-;11845:28;11855:4;11861:2;11865:7;11845:9;:28::i;:::-;11889:48;11912:4;11918:2;11922:7;11931:5;11889:22;:48::i;:::-;11884:129;;11961:40;;;;;;;;;;;;;;11884:129;11678:342;;;;:::o;3690:357:4:-;3763:13;3794:16;3802:7;3794;:16::i;:::-;3789:59;;3819:29;;;;;;;;;;;;;;3789:59;3876:5;3864:17;;:8;;;;;;;;;;;:17;;;3861:66;;;3901:14;3894:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3861:66;3969:1;3950:7;3944:21;;;;;:::i;:::-;;;:26;;:95;;;;;;;;;;;;;;;;;3997:7;4006:18;:7;:16;:18::i;:::-;3980:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3944:95;3937:102;;3690:357;;;;:::o;4739:221::-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4821:4:4::1;4801:24;;:16;;;;;;;;;;;:24;;;4798:153;;;4862:5;4843:16;;:24;;;;;;;;;;;;;;;;;;4798:153;;;4932:4;4913:16;;:23;;;;;;;;;;;;;;;;;;4798:153;4739:221::o:0;1001:35::-;;;;;;;;;;;;;:::o;5288:116::-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5382:14:4::1;5366:13;:30;;;;5288:116:::0;:::o;6067:::-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6161:14:4::1;6145:13;:30;;;;6067:116:::0;:::o;685:28::-;;;;:::o;365:38::-;;;;:::o;10950:164:3:-;11047:4;11071:18;:25;11090:5;11071:25;;;;;;;;;;;;;;;:35;11097:8;11071:35;;;;;;;;;;;;;;;;;;;;;;;;;11064:42;;10950:164;;;;:::o;795:30:4:-;;;;:::o;893:53::-;;;;;;;;;;;;;;;;;:::o;720:29::-;;;;:::o;4376:126::-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4479:15:4::1;4462:14;:32;;;;;;;;;;;;:::i;:::-;;4376:126:::0;:::o;1970:201:11:-;1292:12;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2079:1:::1;2059:22;;:8;:22;;;;2051:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2135:28;2154:8;2135:18;:28::i;:::-;1970:201:::0;:::o;5655:136:4:-;1292:12:11;:10;:12::i;:::-;1281:23;;:7;:5;:7::i;:::-;:23;;;1273:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5764:19:4::1;5743:18;:40;;;;5655:136:::0;:::o;852:157:2:-;937:4;976:25;961:40;;;:11;:40;;;;954:47;;852:157;;;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;12275:144:3:-;12332:4;12366:13;;;;;;;;;;;12356:23;;:7;:23;:55;;;;;12384:11;:20;12396:7;12384:20;;;;;;;;;;;:27;;;;;;;;;;;;12383:28;12356:55;12349:62;;12275:144;;;:::o;19491:196::-;19633:2;19606:15;:24;19622:7;19606:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19671:7;19667:2;19651:28;;19660:5;19651:28;;;;;;;;;;;;19491:196;;;:::o;14992:2112::-;15107:35;15145:20;15157:7;15145:11;:20::i;:::-;15107:58;;15178:22;15220:13;:18;;;15204:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;15255:50;15272:13;:18;;;15292:12;:10;:12::i;:::-;15255:16;:50::i;:::-;15204:101;:154;;;;15346:12;:10;:12::i;:::-;15322:36;;:20;15334:7;15322:11;:20::i;:::-;:36;;;15204:154;15178:181;;15377:17;15372:66;;15403:35;;;;;;;;;;;;;;15372:66;15475:4;15453:26;;:13;:18;;;:26;;;15449:67;;15488:28;;;;;;;;;;;;;;15449:67;15545:1;15531:16;;:2;:16;;;15527:52;;;15556:23;;;;;;;;;;;;;;15527:52;15592:43;15614:4;15620:2;15624:7;15633:1;15592:21;:43::i;:::-;15700:49;15717:1;15721:7;15730:13;:18;;;15700:8;:49::i;:::-;16075:1;16045:12;:18;16058:4;16045:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16119:1;16091:12;:16;16104:2;16091:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16165:2;16137:11;:20;16149:7;16137:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;16227:15;16182:11;:20;16194:7;16182:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;16495:19;16527:1;16517:7;:11;16495:33;;16588:1;16547:43;;:11;:24;16559:11;16547:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;16543:445;;;16772:13;;;;;;;;;;16758:27;;:11;:27;16754:219;;;16842:13;:18;;;16810:11;:24;16822:11;16810:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;16925:13;:28;;;16883:11;:24;16895:11;16883:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;16754:219;16543:445;16020:979;17035:7;17031:2;17016:27;;17025:4;17016:27;;;;;;;;;;;;17054:42;17075:4;17081:2;17085:7;17094:1;17054:20;:42::i;:::-;15096:2008;;14992:2112;;;:::o;668:798:10:-;761:4;778:20;801:4;778:27;;823:9;818:525;842:5;;:12;;838:1;:16;818:525;;;876:20;899:5;;905:1;899:8;;;;;;;:::i;:::-;;;;;;;;876:31;;944:12;928;:28;924:408;;1098:12;1112;1081:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1071:55;;;;;;1056:70;;924:408;;;1288:12;1302;1271:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1261:55;;;;;;1246:70;;924:408;861:482;856:3;;;;;:::i;:::-;;;;818:525;;;;1454:4;1438:12;:20;1431:27;;;668:798;;;;;;:::o;12427:104:3:-;12496:27;12506:2;12510:8;12496:27;;;;;;;;;;;;:9;:27::i;:::-;12427:104;;:::o;7485:1083::-;7546:21;;:::i;:::-;7580:12;7595:7;7580:22;;7651:13;;;;;;;;;;7644:20;;:4;:20;7640:861;;;7685:31;7719:11;:17;7731:4;7719:17;;;;;;;;;;;7685:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7760:9;:16;;;7755:731;;7831:1;7805:28;;:9;:14;;;:28;;;7801:101;;7869:9;7862:16;;;;;;7801:101;8206:261;8213:4;8206:261;;;8246:6;;;;;;;;8291:11;:17;8303:4;8291:17;;;;;;;;;;;8279:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8365:1;8339:28;;:9;:14;;;:28;;;8335:109;;8407:9;8400:16;;;;;;8335:109;8206:261;;;7755:731;7666:835;7640:861;8529:31;;;;;;;;;;;;;;7485:1083;;;;:::o;2331:191:11:-;2405:16;2424:6;;;;;;;;;;;2405:25;;2450:8;2441:6;;:17;;;;;;;;;;;;;;;;;;2505:8;2474:40;;2495:8;2474:40;;;;;;;;;;;;2394:128;2331:191;:::o;20252:790:3:-;20407:4;20428:15;:2;:13;;;:15::i;:::-;20424:611;;;20480:2;20464:36;;;20501:12;:10;:12::i;:::-;20515:4;20521:7;20530:5;20464:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20460:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20727:1;20710:6;:13;:18;20706:259;;;20760:40;;;;;;;;;;;;;;20706:259;20915:6;20909:13;20900:6;20896:2;20892:15;20885:38;20460:520;20597:45;;;20587:55;;;:6;:55;;;;20580:62;;;;;20424:611;21019:4;21012:11;;20252:790;;;;;;;:::o;342:723:12:-;398:13;628:1;619:5;:10;615:53;;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;21690:159:3:-;;;;;:::o;22508:158::-;;;;;:::o;12894:163::-;13017:32;13023:2;13027:8;13037:5;13044:4;13017:5;:32::i;:::-;12894:163;;;:::o;1210:326:0:-;1270:4;1527:1;1505:7;:19;;;:23;1498:30;;1210:326;;;:::o;13316:1422:3:-;13455:20;13478:13;;;;;;;;;;;13455:36;;;;13520:1;13506:16;;:2;:16;;;13502:48;;;13531:19;;;;;;;;;;;;;;13502:48;13577:1;13565:8;:13;13561:44;;;13587:18;;;;;;;;;;;;;;13561:44;13618:61;13648:1;13652:2;13656:12;13670:8;13618:21;:61::i;:::-;13992:8;13957:12;:16;13970:2;13957:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14056:8;14016:12;:16;14029:2;14016:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14115:2;14082:11;:25;14094:12;14082:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;14182:15;14132:11;:25;14144:12;14132:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;14215:20;14238:12;14215:35;;14272:9;14267:328;14287:8;14283:1;:12;14267:328;;;14351:12;14347:2;14326:38;;14343:1;14326:38;;;;;;;;;;;;14387:4;:68;;;;;14396:59;14427:1;14431:2;14435:12;14449:5;14396:22;:59::i;:::-;14395:60;14387:68;14383:164;;;14487:40;;;;;;;;;;;;;;14383:164;14565:14;;;;;;;14297:3;;;;;;;14267:328;;;;14635:12;14611:13;;:37;;;;;;;;;;;;;;;;;;13932:728;14670:60;14699:1;14703:2;14707:12;14721:8;14670:20;:60::i;:::-;13444:1294;13316:1422;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:13:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:704::-;6451:6;6459;6467;6516:2;6504:9;6495:7;6491:23;6487:32;6484:119;;;6522:79;;:::i;:::-;6484:119;6670:1;6659:9;6655:17;6642:31;6700:18;6692:6;6689:30;6686:117;;;6722:79;;:::i;:::-;6686:117;6835:80;6907:7;6898:6;6887:9;6883:22;6835:80;:::i;:::-;6817:98;;;;6613:312;6964:2;6990:53;7035:7;7026:6;7015:9;7011:22;6990:53;:::i;:::-;6980:63;;6935:118;6356:704;;;;;:::o;7066:329::-;7125:6;7174:2;7162:9;7153:7;7149:23;7145:32;7142:119;;;7180:79;;:::i;:::-;7142:119;7300:1;7325:53;7370:7;7361:6;7350:9;7346:22;7325:53;:::i;:::-;7315:63;;7271:117;7066:329;;;;:::o;7401:327::-;7459:6;7508:2;7496:9;7487:7;7483:23;7479:32;7476:119;;;7514:79;;:::i;:::-;7476:119;7634:1;7659:52;7703:7;7694:6;7683:9;7679:22;7659:52;:::i;:::-;7649:62;;7605:116;7401:327;;;;:::o;7734:349::-;7803:6;7852:2;7840:9;7831:7;7827:23;7823:32;7820:119;;;7858:79;;:::i;:::-;7820:119;7978:1;8003:63;8058:7;8049:6;8038:9;8034:22;8003:63;:::i;:::-;7993:73;;7949:127;7734:349;;;;:::o;8089:509::-;8158:6;8207:2;8195:9;8186:7;8182:23;8178:32;8175:119;;;8213:79;;:::i;:::-;8175:119;8361:1;8350:9;8346:17;8333:31;8391:18;8383:6;8380:30;8377:117;;;8413:79;;:::i;:::-;8377:117;8518:63;8573:7;8564:6;8553:9;8549:22;8518:63;:::i;:::-;8508:73;;8304:287;8089:509;;;;:::o;8604:329::-;8663:6;8712:2;8700:9;8691:7;8687:23;8683:32;8680:119;;;8718:79;;:::i;:::-;8680:119;8838:1;8863:53;8908:7;8899:6;8888:9;8884:22;8863:53;:::i;:::-;8853:63;;8809:117;8604:329;;;;:::o;8939:118::-;9026:24;9044:5;9026:24;:::i;:::-;9021:3;9014:37;8939:118;;:::o;9063:157::-;9168:45;9188:24;9206:5;9188:24;:::i;:::-;9168:45;:::i;:::-;9163:3;9156:58;9063:157;;:::o;9226:109::-;9307:21;9322:5;9307:21;:::i;:::-;9302:3;9295:34;9226:109;;:::o;9341:118::-;9428:24;9446:5;9428:24;:::i;:::-;9423:3;9416:37;9341:118;;:::o;9465:157::-;9570:45;9590:24;9608:5;9590:24;:::i;:::-;9570:45;:::i;:::-;9565:3;9558:58;9465:157;;:::o;9628:360::-;9714:3;9742:38;9774:5;9742:38;:::i;:::-;9796:70;9859:6;9854:3;9796:70;:::i;:::-;9789:77;;9875:52;9920:6;9915:3;9908:4;9901:5;9897:16;9875:52;:::i;:::-;9952:29;9974:6;9952:29;:::i;:::-;9947:3;9943:39;9936:46;;9718:270;9628:360;;;;:::o;9994:364::-;10082:3;10110:39;10143:5;10110:39;:::i;:::-;10165:71;10229:6;10224:3;10165:71;:::i;:::-;10158:78;;10245:52;10290:6;10285:3;10278:4;10271:5;10267:16;10245:52;:::i;:::-;10322:29;10344:6;10322:29;:::i;:::-;10317:3;10313:39;10306:46;;10086:272;9994:364;;;;:::o;10364:377::-;10470:3;10498:39;10531:5;10498:39;:::i;:::-;10553:89;10635:6;10630:3;10553:89;:::i;:::-;10546:96;;10651:52;10696:6;10691:3;10684:4;10677:5;10673:16;10651:52;:::i;:::-;10728:6;10723:3;10719:16;10712:23;;10474:267;10364:377;;;;:::o;10771:845::-;10874:3;10911:5;10905:12;10940:36;10966:9;10940:36;:::i;:::-;10992:89;11074:6;11069:3;10992:89;:::i;:::-;10985:96;;11112:1;11101:9;11097:17;11128:1;11123:137;;;;11274:1;11269:341;;;;11090:520;;11123:137;11207:4;11203:9;11192;11188:25;11183:3;11176:38;11243:6;11238:3;11234:16;11227:23;;11123:137;;11269:341;11336:38;11368:5;11336:38;:::i;:::-;11396:1;11410:154;11424:6;11421:1;11418:13;11410:154;;;11498:7;11492:14;11488:1;11483:3;11479:11;11472:35;11548:1;11539:7;11535:15;11524:26;;11446:4;11443:1;11439:12;11434:17;;11410:154;;;11593:6;11588:3;11584:16;11577:23;;11276:334;;11090:520;;10878:738;;10771:845;;;;:::o;11622:366::-;11764:3;11785:67;11849:2;11844:3;11785:67;:::i;:::-;11778:74;;11861:93;11950:3;11861:93;:::i;:::-;11979:2;11974:3;11970:12;11963:19;;11622:366;;;:::o;11994:::-;12136:3;12157:67;12221:2;12216:3;12157:67;:::i;:::-;12150:74;;12233:93;12322:3;12233:93;:::i;:::-;12351:2;12346:3;12342:12;12335:19;;11994:366;;;:::o;12366:::-;12508:3;12529:67;12593:2;12588:3;12529:67;:::i;:::-;12522:74;;12605:93;12694:3;12605:93;:::i;:::-;12723:2;12718:3;12714:12;12707:19;;12366:366;;;:::o;12738:::-;12880:3;12901:67;12965:2;12960:3;12901:67;:::i;:::-;12894:74;;12977:93;13066:3;12977:93;:::i;:::-;13095:2;13090:3;13086:12;13079:19;;12738:366;;;:::o;13110:::-;13252:3;13273:67;13337:2;13332:3;13273:67;:::i;:::-;13266:74;;13349:93;13438:3;13349:93;:::i;:::-;13467:2;13462:3;13458:12;13451:19;;13110:366;;;:::o;13482:::-;13624:3;13645:67;13709:2;13704:3;13645:67;:::i;:::-;13638:74;;13721:93;13810:3;13721:93;:::i;:::-;13839:2;13834:3;13830:12;13823:19;;13482:366;;;:::o;13854:::-;13996:3;14017:67;14081:2;14076:3;14017:67;:::i;:::-;14010:74;;14093:93;14182:3;14093:93;:::i;:::-;14211:2;14206:3;14202:12;14195:19;;13854:366;;;:::o;14226:400::-;14386:3;14407:84;14489:1;14484:3;14407:84;:::i;:::-;14400:91;;14500:93;14589:3;14500:93;:::i;:::-;14618:1;14613:3;14609:11;14602:18;;14226:400;;;:::o;14632:366::-;14774:3;14795:67;14859:2;14854:3;14795:67;:::i;:::-;14788:74;;14871:93;14960:3;14871:93;:::i;:::-;14989:2;14984:3;14980:12;14973:19;;14632:366;;;:::o;15004:::-;15146:3;15167:67;15231:2;15226:3;15167:67;:::i;:::-;15160:74;;15243:93;15332:3;15243:93;:::i;:::-;15361:2;15356:3;15352:12;15345:19;;15004:366;;;:::o;15376:398::-;15535:3;15556:83;15637:1;15632:3;15556:83;:::i;:::-;15549:90;;15648:93;15737:3;15648:93;:::i;:::-;15766:1;15761:3;15757:11;15750:18;;15376:398;;;:::o;15780:366::-;15922:3;15943:67;16007:2;16002:3;15943:67;:::i;:::-;15936:74;;16019:93;16108:3;16019:93;:::i;:::-;16137:2;16132:3;16128:12;16121:19;;15780:366;;;:::o;16152:::-;16294:3;16315:67;16379:2;16374:3;16315:67;:::i;:::-;16308:74;;16391:93;16480:3;16391:93;:::i;:::-;16509:2;16504:3;16500:12;16493:19;;16152:366;;;:::o;16524:::-;16666:3;16687:67;16751:2;16746:3;16687:67;:::i;:::-;16680:74;;16763:93;16852:3;16763:93;:::i;:::-;16881:2;16876:3;16872:12;16865:19;;16524:366;;;:::o;16896:::-;17038:3;17059:67;17123:2;17118:3;17059:67;:::i;:::-;17052:74;;17135:93;17224:3;17135:93;:::i;:::-;17253:2;17248:3;17244:12;17237:19;;16896:366;;;:::o;17268:118::-;17355:24;17373:5;17355:24;:::i;:::-;17350:3;17343:37;17268:118;;:::o;17392:256::-;17504:3;17519:75;17590:3;17581:6;17519:75;:::i;:::-;17619:2;17614:3;17610:12;17603:19;;17639:3;17632:10;;17392:256;;;;:::o;17654:397::-;17794:3;17809:75;17880:3;17871:6;17809:75;:::i;:::-;17909:2;17904:3;17900:12;17893:19;;17922:75;17993:3;17984:6;17922:75;:::i;:::-;18022:2;18017:3;18013:12;18006:19;;18042:3;18035:10;;17654:397;;;;;:::o;18057:695::-;18335:3;18357:92;18445:3;18436:6;18357:92;:::i;:::-;18350:99;;18466:95;18557:3;18548:6;18466:95;:::i;:::-;18459:102;;18578:148;18722:3;18578:148;:::i;:::-;18571:155;;18743:3;18736:10;;18057:695;;;;;:::o;18758:379::-;18942:3;18964:147;19107:3;18964:147;:::i;:::-;18957:154;;19128:3;19121:10;;18758:379;;;:::o;19143:222::-;19236:4;19274:2;19263:9;19259:18;19251:26;;19287:71;19355:1;19344:9;19340:17;19331:6;19287:71;:::i;:::-;19143:222;;;;:::o;19371:640::-;19566:4;19604:3;19593:9;19589:19;19581:27;;19618:71;19686:1;19675:9;19671:17;19662:6;19618:71;:::i;:::-;19699:72;19767:2;19756:9;19752:18;19743:6;19699:72;:::i;:::-;19781;19849:2;19838:9;19834:18;19825:6;19781:72;:::i;:::-;19900:9;19894:4;19890:20;19885:2;19874:9;19870:18;19863:48;19928:76;19999:4;19990:6;19928:76;:::i;:::-;19920:84;;19371:640;;;;;;;:::o;20017:210::-;20104:4;20142:2;20131:9;20127:18;20119:26;;20155:65;20217:1;20206:9;20202:17;20193:6;20155:65;:::i;:::-;20017:210;;;;:::o;20233:222::-;20326:4;20364:2;20353:9;20349:18;20341:26;;20377:71;20445:1;20434:9;20430:17;20421:6;20377:71;:::i;:::-;20233:222;;;;:::o;20461:313::-;20574:4;20612:2;20601:9;20597:18;20589:26;;20661:9;20655:4;20651:20;20647:1;20636:9;20632:17;20625:47;20689:78;20762:4;20753:6;20689:78;:::i;:::-;20681:86;;20461:313;;;;:::o;20780:419::-;20946:4;20984:2;20973:9;20969:18;20961:26;;21033:9;21027:4;21023:20;21019:1;21008:9;21004:17;20997:47;21061:131;21187:4;21061:131;:::i;:::-;21053:139;;20780:419;;;:::o;21205:::-;21371:4;21409:2;21398:9;21394:18;21386:26;;21458:9;21452:4;21448:20;21444:1;21433:9;21429:17;21422:47;21486:131;21612:4;21486:131;:::i;:::-;21478:139;;21205:419;;;:::o;21630:::-;21796:4;21834:2;21823:9;21819:18;21811:26;;21883:9;21877:4;21873:20;21869:1;21858:9;21854:17;21847:47;21911:131;22037:4;21911:131;:::i;:::-;21903:139;;21630:419;;;:::o;22055:::-;22221:4;22259:2;22248:9;22244:18;22236:26;;22308:9;22302:4;22298:20;22294:1;22283:9;22279:17;22272:47;22336:131;22462:4;22336:131;:::i;:::-;22328:139;;22055:419;;;:::o;22480:::-;22646:4;22684:2;22673:9;22669:18;22661:26;;22733:9;22727:4;22723:20;22719:1;22708:9;22704:17;22697:47;22761:131;22887:4;22761:131;:::i;:::-;22753:139;;22480:419;;;:::o;22905:::-;23071:4;23109:2;23098:9;23094:18;23086:26;;23158:9;23152:4;23148:20;23144:1;23133:9;23129:17;23122:47;23186:131;23312:4;23186:131;:::i;:::-;23178:139;;22905:419;;;:::o;23330:::-;23496:4;23534:2;23523:9;23519:18;23511:26;;23583:9;23577:4;23573:20;23569:1;23558:9;23554:17;23547:47;23611:131;23737:4;23611:131;:::i;:::-;23603:139;;23330:419;;;:::o;23755:::-;23921:4;23959:2;23948:9;23944:18;23936:26;;24008:9;24002:4;23998:20;23994:1;23983:9;23979:17;23972:47;24036:131;24162:4;24036:131;:::i;:::-;24028:139;;23755:419;;;:::o;24180:::-;24346:4;24384:2;24373:9;24369:18;24361:26;;24433:9;24427:4;24423:20;24419:1;24408:9;24404:17;24397:47;24461:131;24587:4;24461:131;:::i;:::-;24453:139;;24180:419;;;:::o;24605:::-;24771:4;24809:2;24798:9;24794:18;24786:26;;24858:9;24852:4;24848:20;24844:1;24833:9;24829:17;24822:47;24886:131;25012:4;24886:131;:::i;:::-;24878:139;;24605:419;;;:::o;25030:::-;25196:4;25234:2;25223:9;25219:18;25211:26;;25283:9;25277:4;25273:20;25269:1;25258:9;25254:17;25247:47;25311:131;25437:4;25311:131;:::i;:::-;25303:139;;25030:419;;;:::o;25455:::-;25621:4;25659:2;25648:9;25644:18;25636:26;;25708:9;25702:4;25698:20;25694:1;25683:9;25679:17;25672:47;25736:131;25862:4;25736:131;:::i;:::-;25728:139;;25455:419;;;:::o;25880:::-;26046:4;26084:2;26073:9;26069:18;26061:26;;26133:9;26127:4;26123:20;26119:1;26108:9;26104:17;26097:47;26161:131;26287:4;26161:131;:::i;:::-;26153:139;;25880:419;;;:::o;26305:222::-;26398:4;26436:2;26425:9;26421:18;26413:26;;26449:71;26517:1;26506:9;26502:17;26493:6;26449:71;:::i;:::-;26305:222;;;;:::o;26533:129::-;26567:6;26594:20;;:::i;:::-;26584:30;;26623:33;26651:4;26643:6;26623:33;:::i;:::-;26533:129;;;:::o;26668:75::-;26701:6;26734:2;26728:9;26718:19;;26668:75;:::o;26749:307::-;26810:4;26900:18;26892:6;26889:30;26886:56;;;26922:18;;:::i;:::-;26886:56;26960:29;26982:6;26960:29;:::i;:::-;26952:37;;27044:4;27038;27034:15;27026:23;;26749:307;;;:::o;27062:308::-;27124:4;27214:18;27206:6;27203:30;27200:56;;;27236:18;;:::i;:::-;27200:56;27274:29;27296:6;27274:29;:::i;:::-;27266:37;;27358:4;27352;27348:15;27340:23;;27062:308;;;:::o;27376:141::-;27425:4;27448:3;27440:11;;27471:3;27468:1;27461:14;27505:4;27502:1;27492:18;27484:26;;27376:141;;;:::o;27523:98::-;27574:6;27608:5;27602:12;27592:22;;27523:98;;;:::o;27627:99::-;27679:6;27713:5;27707:12;27697:22;;27627:99;;;:::o;27732:168::-;27815:11;27849:6;27844:3;27837:19;27889:4;27884:3;27880:14;27865:29;;27732:168;;;;:::o;27906:147::-;28007:11;28044:3;28029:18;;27906:147;;;;:::o;28059:169::-;28143:11;28177:6;28172:3;28165:19;28217:4;28212:3;28208:14;28193:29;;28059:169;;;;:::o;28234:148::-;28336:11;28373:3;28358:18;;28234:148;;;;:::o;28388:305::-;28428:3;28447:20;28465:1;28447:20;:::i;:::-;28442:25;;28481:20;28499:1;28481:20;:::i;:::-;28476:25;;28635:1;28567:66;28563:74;28560:1;28557:81;28554:107;;;28641:18;;:::i;:::-;28554:107;28685:1;28682;28678:9;28671:16;;28388:305;;;;:::o;28699:185::-;28739:1;28756:20;28774:1;28756:20;:::i;:::-;28751:25;;28790:20;28808:1;28790:20;:::i;:::-;28785:25;;28829:1;28819:35;;28834:18;;:::i;:::-;28819:35;28876:1;28873;28869:9;28864:14;;28699:185;;;;:::o;28890:348::-;28930:7;28953:20;28971:1;28953:20;:::i;:::-;28948:25;;28987:20;29005:1;28987:20;:::i;:::-;28982:25;;29175:1;29107:66;29103:74;29100:1;29097:81;29092:1;29085:9;29078:17;29074:105;29071:131;;;29182:18;;:::i;:::-;29071:131;29230:1;29227;29223:9;29212:20;;28890:348;;;;:::o;29244:191::-;29284:4;29304:20;29322:1;29304:20;:::i;:::-;29299:25;;29338:20;29356:1;29338:20;:::i;:::-;29333:25;;29377:1;29374;29371:8;29368:34;;;29382:18;;:::i;:::-;29368:34;29427:1;29424;29420:9;29412:17;;29244:191;;;;:::o;29441:96::-;29478:7;29507:24;29525:5;29507:24;:::i;:::-;29496:35;;29441:96;;;:::o;29543:90::-;29577:7;29620:5;29613:13;29606:21;29595:32;;29543:90;;;:::o;29639:77::-;29676:7;29705:5;29694:16;;29639:77;;;:::o;29722:149::-;29758:7;29798:66;29791:5;29787:78;29776:89;;29722:149;;;:::o;29877:126::-;29914:7;29954:42;29947:5;29943:54;29932:65;;29877:126;;;:::o;30009:77::-;30046:7;30075:5;30064:16;;30009:77;;;:::o;30092:154::-;30176:6;30171:3;30166;30153:30;30238:1;30229:6;30224:3;30220:16;30213:27;30092:154;;;:::o;30252:307::-;30320:1;30330:113;30344:6;30341:1;30338:13;30330:113;;;30429:1;30424:3;30420:11;30414:18;30410:1;30405:3;30401:11;30394:39;30366:2;30363:1;30359:10;30354:15;;30330:113;;;30461:6;30458:1;30455:13;30452:101;;;30541:1;30532:6;30527:3;30523:16;30516:27;30452:101;30301:258;30252:307;;;:::o;30565:320::-;30609:6;30646:1;30640:4;30636:12;30626:22;;30693:1;30687:4;30683:12;30714:18;30704:81;;30770:4;30762:6;30758:17;30748:27;;30704:81;30832:2;30824:6;30821:14;30801:18;30798:38;30795:84;;;30851:18;;:::i;:::-;30795:84;30616:269;30565:320;;;:::o;30891:281::-;30974:27;30996:4;30974:27;:::i;:::-;30966:6;30962:40;31104:6;31092:10;31089:22;31068:18;31056:10;31053:34;31050:62;31047:88;;;31115:18;;:::i;:::-;31047:88;31155:10;31151:2;31144:22;30934:238;30891:281;;:::o;31178:233::-;31217:3;31240:24;31258:5;31240:24;:::i;:::-;31231:33;;31286:66;31279:5;31276:77;31273:103;;;31356:18;;:::i;:::-;31273:103;31403:1;31396:5;31392:13;31385:20;;31178:233;;;:::o;31417:100::-;31456:7;31485:26;31505:5;31485:26;:::i;:::-;31474:37;;31417:100;;;:::o;31523:79::-;31562:7;31591:5;31580:16;;31523:79;;;:::o;31608:94::-;31647:7;31676:20;31690:5;31676:20;:::i;:::-;31665:31;;31608:94;;;:::o;31708:176::-;31740:1;31757:20;31775:1;31757:20;:::i;:::-;31752:25;;31791:20;31809:1;31791:20;:::i;:::-;31786:25;;31830:1;31820:35;;31835:18;;:::i;:::-;31820:35;31876:1;31873;31869:9;31864:14;;31708:176;;;;:::o;31890:180::-;31938:77;31935:1;31928:88;32035:4;32032:1;32025:15;32059:4;32056:1;32049:15;32076:180;32124:77;32121:1;32114:88;32221:4;32218:1;32211:15;32245:4;32242:1;32235:15;32262:180;32310:77;32307:1;32300:88;32407:4;32404:1;32397:15;32431:4;32428:1;32421:15;32448:180;32496:77;32493:1;32486:88;32593:4;32590:1;32583:15;32617:4;32614:1;32607:15;32634:180;32682:77;32679:1;32672:88;32779:4;32776:1;32769:15;32803:4;32800:1;32793:15;32820:117;32929:1;32926;32919:12;32943:117;33052:1;33049;33042:12;33066:117;33175:1;33172;33165:12;33189:117;33298:1;33295;33288:12;33312:117;33421:1;33418;33411:12;33435:117;33544:1;33541;33534:12;33558:102;33599:6;33650:2;33646:7;33641:2;33634:5;33630:14;33626:28;33616:38;;33558:102;;;:::o;33666:94::-;33699:8;33747:5;33743:2;33739:14;33718:35;;33666:94;;;:::o;33766:225::-;33906:34;33902:1;33894:6;33890:14;33883:58;33975:8;33970:2;33962:6;33958:15;33951:33;33766:225;:::o;33997:174::-;34137:26;34133:1;34125:6;34121:14;34114:50;33997:174;:::o;34177:173::-;34317:25;34313:1;34305:6;34301:14;34294:49;34177:173;:::o;34356:162::-;34496:14;34492:1;34484:6;34480:14;34473:38;34356:162;:::o;34524:172::-;34664:24;34660:1;34652:6;34648:14;34641:48;34524:172;:::o;34702:173::-;34842:25;34838:1;34830:6;34826:14;34819:49;34702:173;:::o;34881:176::-;35021:28;35017:1;35009:6;35005:14;34998:52;34881:176;:::o;35063:155::-;35203:7;35199:1;35191:6;35187:14;35180:31;35063:155;:::o;35224:182::-;35364:34;35360:1;35352:6;35348:14;35341:58;35224:182;:::o;35412:175::-;35552:27;35548:1;35540:6;35536:14;35529:51;35412:175;:::o;35593:114::-;;:::o;35713:168::-;35853:20;35849:1;35841:6;35837:14;35830:44;35713:168;:::o;35887:171::-;36027:23;36023:1;36015:6;36011:14;36004:47;35887:171;:::o;36064:163::-;36204:15;36200:1;36192:6;36188:14;36181:39;36064:163;:::o;36233:176::-;36373:28;36369:1;36361:6;36357:14;36350:52;36233:176;:::o;36415:122::-;36488:24;36506:5;36488:24;:::i;:::-;36481:5;36478:35;36468:63;;36527:1;36524;36517:12;36468:63;36415:122;:::o;36543:116::-;36613:21;36628:5;36613:21;:::i;:::-;36606:5;36603:32;36593:60;;36649:1;36646;36639:12;36593:60;36543:116;:::o;36665:122::-;36738:24;36756:5;36738:24;:::i;:::-;36731:5;36728:35;36718:63;;36777:1;36774;36767:12;36718:63;36665:122;:::o;36793:120::-;36865:23;36882:5;36865:23;:::i;:::-;36858:5;36855:34;36845:62;;36903:1;36900;36893:12;36845:62;36793:120;:::o;36919:122::-;36992:24;37010:5;36992:24;:::i;:::-;36985:5;36982:35;36972:63;;37031:1;37028;37021:12;36972:63;36919:122;:::o

Swarm Source

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