Token MAD CROW

Overview CRC721

Total Supply:
3,334 M_CROW

Holders:
353 addresses
Balance
0 M_CROW
0xdafc5436cabb478e35c5e74bbc5673ca3ee04252
Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MADCROW

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

pragma solidity 0.8.13;

import "./IERC20.sol";
import "./ERC721.sol";
import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./Context.sol";

contract MADCROW is
    Context,
    Ownable,
    ERC721Enumerable
{
    //ERRORS
    error SaleNotEnded();
    error NoBalance();
    error NoAllowance();
    error SoldOut();
    error AlreadyClaimed();
    error URIFrozen();
    error CrowNotOwned();
    error SaleNotStarted();
    error NotEnoughCrows();
    error ZeroMint();
    error TimeLocked();
    error BadPrice();

    //METADATA
    bool public tokenURIFrozen = false;
    string private baseTokenURI;
    
    //MINT
    uint256 constant public MAX_SUPPLY = 3333;
    uint256 public idTracker;

    //DUTCH
    uint256 public startDate;
    uint256 public endDate;
    uint256 public startPrice = 100 ether;
    uint256 public endPrice = 10 ether;
    uint256 constant public SEGMENTS = 24;
    uint256 public lastPrice;
    bool public soldOut;

    //TEAM CUT
    bool public rewardsClaimed;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;

    //REFUND
    mapping(uint256 => uint256) public purchasePrices;

    //AIRDROP
    mapping(uint256 => bool) public airdropClaimed;

    //CONTRACT
    IERC721Enumerable public crocrow;
    IERC20 public mad;

    event MintEvent(address indexed buyer, uint256 currentSupply, uint256 amount, uint256 time, uint256 price); 

    constructor(
        string memory name,
        string memory symbol,
        string memory uri,
        address _crocrow,
        address _mad,
        uint256 _startDate
    ) ERC721(name, symbol) {
        baseTokenURI = uri;
        startDate = _startDate;
        endDate = startDate + (60 * 60 * 2);
        crocrow = IERC721Enumerable(_crocrow);
        mad = IERC20(_mad);
        _safeMint(_msgSender(), 0);
    }

    function mint(uint256 amount) external {
        uint256 price = getCurrentPrice();
        uint256 totalPrice = price * amount;
        if(amount == 0) revert ZeroMint();
        if((idTracker + amount) > MAX_SUPPLY) revert SoldOut();
        if(block.timestamp < startDate) revert SaleNotStarted();
        if(totalPrice > mad.allowance(_msgSender(),address(this))) revert NoAllowance();
        if(mad.balanceOf(_msgSender()) < totalPrice) revert NoBalance();
        if(crocrow.balanceOf(_msgSender()) < 2) revert NotEnoughCrows();
        
        for (uint256 i = 1; i <= amount;) {
            purchasePrices[idTracker + i] = price;
            _safeMint(_msgSender(), idTracker + i);
            unchecked{
                ++i;
            }
        }
        idTracker += amount;

        if(idTracker == MAX_SUPPLY){
            purchasePrices[0] = price;
            lastPrice = price;
            soldOut = true;
        }

        mad.transferFrom(_msgSender(),address(this),totalPrice);
        emit MintEvent(_msgSender(),idTracker,amount,block.timestamp,price);
    }

    //ADMIN CONTROLS

    function changeStartPrice(uint256 price) external onlyOwner{
        if(block.timestamp >= startDate - (60*60*24) ) revert TimeLocked();
        if(price <= endPrice) revert BadPrice();
        startPrice = price;
    }

    function changeEndPrice(uint256 price) external onlyOwner{
        if(block.timestamp >= startDate - (60*60*24) ) revert TimeLocked();
        if(price >= startPrice) revert BadPrice();
        endPrice = price;
    }

    function changeStartDate(uint256 stamp) public onlyOwner{
        if(block.timestamp >= startDate - (60*60*24) ) revert TimeLocked();
        startDate = stamp;
        endDate = stamp + (60 * 60 * 2);
    }

    function setBaseTokenURI(string memory uri) public onlyOwner {
        if(tokenURIFrozen) revert URIFrozen();
        baseTokenURI = uri;
    }
    
    function freezeBaseURI() public onlyOwner {
        tokenURIFrozen = true;
    }

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

    function walletOfOwner(address add) external view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(add);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(add, i);
        }
        return tokenIds;
    }

    //TEAM FUNDS

    function withdraw() public onlyOwner{
        if(!soldOut) revert SaleNotEnded();
        if(rewardsClaimed) revert AlreadyClaimed();
        rewardsClaimed = true;
        uint256 teamAmount = lastPrice * MAX_SUPPLY / 4;
        mad.transfer(_msgSender(),teamAmount);
        uint256 burnAmount = lastPrice * MAX_SUPPLY / 2;
        mad.transfer(DEAD,burnAmount);
    }

    //REFUNDS

    function refund(uint256 madCrow) external{
        if(!soldOut) revert SaleNotEnded();
        if(_msgSender() != ownerOf(madCrow)) revert CrowNotOwned();
        uint256 amount = purchasePrices[madCrow] - lastPrice;
        if(amount == 0) revert NoBalance();
        purchasePrices[madCrow] = lastPrice;
        mad.transfer(_msgSender(),amount);
    }

    function refundAll() public{
        if(!soldOut) revert SaleNotEnded();
        uint256 ownerTokenCount = balanceOf(_msgSender());
        uint256 toSend;
        uint256 tokenId;
        for (uint256 i; i < ownerTokenCount;) {
            unchecked{
                tokenId = tokenOfOwnerByIndex(_msgSender(),i);
                uint256 amount = purchasePrices[tokenId] - lastPrice;
                purchasePrices[tokenId] = lastPrice;
                toSend+= amount;
                ++i;
            }
        }
        if(toSend == 0) revert NoBalance();
        mad.transfer(_msgSender(),toSend);
    }

    function refundCheck(uint256 madCrow) external view returns(uint256){
        if(!soldOut) revert SaleNotEnded();
        return purchasePrices[madCrow] - lastPrice;
    }

    function refundMulticheck(address add) external view returns (uint256) {
        if(!soldOut) revert SaleNotEnded();
        uint256 ownerTokenCount = balanceOf(add);
        uint256 toSend;
        uint256 tokenId;
        for (uint256 i; i < ownerTokenCount;) {
            unchecked{
                tokenId = tokenOfOwnerByIndex(add,i);
                uint256 amount = purchasePrices[tokenId] - lastPrice;
                toSend+= amount;
                ++i;
            }
        }
        return (toSend);
    }
    
    //AIRDROPS

    function claimAirdrop(uint256 crow) external{
        if(!soldOut) revert SaleNotEnded();
        if(_msgSender() != crocrow.ownerOf(crow)) revert CrowNotOwned();
        if(airdropClaimed[crow]) revert AlreadyClaimed();
        uint256 airdropAmount = lastPrice * MAX_SUPPLY / 4 / 7777;
        airdropClaimed[crow] = true;
        mad.transfer(_msgSender(),airdropAmount);
    }

    function claimAirdropAll() public{
        if(!soldOut) revert SaleNotEnded();
        uint256 airdropAmount = lastPrice * MAX_SUPPLY / 4 / 7777;
        uint256 ownerTokenCount = crocrow.balanceOf(_msgSender());
        uint256 toSend;
        uint256 tokenId;
        for (uint256 i; i < ownerTokenCount;) {
            tokenId = crocrow.tokenOfOwnerByIndex(_msgSender(), i);
            unchecked{
                if(!airdropClaimed[tokenId]){
                    toSend += airdropAmount;
                    airdropClaimed[tokenId] = true;
                }
                ++i;
            }
        }
        if(toSend == 0) revert NoBalance();
        mad.transfer(_msgSender(),toSend);
    }

    //Function for mass claiming for the whales with 200+ CRO CROWs.
    function claimAirdrop100(uint256 index) external{
        if(!soldOut) revert SaleNotEnded();
        uint256 airdropAmount = lastPrice * MAX_SUPPLY / 4 / 7777;
        uint256 ownerTokenCount = crocrow.balanceOf(_msgSender());
        uint256 toSend;
        uint256 tokenId;
        if(ownerTokenCount < 100 * (index+1)) revert NotEnoughCrows();
        for (uint256 i = 100 * index; i < 100 * (index+1);) {
            tokenId = crocrow.tokenOfOwnerByIndex(_msgSender(), i);
            unchecked{
                if(!airdropClaimed[tokenId]){
                    toSend += airdropAmount;
                    airdropClaimed[tokenId] = true;
                }
                ++i;
            }
        }
        if(toSend == 0) revert NoBalance();
        mad.transfer(_msgSender(),toSend);
    }

    function airdropCheck(uint256 crow) external view returns(bool){
        if(!soldOut) revert SaleNotEnded();
        return airdropClaimed[crow];
    }

    function airdropMulticheck(address add) external view returns (uint256) {
        if(!soldOut) revert SaleNotEnded();
        uint256 airdropAmount = lastPrice * MAX_SUPPLY / 4 / 7777;
        uint256 ownerTokenCount = crocrow.balanceOf(add);
        uint256 toSend;
        uint256 tokenId;
        for (uint256 i; i < ownerTokenCount;) {
            tokenId = crocrow.tokenOfOwnerByIndex(add, i);
            unchecked{
                if(!airdropClaimed[tokenId]){
                    toSend += airdropAmount;
                }
                ++i;
            }
        }
        return toSend;
    }

    //TIME

    function currentSegment() public view returns(uint256){
        if(block.timestamp < startDate){
            return 0;
        }else{
            uint256 passed = block.timestamp - startDate;
            uint256 segmentSize = (endDate-startDate) / SEGMENTS;
            uint256 current = ((passed - (passed % segmentSize)) / segmentSize) + 1;
            if(current > SEGMENTS){
                current = SEGMENTS+1;
            }
            return current;
        }
    }

    function getCurrentPrice() public view returns(uint256){
        uint256 segment = currentSegment();
        if(segment == 0){
            return startPrice;
        }
        return endPrice+((SEGMENTS - (segment-1)) * (startPrice-endPrice) /SEGMENTS);
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"_crocrow","type":"address"},{"internalType":"address","name":"_mad","type":"address"},{"internalType":"uint256","name":"_startDate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"BadPrice","type":"error"},{"inputs":[],"name":"CrowNotOwned","type":"error"},{"inputs":[],"name":"NoAllowance","type":"error"},{"inputs":[],"name":"NoBalance","type":"error"},{"inputs":[],"name":"NotEnoughCrows","type":"error"},{"inputs":[],"name":"SaleNotEnded","type":"error"},{"inputs":[],"name":"SaleNotStarted","type":"error"},{"inputs":[],"name":"SoldOut","type":"error"},{"inputs":[],"name":"TimeLocked","type":"error"},{"inputs":[],"name":"URIFrozen","type":"error"},{"inputs":[],"name":"ZeroMint","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":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"currentSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"MintEvent","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":[],"name":"SEGMENTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"crow","type":"uint256"}],"name":"airdropCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"airdropClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"airdropMulticheck","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":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"changeEndPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stamp","type":"uint256"}],"name":"changeStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"changeStartPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"crow","type":"uint256"}],"name":"claimAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"claimAirdrop100","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAirdropAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crocrow","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSegment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"idTracker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mad","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"purchasePrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"madCrow","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"madCrow","type":"uint256"}],"name":"refundCheck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"refundMulticheck","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsClaimed","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":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soldOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startPrice","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":[{"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":"tokenURIFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"add","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff02191690831515021790555068056bc75e2d63100000601055678ac7230489e800006011553480156200004557600080fd5b50604051620072c4380380620072c483398181016040528101906200006b919062000f35565b85856200008d62000081620001a960201b60201c565b620001b160201b60201c565b8160019080519060200190620000a592919062000c48565b508060029080519060200190620000be92919062000c48565b50505083600c9080519060200190620000d992919062000c48565b5080600e81905550611c20600e54620000f391906200105d565b600f8190555082601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200019d6200018f620001a960201b60201c565b60006200027560201b60201c565b5050505050506200153e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002978282604051806020016040528060008152506200029b60201b60201c565b5050565b620002ad83836200030960201b60201c565b620002c26000848484620004ee60201b60201c565b62000304576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002fb9062001141565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200037b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037290620011b3565b60405180910390fd5b6200038c816200069760201b60201c565b15620003cf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003c69062001225565b60405180910390fd5b620003e3600083836200070360201b60201c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200043591906200105d565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200051c8473ffffffffffffffffffffffffffffffffffffffff166200084860201b6200346c1760201c565b156200068a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200054e620001a960201b60201c565b8786866040518563ffffffff1660e01b8152600401620005729493929190620012c6565b6020604051808303816000875af1925050508015620005b157506040513d601f19601f82011682018060405250810190620005ae919062001377565b60015b62000639573d8060008114620005e4576040519150601f19603f3d011682016040523d82523d6000602084013e620005e9565b606091505b50600081510362000631576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006289062001141565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200068f565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200071b8383836200085b60201b6200347f1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620007675762000761816200086060201b60201c565b620007af565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620007ae57620007ad8382620008a960201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620007fb57620007f58162000a2660201b60201c565b62000843565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620008425762000841828262000b0260201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001620008c38462000b8e60201b6200231e1760201c565b620008cf9190620013a9565b9050600060086000848152602001908152602001600020549050818114620009b5576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905062000a3c9190620013a9565b90506000600a600084815260200190815260200160002054905060006009838154811062000a6f5762000a6e620013e4565b5b90600052602060002001549050806009838154811062000a945762000a93620013e4565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548062000ae65762000ae562001413565b5b6001900381819060005260206000200160009055905550505050565b600062000b1a8362000b8e60201b6200231e1760201c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000c01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000bf890620014b8565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000c569062001509565b90600052602060002090601f01602090048101928262000c7a576000855562000cc6565b82601f1062000c9557805160ff191683800117855562000cc6565b8280016001018555821562000cc6579182015b8281111562000cc557825182559160200191906001019062000ca8565b5b50905062000cd5919062000cd9565b5090565b5b8082111562000cf457600081600090555060010162000cda565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000d618262000d16565b810181811067ffffffffffffffff8211171562000d835762000d8262000d27565b5b80604052505050565b600062000d9862000cf8565b905062000da6828262000d56565b919050565b600067ffffffffffffffff82111562000dc95762000dc862000d27565b5b62000dd48262000d16565b9050602081019050919050565b60005b8381101562000e0157808201518184015260208101905062000de4565b8381111562000e11576000848401525b50505050565b600062000e2e62000e288462000dab565b62000d8c565b90508281526020810184848401111562000e4d5762000e4c62000d11565b5b62000e5a84828562000de1565b509392505050565b600082601f83011262000e7a5762000e7962000d0c565b5b815162000e8c84826020860162000e17565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000ec28262000e95565b9050919050565b62000ed48162000eb5565b811462000ee057600080fd5b50565b60008151905062000ef48162000ec9565b92915050565b6000819050919050565b62000f0f8162000efa565b811462000f1b57600080fd5b50565b60008151905062000f2f8162000f04565b92915050565b60008060008060008060c0878903121562000f555762000f5462000d02565b5b600087015167ffffffffffffffff81111562000f765762000f7562000d07565b5b62000f8489828a0162000e62565b965050602087015167ffffffffffffffff81111562000fa85762000fa762000d07565b5b62000fb689828a0162000e62565b955050604087015167ffffffffffffffff81111562000fda5762000fd962000d07565b5b62000fe889828a0162000e62565b945050606062000ffb89828a0162000ee3565b93505060806200100e89828a0162000ee3565b92505060a06200102189828a0162000f1e565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200106a8262000efa565b9150620010778362000efa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620010af57620010ae6200102e565b5b828201905092915050565b600082825260208201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600062001129603283620010ba565b91506200113682620010cb565b604082019050919050565b600060208201905081810360008301526200115c816200111a565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006200119b602083620010ba565b9150620011a88262001163565b602082019050919050565b60006020820190508181036000830152620011ce816200118c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006200120d601c83620010ba565b91506200121a82620011d5565b602082019050919050565b600060208201905081810360008301526200124081620011fe565b9050919050565b620012528162000eb5565b82525050565b620012638162000efa565b82525050565b600081519050919050565b600082825260208201905092915050565b6000620012928262001269565b6200129e818562001274565b9350620012b081856020860162000de1565b620012bb8162000d16565b840191505092915050565b6000608082019050620012dd600083018762001247565b620012ec602083018662001247565b620012fb604083018562001258565b81810360608301526200130f818462001285565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62001351816200131a565b81146200135d57600080fd5b50565b600081519050620013718162001346565b92915050565b60006020828403121562001390576200138f62000d02565b5b6000620013a08482850162001360565b91505092915050565b6000620013b68262000efa565b9150620013c38362000efa565b925082821015620013d957620013d86200102e565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000620014a0602a83620010ba565b9150620014ad8262001442565b604082019050919050565b60006020820190508181036000830152620014d38162001491565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200152257607f821691505b602082108103620015385762001537620014da565b5b50919050565b615d76806200154e6000396000f3fe608060405234801561001057600080fd5b50600436106103265760003560e01c80634f6ccce7116101b8578063b868723e11610104578063e30d4440116100a2578063eb91d37e1161007c578063eb91d37e14610967578063f1a9af8914610985578063f2fde38b146109a3578063ffb0b95d146109bf57610326565b8063e30d444014610911578063e7bc82081461092d578063e985e9c51461093757610326565b8063c24a0f8b116100de578063c24a0f8b14610889578063c29de630146108a7578063c87b56dd146108c5578063d11cd4c6146108f557610326565b8063b868723e14610831578063b88d4fde1461084f578063c1ae90c81461086b57610326565b8063893da6c91161017157806399b465cb1161014b57806399b465cb146107ab578063a0712d68146107c9578063a22cb465146107e5578063a3a2af401461080157610326565b8063893da6c9146107515780638da5cb5b1461076f57806395d89b411461078d57610326565b80634f6ccce71461067d5780636352211e146106ad5780636b9d6e7d146106dd57806370a08231146106f9578063715018a61461072957806385df643d1461073357610326565b80632a9c3777116102775780633ccfd60b1161023057806342842e0e1161020a57806342842e0e146105e3578063438b6300146105ff5780634a028a8e1461062f5780634d0d11a01461064d57610326565b80633ccfd60b1461058d5780634069d6df1461059757806341a0efef146105b357610326565b80632a9c3777146104cb5780632b463a23146104e95780632f745c591461051957806330176e131461054957806332cb6b0c1461056557806338e771ab1461058357610326565b80630b97bc86116102e4578063182066bd116102be578063182066bd146104455780631b7fe6b61461047557806323b872dd14610493578063278ecde1146104af57610326565b80630b97bc86146103ff57806310b36c101461041d57806318160ddd1461042757610326565b8062739f2a1461032b57806301ffc9a714610347578063053f14da1461037757806306fdde0314610395578063081812fc146103b3578063095ea7b3146103e3575b600080fd5b6103456004803603810190610340919061461a565b6109ef565b005b610361600480360381019061035c919061469f565b610ad2565b60405161036e91906146e7565b60405180910390f35b61037f610b4c565b60405161038c9190614711565b60405180910390f35b61039d610b52565b6040516103aa91906147c5565b60405180910390f35b6103cd60048036038101906103c8919061461a565b610be4565b6040516103da9190614828565b60405180910390f35b6103fd60048036038101906103f8919061486f565b610c69565b005b610407610d80565b6040516104149190614711565b60405180910390f35b610425610d86565b005b61042f6110a0565b60405161043c9190614711565b60405180910390f35b61045f600480360381019061045a91906148af565b6110ad565b60405161046c9190614711565b60405180910390f35b61047d611155565b60405161048a9190614711565b60405180910390f35b6104ad60048036038101906104a891906148dc565b61115b565b005b6104c960048036038101906104c4919061461a565b6111bb565b005b6104d361139a565b6040516104e0919061498e565b60405180910390f35b61050360048036038101906104fe919061461a565b6113c0565b6040516105109190614711565b60405180910390f35b610533600480360381019061052e919061486f565b611430565b6040516105409190614711565b60405180910390f35b610563600480360381019061055e9190614ade565b6114d5565b005b61056d6115b2565b60405161057a9190614711565b60405180910390f35b61058b6115b8565b005b610595611762565b005b6105b160048036038101906105ac919061461a565b611a15565b005b6105cd60048036038101906105c8919061461a565b611b1f565b6040516105da91906146e7565b60405180910390f35b6105fd60048036038101906105f891906148dc565b611b8f565b005b610619600480360381019061061491906148af565b611baf565b6040516106269190614be5565b60405180910390f35b610637611c5d565b6040516106449190614711565b60405180910390f35b610667600480360381019061066291906148af565b611c62565b6040516106749190614711565b60405180910390f35b6106976004803603810190610692919061461a565b611e68565b6040516106a49190614711565b60405180910390f35b6106c760048036038101906106c2919061461a565b611ed9565b6040516106d49190614828565b60405180910390f35b6106f760048036038101906106f2919061461a565b611f8a565b005b610713600480360381019061070e91906148af565b61231e565b6040516107209190614711565b60405180910390f35b6107316123d5565b005b61073b61245d565b6040516107489190614c28565b60405180910390f35b610759612483565b60405161076691906146e7565b60405180910390f35b610777612496565b6040516107849190614828565b60405180910390f35b6107956124bf565b6040516107a291906147c5565b60405180910390f35b6107b3612551565b6040516107c09190614711565b60405180910390f35b6107e360048036038101906107de919061461a565b6125ee565b005b6107ff60048036038101906107fa9190614c6f565b612b28565b005b61081b6004803603810190610816919061461a565b612ca8565b60405161082891906146e7565b60405180910390f35b610839612cc8565b6040516108469190614711565b60405180910390f35b61086960048036038101906108649190614d50565b612cce565b005b610873612d30565b60405161088091906146e7565b60405180910390f35b610891612d43565b60405161089e9190614711565b60405180910390f35b6108af612d49565b6040516108bc91906146e7565b60405180910390f35b6108df60048036038101906108da919061461a565b612d5c565b6040516108ec91906147c5565b60405180910390f35b61090f600480360381019061090a919061461a565b612e03565b005b61092b6004803603810190610926919061461a565b612f0d565b005b6109356131b7565b005b610951600480360381019061094c9190614dd3565b613250565b60405161095e91906146e7565b60405180910390f35b61096f6132e4565b60405161097c9190614711565b60405180910390f35b61098d613357565b60405161099a9190614711565b60405180910390f35b6109bd60048036038101906109b891906148af565b61335d565b005b6109d960048036038101906109d4919061461a565b613454565b6040516109e69190614711565b60405180910390f35b6109f7613484565b73ffffffffffffffffffffffffffffffffffffffff16610a15612496565b73ffffffffffffffffffffffffffffffffffffffff1614610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290614e5f565b60405180910390fd5b62015180600e54610a7c9190614eae565b4210610ab4576040517f56f3855700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e81905550611c2081610ac99190614ee2565b600f8190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b455750610b448261348c565b5b9050919050565b60125481565b606060018054610b6190614f67565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d90614f67565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b5050505050905090565b6000610bef8261356e565b610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c259061500a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7482611ed9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb9061509c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d03613484565b73ffffffffffffffffffffffffffffffffffffffff161480610d325750610d3181610d2c613484565b613250565b5b610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d689061512e565b60405180910390fd5b610d7b83836135da565b505050565b600e5481565b601360009054906101000a900460ff16610dcc576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e616004610d05601254610de3919061514e565b610ded91906151d7565b610df791906151d7565b90506000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610e41613484565b6040518263ffffffff1660e01b8152600401610e5d9190614828565b602060405180830381865afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e919061521d565b905060008060005b83811015610fb757601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610ef4613484565b836040518363ffffffff1660e01b8152600401610f1292919061524a565b602060405180830381865afa158015610f2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f53919061521d565b91506015600083815260200190815260200160002060009054906101000a900460ff16610fac57848301925060016015600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806001019050610ea6565b5060008203610ff2576040517fc2caa2a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611038613484565b846040518363ffffffff1660e01b815260040161105692919061524a565b6020604051808303816000875af1158015611075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110999190615288565b5050505050565b6000600980549050905090565b6000601360009054906101000a900460ff166110f5576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111008361231e565b905060008060005b838110156111495761111a8682611430565b915060006012546014600085815260200190815260200160002054039050808401935081600101915050611108565b50819350505050919050565b600d5481565b61116c611166613484565b82613693565b6111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290615327565b60405180910390fd5b6111b6838383613771565b505050565b601360009054906101000a900460ff16611201576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61120a81611ed9565b73ffffffffffffffffffffffffffffffffffffffff16611228613484565b73ffffffffffffffffffffffffffffffffffffffff1614611275576040517f281a56e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060125460146000848152602001908152602001600020546112989190614eae565b9050600081036112d4576040517fc2caa2a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6012546014600084815260200190815260200160002081905550601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611334613484565b836040518363ffffffff1660e01b815260040161135292919061524a565b6020604051808303816000875af1158015611371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113959190615288565b505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601360009054906101000a900460ff16611408576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60125460146000848152602001908152602001600020546114299190614eae565b9050919050565b600061143b8361231e565b821061147c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611473906153b9565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6114dd613484565b73ffffffffffffffffffffffffffffffffffffffff166114fb612496565b73ffffffffffffffffffffffffffffffffffffffff1614611551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154890614e5f565b60405180910390fd5b600b60009054906101000a900460ff1615611598576040517f6a2981ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c90805190602001906115ae92919061452d565b5050565b610d0581565b601360009054906101000a900460ff166115fe576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061161061160b613484565b61231e565b905060008060005b8381101561167a5761163161162b613484565b82611430565b9150600060125460146000858152602001908152602001600020540390506012546014600085815260200190815260200160002081905550808401935081600101915050611618565b50600082036116b5576040517fc2caa2a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6116fb613484565b846040518363ffffffff1660e01b815260040161171992919061524a565b6020604051808303816000875af1158015611738573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175c9190615288565b50505050565b61176a613484565b73ffffffffffffffffffffffffffffffffffffffff16611788612496565b73ffffffffffffffffffffffffffffffffffffffff16146117de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d590614e5f565b60405180910390fd5b601360009054906101000a900460ff16611824576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601360019054906101000a900460ff161561186b576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601360016101000a81548160ff02191690831515021790555060006004610d0560125461189a919061514e565b6118a491906151d7565b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6118ec613484565b836040518363ffffffff1660e01b815260040161190a92919061524a565b6020604051808303816000875af1158015611929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d9190615288565b5060006002610d05601254611962919061514e565b61196c91906151d7565b9050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61dead836040518363ffffffff1660e01b81526004016119cd92919061524a565b6020604051808303816000875af11580156119ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a109190615288565b505050565b611a1d613484565b73ffffffffffffffffffffffffffffffffffffffff16611a3b612496565b73ffffffffffffffffffffffffffffffffffffffff1614611a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8890614e5f565b60405180910390fd5b62015180600e54611aa29190614eae565b4210611ada576040517f56f3855700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010548110611b15576040517ffd1ee34900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060118190555050565b6000601360009054906101000a900460ff16611b67576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6015600083815260200190815260200160002060009054906101000a900460ff169050919050565b611baa83838360405180602001604052806000815250612cce565b505050565b60606000611bbc8361231e565b905060008167ffffffffffffffff811115611bda57611bd96149b3565b5b604051908082528060200260200182016040528015611c085781602001602082028036833780820191505090505b50905060005b82811015611c5257611c208582611430565b828281518110611c3357611c326153d9565b5b6020026020010181815250508080611c4a90615408565b915050611c0e565b508092505050919050565b601881565b6000601360009054906101000a900460ff16611caa576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e616004610d05601254611cc1919061514e565b611ccb91906151d7565b611cd591906151d7565b90506000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401611d349190614828565b602060405180830381865afa158015611d51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d75919061521d565b905060008060005b83811015611e5b57601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5988836040518363ffffffff1660e01b8152600401611de292919061524a565b602060405180830381865afa158015611dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e23919061521d565b91506015600083815260200190815260200160002060009054906101000a900460ff16611e505784830192505b806001019050611d7d565b5081945050505050919050565b6000611e726110a0565b8210611eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eaa906154c2565b60405180910390fd5b60098281548110611ec757611ec66153d9565b5b90600052602060002001549050919050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7890615554565b60405180910390fd5b80915050919050565b601360009054906101000a900460ff16611fd0576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e616004610d05601254611fe7919061514e565b611ff191906151d7565b611ffb91906151d7565b90506000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231612045613484565b6040518263ffffffff1660e01b81526004016120619190614828565b602060405180830381865afa15801561207e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a2919061521d565b90506000806001856120b49190614ee2565b60646120c0919061514e565b8310156120f9576040517f1ee4ec4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000856064612108919061514e565b90505b6001866121189190614ee2565b6064612124919061514e565b81101561223457601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59612171613484565b836040518363ffffffff1660e01b815260040161218f92919061524a565b602060405180830381865afa1580156121ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d0919061521d565b91506015600083815260200190815260200160002060009054906101000a900460ff1661222957848301925060016015600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80600101905061210b565b506000820361226f576040517fc2caa2a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6122b5613484565b846040518363ffffffff1660e01b81526004016122d392919061524a565b6020604051808303816000875af11580156122f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123169190615288565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361238e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612385906155e6565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6123dd613484565b73ffffffffffffffffffffffffffffffffffffffff166123fb612496565b73ffffffffffffffffffffffffffffffffffffffff1614612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614e5f565b60405180910390fd5b61245b60006139cc565b565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601360009054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546124ce90614f67565b80601f01602080910402602001604051908101604052809291908181526020018280546124fa90614f67565b80156125475780601f1061251c57610100808354040283529160200191612547565b820191906000526020600020905b81548152906001019060200180831161252a57829003601f168201915b5050505050905090565b6000600e5442101561256657600090506125eb565b6000600e54426125769190614eae565b905060006018600e54600f5461258c9190614eae565b61259691906151d7565b9050600060018283856125a99190615606565b856125b49190614eae565b6125be91906151d7565b6125c89190614ee2565b905060188111156125e457600160186125e19190614ee2565b90505b8093505050505b90565b60006125f86132e4565b905060008282612608919061514e565b905060008303612644576040517fa776bb4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0583600d546126559190614ee2565b111561268d576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e544210156126c9576040517f2d0a346e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e61270f613484565b306040518363ffffffff1660e01b815260040161272d929190615637565b602060405180830381865afa15801561274a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276e919061521d565b8111156127a7576040517febf59ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316127ee613484565b6040518263ffffffff1660e01b815260040161280a9190614828565b602060405180830381865afa158015612827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284b919061521d565b1015612883576040517fc2caa2a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316128cb613484565b6040518263ffffffff1660e01b81526004016128e79190614828565b602060405180830381865afa158015612904573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612928919061521d565b1015612960576040517f1ee4ec4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600190505b8381116129bc57826014600083600d546129819190614ee2565b8152602001908152602001600020819055506129b161299e613484565b82600d546129ac9190614ee2565b613a90565b806001019050612967565b5082600d60008282546129cf9190614ee2565b92505081905550610d05600d5403612a1c57816014600080815260200190815260200160002081905550816012819055506001601360006101000a81548160ff0219169083151502179055505b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd612a62613484565b30846040518463ffffffff1660e01b8152600401612a8293929190615660565b6020604051808303816000875af1158015612aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ac59190615288565b50612ace613484565b73ffffffffffffffffffffffffffffffffffffffff167f129bf886bd424e155dd07a881393affc998b081098262df9cebb9f5370b0404c600d54854286604051612b1b9493929190615697565b60405180910390a2505050565b612b30613484565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9490615728565b60405180910390fd5b8060066000612baa613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612c57613484565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c9c91906146e7565b60405180910390a35050565b60156020528060005260406000206000915054906101000a900460ff1681565b60115481565b612cdf612cd9613484565b83613693565b612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1590615327565b60405180910390fd5b612d2a84848484613aae565b50505050565b601360019054906101000a900460ff1681565b600f5481565b600b60009054906101000a900460ff1681565b6060612d678261356e565b612da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9d906157ba565b60405180910390fd5b6000612db0613b0a565b90506000815111612dd05760405180602001604052806000815250612dfb565b80612dda84613b9c565b604051602001612deb929190615816565b6040516020818303038152906040525b915050919050565b612e0b613484565b73ffffffffffffffffffffffffffffffffffffffff16612e29612496565b73ffffffffffffffffffffffffffffffffffffffff1614612e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7690614e5f565b60405180910390fd5b62015180600e54612e909190614eae565b4210612ec8576040517f56f3855700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011548111612f03576040517ffd1ee34900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060108190555050565b601360009054906101000a900460ff16612f53576040517f9d98b04b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b8152600401612fae9190614711565b602060405180830381865afa158015612fcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fef919061584f565b73ffffffffffffffffffffffffffffffffffffffff1661300d613484565b73ffffffffffffffffffffffffffffffffffffffff161461305a576040517f281a56e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6015600082815260200190815260200160002060009054906101000a900460ff16156130b2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e616004610d056012546130c9919061514e565b6130d391906151d7565b6130dd91906151d7565b905060016015600084815260200190815260200160002060006101000a81548160ff021916908315150217905550601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb613151613484565b836040518363ffffffff1660e01b815260040161316f92919061524a565b6020604051808303816000875af115801561318e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b29190615288565b505050565b6131bf613484565b73ffffffffffffffffffffffffffffffffffffffff166131dd612496565b73ffffffffffffffffffffffffffffffffffffffff1614613233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322a90614e5f565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806132ef612551565b90506000810361330457601054915050613354565b60186011546010546133169190614eae565b6001836133239190614eae565b601861332f9190614eae565b613339919061514e565b61334391906151d7565b6011546133509190614ee2565b9150505b90565b60105481565b613365613484565b73ffffffffffffffffffffffffffffffffffffffff16613383612496565b73ffffffffffffffffffffffffffffffffffffffff16146133d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d090614e5f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343f906158ee565b60405180910390fd5b613451816139cc565b50565b60146020528060005260406000206000915090505481565b600080823b905060008111915050919050565b505050565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061355757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613567575061356682613cfc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661364d83611ed9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061369e8261356e565b6136dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d490615980565b60405180910390fd5b60006136e883611ed9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061375757508373ffffffffffffffffffffffffffffffffffffffff1661373f84610be4565b73ffffffffffffffffffffffffffffffffffffffff16145b8061376857506137678185613250565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661379182611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146137e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137de90615a12565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384d90615aa4565b60405180910390fd5b613861838383613d66565b61386c6000826135da565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138bc9190614eae565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139139190614ee2565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613aaa828260405180602001604052806000815250613e78565b5050565b613ab9848484613771565b613ac584848484613ed3565b613b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613afb90615b36565b60405180910390fd5b50505050565b6060600c8054613b1990614f67565b80601f0160208091040260200160405190810160405280929190818152602001828054613b4590614f67565b8015613b925780601f10613b6757610100808354040283529160200191613b92565b820191906000526020600020905b815481529060010190602001808311613b7557829003601f168201915b5050505050905090565b606060008203613be3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613cf7565b600082905060005b60008214613c15578080613bfe90615408565b915050600a82613c0e91906151d7565b9150613beb565b60008167ffffffffffffffff811115613c3157613c306149b3565b5b6040519080825280601f01601f191660200182016040528015613c635781602001600182028036833780820191505090505b5090505b60008514613cf057600182613c7c9190614eae565b9150600a85613c8b9190615606565b6030613c979190614ee2565b60f81b818381518110613cad57613cac6153d9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613ce991906151d7565b9450613c67565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613d7183838361347f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613db357613dae8161405a565b613df2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613df157613df083826140a3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613e3457613e2f81614210565b613e73565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613e7257613e7182826142e1565b5b5b505050565b613e828383614360565b613e8f6000848484613ed3565b613ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ec590615b36565b60405180910390fd5b505050565b6000613ef48473ffffffffffffffffffffffffffffffffffffffff1661346c565b1561404d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613f1d613484565b8786866040518563ffffffff1660e01b8152600401613f3f9493929190615bab565b6020604051808303816000875af1925050508015613f7b57506040513d601f19601f82011682018060405250810190613f789190615c0c565b60015b613ffd573d8060008114613fab576040519150601f19603f3d011682016040523d82523d6000602084013e613fb0565b606091505b506000815103613ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fec90615b36565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050614052565b600190505b949350505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016140b08461231e565b6140ba9190614eae565b905060006008600084815260200190815260200160002054905081811461419f576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506142249190614eae565b90506000600a6000848152602001908152602001600020549050600060098381548110614254576142536153d9565b5b906000526020600020015490508060098381548110614276576142756153d9565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806142c5576142c4615c39565b5b6001900381819060005260206000200160009055905550505050565b60006142ec8361231e565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036143cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143c690615cb4565b60405180910390fd5b6143d88161356e565b15614418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161440f90615d20565b60405180910390fd5b61442460008383613d66565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546144749190614ee2565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461453990614f67565b90600052602060002090601f01602090048101928261455b57600085556145a2565b82601f1061457457805160ff19168380011785556145a2565b828001600101855582156145a2579182015b828111156145a1578251825591602001919060010190614586565b5b5090506145af91906145b3565b5090565b5b808211156145cc5760008160009055506001016145b4565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6145f7816145e4565b811461460257600080fd5b50565b600081359050614614816145ee565b92915050565b6000602082840312156146305761462f6145da565b5b600061463e84828501614605565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61467c81614647565b811461468757600080fd5b50565b60008135905061469981614673565b92915050565b6000602082840312156146b5576146b46145da565b5b60006146c38482850161468a565b91505092915050565b60008115159050919050565b6146e1816146cc565b82525050565b60006020820190506146fc60008301846146d8565b92915050565b61470b816145e4565b82525050565b60006020820190506147266000830184614702565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561476657808201518184015260208101905061474b565b83811115614775576000848401525b50505050565b6000601f19601f8301169050919050565b60006147978261472c565b6147a18185614737565b93506147b1818560208601614748565b6147ba8161477b565b840191505092915050565b600060208201905081810360008301526147df818461478c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614812826147e7565b9050919050565b61482281614807565b82525050565b600060208201905061483d6000830184614819565b92915050565b61484c81614807565b811461485757600080fd5b50565b60008135905061486981614843565b92915050565b60008060408385031215614886576148856145da565b5b60006148948582860161485a565b92505060206148a585828601614605565b9150509250929050565b6000602082840312156148c5576148c46145da565b5b60006148d38482850161485a565b91505092915050565b6000806000606084860312156148f5576148f46145da565b5b60006149038682870161485a565b93505060206149148682870161485a565b925050604061492586828701614605565b9150509250925092565b6000819050919050565b600061495461494f61494a846147e7565b61492f565b6147e7565b9050919050565b600061496682614939565b9050919050565b60006149788261495b565b9050919050565b6149888161496d565b82525050565b60006020820190506149a3600083018461497f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6149eb8261477b565b810181811067ffffffffffffffff82111715614a0a57614a096149b3565b5b80604052505050565b6000614a1d6145d0565b9050614a2982826149e2565b919050565b600067ffffffffffffffff821115614a4957614a486149b3565b5b614a528261477b565b9050602081019050919050565b82818337600083830152505050565b6000614a81614a7c84614a2e565b614a13565b905082815260208101848484011115614a9d57614a9c6149ae565b5b614aa8848285614a5f565b509392505050565b600082601f830112614ac557614ac46149a9565b5b8135614ad5848260208601614a6e565b91505092915050565b600060208284031215614af457614af36145da565b5b600082013567ffffffffffffffff811115614b1257614b116145df565b5b614b1e84828501614ab0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614b5c816145e4565b82525050565b6000614b6e8383614b53565b60208301905092915050565b6000602082019050919050565b6000614b9282614b27565b614b9c8185614b32565b9350614ba783614b43565b8060005b83811015614bd8578151614bbf8882614b62565b9750614bca83614b7a565b925050600181019050614bab565b5085935050505092915050565b60006020820190508181036000830152614bff8184614b87565b905092915050565b6000614c128261495b565b9050919050565b614c2281614c07565b82525050565b6000602082019050614c3d6000830184614c19565b92915050565b614c4c816146cc565b8114614c5757600080fd5b50565b600081359050614c6981614c43565b92915050565b60008060408385031215614c8657614c856145da565b5b6000614c948582860161485a565b9250506020614ca585828601614c5a565b9150509250929050565b600067ffffffffffffffff821115614cca57614cc96149b3565b5b614cd38261477b565b9050602081019050919050565b6000614cf3614cee84614caf565b614a13565b905082815260208101848484011115614d0f57614d0e6149ae565b5b614d1a848285614a5f565b509392505050565b600082601f830112614d3757614d366149a9565b5b8135614d47848260208601614ce0565b91505092915050565b60008060008060808587031215614d6a57614d696145da565b5b6000614d788782880161485a565b9450506020614d898782880161485a565b9350506040614d9a87828801614605565b925050606085013567ffffffffffffffff811115614dbb57614dba6145df565b5b614dc787828801614d22565b91505092959194509250565b60008060408385031215614dea57614de96145da565b5b6000614df88582860161485a565b9250506020614e098582860161485a565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614e49602083614737565b9150614e5482614e13565b602082019050919050565b60006020820190508181036000830152614e7881614e3c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614eb9826145e4565b9150614ec4836145e4565b925082821015614ed757614ed6614e7f565b5b828203905092915050565b6000614eed826145e4565b9150614ef8836145e4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f2d57614f2c614e7f565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f7f57607f821691505b602082108103614f9257614f91614f38565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614ff4602c83614737565b9150614fff82614f98565b604082019050919050565b6000602082019050818103600083015261502381614fe7565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000615086602183614737565b91506150918261502a565b604082019050919050565b600060208201905081810360008301526150b581615079565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000615118603883614737565b9150615123826150bc565b604082019050919050565b600060208201905081810360008301526151478161510b565b9050919050565b6000615159826145e4565b9150615164836145e4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561519d5761519c614e7f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151e2826145e4565b91506151ed836145e4565b9250826151fd576151fc6151a8565b5b828204905092915050565b600081519050615217816145ee565b92915050565b600060208284031215615233576152326145da565b5b600061524184828501615208565b91505092915050565b600060408201905061525f6000830185614819565b61526c6020830184614702565b9392505050565b60008151905061528281614c43565b92915050565b60006020828403121561529e5761529d6145da565b5b60006152ac84828501615273565b91505092915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000615311603183614737565b915061531c826152b5565b604082019050919050565b6000602082019050818103600083015261534081615304565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006153a3602b83614737565b91506153ae82615347565b604082019050919050565b600060208201905081810360008301526153d281615396565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000615413826145e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361544557615444614e7f565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006154ac602c83614737565b91506154b782615450565b604082019050919050565b600060208201905081810360008301526154db8161549f565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b600061553e602983614737565b9150615549826154e2565b604082019050919050565b6000602082019050818103600083015261556d81615531565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006155d0602a83614737565b91506155db82615574565b604082019050919050565b600060208201905081810360008301526155ff816155c3565b9050919050565b6000615611826145e4565b915061561c836145e4565b92508261562c5761562b6151a8565b5b828206905092915050565b600060408201905061564c6000830185614819565b6156596020830184614819565b9392505050565b60006060820190506156756000830186614819565b6156826020830185614819565b61568f6040830184614702565b949350505050565b60006080820190506156ac6000830187614702565b6156b96020830186614702565b6156c66040830185614702565b6156d36060830184614702565b95945050505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615712601983614737565b915061571d826156dc565b602082019050919050565b6000602082019050818103600083015261574181615705565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006157a4602f83614737565b91506157af82615748565b604082019050919050565b600060208201905081810360008301526157d381615797565b9050919050565b600081905092915050565b60006157f08261472c565b6157fa81856157da565b935061580a818560208601614748565b80840191505092915050565b600061582282856157e5565b915061582e82846157e5565b91508190509392505050565b60008151905061584981614843565b92915050565b600060208284031215615865576158646145da565b5b60006158738482850161583a565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006158d8602683614737565b91506158e38261587c565b604082019050919050565b60006020820190508181036000830152615907816158cb565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061596a602c83614737565b91506159758261590e565b604082019050919050565b600060208201905081810360008301526159998161595d565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006159fc602983614737565b9150615a07826159a0565b604082019050919050565b60006020820190508181036000830152615a2b816159ef565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615a8e602483614737565b9150615a9982615a32565b604082019050919050565b60006020820190508181036000830152615abd81615a81565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b20603283614737565b9150615b2b82615ac4565b604082019050919050565b60006020820190508181036000830152615b4f81615b13565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b7d82615b56565b615b878185615b61565b9350615b97818560208601614748565b615ba08161477b565b840191505092915050565b6000608082019050615bc06000830187614819565b615bcd6020830186614819565b615bda6040830185614702565b8181036060830152615bec8184615b72565b905095945050505050565b600081519050615c0681614673565b92915050565b600060208284031215615c2257615c216145da565b5b6000615c3084828501615bf7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615c9e602083614737565b9150615ca982615c68565b602082019050919050565b60006020820190508181036000830152615ccd81615c91565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d0a601c83614737565b9150615d1582615cd4565b602082019050919050565b60006020820190508181036000830152615d3981615cfd565b905091905056fea26469706673582212208b7086c00d5e871ac0dc06fca55fbc1e8d6586ded0f78130534e3375065b2cbb64736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000e4ab77ed89528d90e6bcf0e1ac99c58da24e79d5000000000000000000000000212331e1435a8df230715db4c02b2a3a0abf8c610000000000000000000000000000000000000000000000000000000062815bc000000000000000000000000000000000000000000000000000000000000000084d41442043524f5700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d5f43524f570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c697066733a2f2f736f6f6e2f0000000000000000000000000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000e4ab77ed89528d90e6bcf0e1ac99c58da24e79d5000000000000000000000000212331e1435a8df230715db4c02b2a3a0abf8c610000000000000000000000000000000000000000000000000000000062815bc000000000000000000000000000000000000000000000000000000000000000084d41442043524f5700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064d5f43524f570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c697066733a2f2f736f6f6e2f0000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): MAD CROW
Arg [1] : symbol (string): M_CROW
Arg [2] : uri (string): ipfs://soon/
Arg [3] : _crocrow (address): 0xe4ab77ed89528d90e6bcf0e1ac99c58da24e79d5
Arg [4] : _mad (address): 0x212331e1435a8df230715db4c02b2a3a0abf8c61
Arg [5] : _startDate (uint256): 1652644800

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 000000000000000000000000e4ab77ed89528d90e6bcf0e1ac99c58da24e79d5
Arg [4] : 000000000000000000000000212331e1435a8df230715db4c02b2a3a0abf8c61
Arg [5] : 0000000000000000000000000000000000000000000000000000000062815bc0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [7] : 4d41442043524f57000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [9] : 4d5f43524f570000000000000000000000000000000000000000000000000000
Arg [10] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [11] : 697066733a2f2f736f6f6e2f0000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

196:10069:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3567:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;937:224:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;990:24:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;801:24:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7078:717;;;:::i;:::-;;1577:113:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6120:533:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;755:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:339:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4937:361:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1378:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5938:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1245:256:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3786:146:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;707:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5306:624;;;:::i;:::-;;4534:378;;;:::i;:::-;;3338:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8699:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5285:185:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4155:351:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;946:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8861:620;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1767:233:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:239:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7873:818:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1850:208:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:12;;;:::i;:::-;;1339:32:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1021:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;999:87:12;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:104:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9503:486:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1965:1110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4278:295:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1268:46:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;905:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5541:328:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1065:26:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;832:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;614:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2770:334:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3107:223:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6683:387;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3944:82;;;:::i;:::-;;4644:164:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9997:265:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;861:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1195:49:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3567:211;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3669:8:11::1;3656:9;;:22;;;;:::i;:::-;3637:15;:41;3634:66;;3688:12;;;;;;;;;;;;;;3634:66;3723:5;3711:9;:17;;;;3758:11;3749:5;:21;;;;:::i;:::-;3739:7;:31;;;;3567:211:::0;:::o;937:224:4:-;1039:4;1078:35;1063:50;;;:11;:50;;;;:90;;;;1117:36;1141:11;1117:23;:36::i;:::-;1063:90;1056:97;;937:224;;;:::o;990:24:11:-;;;;:::o;2426:100:3:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3578:341;3508:411;;:::o;801:24:11:-;;;;:::o;7078:717::-;7126:7;;;;;;;;;;;7122:34;;7142:14;;;;;;;;;;;;;;7122:34;7167:21;7220:4;7216:1;744:4;7191:9;;:22;;;;:::i;:::-;:26;;;;:::i;:::-;:33;;;;:::i;:::-;7167:57;;7235:23;7261:7;;;;;;;;;;;:17;;;7279:12;:10;:12::i;:::-;7261:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7235:57;;7303:14;7328:15;7359:9;7354:345;7374:15;7370:1;:19;7354:345;;;7417:7;;;;;;;;;;;:27;;;7445:12;:10;:12::i;:::-;7459:1;7417:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7407:54;;7508:14;:23;7523:7;7508:23;;;;;;;;;;;;;;;;;;;;;7504:147;;7565:13;7555:23;;;;7627:4;7601:14;:23;7616:7;7601:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;7504:147;7669:3;;;;;7354:345;;;;7722:1;7712:6;:11;7709:34;;7732:11;;;;;;;;;;;;;;7709:34;7754:3;;;;;;;;;;;:12;;;7767;:10;:12::i;:::-;7780:6;7754:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7111:684;;;;7078:717::o;1577:113:4:-;1638:7;1665:10;:17;;;;1658:24;;1577:113;:::o;6120:533:11:-;6182:7;6206;;;;;;;;;;;6202:34;;6222:14;;;;;;;;;;;;;;6202:34;6247:23;6273:14;6283:3;6273:9;:14::i;:::-;6247:40;;6298:14;6323:15;6354:9;6349:271;6369:15;6365:1;:19;6349:271;;;6440:26;6460:3;6464:1;6440:19;:26::i;:::-;6430:36;;6485:14;6528:9;;6502:14;:23;6517:7;6502:23;;;;;;;;;;;;:35;6485:52;;6565:6;6556:15;;;;6590:3;;;;;6402:207;6349:271;;;;6638:6;6630:15;;;;;6120:533;;;:::o;755:24::-;;;;:::o;4875:339:3:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;4937:361:11:-;4993:7;;;;;;;;;;;4989:34;;5009:14;;;;;;;;;;;;;;4989:34;5053:16;5061:7;5053;:16::i;:::-;5037:32;;:12;:10;:12::i;:::-;:32;;;5034:58;;5078:14;;;;;;;;;;;;;;5034:58;5103:14;5146:9;;5120:14;:23;5135:7;5120:23;;;;;;;;;;;;:35;;;;:::i;:::-;5103:52;;5179:1;5169:6;:11;5166:34;;5189:11;;;;;;;;;;;;;;5166:34;5237:9;;5211:14;:23;5226:7;5211:23;;;;;;;;;;;:35;;;;5257:3;;;;;;;;;;;:12;;;5270;:10;:12::i;:::-;5283:6;5257:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4978:320;4937:361;:::o;1378:17::-;;;;;;;;;;;;;:::o;5938:174::-;5998:7;6021;;;;;;;;;;;6017:34;;6037:14;;;;;;;;;;;;;;6017:34;6095:9;;6069:14;:23;6084:7;6069:23;;;;;;;;;;;;:35;;;;:::i;:::-;6062:42;;5938:174;;;:::o;1245:256:4:-;1342:7;1378:23;1395:5;1378:16;:23::i;:::-;1370:5;:31;1362:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1467:12;:19;1480:5;1467:19;;;;;;;;;;;;;;;:26;1487:5;1467:26;;;;;;;;;;;;1460:33;;1245:256;;;;:::o;3786:146:11:-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3861:14:11::1;;;;;;;;;;;3858:37;;;3884:11;;;;;;;;;;;;;;3858:37;3921:3;3906:12;:18;;;;;;;;;;;;:::i;:::-;;3786:146:::0;:::o;707:41::-;744:4;707:41;:::o;5306:624::-;5348:7;;;;;;;;;;;5344:34;;5364:14;;;;;;;;;;;;;;5344:34;5389:23;5415;5425:12;:10;:12::i;:::-;5415:9;:23::i;:::-;5389:49;;5449:14;5474:15;5505:9;5500:334;5520:15;5516:1;:19;5500:334;;;5591:35;5611:12;:10;:12::i;:::-;5624:1;5591:19;:35::i;:::-;5581:45;;5645:14;5688:9;;5662:14;:23;5677:7;5662:23;;;;;;;;;;;;:35;5645:52;;5742:9;;5716:14;:23;5731:7;5716:23;;;;;;;;;;;:35;;;;5779:6;5770:15;;;;5804:3;;;;;5553:270;5500:334;;;;5857:1;5847:6;:11;5844:34;;5867:11;;;;;;;;;;;;;;5844:34;5889:3;;;;;;;;;;;:12;;;5902;:10;:12::i;:::-;5915:6;5889:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5333:597;;;5306:624::o;4534:378::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4585:7:11::1;;;;;;;;;;;4581:34;;4601:14;;;;;;;;;;;;;;4581:34;4629:14;;;;;;;;;;;4626:42;;;4652:16;;;;;;;;;;;;;;4626:42;4696:4;4679:14;;:21;;;;;;;;;;;;;;;;;;4711:18;4757:1;744:4;4732:9;;:22;;;;:::i;:::-;:26;;;;:::i;:::-;4711:47;;4769:3;;;;;;;;;;;:12;;;4782;:10;:12::i;:::-;4795:10;4769:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4817:18;4863:1;744:4;4838:9;;:22;;;;:::i;:::-;:26;;;;:::i;:::-;4817:47;;4875:3;;;;;;;;;;;:12;;;1130:42;4893:10;4875:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4570:342;;4534:378::o:0;3338:221::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3441:8:11::1;3428:9;;:22;;;;:::i;:::-;3409:15;:41;3406:66;;3460:12;;;;;;;;;;;;;;3406:66;3495:10;;3486:5;:19;3483:41;;3514:10;;;;;;;;;;;;;;3483:41;3546:5;3535:8;:16;;;;3338:221:::0;:::o;8699:154::-;8757:4;8777:7;;;;;;;;;;;8773:34;;8793:14;;;;;;;;;;;;;;8773:34;8825:14;:20;8840:4;8825:20;;;;;;;;;;;;;;;;;;;;;8818:27;;8699:154;;;:::o;5285:185:3:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;4155:351:11:-;4214:16;4243:23;4269:14;4279:3;4269:9;:14::i;:::-;4243:40;;4294:25;4336:15;4322:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4294:58;;4368:9;4363:110;4383:15;4379:1;:19;4363:110;;;4434:27;4454:3;4459:1;4434:19;:27::i;:::-;4420:8;4429:1;4420:11;;;;;;;;:::i;:::-;;;;;;;:41;;;;;4400:3;;;;;:::i;:::-;;;;4363:110;;;;4490:8;4483:15;;;;4155:351;;;:::o;946:37::-;981:2;946:37;:::o;8861:620::-;8924:7;8948;;;;;;;;;;;8944:34;;8964:14;;;;;;;;;;;;;;8944:34;8989:21;9042:4;9038:1;744:4;9013:9;;:22;;;;:::i;:::-;:26;;;;:::i;:::-;:33;;;;:::i;:::-;8989:57;;9057:23;9083:7;;;;;;;;;;;:17;;;9101:3;9083:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9057:48;;9116:14;9141:15;9172:9;9167:283;9187:15;9183:1;:19;9167:283;;;9230:7;;;;;;;;;;;:27;;;9258:3;9263:1;9230:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9220:45;;9312:14;:23;9327:7;9312:23;;;;;;;;;;;;;;;;;;;;;9308:94;;9369:13;9359:23;;;;9308:94;9420:3;;;;;9167:283;;;;9467:6;9460:13;;;;;;8861:620;;;:::o;1767:233:4:-;1842:7;1878:30;:28;:30::i;:::-;1870:5;:38;1862:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1975:10;1986:5;1975:17;;;;;;;;:::i;:::-;;;;;;;;;;1968:24;;1767:233;;;:::o;2120:239:3:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;7873:818:11:-;7936:7;;;;;;;;;;;7932:34;;7952:14;;;;;;;;;;;;;;7932:34;7977:21;8030:4;8026:1;744:4;8001:9;;:22;;;;:::i;:::-;:26;;;;:::i;:::-;:33;;;;:::i;:::-;7977:57;;8045:23;8071:7;;;;;;;;;;;:17;;;8089:12;:10;:12::i;:::-;8071:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8045:57;;8113:14;8138:15;8198:1;8192:5;:7;;;;:::i;:::-;8185:3;:15;;;;:::i;:::-;8167;:33;8164:61;;;8209:16;;;;;;;;;;;;;;8164:61;8241:9;8259:5;8253:3;:11;;;;:::i;:::-;8241:23;;8236:359;8283:1;8277:5;:7;;;;:::i;:::-;8270:3;:15;;;;:::i;:::-;8266:1;:19;8236:359;;;8313:7;;;;;;;;;;;:27;;;8341:12;:10;:12::i;:::-;8355:1;8313:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8303:54;;8404:14;:23;8419:7;8404:23;;;;;;;;;;;;;;;;;;;;;8400:147;;8461:13;8451:23;;;;8523:4;8497:14;:23;8512:7;8497:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;8400:147;8565:3;;;;;8236:359;;;;8618:1;8608:6;:11;8605:34;;8628:11;;;;;;;;;;;;;;8605:34;8650:3;;;;;;;;;;;:12;;;8663;:10;:12::i;:::-;8676:6;8650:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7921:770;;;;7873:818;:::o;1850:208:3:-;1922:7;1967:1;1950:19;;:5;:19;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1650:94:12:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;1339:32:11:-;;;;;;;;;;;;;:::o;1021:19::-;;;;;;;;;;;;;:::o;999:87:12:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;2595:104:3:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;9503:486:11:-;9549:7;9589:9;;9571:15;:27;9568:414;;;9621:1;9614:8;;;;9568:414;9653:14;9688:9;;9670:15;:27;;;;:::i;:::-;9653:44;;9712:19;981:2;9743:9;;9735:7;;:17;;;;:::i;:::-;9734:30;;;;:::i;:::-;9712:52;;9779:15;9849:1;9834:11;9818;9809:6;:20;;;;:::i;:::-;9799:6;:31;;;;:::i;:::-;9798:47;;;;:::i;:::-;9797:53;;;;:::i;:::-;9779:71;;981:2;9868:7;:18;9865:77;;;9925:1;981:2;9916:10;;;;:::i;:::-;9906:20;;9865:77;9963:7;9956:14;;;;;9503:486;;:::o;1965:1110::-;2015:13;2031:17;:15;:17::i;:::-;2015:33;;2059:18;2088:6;2080:5;:14;;;;:::i;:::-;2059:35;;2118:1;2108:6;:11;2105:33;;2128:10;;;;;;;;;;;;;;2105:33;744:4;2165:6;2153:9;;:18;;;;:::i;:::-;2152:33;2149:54;;;2194:9;;;;;;;;;;;;;;2149:54;2235:9;;2217:15;:27;2214:55;;;2253:16;;;;;;;;;;;;;;2214:55;2296:3;;;;;;;;;;;:13;;;2310:12;:10;:12::i;:::-;2331:4;2296:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2283:10;:54;2280:79;;;2346:13;;;;;;;;;;;;;;2280:79;2403:10;2373:3;;;;;;;;;;;:13;;;2387:12;:10;:12::i;:::-;2373:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;2370:63;;;2422:11;;;;;;;;;;;;;;2370:63;2481:1;2447:7;;;;;;;;;;;:17;;;2465:12;:10;:12::i;:::-;2447:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;2444:63;;;2491:16;;;;;;;;;;;;;;2444:63;2533:9;2545:1;2533:13;;2528:212;2553:6;2548:1;:11;2528:212;;2609:5;2577:14;:29;2604:1;2592:9;;:13;;;;:::i;:::-;2577:29;;;;;;;;;;;:37;;;;2629:38;2639:12;:10;:12::i;:::-;2665:1;2653:9;;:13;;;;:::i;:::-;2629:9;:38::i;:::-;2710:3;;;;;2528:212;;;;2763:6;2750:9;;:19;;;;;;;:::i;:::-;;;;;;;;744:4;2785:9;;:23;2782:140;;2844:5;2824:14;:17;2839:1;2824:17;;;;;;;;;;;:25;;;;2876:5;2864:9;:17;;;;2906:4;2896:7;;:14;;;;;;;;;;;;;;;;;;2782:140;2934:3;;;;;;;;;;;:16;;;2951:12;:10;:12::i;:::-;2972:4;2978:10;2934:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3015:12;:10;:12::i;:::-;3005:62;;;3028:9;;3038:6;3045:15;3061:5;3005:62;;;;;;;;;:::i;:::-;;;;;;;;2004:1071;;1965:1110;:::o;4278:295:3:-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;1268:46:11:-;;;;;;;;;;;;;;;;;;;;;;:::o;905:34::-;;;;:::o;5541:328:3:-;5716:41;5735:12;:10;:12::i;:::-;5749:7;5716:18;:41::i;:::-;5708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5822:39;5836:4;5842:2;5846:7;5855:5;5822:13;:39::i;:::-;5541:328;;;;:::o;1065:26:11:-;;;;;;;;;;;;;:::o;832:22::-;;;;:::o;614:34::-;;;;;;;;;;;;;:::o;2770:334:3:-;2843:13;2877:16;2885:7;2877;:16::i;:::-;2869:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2958:21;2982:10;:8;:10::i;:::-;2958:34;;3034:1;3016:7;3010:21;:25;:86;;;;;;;;;;;;;;;;;3062:7;3071:18;:7;:16;:18::i;:::-;3045:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3010:86;3003:93;;;2770:334;;;:::o;3107:223:11:-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3212:8:11::1;3199:9;;:22;;;;:::i;:::-;3180:15;:41;3177:66;;3231:12;;;;;;;;;;;;;;3177:66;3266:8;;3257:5;:17;3254:39;;3283:10;;;;;;;;;;;;;;3254:39;3317:5;3304:10;:18;;;;3107:223:::0;:::o;6683:387::-;6742:7;;;;;;;;;;;6738:34;;6758:14;;;;;;;;;;;;;;6738:34;6802:7;;;;;;;;;;;:15;;;6818:4;6802:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6786:37;;:12;:10;:12::i;:::-;:37;;;6783:63;;6832:14;;;;;;;;;;;;;;6783:63;6860:14;:20;6875:4;6860:20;;;;;;;;;;;;;;;;;;;;;6857:48;;;6889:16;;;;;;;;;;;;;;6857:48;6916:21;6969:4;6965:1;744:4;6940:9;;:22;;;;:::i;:::-;:26;;;;:::i;:::-;:33;;;;:::i;:::-;6916:57;;7007:4;6984:14;:20;6999:4;6984:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;7022:3;;;;;;;;;;;:12;;;7035;:10;:12::i;:::-;7048:13;7022:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6727:343;6683:387;:::o;3944:82::-;1230:12:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4014:4:11::1;3997:14;;:21;;;;;;;;;;;;;;;;;;3944:82::o:0;4644:164:3:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;9997:265:11:-;10044:7;10063:15;10081:16;:14;:16::i;:::-;10063:34;;10122:1;10111:7;:12;10108:60;;10146:10;;10139:17;;;;;10108:60;981:2;10234:8;;10223:10;;:19;;;;:::i;:::-;10216:1;10208:7;:9;;;;:::i;:::-;981:2;10196:22;;;;:::i;:::-;10195:48;;;;:::i;:::-;:58;;;;:::i;:::-;10185:8;;:69;;;;:::i;:::-;10178:76;;;9997:265;;:::o;861:37::-;;;;:::o;1899:192:12:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;::::0;1980:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;1195:49:11:-;;;;;;;;;;;;;;;;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;13475:126:3:-;;;;:::o;601:98:1:-;654:7;681:10;674:17;;601:98;:::o;1481:305:3:-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;7379:127::-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;11361:174::-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;7673:348::-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;2099:173:12:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2144:128;2099:173;:::o;8363:110:3:-;8439:26;8449:2;8453:7;8439:26;;;;;;;;;;;;:9;:26::i;:::-;8363:110;;:::o;6751:315::-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;4034:113:11:-;4094:13;4127:12;4120:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4034:113;:::o;288:723:13:-;344:13;574:1;565:5;:10;561:53;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;787:157:2:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;2613:589:4:-;2757:45;2784:4;2790:2;2794:7;2757:26;:45::i;:::-;2835:1;2819:18;;:4;:18;;;2815:187;;2854:40;2886:7;2854:31;:40::i;:::-;2815:187;;;2924:2;2916:10;;:4;:10;;;2912:90;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2912:90;2815:187;3030:1;3016:16;;:2;:16;;;3012:183;;3049:45;3086:7;3049:36;:45::i;:::-;3012:183;;;3122:4;3116:10;;:2;:10;;;3112:83;;3143:40;3171:2;3175:7;3143:27;:40::i;:::-;3112:83;3012:183;2613:589;;;:::o;8700:321:3:-;8830:18;8836:2;8840:7;8830:5;:18::i;:::-;8881:54;8912:1;8916:2;8920:7;8929:5;8881:22;:54::i;:::-;8859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8700:321;;;:::o;12100:803::-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:624;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12575:1;12558:6;:13;:18;12554:272;;12601:60;;;;;;;;;;:::i;:::-;;;;;;;;12554:272;12776:6;12770:13;12761:6;12757:2;12753:15;12746:38;12308:533;12445:45;;;12435:55;;;:6;:55;;;;12428:62;;;;;12272:624;12880:4;12873:11;;12100:803;;;;;;;:::o;3925:164:4:-;4029:10;:17;;;;4002:15;:24;4018:7;4002:24;;;;;;;;;;;:44;;;;4057:10;4073:7;4057:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:164;:::o;4716:988::-;4982:22;5032:1;5007:22;5024:4;5007:16;:22::i;:::-;:26;;;;:::i;:::-;4982:51;;5044:18;5065:17;:26;5083:7;5065:26;;;;;;;;;;;;5044:47;;5212:14;5198:10;:28;5194:328;;5243:19;5265:12;:18;5278:4;5265:18;;;;;;;;;;;;;;;:34;5284:14;5265:34;;;;;;;;;;;;5243:56;;5349:11;5316:12;:18;5329:4;5316:18;;;;;;;;;;;;;;;:30;5335:10;5316:30;;;;;;;;;;;:44;;;;5466:10;5433:17;:30;5451:11;5433:30;;;;;;;;;;;:43;;;;5228:294;5194:328;5618:17;:26;5636:7;5618:26;;;;;;;;;;;5611:33;;;5662:12;:18;5675:4;5662:18;;;;;;;;;;;;;;;:34;5681:14;5662:34;;;;;;;;;;;5655:41;;;4797:907;;4716:988;;:::o;5999:1079::-;6252:22;6297:1;6277:10;:17;;;;:21;;;;:::i;:::-;6252:46;;6309:18;6330:15;:24;6346:7;6330:24;;;;;;;;;;;;6309:45;;6681:19;6703:10;6714:14;6703:26;;;;;;;;:::i;:::-;;;;;;;;;;6681:48;;6767:11;6742:10;6753;6742:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6878:10;6847:15;:28;6863:11;6847:28;;;;;;;;;;;:41;;;;7019:15;:24;7035:7;7019:24;;;;;;;;;;;7012:31;;;7054:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6070:1008;;;5999:1079;:::o;3503:221::-;3588:14;3605:20;3622:2;3605:16;:20::i;:::-;3588:37;;3663:7;3636:12;:16;3649:2;3636:16;;;;;;;;;;;;;;;:24;3653:6;3636:24;;;;;;;;;;;:34;;;;3710:6;3681:17;:26;3699:7;3681:26;;;;;;;;;;;:35;;;;3577:147;3503:221;;:::o;9357:382:3:-;9451:1;9437:16;;:2;:16;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:149::-;1061:7;1101:66;1094:5;1090:78;1079:89;;1025:149;;;:::o;1180:120::-;1252:23;1269:5;1252:23;:::i;:::-;1245:5;1242:34;1232:62;;1290:1;1287;1280:12;1232:62;1180:120;:::o;1306:137::-;1351:5;1389:6;1376:20;1367:29;;1405:32;1431:5;1405:32;:::i;:::-;1306:137;;;;:::o;1449:327::-;1507:6;1556:2;1544:9;1535:7;1531:23;1527:32;1524:119;;;1562:79;;:::i;:::-;1524:119;1682:1;1707:52;1751:7;1742:6;1731:9;1727:22;1707:52;:::i;:::-;1697:62;;1653:116;1449:327;;;;:::o;1782:90::-;1816:7;1859:5;1852:13;1845:21;1834:32;;1782:90;;;:::o;1878:109::-;1959:21;1974:5;1959:21;:::i;:::-;1954:3;1947:34;1878:109;;:::o;1993:210::-;2080:4;2118:2;2107:9;2103:18;2095:26;;2131:65;2193:1;2182:9;2178:17;2169:6;2131:65;:::i;:::-;1993:210;;;;:::o;2209:118::-;2296:24;2314:5;2296:24;:::i;:::-;2291:3;2284:37;2209:118;;:::o;2333:222::-;2426:4;2464:2;2453:9;2449:18;2441:26;;2477:71;2545:1;2534:9;2530:17;2521:6;2477:71;:::i;:::-;2333:222;;;;:::o;2561:99::-;2613:6;2647:5;2641:12;2631:22;;2561:99;;;:::o;2666:169::-;2750:11;2784:6;2779:3;2772:19;2824:4;2819:3;2815:14;2800:29;;2666:169;;;;:::o;2841:307::-;2909:1;2919:113;2933:6;2930:1;2927:13;2919:113;;;3018:1;3013:3;3009:11;3003:18;2999:1;2994:3;2990:11;2983:39;2955:2;2952:1;2948:10;2943:15;;2919:113;;;3050:6;3047:1;3044:13;3041:101;;;3130:1;3121:6;3116:3;3112:16;3105:27;3041:101;2890:258;2841:307;;;:::o;3154:102::-;3195:6;3246:2;3242:7;3237:2;3230:5;3226:14;3222:28;3212:38;;3154:102;;;:::o;3262:364::-;3350:3;3378:39;3411:5;3378:39;:::i;:::-;3433:71;3497:6;3492:3;3433:71;:::i;:::-;3426:78;;3513:52;3558:6;3553:3;3546:4;3539:5;3535:16;3513:52;:::i;:::-;3590:29;3612:6;3590:29;:::i;:::-;3585:3;3581:39;3574:46;;3354:272;3262:364;;;;:::o;3632:313::-;3745:4;3783:2;3772:9;3768:18;3760:26;;3832:9;3826:4;3822:20;3818:1;3807:9;3803:17;3796:47;3860:78;3933:4;3924:6;3860:78;:::i;:::-;3852:86;;3632:313;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:60::-;6278:3;6299:5;6292:12;;6250:60;;;:::o;6316:142::-;6366:9;6399:53;6417:34;6426:24;6444:5;6426:24;:::i;:::-;6417:34;:::i;:::-;6399:53;:::i;:::-;6386:66;;6316:142;;;:::o;6464:126::-;6514:9;6547:37;6578:5;6547:37;:::i;:::-;6534:50;;6464:126;;;:::o;6596:141::-;6661:9;6694:37;6725:5;6694:37;:::i;:::-;6681:50;;6596:141;;;:::o;6743:161::-;6845:52;6891:5;6845:52;:::i;:::-;6840:3;6833:65;6743:161;;:::o;6910:252::-;7018:4;7056:2;7045:9;7041:18;7033:26;;7069:86;7152:1;7141:9;7137:17;7128:6;7069:86;:::i;:::-;6910:252;;;;:::o;7168:117::-;7277:1;7274;7267:12;7291:117;7400:1;7397;7390:12;7414:180;7462:77;7459:1;7452:88;7559:4;7556:1;7549:15;7583:4;7580:1;7573:15;7600:281;7683:27;7705:4;7683:27;:::i;:::-;7675:6;7671:40;7813:6;7801:10;7798:22;7777:18;7765:10;7762:34;7759:62;7756:88;;;7824:18;;:::i;:::-;7756:88;7864:10;7860:2;7853:22;7643:238;7600:281;;:::o;7887:129::-;7921:6;7948:20;;:::i;:::-;7938:30;;7977:33;8005:4;7997:6;7977:33;:::i;:::-;7887:129;;;:::o;8022:308::-;8084:4;8174:18;8166:6;8163:30;8160:56;;;8196:18;;:::i;:::-;8160:56;8234:29;8256:6;8234:29;:::i;:::-;8226:37;;8318:4;8312;8308:15;8300:23;;8022:308;;;:::o;8336:154::-;8420:6;8415:3;8410;8397:30;8482:1;8473:6;8468:3;8464:16;8457:27;8336:154;;;:::o;8496:412::-;8574:5;8599:66;8615:49;8657:6;8615:49;:::i;:::-;8599:66;:::i;:::-;8590:75;;8688:6;8681:5;8674:21;8726:4;8719:5;8715:16;8764:3;8755:6;8750:3;8746:16;8743:25;8740:112;;;8771:79;;:::i;:::-;8740:112;8861:41;8895:6;8890:3;8885;8861:41;:::i;:::-;8580:328;8496:412;;;;;:::o;8928:340::-;8984:5;9033:3;9026:4;9018:6;9014:17;9010:27;9000:122;;9041:79;;:::i;:::-;9000:122;9158:6;9145:20;9183:79;9258:3;9250:6;9243:4;9235:6;9231:17;9183:79;:::i;:::-;9174:88;;8990:278;8928:340;;;;:::o;9274:509::-;9343:6;9392:2;9380:9;9371:7;9367:23;9363:32;9360:119;;;9398:79;;:::i;:::-;9360:119;9546:1;9535:9;9531:17;9518:31;9576:18;9568:6;9565:30;9562:117;;;9598:79;;:::i;:::-;9562:117;9703:63;9758:7;9749:6;9738:9;9734:22;9703:63;:::i;:::-;9693:73;;9489:287;9274:509;;;;:::o;9789:114::-;9856:6;9890:5;9884:12;9874:22;;9789:114;;;:::o;9909:184::-;10008:11;10042:6;10037:3;10030:19;10082:4;10077:3;10073:14;10058:29;;9909:184;;;;:::o;10099:132::-;10166:4;10189:3;10181:11;;10219:4;10214:3;10210:14;10202:22;;10099:132;;;:::o;10237:108::-;10314:24;10332:5;10314:24;:::i;:::-;10309:3;10302:37;10237:108;;:::o;10351:179::-;10420:10;10441:46;10483:3;10475:6;10441:46;:::i;:::-;10519:4;10514:3;10510:14;10496:28;;10351:179;;;;:::o;10536:113::-;10606:4;10638;10633:3;10629:14;10621:22;;10536:113;;;:::o;10685:732::-;10804:3;10833:54;10881:5;10833:54;:::i;:::-;10903:86;10982:6;10977:3;10903:86;:::i;:::-;10896:93;;11013:56;11063:5;11013:56;:::i;:::-;11092:7;11123:1;11108:284;11133:6;11130:1;11127:13;11108:284;;;11209:6;11203:13;11236:63;11295:3;11280:13;11236:63;:::i;:::-;11229:70;;11322:60;11375:6;11322:60;:::i;:::-;11312:70;;11168:224;11155:1;11152;11148:9;11143:14;;11108:284;;;11112:14;11408:3;11401:10;;10809:608;;;10685:732;;;;:::o;11423:373::-;11566:4;11604:2;11593:9;11589:18;11581:26;;11653:9;11647:4;11643:20;11639:1;11628:9;11624:17;11617:47;11681:108;11784:4;11775:6;11681:108;:::i;:::-;11673:116;;11423:373;;;;:::o;11802:152::-;11878:9;11911:37;11942:5;11911:37;:::i;:::-;11898:50;;11802:152;;;:::o;11960:183::-;12073:63;12130:5;12073:63;:::i;:::-;12068:3;12061:76;11960:183;;:::o;12149:274::-;12268:4;12306:2;12295:9;12291:18;12283:26;;12319:97;12413:1;12402:9;12398:17;12389:6;12319:97;:::i;:::-;12149:274;;;;:::o;12429:116::-;12499:21;12514:5;12499:21;:::i;:::-;12492:5;12489:32;12479:60;;12535:1;12532;12525:12;12479:60;12429:116;:::o;12551:133::-;12594:5;12632:6;12619:20;12610:29;;12648:30;12672:5;12648:30;:::i;:::-;12551:133;;;;:::o;12690:468::-;12755:6;12763;12812:2;12800:9;12791:7;12787:23;12783:32;12780:119;;;12818:79;;:::i;:::-;12780:119;12938:1;12963:53;13008:7;12999:6;12988:9;12984:22;12963:53;:::i;:::-;12953:63;;12909:117;13065:2;13091:50;13133:7;13124:6;13113:9;13109:22;13091:50;:::i;:::-;13081:60;;13036:115;12690:468;;;;;:::o;13164:307::-;13225:4;13315:18;13307:6;13304:30;13301:56;;;13337:18;;:::i;:::-;13301:56;13375:29;13397:6;13375:29;:::i;:::-;13367:37;;13459:4;13453;13449:15;13441:23;;13164:307;;;:::o;13477:410::-;13554:5;13579:65;13595:48;13636:6;13595:48;:::i;:::-;13579:65;:::i;:::-;13570:74;;13667:6;13660:5;13653:21;13705:4;13698:5;13694:16;13743:3;13734:6;13729:3;13725:16;13722:25;13719:112;;;13750:79;;:::i;:::-;13719:112;13840:41;13874:6;13869:3;13864;13840:41;:::i;:::-;13560:327;13477:410;;;;;:::o;13906:338::-;13961:5;14010:3;14003:4;13995:6;13991:17;13987:27;13977:122;;14018:79;;:::i;:::-;13977:122;14135:6;14122:20;14160:78;14234:3;14226:6;14219:4;14211:6;14207:17;14160:78;:::i;:::-;14151:87;;13967:277;13906:338;;;;:::o;14250:943::-;14345:6;14353;14361;14369;14418:3;14406:9;14397:7;14393:23;14389:33;14386:120;;;14425:79;;:::i;:::-;14386:120;14545:1;14570:53;14615:7;14606:6;14595:9;14591:22;14570:53;:::i;:::-;14560:63;;14516:117;14672:2;14698:53;14743:7;14734:6;14723:9;14719:22;14698:53;:::i;:::-;14688:63;;14643:118;14800:2;14826:53;14871:7;14862:6;14851:9;14847:22;14826:53;:::i;:::-;14816:63;;14771:118;14956:2;14945:9;14941:18;14928:32;14987:18;14979:6;14976:30;14973:117;;;15009:79;;:::i;:::-;14973:117;15114:62;15168:7;15159:6;15148:9;15144:22;15114:62;:::i;:::-;15104:72;;14899:287;14250:943;;;;;;;:::o;15199:474::-;15267:6;15275;15324:2;15312:9;15303:7;15299:23;15295:32;15292:119;;;15330:79;;:::i;:::-;15292:119;15450:1;15475:53;15520:7;15511:6;15500:9;15496:22;15475:53;:::i;:::-;15465:63;;15421:117;15577:2;15603:53;15648:7;15639:6;15628:9;15624:22;15603:53;:::i;:::-;15593:63;;15548:118;15199:474;;;;;:::o;15679:182::-;15819:34;15815:1;15807:6;15803:14;15796:58;15679:182;:::o;15867:366::-;16009:3;16030:67;16094:2;16089:3;16030:67;:::i;:::-;16023:74;;16106:93;16195:3;16106:93;:::i;:::-;16224:2;16219:3;16215:12;16208:19;;15867:366;;;:::o;16239:419::-;16405:4;16443:2;16432:9;16428:18;16420:26;;16492:9;16486:4;16482:20;16478:1;16467:9;16463:17;16456:47;16520:131;16646:4;16520:131;:::i;:::-;16512:139;;16239:419;;;:::o;16664:180::-;16712:77;16709:1;16702:88;16809:4;16806:1;16799:15;16833:4;16830:1;16823:15;16850:191;16890:4;16910:20;16928:1;16910:20;:::i;:::-;16905:25;;16944:20;16962:1;16944:20;:::i;:::-;16939:25;;16983:1;16980;16977:8;16974:34;;;16988:18;;:::i;:::-;16974:34;17033:1;17030;17026:9;17018:17;;16850:191;;;;:::o;17047:305::-;17087:3;17106:20;17124:1;17106:20;:::i;:::-;17101:25;;17140:20;17158:1;17140:20;:::i;:::-;17135:25;;17294:1;17226:66;17222:74;17219:1;17216:81;17213:107;;;17300:18;;:::i;:::-;17213:107;17344:1;17341;17337:9;17330:16;;17047:305;;;;:::o;17358:180::-;17406:77;17403:1;17396:88;17503:4;17500:1;17493:15;17527:4;17524:1;17517:15;17544:320;17588:6;17625:1;17619:4;17615:12;17605:22;;17672:1;17666:4;17662:12;17693:18;17683:81;;17749:4;17741:6;17737:17;17727:27;;17683:81;17811:2;17803:6;17800:14;17780:18;17777:38;17774:84;;17830:18;;:::i;:::-;17774:84;17595:269;17544:320;;;:::o;17870:231::-;18010:34;18006:1;17998:6;17994:14;17987:58;18079:14;18074:2;18066:6;18062:15;18055:39;17870:231;:::o;18107:366::-;18249:3;18270:67;18334:2;18329:3;18270:67;:::i;:::-;18263:74;;18346:93;18435:3;18346:93;:::i;:::-;18464:2;18459:3;18455:12;18448:19;;18107:366;;;:::o;18479:419::-;18645:4;18683:2;18672:9;18668:18;18660:26;;18732:9;18726:4;18722:20;18718:1;18707:9;18703:17;18696:47;18760:131;18886:4;18760:131;:::i;:::-;18752:139;;18479:419;;;:::o;18904:220::-;19044:34;19040:1;19032:6;19028:14;19021:58;19113:3;19108:2;19100:6;19096:15;19089:28;18904:220;:::o;19130:366::-;19272:3;19293:67;19357:2;19352:3;19293:67;:::i;:::-;19286:74;;19369:93;19458:3;19369:93;:::i;:::-;19487:2;19482:3;19478:12;19471:19;;19130:366;;;:::o;19502:419::-;19668:4;19706:2;19695:9;19691:18;19683:26;;19755:9;19749:4;19745:20;19741:1;19730:9;19726:17;19719:47;19783:131;19909:4;19783:131;:::i;:::-;19775:139;;19502:419;;;:::o;19927:243::-;20067:34;20063:1;20055:6;20051:14;20044:58;20136:26;20131:2;20123:6;20119:15;20112:51;19927:243;:::o;20176:366::-;20318:3;20339:67;20403:2;20398:3;20339:67;:::i;:::-;20332:74;;20415:93;20504:3;20415:93;:::i;:::-;20533:2;20528:3;20524:12;20517:19;;20176:366;;;:::o;20548:419::-;20714:4;20752:2;20741:9;20737:18;20729:26;;20801:9;20795:4;20791:20;20787:1;20776:9;20772:17;20765:47;20829:131;20955:4;20829:131;:::i;:::-;20821:139;;20548:419;;;:::o;20973:348::-;21013:7;21036:20;21054:1;21036:20;:::i;:::-;21031:25;;21070:20;21088:1;21070:20;:::i;:::-;21065:25;;21258:1;21190:66;21186:74;21183:1;21180:81;21175:1;21168:9;21161:17;21157:105;21154:131;;;21265:18;;:::i;:::-;21154:131;21313:1;21310;21306:9;21295:20;;20973:348;;;;:::o;21327:180::-;21375:77;21372:1;21365:88;21472:4;21469:1;21462:15;21496:4;21493:1;21486:15;21513:185;21553:1;21570:20;21588:1;21570:20;:::i;:::-;21565:25;;21604:20;21622:1;21604:20;:::i;:::-;21599:25;;21643:1;21633:35;;21648:18;;:::i;:::-;21633:35;21690:1;21687;21683:9;21678:14;;21513:185;;;;:::o;21704:143::-;21761:5;21792:6;21786:13;21777:22;;21808:33;21835:5;21808:33;:::i;:::-;21704:143;;;;:::o;21853:351::-;21923:6;21972:2;21960:9;21951:7;21947:23;21943:32;21940:119;;;21978:79;;:::i;:::-;21940:119;22098:1;22123:64;22179:7;22170:6;22159:9;22155:22;22123:64;:::i;:::-;22113:74;;22069:128;21853:351;;;;:::o;22210:332::-;22331:4;22369:2;22358:9;22354:18;22346:26;;22382:71;22450:1;22439:9;22435:17;22426:6;22382:71;:::i;:::-;22463:72;22531:2;22520:9;22516:18;22507:6;22463:72;:::i;:::-;22210:332;;;;;:::o;22548:137::-;22602:5;22633:6;22627:13;22618:22;;22649:30;22673:5;22649:30;:::i;:::-;22548:137;;;;:::o;22691:345::-;22758:6;22807:2;22795:9;22786:7;22782:23;22778:32;22775:119;;;22813:79;;:::i;:::-;22775:119;22933:1;22958:61;23011:7;23002:6;22991:9;22987:22;22958:61;:::i;:::-;22948:71;;22904:125;22691:345;;;;:::o;23042:236::-;23182:34;23178:1;23170:6;23166:14;23159:58;23251:19;23246:2;23238:6;23234:15;23227:44;23042:236;:::o;23284:366::-;23426:3;23447:67;23511:2;23506:3;23447:67;:::i;:::-;23440:74;;23523:93;23612:3;23523:93;:::i;:::-;23641:2;23636:3;23632:12;23625:19;;23284:366;;;:::o;23656:419::-;23822:4;23860:2;23849:9;23845:18;23837:26;;23909:9;23903:4;23899:20;23895:1;23884:9;23880:17;23873:47;23937:131;24063:4;23937:131;:::i;:::-;23929:139;;23656:419;;;:::o;24081:230::-;24221:34;24217:1;24209:6;24205:14;24198:58;24290:13;24285:2;24277:6;24273:15;24266:38;24081:230;:::o;24317:366::-;24459:3;24480:67;24544:2;24539:3;24480:67;:::i;:::-;24473:74;;24556:93;24645:3;24556:93;:::i;:::-;24674:2;24669:3;24665:12;24658:19;;24317:366;;;:::o;24689:419::-;24855:4;24893:2;24882:9;24878:18;24870:26;;24942:9;24936:4;24932:20;24928:1;24917:9;24913:17;24906:47;24970:131;25096:4;24970:131;:::i;:::-;24962:139;;24689:419;;;:::o;25114:180::-;25162:77;25159:1;25152:88;25259:4;25256:1;25249:15;25283:4;25280:1;25273:15;25300:233;25339:3;25362:24;25380:5;25362:24;:::i;:::-;25353:33;;25408:66;25401:5;25398:77;25395:103;;25478:18;;:::i;:::-;25395:103;25525:1;25518:5;25514:13;25507:20;;25300:233;;;:::o;25539:231::-;25679:34;25675:1;25667:6;25663:14;25656:58;25748:14;25743:2;25735:6;25731:15;25724:39;25539:231;:::o;25776:366::-;25918:3;25939:67;26003:2;25998:3;25939:67;:::i;:::-;25932:74;;26015:93;26104:3;26015:93;:::i;:::-;26133:2;26128:3;26124:12;26117:19;;25776:366;;;:::o;26148:419::-;26314:4;26352:2;26341:9;26337:18;26329:26;;26401:9;26395:4;26391:20;26387:1;26376:9;26372:17;26365:47;26429:131;26555:4;26429:131;:::i;:::-;26421:139;;26148:419;;;:::o;26573:228::-;26713:34;26709:1;26701:6;26697:14;26690:58;26782:11;26777:2;26769:6;26765:15;26758:36;26573:228;:::o;26807:366::-;26949:3;26970:67;27034:2;27029:3;26970:67;:::i;:::-;26963:74;;27046:93;27135:3;27046:93;:::i;:::-;27164:2;27159:3;27155:12;27148:19;;26807:366;;;:::o;27179:419::-;27345:4;27383:2;27372:9;27368:18;27360:26;;27432:9;27426:4;27422:20;27418:1;27407:9;27403:17;27396:47;27460:131;27586:4;27460:131;:::i;:::-;27452:139;;27179:419;;;:::o;27604:229::-;27744:34;27740:1;27732:6;27728:14;27721:58;27813:12;27808:2;27800:6;27796:15;27789:37;27604:229;:::o;27839:366::-;27981:3;28002:67;28066:2;28061:3;28002:67;:::i;:::-;27995:74;;28078:93;28167:3;28078:93;:::i;:::-;28196:2;28191:3;28187:12;28180:19;;27839:366;;;:::o;28211:419::-;28377:4;28415:2;28404:9;28400:18;28392:26;;28464:9;28458:4;28454:20;28450:1;28439:9;28435:17;28428:47;28492:131;28618:4;28492:131;:::i;:::-;28484:139;;28211:419;;;:::o;28636:176::-;28668:1;28685:20;28703:1;28685:20;:::i;:::-;28680:25;;28719:20;28737:1;28719:20;:::i;:::-;28714:25;;28758:1;28748:35;;28763:18;;:::i;:::-;28748:35;28804:1;28801;28797:9;28792:14;;28636:176;;;;:::o;28818:332::-;28939:4;28977:2;28966:9;28962:18;28954:26;;28990:71;29058:1;29047:9;29043:17;29034:6;28990:71;:::i;:::-;29071:72;29139:2;29128:9;29124:18;29115:6;29071:72;:::i;:::-;28818:332;;;;;:::o;29156:442::-;29305:4;29343:2;29332:9;29328:18;29320:26;;29356:71;29424:1;29413:9;29409:17;29400:6;29356:71;:::i;:::-;29437:72;29505:2;29494:9;29490:18;29481:6;29437:72;:::i;:::-;29519;29587:2;29576:9;29572:18;29563:6;29519:72;:::i;:::-;29156:442;;;;;;:::o;29604:553::-;29781:4;29819:3;29808:9;29804:19;29796:27;;29833:71;29901:1;29890:9;29886:17;29877:6;29833:71;:::i;:::-;29914:72;29982:2;29971:9;29967:18;29958:6;29914:72;:::i;:::-;29996;30064:2;30053:9;30049:18;30040:6;29996:72;:::i;:::-;30078;30146:2;30135:9;30131:18;30122:6;30078:72;:::i;:::-;29604:553;;;;;;;:::o;30163:175::-;30303:27;30299:1;30291:6;30287:14;30280:51;30163:175;:::o;30344:366::-;30486:3;30507:67;30571:2;30566:3;30507:67;:::i;:::-;30500:74;;30583:93;30672:3;30583:93;:::i;:::-;30701:2;30696:3;30692:12;30685:19;;30344:366;;;:::o;30716:419::-;30882:4;30920:2;30909:9;30905:18;30897:26;;30969:9;30963:4;30959:20;30955:1;30944:9;30940:17;30933:47;30997:131;31123:4;30997:131;:::i;:::-;30989:139;;30716:419;;;:::o;31141:234::-;31281:34;31277:1;31269:6;31265:14;31258:58;31350:17;31345:2;31337:6;31333:15;31326:42;31141:234;:::o;31381:366::-;31523:3;31544:67;31608:2;31603:3;31544:67;:::i;:::-;31537:74;;31620:93;31709:3;31620:93;:::i;:::-;31738:2;31733:3;31729:12;31722:19;;31381:366;;;:::o;31753:419::-;31919:4;31957:2;31946:9;31942:18;31934:26;;32006:9;32000:4;31996:20;31992:1;31981:9;31977:17;31970:47;32034:131;32160:4;32034:131;:::i;:::-;32026:139;;31753:419;;;:::o;32178:148::-;32280:11;32317:3;32302:18;;32178:148;;;;:::o;32332:377::-;32438:3;32466:39;32499:5;32466:39;:::i;:::-;32521:89;32603:6;32598:3;32521:89;:::i;:::-;32514:96;;32619:52;32664:6;32659:3;32652:4;32645:5;32641:16;32619:52;:::i;:::-;32696:6;32691:3;32687:16;32680:23;;32442:267;32332:377;;;;:::o;32715:435::-;32895:3;32917:95;33008:3;32999:6;32917:95;:::i;:::-;32910:102;;33029:95;33120:3;33111:6;33029:95;:::i;:::-;33022:102;;33141:3;33134:10;;32715:435;;;;;:::o;33156:143::-;33213:5;33244:6;33238:13;33229:22;;33260:33;33287:5;33260:33;:::i;:::-;33156:143;;;;:::o;33305:351::-;33375:6;33424:2;33412:9;33403:7;33399:23;33395:32;33392:119;;;33430:79;;:::i;:::-;33392:119;33550:1;33575:64;33631:7;33622:6;33611:9;33607:22;33575:64;:::i;:::-;33565:74;;33521:128;33305:351;;;;:::o;33662:225::-;33802:34;33798:1;33790:6;33786:14;33779:58;33871:8;33866:2;33858:6;33854:15;33847:33;33662:225;:::o;33893:366::-;34035:3;34056:67;34120:2;34115:3;34056:67;:::i;:::-;34049:74;;34132:93;34221:3;34132:93;:::i;:::-;34250:2;34245:3;34241:12;34234:19;;33893:366;;;:::o;34265:419::-;34431:4;34469:2;34458:9;34454:18;34446:26;;34518:9;34512:4;34508:20;34504:1;34493:9;34489:17;34482:47;34546:131;34672:4;34546:131;:::i;:::-;34538:139;;34265:419;;;:::o;34690:231::-;34830:34;34826:1;34818:6;34814:14;34807:58;34899:14;34894:2;34886:6;34882:15;34875:39;34690:231;:::o;34927:366::-;35069:3;35090:67;35154:2;35149:3;35090:67;:::i;:::-;35083:74;;35166:93;35255:3;35166:93;:::i;:::-;35284:2;35279:3;35275:12;35268:19;;34927:366;;;:::o;35299:419::-;35465:4;35503:2;35492:9;35488:18;35480:26;;35552:9;35546:4;35542:20;35538:1;35527:9;35523:17;35516:47;35580:131;35706:4;35580:131;:::i;:::-;35572:139;;35299:419;;;:::o;35724:228::-;35864:34;35860:1;35852:6;35848:14;35841:58;35933:11;35928:2;35920:6;35916:15;35909:36;35724:228;:::o;35958:366::-;36100:3;36121:67;36185:2;36180:3;36121:67;:::i;:::-;36114:74;;36197:93;36286:3;36197:93;:::i;:::-;36315:2;36310:3;36306:12;36299:19;;35958:366;;;:::o;36330:419::-;36496:4;36534:2;36523:9;36519:18;36511:26;;36583:9;36577:4;36573:20;36569:1;36558:9;36554:17;36547:47;36611:131;36737:4;36611:131;:::i;:::-;36603:139;;36330:419;;;:::o;36755:223::-;36895:34;36891:1;36883:6;36879:14;36872:58;36964:6;36959:2;36951:6;36947:15;36940:31;36755:223;:::o;36984:366::-;37126:3;37147:67;37211:2;37206:3;37147:67;:::i;:::-;37140:74;;37223:93;37312:3;37223:93;:::i;:::-;37341:2;37336:3;37332:12;37325:19;;36984:366;;;:::o;37356:419::-;37522:4;37560:2;37549:9;37545:18;37537:26;;37609:9;37603:4;37599:20;37595:1;37584:9;37580:17;37573:47;37637:131;37763:4;37637:131;:::i;:::-;37629:139;;37356:419;;;:::o;37781:237::-;37921:34;37917:1;37909:6;37905:14;37898:58;37990:20;37985:2;37977:6;37973:15;37966:45;37781:237;:::o;38024:366::-;38166:3;38187:67;38251:2;38246:3;38187:67;:::i;:::-;38180:74;;38263:93;38352:3;38263:93;:::i;:::-;38381:2;38376:3;38372:12;38365:19;;38024:366;;;:::o;38396:419::-;38562:4;38600:2;38589:9;38585:18;38577:26;;38649:9;38643:4;38639:20;38635:1;38624:9;38620:17;38613:47;38677:131;38803:4;38677:131;:::i;:::-;38669:139;;38396:419;;;:::o;38821:98::-;38872:6;38906:5;38900:12;38890:22;;38821:98;;;:::o;38925:168::-;39008:11;39042:6;39037:3;39030:19;39082:4;39077:3;39073:14;39058:29;;38925:168;;;;:::o;39099:360::-;39185:3;39213:38;39245:5;39213:38;:::i;:::-;39267:70;39330:6;39325:3;39267:70;:::i;:::-;39260:77;;39346:52;39391:6;39386:3;39379:4;39372:5;39368:16;39346:52;:::i;:::-;39423:29;39445:6;39423:29;:::i;:::-;39418:3;39414:39;39407:46;;39189:270;39099:360;;;;:::o;39465:640::-;39660:4;39698:3;39687:9;39683:19;39675:27;;39712:71;39780:1;39769:9;39765:17;39756:6;39712:71;:::i;:::-;39793:72;39861:2;39850:9;39846:18;39837:6;39793:72;:::i;:::-;39875;39943:2;39932:9;39928:18;39919:6;39875:72;:::i;:::-;39994:9;39988:4;39984:20;39979:2;39968:9;39964:18;39957:48;40022:76;40093:4;40084:6;40022:76;:::i;:::-;40014:84;;39465:640;;;;;;;:::o;40111:141::-;40167:5;40198:6;40192:13;40183:22;;40214:32;40240:5;40214:32;:::i;:::-;40111:141;;;;:::o;40258:349::-;40327:6;40376:2;40364:9;40355:7;40351:23;40347:32;40344:119;;;40382:79;;:::i;:::-;40344:119;40502:1;40527:63;40582:7;40573:6;40562:9;40558:22;40527:63;:::i;:::-;40517:73;;40473:127;40258:349;;;;:::o;40613:180::-;40661:77;40658:1;40651:88;40758:4;40755:1;40748:15;40782:4;40779:1;40772:15;40799:182;40939:34;40935:1;40927:6;40923:14;40916:58;40799:182;:::o;40987:366::-;41129:3;41150:67;41214:2;41209:3;41150:67;:::i;:::-;41143:74;;41226:93;41315:3;41226:93;:::i;:::-;41344:2;41339:3;41335:12;41328:19;;40987:366;;;:::o;41359:419::-;41525:4;41563:2;41552:9;41548:18;41540:26;;41612:9;41606:4;41602:20;41598:1;41587:9;41583:17;41576:47;41640:131;41766:4;41640:131;:::i;:::-;41632:139;;41359:419;;;:::o;41784:178::-;41924:30;41920:1;41912:6;41908:14;41901:54;41784:178;:::o;41968:366::-;42110:3;42131:67;42195:2;42190:3;42131:67;:::i;:::-;42124:74;;42207:93;42296:3;42207:93;:::i;:::-;42325:2;42320:3;42316:12;42309:19;;41968:366;;;:::o;42340:419::-;42506:4;42544:2;42533:9;42529:18;42521:26;;42593:9;42587:4;42583:20;42579:1;42568:9;42564:17;42557:47;42621:131;42747:4;42621:131;:::i;:::-;42613:139;;42340:419;;;:::o

Swarm Source

ipfs://8b7086c00d5e871ac0dc06fca55fbc1e8d6586ded0f78130534e3375065b2cbb
Loading