ETH Price: $3,361.08 (-0.63%)
Gas: 10 Gwei

Token

MYTHICAL (MC)
 

Overview

Max Total Supply

525 MC

Holders

279

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MC
0x2c3244f7761540e41859d9a446b489b08a85a058
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The ecosystem of Mythical Dreamland P2E game will be driven by the Mythical Creatures Genesis Collection and the Inhibitor. Alice token will help you navigate through Dreamland and build your collection of Mythical Friends.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MYTHICAL

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 50000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-12
*/

// SPDX-License-Identifier: MIT
// Creator: Mai of Tessera Labs
// Special Thanks to Diversity from Divine Anarchy for all his help reviewing

pragma solidity ^0.8.12;

/**
 * @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);
    }
}


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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        bytes32 computedHash = leaf;

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

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

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


interface ERC721TokenReceiver {
    function onERC721Received(address operator,address from, uint256 id, bytes calldata data) external returns (bytes4);
}

interface IInhibitor {
    function mintHelper(address _user, uint256 quantity) external;
}

interface IStakingHelper {
    function startSeason(uint256 _dailyYield) external;
    function endSeason() external;
    function needsRewardsUpdate(address _user) external view returns (bool);
    function aggregateRewards(address _user) external;
}

error OwnerOfNullValue();
error BalanceOfZeroAddress();
error MintZeroAddress();
error MintZeroQuantity();
error SafeMintZeroQuantity();
error SafeMintZeroAddress();
error SafeMintUnsafeDestination();
error TokensLocked();
error CallerLacksTransferPermissions();
error TransferFromNotOwner();
error TransferZeroAddress();
error SafeTransferUnsafeDestination();
error TokensNotBatchable();
error BatchQuantityTooSmall();
error ApprovalToOwner();
error CallerLacksApprovalPermissions();
error getApprovedNonexistentToken();
error stakingNotActive();
error TokensStaked();
error TokensUnstaked();
error StakedTokensTimeLocked();
error StakingActive();
error beginStakingZeroAddress();
error StakingInactive();
error UnsupportedCooldownDuration();
error CooldownTooSmall();
error TokensUnlocked();
error NewOwnerAddressZero();
error TokenURINonexistentToken();
error TokensZeroBalance();
error TokensOfOwnerNullValue();
error CallerNotStakingHelper();
error CallerNotOwner();

/**
 * Built to optimize for lower gas during batch mints and transfers. 
 * A new locking mechanism has been added to protect users from all attempted scams.
 * New "Phantom Staking" is supported allowing for users to participate in token staking without large gas overhead or transferring tokens.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 */
abstract contract ERC721LPhantomStakeable {
    using Address for address;
    using Strings for uint256;

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    event Locked(address indexed owner, uint256 unlockCooldown);
    event Unlocked(address indexed owner, uint256 unlockTimestamp);
    event Staked(address indexed owner, uint256 stakedTimestamp);
    event Unstaked(address indexed owner, uint256 unstakedTimestamp);
    event StakingEventStarted(address indexed stakingContract, uint256 dailyYield, uint256 timestamp);
    event StakingEventEnded(uint256 timestamp);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    struct addressData {
        uint64 balance;
        bool staked;
        bool locked;
        uint64 lockedUnlockCooldown;
        uint64 lockedUnlockTimestamp;
    }

    struct collectionData {
        string name;
        string symbol;
        address owner;
        uint256 index;
        uint256 burned;
    }

    struct stakingData {
        IStakingHelper stakingContract;
        bool stakingStatus;
    }

    collectionData internal _collectionData;
    stakingData internal _stakingData;

    mapping(uint256 => address) internal _ownerships;
    mapping(address => addressData) internal _addressData;
    mapping(uint256 => address) internal _tokenApprovals;
    mapping(address => mapping(address => bool)) private  _operatorApprovals;

    constructor(string memory _name, string memory _symbol) {
        _collectionData.name = _name;
        _collectionData.symbol = _symbol;
        _transferOwnership(_msgSender());
    }

    function _msgSender() internal view returns (address) {
        return msg.sender;
    }

    /**
     * @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` or `_safeMint`),
     */
    function _exists(uint256 tokenId) public view virtual returns (bool) {
        return tokenId < _collectionData.index;
    }

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual returns (address) {
        unchecked {
            if (tokenId < _collectionData.index) {
                address ownership = _ownerships[tokenId];
                if (ownership != address(0)) {
                    return ownership;
                }
                    while (true) {
                        tokenId--;
                        ownership = _ownerships[tokenId];

                        if (ownership != address(0)) {
                            return ownership;
                        }
                         
                    }
                }
            }

        revert OwnerOfNullValue();
    }

    /**
     * @dev Returns the number of tokens in `_owner`'s account.
     */
    function balanceOf(address _address) public view returns (uint256) {
        if (_address == address(0)) revert BalanceOfZeroAddress();
        return uint256(_addressData[_address].balance);
    }

    /**
     * @dev Returns whether `_owner`'s tokens are currently unlocked.
     */
    function isUnlocked(address _owner) public view returns (bool) {
        return 
            !_addressData[_owner].locked && 
            _addressData[_owner].lockedUnlockTimestamp < block.timestamp && 
            (_stakingData.stakingStatus ? !_addressData[_owner].staked : true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        if (to == address(0)) revert MintZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        if (_stakingData.stakingStatus && _addressData[to].staked && _stakingData.stakingContract.needsRewardsUpdate(to)){
            _stakingData.stakingContract.aggregateRewards(to);
        }

        unchecked {
            uint256 updatedIndex = _collectionData.index;
            _addressData[to].balance += uint64(quantity);
            _ownerships[updatedIndex] = to;
            
            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex++);
            }

            _collectionData.index = updatedIndex;
        }
    }

    /**
     * @dev See Below {ERC721L-_safeMint}.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

        if (_stakingData.stakingStatus && _addressData[to].staked && _stakingData.stakingContract.needsRewardsUpdate(to)){
            _stakingData.stakingContract.aggregateRewards(to);
        }

        unchecked {
            uint256 updatedIndex = _collectionData.index;
            _addressData[to].balance += uint64(quantity);
            _ownerships[updatedIndex] = to;
            
            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if(to.code.length > 0 &&
                        ERC721TokenReceiver(to).onERC721Received(_msgSender(), address(0), updatedIndex, _data) !=
                        ERC721TokenReceiver.onERC721Received.selector) revert SafeMintUnsafeDestination();
                updatedIndex++;
            }

            _collectionData.index = updatedIndex;
        }
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - `from` must not have tokens locked.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) public {
        address currentOwner = ownerOf(tokenId);
        if (!isUnlocked(from)) revert TokensLocked();
        if (_msgSender() != currentOwner &&
            getApproved(tokenId) != _msgSender() &&
            !isApprovedForAll(currentOwner,_msgSender())) revert CallerLacksTransferPermissions();
        if (currentOwner != from) revert TransferFromNotOwner();
        if (to == address(0)) revert TransferZeroAddress();

        if (_stakingData.stakingStatus && _addressData[to].staked && _stakingData.stakingContract.needsRewardsUpdate(to)){
            _stakingData.stakingContract.aggregateRewards(to);
        }

        delete _tokenApprovals[tokenId]; 
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
            _ownerships[tokenId] = to;
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId] == address(0) && nextTokenId < _collectionData.index) {
                _ownerships[nextTokenId] = currentOwner;
            }
        }

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @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 {ERC721TokenReceiver}, which is called upon a safe transfer.
     * - `from` must not have tokens locked.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual {
        transferFrom(from, to, tokenId);
        if (to.code.length > 0 &&
                ERC721TokenReceiver(to).onERC721Received(_msgSender(), address(0), tokenId, _data) !=
                ERC721TokenReceiver.onERC721Received.selector) revert SafeTransferUnsafeDestination();
    }

    /**
     * @dev Batch transfers `quantity` tokens sequentially starting at `startID` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `startID` token and all sequential tokens must exist and be owned by `from`.
     * - `from` must not have tokens locked.
     *
     * Emits `quantity` number of {Transfer} events.
     */
    function batchTransferFrom(address from, address to, uint256 startID, uint256 quantity) public virtual {
        _batchTransferFrom(from, to, startID, quantity, false, '');
    }

    /**
     * @dev See Below {ERC721L-batchSafeTransferFrom}.
     */
    function batchSafeTransferFrom(address from, address to, uint256 startID, uint256 quantity) public virtual {
        batchSafeTransferFrom(from, to, startID, quantity, '');
    }

    /**
     * @dev Safely batch transfers `quantity` tokens sequentially starting at `startID` 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.
     * - `startID` token and all sequential tokens 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 {ERC721TokenReceiver}, which is called upon a safe transfer.
     * - `from` must not have tokens locked.
     *
     * Emits `quantity` number of {Transfer} events.
     */
    function batchSafeTransferFrom(address from, address to, uint256 startID, uint256 quantity, bytes memory _data) public virtual {
        _batchTransferFrom(from, to, startID, quantity, true, _data);
    }

    function _batchTransferFrom (address from, address to, uint256 startID, uint256 quantity, bool safeTransferCheck, bytes memory _data) internal {
        if (!isUnlocked(from)) revert TokensLocked();
        if (_msgSender() != from && !isApprovedForAll(from,_msgSender())) revert CallerLacksTransferPermissions();
        if (!multiOwnerCheck(from, startID, quantity)) revert TokensNotBatchable();
        if (to == address(0)) revert TransferZeroAddress();

        if (_stakingData.stakingStatus && _addressData[to].staked && _stakingData.stakingContract.needsRewardsUpdate(to)){
            _stakingData.stakingContract.aggregateRewards(to);
        }

        unchecked {
            for (uint256 i; i < quantity; i++) {
                uint256 currentToken = startID + i;
                delete _tokenApprovals[currentToken];

                if (i == 0){
                    _ownerships[currentToken] = to;
                } else {
                    delete _ownerships[currentToken];
                }
                emit Transfer(from, to, currentToken);
                if (safeTransferCheck){
                    if(to.code.length > 0 &&
                        ERC721TokenReceiver(to).onERC721Received(_msgSender(), address(0), currentToken, _data) !=
                        ERC721TokenReceiver.onERC721Received.selector) revert SafeTransferUnsafeDestination();
                }
            }

            _addressData[from].balance -= uint64(quantity);
            _addressData[to].balance += uint64(quantity);
            uint256 nextTokenId = startID + quantity;
            if (_ownerships[nextTokenId] == address(0) && nextTokenId < _collectionData.index) {
                _ownerships[nextTokenId] = from;
            }
        }
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() public view returns (uint256) {
        unchecked {
            return _collectionData.index - _collectionData.burned;
        }
    }

    /**
     * @dev Returns whether `_addressToCheck` is the owner of `quantity` tokens sequentially starting from `startID`.
     *
     * Requirements:
     *
     * - `startID` token and all sequential tokens must exist.
     */
    function multiOwnerCheck(address _addressToCheck, uint256 startID, uint256 quantity) internal view returns (bool) {
        if (quantity < 2) revert BatchQuantityTooSmall();
        unchecked {
            for (uint256 i; i < quantity; i++) {
                if (ownerOf(startID + i) != _addressToCheck){
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * @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.
     * - Owner must not have tokens locked.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public {
        if (operator == _msgSender()) revert ApprovalToOwner();
        if (!isUnlocked(_msgSender())) revert TokensLocked();

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

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `_owner` and tokens are unlocked for `_owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address _owner, address operator) public view returns (bool) {
        return !isUnlocked(_owner) ? false : _operatorApprovals[_owner][operator];
    }

    /**
     * @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) public {
        address tokenOwner = ownerOf(tokenId);
        if (to == tokenOwner) revert ApprovalToOwner();
        if (_msgSender() != tokenOwner && !isApprovedForAll(tokenOwner, _msgSender())) revert CallerLacksApprovalPermissions();
        _tokenApprovals[tokenId] = to;
        emit Approval(tokenOwner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        if (!_exists(tokenId)) revert getApprovedNonexistentToken();
        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Stakes `_owner`'s tokens, if optionallock is enabled cannot be unstaked for optionalStakingLockPeriod days.
     * Requirements:
     *
     * - The `caller` cannot have their tokens staked currently.
     *
     * Emits an {Staked} event.
     */
    function stake(address _owner) public stakingHelper {
        if (!_stakingData.stakingStatus) revert stakingNotActive();
        if (_addressData[_owner].staked) revert TokensStaked();

        _addressData[_owner].staked = true;
        emit Staked(_msgSender(), block.timestamp);
    }

    /**
     * @dev Unstakes `_owner`'s tokens if they arent in a locked staking cycle.
     * Requirements:
     *
     * - The `_owner` cannot have their tokens unstaked currently.
     * - The `_owner` cannot have their tokens optionally locked currently.
     *
     * Emits an {Unstaked} event.
     */
    function unstake(address _owner) public stakingHelper {
        if (!_addressData[_owner].staked) revert TokensUnstaked();

        delete _addressData[_owner].staked;
        emit Unstaked(_owner, block.timestamp);
    }

    /**
     * @dev Begins Staking Event. 
     * Requirements:
     *
     * - Staking must be inactive.
     * - `_stakingContract` cannot be null address.
     *
     * Emits a {StakingEventStarted} event.
     */
    function beginStaking(address _stakingContract, uint256 _dailyYield) public onlyOwner {
        if (_stakingData.stakingStatus) revert StakingActive();
        if (_stakingContract == address(0)) revert beginStakingZeroAddress();

        _stakingData.stakingContract = IStakingHelper(_stakingContract);
        _stakingData.stakingStatus = true;
        _stakingData.stakingContract.startSeason(_dailyYield);
        
        emit StakingEventStarted(_stakingContract, _dailyYield, block.timestamp);
    }

    /**
     * @dev Ends Staking Event.
     * Requirements:
     *
     * - Staking must be active.
     *
     * Emits a {StakingEnded} event.
     */
    function endStaking() public onlyOwner {
        if (!_stakingData.stakingStatus) revert StakingInactive();

        _stakingData.stakingContract.endSeason();
        delete _stakingData;
        
        emit StakingEventEnded(block.timestamp);
    }

    /**
     * @dev Locks `_owner`'s tokens from any form of transferring.
     * Requirements:
     *
     * - The `caller` cannot have their tokens locked currently.
     *
     * Emits a {Locked} event.
     */
    function lock(uint256 _cooldown) public {
        if (_addressData[_msgSender()].locked) revert TokensLocked();
        if (_cooldown < 1 || _cooldown > 30) revert UnsupportedCooldownDuration();

        unchecked {
            uint256 proposedCooldown = _cooldown * 1 days;
            if (block.timestamp + proposedCooldown < _addressData[_msgSender()].lockedUnlockTimestamp) revert CooldownTooSmall();
            _addressData[_msgSender()].locked = true;
            _addressData[_msgSender()].lockedUnlockCooldown = uint64(proposedCooldown);
        }
        
        emit Locked(_msgSender(), _cooldown);
    }

    /**
     * @dev Begins unlocking process for `_owner`'s tokens.
     * Requirements:
     *
     * - The `caller` cannot have their tokens unlocked currently.
     *
     * Emits an {Unlocked} event.
     */
    function unlock() public {
        if (!_addressData[_msgSender()].locked) revert TokensUnlocked();

        delete _addressData[_msgSender()].locked;
        unchecked {
            _addressData[_msgSender()].lockedUnlockTimestamp = uint64(block.timestamp + _addressData[_msgSender()].lockedUnlockCooldown);
        }
        emit Unlocked(_msgSender(), block.timestamp);
    }

    /**
     * @dev Returns the address of the current collection owner.
     */
    function owner() public view returns (address) {
        return _collectionData.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 onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        if (newOwner == address(0)) revert NewOwnerAddressZero();
        _transferOwnership(newOwner);
    }

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

    function name() public view returns (string memory) {
        return _collectionData.name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view returns (string memory) {
        return _collectionData.symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        if (!_exists(tokenId)) revert TokenURINonexistentToken();
        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() public view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Returns tokenIDs owned by `_owner`.
     */
    function tokensOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 totalOwned = _addressData[_owner].balance;
        if (totalOwned == 0) revert TokensZeroBalance();
        uint256 supply = _collectionData.index;
        uint256[] memory tokenIDs = new uint256[](totalOwned);
        uint256 ownedIndex;
        address currentOwner;

        unchecked {
            for (uint256 i; i < supply; i++) {
                address currentAddress = _ownerships[i];
                if (currentAddress != address(0)) {
                    currentOwner = currentAddress;
                }
                if (currentOwner == _owner) {
                    tokenIDs[ownedIndex++] = i;
                    if (ownedIndex == totalOwned){
                        return tokenIDs;
                    }
                }
            }
        }

        revert TokensOfOwnerNullValue();
    }

    /**
     * @dev Returns `_owner`'s lock status and unlock timestamp in unix time, and personal lock cooldown in days.
     */
    function getLockData(address _owner) public view returns (bool, uint256, uint256) {
        return (_addressData[_owner].locked, 
        _addressData[_owner].lockedUnlockTimestamp, 
        _addressData[_owner].lockedUnlockCooldown);
    }

    /**
     * @dev Returns `_address`'s staking status.
     */
    function getStakingStatus(address _address) public view returns (bool) {
        return (_addressData[_address].staked);
    }

    /**
     * @dev Returns the token collection information.
     */
    function collectionInformation() public view returns (collectionData memory) {
        return _collectionData;
    }

    /**
     * @dev Returns the token collection information.
     */
    function stakingInformation() public view returns (address, bool) {
        return (address(_stakingData.stakingContract), _stakingData.stakingStatus);
    }

    function supportsInterface(bytes4 interfaceId) public pure returns (bool) {
        return interfaceId == 0x01ffc9a7 || interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f;
    }

    modifier stakingHelper() {
      if (address(_stakingData.stakingContract) != _msgSender()) revert CallerNotStakingHelper();
        _;
    }

    modifier onlyOwner() {
        if (owner() != _msgSender()) revert CallerNotOwner();
        _;
    }

}

error CallerIsSmartContract();
error ProofFailure();
error QuantityFailure();
error SupplyFailure();
error PriceFailure();
error AmountFailure();
error MintNotActive();
error InputError();
error WithdrawFailure();

contract MYTHICAL is ERC721LPhantomStakeable {

    struct addressMintData {
        uint128 genesisMinted;
        uint128 inhibitorMinted;
    }
 
    address public royaltyAddress;
    uint256 public royaltySize = 750;
    uint256 public royaltyDenominator = 10000;
    mapping(uint256 => address) private _royaltyReceivers;

    uint256 public maxSupply = 7777;
    string private _baseURI = "ipfs://QmVdZQvv66kvfCkZ4Lwen8bM7KJX5JgtZEmWRaGL8hy54X/";
    uint256 public allowListMaxMint = 1;
    uint256 public publicMaxMint = 5;
    uint256 public priceGenesis = .1 ether;
    uint256 public priceInhibitor = .02 ether;
    mapping(address => addressMintData) internal _addressMintData;
    bytes32 public allowlistRoot = 0x8977b92ce0adeb8244cbc3b448b4332c7d78cd253f33e5e5d80924caf270375d;
    uint256 public presaleActive;
    uint256 public publicActive;
    bool public teamAllocationMinted;
    IInhibitor public INHIB;

  constructor() ERC721LPhantomStakeable("MYTHICAL", "MC") {
      royaltyAddress = owner();
  }

  modifier callerIsUser() {
    if (tx.origin != _msgSender() || _msgSender().code.length != 0) revert CallerIsSmartContract();
    _;
  }

  function presaleMint(uint256 _quantityGenesis, uint256 _quantityInhibitor, bytes32[] calldata _proof) public payable callerIsUser {
    if (presaleActive < 1) revert MintNotActive();
    if (!MerkleProof.verify(_proof, allowlistRoot, keccak256(abi.encodePacked(_msgSender())))) revert ProofFailure();
    unchecked {
        if (_quantityGenesis + _quantityInhibitor < 1) revert QuantityFailure();
        if (totalSupply() + _quantityGenesis > maxSupply) revert SupplyFailure();
        if (msg.value < (_quantityGenesis * priceGenesis) + (_quantityInhibitor * priceInhibitor)) revert PriceFailure();
    }

    if(_quantityInhibitor > 0){
        unchecked {
            if (_quantityInhibitor + _addressMintData[_msgSender()].inhibitorMinted > allowListMaxMint) revert AmountFailure();
            _addressMintData[_msgSender()].inhibitorMinted += uint128(_quantityInhibitor);
        }
        INHIB.mintHelper(_msgSender(), _quantityInhibitor);
    }

    if(_quantityGenesis > 0){
        unchecked {
            if (_quantityGenesis + _addressMintData[_msgSender()].genesisMinted > allowListMaxMint) revert AmountFailure();
            _addressMintData[_msgSender()].genesisMinted += uint128(_quantityGenesis);
        }
        _mint(_msgSender(), _quantityGenesis);
    }
 
  }

  function publicMint(uint256 _quantityGenesis, uint256 _quantityInhibitor) public payable callerIsUser {
    if (publicActive < 1) revert MintNotActive();
    unchecked {
        if (_quantityGenesis + _quantityInhibitor < 1) revert QuantityFailure();
        if (totalSupply() + _quantityGenesis > maxSupply) revert SupplyFailure();
        if (msg.value < (_quantityGenesis * priceGenesis) + (_quantityInhibitor * priceInhibitor)) revert PriceFailure();
    }

    if(_quantityInhibitor > 0){
        unchecked {
            if (_quantityInhibitor > publicMaxMint) revert AmountFailure();
        }
        INHIB.mintHelper(_msgSender(), _quantityInhibitor);
    }

    if(_quantityGenesis > 0){
        unchecked {
            if (_quantityGenesis > publicMaxMint) revert AmountFailure();
        }
        _mint(_msgSender(), _quantityGenesis);
    }
  }

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

  function setBaseURI(string calldata newBaseURI) external onlyOwner {
    _baseURI = newBaseURI;
  }

  function setState(uint256 group, uint256 category, uint256 _value) external onlyOwner {
    bool adjusted;
    if (group == 0){
        if (category == 0){
            presaleActive = _value;
            adjusted = true;
        }

        if (category == 1){
            publicActive = _value;
            adjusted = true;
        }
    }

    if (group == 1){
        if (category == 0){
            allowListMaxMint = _value;
            adjusted = true;
        }

        if (category == 1){
            publicMaxMint = _value;
            adjusted = true;
        }
    }

    if (group == 2){

        if (category == 0){
            priceGenesis = _value;
            adjusted = true;
        }

        if (category == 1){
            priceInhibitor = _value;
            adjusted = true;
        }
    }

    if (!adjusted) revert InputError();
  }

  function setInhibitorAddress(IInhibitor _address) external onlyOwner {
    INHIB = _address;
  }

  function setRoot(bytes32 _root) external onlyOwner {
    allowlistRoot = _root;
  }

  function checkRemainingMints(address _address, bytes32[] calldata _proof) external view returns (uint256, uint256) {
      if (!MerkleProof.verify(_proof, allowlistRoot, keccak256(abi.encodePacked(_address)))) return (0, 0);
      return(allowListMaxMint - _addressMintData[_address].genesisMinted, allowListMaxMint - _addressMintData[_address].inhibitorMinted);
  }

  function mintTeamAllocation() external onlyOwner callerIsUser {
      require(!teamAllocationMinted, "Team Allocation already minted");
      INHIB.mintHelper(_msgSender(), 120);
      _mint(_msgSender(), 120);
      teamAllocationMinted = true;
  }

  function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) {
      uint256 amount = (_salePrice * royaltySize)/(royaltyDenominator);
      address royaltyReceiver = _royaltyReceivers[_tokenId] != address(0) ? _royaltyReceivers[_tokenId] : royaltyAddress;
      return (royaltyReceiver, amount);
   }

    function addRoyaltyReceiverForTokenId(address receiver, uint256 tokenId) public onlyOwner {
      _royaltyReceivers[tokenId] = receiver;
   }

  function withdraw() external onlyOwner {
    uint256 currentBalance = address(this).balance;
    (bool sent, ) = address(msg.sender).call{value: currentBalance}('');
    if (!sent) revert WithdrawFailure();   
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountFailure","type":"error"},{"inputs":[],"name":"ApprovalToOwner","type":"error"},{"inputs":[],"name":"BalanceOfZeroAddress","type":"error"},{"inputs":[],"name":"BatchQuantityTooSmall","type":"error"},{"inputs":[],"name":"CallerIsSmartContract","type":"error"},{"inputs":[],"name":"CallerLacksApprovalPermissions","type":"error"},{"inputs":[],"name":"CallerLacksTransferPermissions","type":"error"},{"inputs":[],"name":"CallerNotOwner","type":"error"},{"inputs":[],"name":"CallerNotStakingHelper","type":"error"},{"inputs":[],"name":"CooldownTooSmall","type":"error"},{"inputs":[],"name":"InputError","type":"error"},{"inputs":[],"name":"MintNotActive","type":"error"},{"inputs":[],"name":"MintZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NewOwnerAddressZero","type":"error"},{"inputs":[],"name":"OwnerOfNullValue","type":"error"},{"inputs":[],"name":"PriceFailure","type":"error"},{"inputs":[],"name":"ProofFailure","type":"error"},{"inputs":[],"name":"QuantityFailure","type":"error"},{"inputs":[],"name":"SafeTransferUnsafeDestination","type":"error"},{"inputs":[],"name":"StakingActive","type":"error"},{"inputs":[],"name":"StakingInactive","type":"error"},{"inputs":[],"name":"SupplyFailure","type":"error"},{"inputs":[],"name":"TokenURINonexistentToken","type":"error"},{"inputs":[],"name":"TokensLocked","type":"error"},{"inputs":[],"name":"TokensNotBatchable","type":"error"},{"inputs":[],"name":"TokensOfOwnerNullValue","type":"error"},{"inputs":[],"name":"TokensStaked","type":"error"},{"inputs":[],"name":"TokensUnlocked","type":"error"},{"inputs":[],"name":"TokensUnstaked","type":"error"},{"inputs":[],"name":"TokensZeroBalance","type":"error"},{"inputs":[],"name":"TransferFromNotOwner","type":"error"},{"inputs":[],"name":"TransferZeroAddress","type":"error"},{"inputs":[],"name":"UnsupportedCooldownDuration","type":"error"},{"inputs":[],"name":"WithdrawFailure","type":"error"},{"inputs":[],"name":"beginStakingZeroAddress","type":"error"},{"inputs":[],"name":"getApprovedNonexistentToken","type":"error"},{"inputs":[],"name":"stakingNotActive","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":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockCooldown","type":"uint256"}],"name":"Locked","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":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedTimestamp","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"StakingEventEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakingContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"dailyYield","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"StakingEventStarted","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockTimestamp","type":"uint256"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"unstakedTimestamp","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"INHIB","outputs":[{"internalType":"contract IInhibitor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"addRoyaltyReceiverForTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"_address","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"startID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"batchSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"startID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"batchSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"startID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakingContract","type":"address"},{"internalType":"uint256","name":"_dailyYield","type":"uint256"}],"name":"beginStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"checkRemainingMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionInformation","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"burned","type":"uint256"}],"internalType":"struct ERC721LPhantomStakeable.collectionData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getLockData","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getStakingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"isUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cooldown","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintTeamAllocation","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":[],"name":"presaleActive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantityGenesis","type":"uint256"},{"internalType":"uint256","name":"_quantityInhibitor","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"priceGenesis","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceInhibitor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicActive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantityGenesis","type":"uint256"},{"internalType":"uint256","name":"_quantityInhibitor","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltySize","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IInhibitor","name":"_address","type":"address"}],"name":"setInhibitorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"group","type":"uint256"},{"internalType":"uint256","name":"category","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingInformation","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAllocationMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6102ee600b55612710600c55611e61600e5560e0604052603660808181529062004e0060a03980516200003b91600f9160209091019062000177565b506001601055600560115567016345785d8a000060125566470de4df8200006013557f8977b92ce0adeb8244cbc3b448b4332c7d78cd253f33e5e5d80924caf270375d6015553480156200008e57600080fd5b506040805180820182526008815267135655121250d05360c21b6020808301918252835180850190945260028452614d4360f01b908401528151919291620000d99160009162000177565b508051620000ef90600190602084019062000177565b50620000fb3362000125565b5050600254600a80546001600160a01b0319166001600160a01b039092169190911790556200025a565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000185906200021d565b90600052602060002090601f016020900481019282620001a95760008555620001f4565b82601f10620001c457805160ff1916838001178555620001f4565b82800160010185558215620001f4579182015b82811115620001f4578251825591602001919060010190620001d7565b506200020292915062000206565b5090565b5b8082111562000202576000815560010162000207565b600181811c908216806200023257607f821691505b602082108114156200025457634e487b7160e01b600052602260045260246000fd5b50919050565b614b96806200026a6000396000f3fe6080604052600436106103815760003560e01c8063715018a6116101d1578063ad2f852a11610102578063d9b3c801116100a0578063f2888dbb1161006f578063f2888dbb14610b24578063f2fde38b14610b44578063f8e76cc014610b64578063fd8d7ed314610b8657600080fd5b8063d9b3c80114610aa4578063dab5f34014610ac4578063dd46706414610ae4578063e985e9c514610b0457600080fd5b8063c6222331116100dc578063c6222331146109ac578063c87b56dd14610a4e578063cd6a3ea514610a6e578063d5abeb0114610a8e57600080fd5b8063ad2f852a1461092d578063b88d4fde1461095a578063bd576a591461097a57600080fd5b8063947d58761161016f57806398ae99a81161014957806398ae99a8146108cf5780639c9c6669146108e2578063a22cb465146108f8578063a69df4b51461091857600080fd5b8063947d58761461084e57806395d89b41146108a457806397309a5b146108b957600080fd5b8063830ef099116101ab578063830ef099146107b65780638462151c146107d657806387d381cf146108035780638da5cb5b1461082357600080fd5b8063715018a61461077557806379b2f57f1461078a5780637f44ab2f146107a057600080fd5b80632bbf532a116102b657806353135ca0116102545780636352211e116102235780636352211e146107005780636b5dd991146107205780636c0360eb1461074057806370a082311461075557600080fd5b806353135ca01461066357806355f804b3146106795780635a5d3742146106995780635d49c133146106ae57600080fd5b80633f2981cf116102905780633f2981cf146105eb5780633ffea8c81461060157806342842e0e146106235780634c9047301461064357600080fd5b80632bbf532a146105a0578063305c7d4a146105c05780633ccfd60b146105d657600080fd5b80631d7d5ae4116103235780632507190a116102fd5780632507190a146104ff578063264762041461051457806329dc1102146105345780632a55205a1461055457600080fd5b80631d7d5ae41461049457806323b872dd146104aa578063243a190c146104ca57600080fd5b8063095ea7b31161035f578063095ea7b3146104225780630f8223be1461044457806318160ddd1461045e5780631b59169d1461048157600080fd5b806301ffc9a71461038657806306fdde03146103bb578063081812fc146103dd575b600080fd5b34801561039257600080fd5b506103a66103a1366004614295565b610b9c565b60405190151581526020015b60405180910390f35b3480156103c757600080fd5b506103d0610c81565b6040516103b29190614328565b3480156103e957600080fd5b506103fd6103f836600461433b565b610d15565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103b2565b34801561042e57600080fd5b5061044261043d366004614376565b610d81565b005b34801561045057600080fd5b506018546103a69060ff1681565b34801561046a57600080fd5b50600454600354035b6040519081526020016103b2565b61044261048f3660046143e7565b610ed9565b3480156104a057600080fd5b5061047360135481565b3480156104b657600080fd5b506104426104c536600461443a565b6112fc565b3480156104d657600080fd5b506104ea6104e536600461447b565b6117be565b604080519283526020830191909152016103b2565b34801561050b57600080fd5b506104426118ee565b34801561052057600080fd5b5061044261052f3660046144d0565b611a74565b34801561054057600080fd5b5061044261054f3660046144ed565b611c34565b34801561056057600080fd5b5061057461056f366004614533565b611c50565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016103b2565b3480156105ac57600080fd5b506103a66105bb3660046144d0565b611cef565b3480156105cc57600080fd5b5061047360115481565b3480156105e257600080fd5b50610442611de0565b3480156105f757600080fd5b5061047360175481565b34801561060d57600080fd5b50610616611eb9565b6040516103b29190614555565b34801561062f57600080fd5b5061044261063e36600461443a565b61206c565b34801561064f57600080fd5b5061044261065e3660046145ed565b61208c565b34801561066f57600080fd5b5061047360165481565b34801561068557600080fd5b50610442610694366004614619565b61218d565b3480156106a557600080fd5b506104426121ea565b3480156106ba57600080fd5b506103a66106c93660046144d0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900460ff1690565b34801561070c57600080fd5b506103fd61071b36600461433b565b6123d9565b34801561072c57600080fd5b5061044261073b3660046144d0565b6124a7565b34801561074c57600080fd5b506103d0612544565b34801561076157600080fd5b506104736107703660046144d0565b612553565b34801561078157600080fd5b506104426125d5565b34801561079657600080fd5b5061047360125481565b3480156107ac57600080fd5b5061047360105481565b3480156107c257600080fd5b506104426107d1366004614376565b612632565b3480156107e257600080fd5b506107f66107f13660046144d0565b612841565b6040516103b2919061468b565b34801561080f57600080fd5b5061044261081e3660046147a9565b6129dc565b34801561082f57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103fd565b34801561085a57600080fd5b506005546040805173ffffffffffffffffffffffffffffffffffffffff831681527401000000000000000000000000000000000000000090920460ff1615156020830152016103b2565b3480156108b057600080fd5b506103d06129f2565b3480156108c557600080fd5b50610473600b5481565b6104426108dd366004614533565b612a04565b3480156108ee57600080fd5b5061047360155481565b34801561090457600080fd5b5061044261091336600461482d565b612c8a565b34801561092457600080fd5b50610442612db0565b34801561093957600080fd5b50600a546103fd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561096657600080fd5b50610442610975366004614866565b612ee3565b34801561098657600080fd5b506018546103fd90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156109b857600080fd5b50610a316109c73660046144d0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205460ff69010000000000000000008204169167ffffffffffffffff720100000000000000000000000000000000000083048116926a010000000000000000000090041690565b6040805193151584526020840192909252908201526060016103b2565b348015610a5a57600080fd5b506103d0610a6936600461433b565b61300a565b348015610a7a57600080fd5b50610442610a89366004614376565b6130a9565b348015610a9a57600080fd5b50610473600e5481565b348015610ab057600080fd5b50610442610abf3660046144ed565b61314d565b348015610ad057600080fd5b50610442610adf36600461433b565b61316b565b348015610af057600080fd5b50610442610aff36600461433b565b6131c1565b348015610b1057600080fd5b506103a6610b1f3660046148d2565b613379565b348015610b3057600080fd5b50610442610b3f3660046144d0565b6133cd565b348015610b5057600080fd5b50610442610b5f3660046144d0565b613506565b348015610b7057600080fd5b506103a6610b7f36600461433b565b6003541190565b348015610b9257600080fd5b50610473600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161480610c2f57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610c7b57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080018054610c9290614900565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe90614900565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b5050505050905090565b6000610d22826003541190565b610d58576040517f1e3d0dec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009081526008602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610d8c826123d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610df4576040517f93f5178600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614801590610e215750610e1f8133613379565b155b15610e58576040517f302318df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526008602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233141580610ee85750333b15155b15610f1f576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016016541015610f5c576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fe5828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015290925060340190505b604051602081830303815290604052805190602001206135b0565b61101b576040517f9ba1ff2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018385011015611058576040517f82af4ff400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54846110696004546003540390565b0111156110a2576040517f2605101300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60135483026012548502013410156110e6576040517f7b9b085b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215611238576010543360009081526014602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff168401111561115f576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526014602052604080822080547001000000000000000000000000000000008082046fffffffffffffffffffffffffffffffff9081168a018116909102911617905560185481517f1b5462e8000000000000000000000000000000000000000000000000000000008152600481019490945260248401879052905161010090910473ffffffffffffffffffffffffffffffffffffffff1692631b5462e892604480830193919282900301818387803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050505b83156112f657601054336000908152601460205260409020546fffffffffffffffffffffffffffffffff168501111561129d576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260146020526040902080546fffffffffffffffffffffffffffffffff8082168801167fffffffffffffffffffffffffffffffff000000000000000000000000000000009091161790556112f6908561365f565b50505050565b6000611307826123d9565b905061131284611cef565b611348576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff82161480159061138c57503361137383610d15565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561139f575061139d8133613379565b155b156113d6576040517fde3abed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461143b576040517f3441f6c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611488576040517f90171a1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff1680156114e3575073ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205468010000000000000000900460ff165b801561157e57506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152909116906391a2748990602401602060405180830381865afa15801561155a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157e9190614954565b15611609576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015290911690630622fd5d90602401600060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050505b600082815260086020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff88811685526007845282852080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831617909255898316808852858820805493841693831660019081019093169390931790925588875260069095528386208054909316179091559185018084529220541615801561170a575060035481105b1561175c57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b50818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600080611834848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b1660208201529092506034019050610fca565b611843575060009050806118e6565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260146020526040902054601054611888916fffffffffffffffffffffffffffffffff16906149a0565b73ffffffffffffffffffffffffffffffffffffffff86166000908152601460205260409020546010546118e19170010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906149a0565b915091505b935093915050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461193f576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16611993576040517f7bf6f57300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554604080517f3dcdb672000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691633dcdb6729160048082019260009290919082900301818387803b1580156119ff57600080fd5b505af1158015611a13573d6000803e3d6000fd5b5050600580547fffffffffffffffffffffff00000000000000000000000000000000000000000016905550506040514281527f0fbfe41594a440a7d2b4ca090193b23cfd3f135b34c7ae9111e52e6d9f363d629060200160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff163314611ac5576040517fd57b231500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16611b19576040517fccbfc30700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205468010000000000000000900460ff1615611b85576040517fd68e98c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000179055611be23390565b73ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d42604051611c2991815260200190565b60405180910390a250565b6112f684848484604051806020016040528060008152506129dc565b6000806000600c54600b5485611c6691906149b7565b611c709190614a23565b6000868152600d60205260408120549192509073ffffffffffffffffffffffffffffffffffffffff16611cbb57600a5473ffffffffffffffffffffffffffffffffffffffff16611ce1565b6000868152600d602052604090205473ffffffffffffffffffffffffffffffffffffffff165b9350909150505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600760205260408120546901000000000000000000900460ff16158015611d77575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205442720100000000000000000000000000000000000090910467ffffffffffffffff16105b8015610c7b575060055474010000000000000000000000000000000000000000900460ff16611da7576001610c7b565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900460ff161590565b60025473ffffffffffffffffffffffffffffffffffffffff163314611e31576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040514790600090339083908381818185875af1925050503d8060008114611e75576040519150601f19603f3d011682016040523d82523d6000602084013e611e7a565b606091505b5050905080611eb5576040517f1a0263ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b611f016040518060a001604052806060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b60006040518060a0016040529081600082018054611f1e90614900565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4a90614900565b8015611f975780601f10611f6c57610100808354040283529160200191611f97565b820191906000526020600020905b815481529060010190602001808311611f7a57829003601f168201915b50505050508152602001600182018054611fb090614900565b80601f0160208091040260200160405190810160405280929190818152602001828054611fdc90614900565b80156120295780601f10611ffe57610100808354040283529160200191612029565b820191906000526020600020905b81548152906001019060200180831161200c57829003601f168201915b5050509183525050600282015473ffffffffffffffffffffffffffffffffffffffff16602082015260038201546040820152600490910154606090910152919050565b61208783838360405180602001604052806000815250612ee3565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146120dd576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008361210457826120f25750601681905560015b82600114156121045750601781905560015b836001141561212d578261211b5750601081905560015b826001141561212d5750601181905560015b836002141561215657826121445750601281905560015b82600114156121565750601381905560015b806112f6576040517fb092b44200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff1633146121de576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612087600f83836141b0565b60025473ffffffffffffffffffffffffffffffffffffffff16331461223b576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b323314158061224a5750333b15155b15612281576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60185460ff16156122f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5465616d20416c6c6f636174696f6e20616c7265616479206d696e7465640000604482015260640160405180910390fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16631b5462e8336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260786024820152604401600060405180830381600087803b15801561238357600080fd5b505af1158015612397573d6000803e3d6000fd5b505050506123ac6123a53390565b607861365f565b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6003546000908210156124755760008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156124175792915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160008181526006602052604090205490919073ffffffffffffffffffffffffffffffffffffffff1680156124705792915050565b612417565b6040517fad820bd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff1633146124f8576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6018805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6060600f8054610c9290614900565b600073ffffffffffffffffffffffffffffffffffffffff82166125a2576040517f4a63b0d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205467ffffffffffffffff1690565b60025473ffffffffffffffffffffffffffffffffffffffff163314612626576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612630600061395d565b565b60025473ffffffffffffffffffffffffffffffffffffffff163314612683576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16156126d8576040517fd9e399d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612725576040517fdb649fbb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffff0000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091177401000000000000000000000000000000000000000017918290556040517f703dbfe40000000000000000000000000000000000000000000000000000000081526004810184905291169063703dbfe490602401600060405180830381600087803b1580156127d557600080fd5b505af11580156127e9573d6000803e3d6000fd5b50506040805184815242602082015273ffffffffffffffffffffffffffffffffffffffff861693507fbd322cf26f75962cc059b75e120b5b386dfb217b4874d0a20e31106b3dbf52b792500160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205460609067ffffffffffffffff16806128ab576040517f49dc2df800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035460008267ffffffffffffffff8111156128c9576128c96146cf565b6040519080825280602002602001820160405280156128f2578160200160208202803683370190505b50905060008060005b848110156129a95760008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff168015612932578092505b8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a0578185858060010196508151811061297f5761297f614a37565b602002602001018181525050868414156129a0575092979650505050505050565b506001016128fb565b506040517f2625890700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129eb858585856001866139d4565b5050505050565b606060006001018054610c9290614900565b3233141580612a135750333b15155b15612a4a576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016017541015612a87576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018183011015612ac4576040517f82af4ff400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5482612ad56004546003540390565b011115612b0e576040517f2605101300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6013548102601254830201341015612b52576040517f7b9b085b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015612c3e57601154811115612b94576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16631b5462e8336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015612c2557600080fd5b505af1158015612c39573d6000803e3d6000fd5b505050505b8115611eb557601154821115612c80576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb5338361365f565b73ffffffffffffffffffffffffffffffffffffffff8216331415612cda576040517f93f5178600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce333611cef565b612d19576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600760205260409020546901000000000000000000900460ff16612e06576040517f27591bac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260076020526040902080546a01000000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff82160467ffffffffffffffff9081164201167201000000000000000000000000000000000000027fffffffffffff0000000000000000ffffffffffffffff00ffffffffffffffffff90911617905573ffffffffffffffffffffffffffffffffffffffff167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d42604051612ed991815260200190565b60405180910390a2565b612eee8484846112fc565b60008373ffffffffffffffffffffffffffffffffffffffff163b118015612fd357506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612f6b90339060009088908890600401614a66565b6020604051808303816000875af1158015612f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fae9190614aaf565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156112f6576040517f49549fca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060613017826003541190565b61304d576040517f5d39406100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613057612544565b9050600081511161307757604051806020016040528060008152506130a2565b8061308184613fd4565b604051602001613092929190614acc565b6040516020818303038152906040525b9392505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146130fa576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908152600d6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6112f6848484846000604051806020016040528060008152506139d4565b60025473ffffffffffffffffffffffffffffffffffffffff1633146131bc576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601555565b336000908152600760205260409020546901000000000000000000900460ff1615613218576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018110806132275750601e81115b1561325e576040517fb66ed3bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260076020526040902054620151808202907201000000000000000000000000000000000000900467ffffffffffffffff1642820110156132d0576040517f5df8edee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260076020526040902080547fffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff166a010000000000000000000067ffffffffffffffff909416939093029290921769010000000000000000001790915573ffffffffffffffffffffffffffffffffffffffff167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000882604051611c2991815260200190565b600061338483611cef565b156133c45773ffffffffffffffffffffffffffffffffffffffff80841660009081526009602090815260408083209386168352929052205460ff166130a2565b60009392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461341e576040517fd57b231500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205468010000000000000000900460ff16613489576040517f31307b2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169055517f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7590611c299042815260200190565b60025473ffffffffffffffffffffffffffffffffffffffff163314613557576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166135a4576040517f6843268c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135ad8161395d565b50565b600081815b85518110156136545760008682815181106135d2576135d2614a37565b60200260200101519050808311613614576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613641565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061364c81614afb565b9150506135b5565b509092149392505050565b73ffffffffffffffffffffffffffffffffffffffff82166136ac576040517f0474812a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806136e3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16801561373e575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205468010000000000000000900460ff165b80156137d957506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152909116906391a2748990602401602060405180830381865afa1580156137b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d99190614954565b15613864576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015290911690630622fd5d90602401600060405180830381600087803b15801561384b57600080fd5b505af115801561385f573d6000803e3d6000fd5b505050505b60035473ffffffffffffffffffffffffffffffffffffffff83166000818152600760209081526040808320805467ffffffffffffffff8082168901167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790558483526006909152812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091555b828110156139555760405160018301929073ffffffffffffffffffffffffffffffffffffffff8616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001016138fc565b506003555050565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6139dd86611cef565b613a13576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff871614801590613a405750613a3e8633613379565b155b15613a77576040517fde3abed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a8286858561410e565b613ab8576040517f83b8038500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516613b05576040517f90171a1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff168015613b60575073ffffffffffffffffffffffffffffffffffffffff851660009081526007602052604090205468010000000000000000900460ff165b8015613bfb57506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152909116906391a2748990602401602060405180830381865afa158015613bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bfb9190614954565b15613c86576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015290911690630622fd5d90602401600060405180830381600087803b158015613c6d57600080fd5b505af1158015613c81573d6000803e3d6000fd5b505050505b60005b83811015613ed957848101600081815260086020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905581613d1e57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8916179055613d53565b600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613ed05760008773ffffffffffffffffffffffffffffffffffffffff163b118015613e9957506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063150b7a0290613e3190339060009087908a90600401614a66565b6020604051808303816000875af1158015613e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e749190614aaf565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15613ed0576040517f49549fca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101613c89565b5073ffffffffffffffffffffffffffffffffffffffff868116600090815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283168b90038316179092558a8616855282852080549283169282168a01909116919091179055878701808452600690925290912054909116158015613f79575060035481105b15613fcb57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505050505050565b60608161401457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561403e578061402881614afb565b91506140379050600a83614a23565b9150614018565b60008167ffffffffffffffff811115614059576140596146cf565b6040519080825280601f01601f191660200182016040528015614083576020820181803683370190505b5090505b8415614106576140986001836149a0565b91506140a5600a86614b34565b6140b0906030614b48565b60f81b8183815181106140c5576140c5614a37565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506140ff600a86614a23565b9450614087565b949350505050565b6000600282101561414b576040517fa9ca8b7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b828110156141a5578473ffffffffffffffffffffffffffffffffffffffff166141788286016123d9565b73ffffffffffffffffffffffffffffffffffffffff161461419d5760009150506130a2565b60010161414e565b506001949350505050565b8280546141bc90614900565b90600052602060002090601f0160209004810192826141de5760008555614242565b82601f10614215578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614242565b82800160010185558215614242579182015b82811115614242578235825591602001919060010190614227565b5061424e929150614252565b5090565b5b8082111561424e5760008155600101614253565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146135ad57600080fd5b6000602082840312156142a757600080fd5b81356130a281614267565b60005b838110156142cd5781810151838201526020016142b5565b838111156112f65750506000910152565b600081518084526142f68160208601602086016142b2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006130a260208301846142de565b60006020828403121561434d57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146135ad57600080fd5b6000806040838503121561438957600080fd5b823561439481614354565b946020939093013593505050565b60008083601f8401126143b457600080fd5b50813567ffffffffffffffff8111156143cc57600080fd5b6020830191508360208260051b8501011115611ce857600080fd5b600080600080606085870312156143fd57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561442257600080fd5b61442e878288016143a2565b95989497509550505050565b60008060006060848603121561444f57600080fd5b833561445a81614354565b9250602084013561446a81614354565b929592945050506040919091013590565b60008060006040848603121561449057600080fd5b833561449b81614354565b9250602084013567ffffffffffffffff8111156144b757600080fd5b6144c3868287016143a2565b9497909650939450505050565b6000602082840312156144e257600080fd5b81356130a281614354565b6000806000806080858703121561450357600080fd5b843561450e81614354565b9350602085013561451e81614354565b93969395505050506040820135916060013590565b6000806040838503121561454657600080fd5b50508035926020909101359150565b602081526000825160a0602084015261457160c08401826142de565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526145ac82826142de565b91505073ffffffffffffffffffffffffffffffffffffffff604085015116606084015260608401516080840152608084015160a08401528091505092915050565b60008060006060848603121561460257600080fd5b505081359360208301359350604090920135919050565b6000806020838503121561462c57600080fd5b823567ffffffffffffffff8082111561464457600080fd5b818501915085601f83011261465857600080fd5b81358181111561466757600080fd5b86602082850101111561467957600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b818110156146c3578351835292840192918401916001016146a7565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261470f57600080fd5b813567ffffffffffffffff8082111561472a5761472a6146cf565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614770576147706146cf565b8160405283815286602085880101111561478957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156147c157600080fd5b85356147cc81614354565b945060208601356147dc81614354565b93506040860135925060608601359150608086013567ffffffffffffffff81111561480657600080fd5b614812888289016146fe565b9150509295509295909350565b80151581146135ad57600080fd5b6000806040838503121561484057600080fd5b823561484b81614354565b9150602083013561485b8161481f565b809150509250929050565b6000806000806080858703121561487c57600080fd5b843561488781614354565b9350602085013561489781614354565b925060408501359150606085013567ffffffffffffffff8111156148ba57600080fd5b6148c6878288016146fe565b91505092959194509250565b600080604083850312156148e557600080fd5b82356148f081614354565b9150602083013561485b81614354565b600181811c9082168061491457607f821691505b6020821081141561494e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561496657600080fd5b81516130a28161481f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156149b2576149b2614971565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149ef576149ef614971565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614a3257614a326149f4565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614aa560808301846142de565b9695505050505050565b600060208284031215614ac157600080fd5b81516130a281614267565b60008351614ade8184602088016142b2565b835190830190614af28183602088016142b2565b01949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b2d57614b2d614971565b5060010190565b600082614b4357614b436149f4565b500690565b60008219821115614b5b57614b5b614971565b50019056fea26469706673582212201fb992136021118512c28be65a8c6c3390dead01e1e8df55ab537f85ed1817fe64736f6c634300080c0033697066733a2f2f516d56645a51767636366b7666436b5a344c77656e38624d374b4a58354a67745a456d575261474c3868793534582f

Deployed Bytecode

0x6080604052600436106103815760003560e01c8063715018a6116101d1578063ad2f852a11610102578063d9b3c801116100a0578063f2888dbb1161006f578063f2888dbb14610b24578063f2fde38b14610b44578063f8e76cc014610b64578063fd8d7ed314610b8657600080fd5b8063d9b3c80114610aa4578063dab5f34014610ac4578063dd46706414610ae4578063e985e9c514610b0457600080fd5b8063c6222331116100dc578063c6222331146109ac578063c87b56dd14610a4e578063cd6a3ea514610a6e578063d5abeb0114610a8e57600080fd5b8063ad2f852a1461092d578063b88d4fde1461095a578063bd576a591461097a57600080fd5b8063947d58761161016f57806398ae99a81161014957806398ae99a8146108cf5780639c9c6669146108e2578063a22cb465146108f8578063a69df4b51461091857600080fd5b8063947d58761461084e57806395d89b41146108a457806397309a5b146108b957600080fd5b8063830ef099116101ab578063830ef099146107b65780638462151c146107d657806387d381cf146108035780638da5cb5b1461082357600080fd5b8063715018a61461077557806379b2f57f1461078a5780637f44ab2f146107a057600080fd5b80632bbf532a116102b657806353135ca0116102545780636352211e116102235780636352211e146107005780636b5dd991146107205780636c0360eb1461074057806370a082311461075557600080fd5b806353135ca01461066357806355f804b3146106795780635a5d3742146106995780635d49c133146106ae57600080fd5b80633f2981cf116102905780633f2981cf146105eb5780633ffea8c81461060157806342842e0e146106235780634c9047301461064357600080fd5b80632bbf532a146105a0578063305c7d4a146105c05780633ccfd60b146105d657600080fd5b80631d7d5ae4116103235780632507190a116102fd5780632507190a146104ff578063264762041461051457806329dc1102146105345780632a55205a1461055457600080fd5b80631d7d5ae41461049457806323b872dd146104aa578063243a190c146104ca57600080fd5b8063095ea7b31161035f578063095ea7b3146104225780630f8223be1461044457806318160ddd1461045e5780631b59169d1461048157600080fd5b806301ffc9a71461038657806306fdde03146103bb578063081812fc146103dd575b600080fd5b34801561039257600080fd5b506103a66103a1366004614295565b610b9c565b60405190151581526020015b60405180910390f35b3480156103c757600080fd5b506103d0610c81565b6040516103b29190614328565b3480156103e957600080fd5b506103fd6103f836600461433b565b610d15565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103b2565b34801561042e57600080fd5b5061044261043d366004614376565b610d81565b005b34801561045057600080fd5b506018546103a69060ff1681565b34801561046a57600080fd5b50600454600354035b6040519081526020016103b2565b61044261048f3660046143e7565b610ed9565b3480156104a057600080fd5b5061047360135481565b3480156104b657600080fd5b506104426104c536600461443a565b6112fc565b3480156104d657600080fd5b506104ea6104e536600461447b565b6117be565b604080519283526020830191909152016103b2565b34801561050b57600080fd5b506104426118ee565b34801561052057600080fd5b5061044261052f3660046144d0565b611a74565b34801561054057600080fd5b5061044261054f3660046144ed565b611c34565b34801561056057600080fd5b5061057461056f366004614533565b611c50565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016103b2565b3480156105ac57600080fd5b506103a66105bb3660046144d0565b611cef565b3480156105cc57600080fd5b5061047360115481565b3480156105e257600080fd5b50610442611de0565b3480156105f757600080fd5b5061047360175481565b34801561060d57600080fd5b50610616611eb9565b6040516103b29190614555565b34801561062f57600080fd5b5061044261063e36600461443a565b61206c565b34801561064f57600080fd5b5061044261065e3660046145ed565b61208c565b34801561066f57600080fd5b5061047360165481565b34801561068557600080fd5b50610442610694366004614619565b61218d565b3480156106a557600080fd5b506104426121ea565b3480156106ba57600080fd5b506103a66106c93660046144d0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900460ff1690565b34801561070c57600080fd5b506103fd61071b36600461433b565b6123d9565b34801561072c57600080fd5b5061044261073b3660046144d0565b6124a7565b34801561074c57600080fd5b506103d0612544565b34801561076157600080fd5b506104736107703660046144d0565b612553565b34801561078157600080fd5b506104426125d5565b34801561079657600080fd5b5061047360125481565b3480156107ac57600080fd5b5061047360105481565b3480156107c257600080fd5b506104426107d1366004614376565b612632565b3480156107e257600080fd5b506107f66107f13660046144d0565b612841565b6040516103b2919061468b565b34801561080f57600080fd5b5061044261081e3660046147a9565b6129dc565b34801561082f57600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff166103fd565b34801561085a57600080fd5b506005546040805173ffffffffffffffffffffffffffffffffffffffff831681527401000000000000000000000000000000000000000090920460ff1615156020830152016103b2565b3480156108b057600080fd5b506103d06129f2565b3480156108c557600080fd5b50610473600b5481565b6104426108dd366004614533565b612a04565b3480156108ee57600080fd5b5061047360155481565b34801561090457600080fd5b5061044261091336600461482d565b612c8a565b34801561092457600080fd5b50610442612db0565b34801561093957600080fd5b50600a546103fd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561096657600080fd5b50610442610975366004614866565b612ee3565b34801561098657600080fd5b506018546103fd90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156109b857600080fd5b50610a316109c73660046144d0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205460ff69010000000000000000008204169167ffffffffffffffff720100000000000000000000000000000000000083048116926a010000000000000000000090041690565b6040805193151584526020840192909252908201526060016103b2565b348015610a5a57600080fd5b506103d0610a6936600461433b565b61300a565b348015610a7a57600080fd5b50610442610a89366004614376565b6130a9565b348015610a9a57600080fd5b50610473600e5481565b348015610ab057600080fd5b50610442610abf3660046144ed565b61314d565b348015610ad057600080fd5b50610442610adf36600461433b565b61316b565b348015610af057600080fd5b50610442610aff36600461433b565b6131c1565b348015610b1057600080fd5b506103a6610b1f3660046148d2565b613379565b348015610b3057600080fd5b50610442610b3f3660046144d0565b6133cd565b348015610b5057600080fd5b50610442610b5f3660046144d0565b613506565b348015610b7057600080fd5b506103a6610b7f36600461433b565b6003541190565b348015610b9257600080fd5b50610473600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161480610c2f57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610c7b57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080018054610c9290614900565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe90614900565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b5050505050905090565b6000610d22826003541190565b610d58576040517f1e3d0dec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060009081526008602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610d8c826123d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610df4576040517f93f5178600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614801590610e215750610e1f8133613379565b155b15610e58576040517f302318df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526008602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b3233141580610ee85750333b15155b15610f1f576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016016541015610f5c576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fe5828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015290925060340190505b604051602081830303815290604052805190602001206135b0565b61101b576040517f9ba1ff2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018385011015611058576040517f82af4ff400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54846110696004546003540390565b0111156110a2576040517f2605101300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60135483026012548502013410156110e6576040517f7b9b085b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8215611238576010543360009081526014602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff168401111561115f576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526014602052604080822080547001000000000000000000000000000000008082046fffffffffffffffffffffffffffffffff9081168a018116909102911617905560185481517f1b5462e8000000000000000000000000000000000000000000000000000000008152600481019490945260248401879052905161010090910473ffffffffffffffffffffffffffffffffffffffff1692631b5462e892604480830193919282900301818387803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050505b83156112f657601054336000908152601460205260409020546fffffffffffffffffffffffffffffffff168501111561129d576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260146020526040902080546fffffffffffffffffffffffffffffffff8082168801167fffffffffffffffffffffffffffffffff000000000000000000000000000000009091161790556112f6908561365f565b50505050565b6000611307826123d9565b905061131284611cef565b611348576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff82161480159061138c57503361137383610d15565b73ffffffffffffffffffffffffffffffffffffffff1614155b801561139f575061139d8133613379565b155b156113d6576040517fde3abed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461143b576040517f3441f6c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611488576040517f90171a1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff1680156114e3575073ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205468010000000000000000900460ff165b801561157e57506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152909116906391a2748990602401602060405180830381865afa15801561155a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157e9190614954565b15611609576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015290911690630622fd5d90602401600060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050505b600082815260086020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff88811685526007845282852080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831617909255898316808852858820805493841693831660019081019093169390931790925588875260069095528386208054909316179091559185018084529220541615801561170a575060035481105b1561175c57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b50818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600080611834848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506015546040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b1660208201529092506034019050610fca565b611843575060009050806118e6565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260146020526040902054601054611888916fffffffffffffffffffffffffffffffff16906149a0565b73ffffffffffffffffffffffffffffffffffffffff86166000908152601460205260409020546010546118e19170010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906149a0565b915091505b935093915050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461193f576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16611993576040517f7bf6f57300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554604080517f3dcdb672000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691633dcdb6729160048082019260009290919082900301818387803b1580156119ff57600080fd5b505af1158015611a13573d6000803e3d6000fd5b5050600580547fffffffffffffffffffffff00000000000000000000000000000000000000000016905550506040514281527f0fbfe41594a440a7d2b4ca090193b23cfd3f135b34c7ae9111e52e6d9f363d629060200160405180910390a1565b60055473ffffffffffffffffffffffffffffffffffffffff163314611ac5576040517fd57b231500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16611b19576040517fccbfc30700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205468010000000000000000900460ff1615611b85576040517fd68e98c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000179055611be23390565b73ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d42604051611c2991815260200190565b60405180910390a250565b6112f684848484604051806020016040528060008152506129dc565b6000806000600c54600b5485611c6691906149b7565b611c709190614a23565b6000868152600d60205260408120549192509073ffffffffffffffffffffffffffffffffffffffff16611cbb57600a5473ffffffffffffffffffffffffffffffffffffffff16611ce1565b6000868152600d602052604090205473ffffffffffffffffffffffffffffffffffffffff165b9350909150505b9250929050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600760205260408120546901000000000000000000900460ff16158015611d77575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205442720100000000000000000000000000000000000090910467ffffffffffffffff16105b8015610c7b575060055474010000000000000000000000000000000000000000900460ff16611da7576001610c7b565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205468010000000000000000900460ff161590565b60025473ffffffffffffffffffffffffffffffffffffffff163314611e31576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040514790600090339083908381818185875af1925050503d8060008114611e75576040519150601f19603f3d011682016040523d82523d6000602084013e611e7a565b606091505b5050905080611eb5576040517f1a0263ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b611f016040518060a001604052806060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b60006040518060a0016040529081600082018054611f1e90614900565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4a90614900565b8015611f975780601f10611f6c57610100808354040283529160200191611f97565b820191906000526020600020905b815481529060010190602001808311611f7a57829003601f168201915b50505050508152602001600182018054611fb090614900565b80601f0160208091040260200160405190810160405280929190818152602001828054611fdc90614900565b80156120295780601f10611ffe57610100808354040283529160200191612029565b820191906000526020600020905b81548152906001019060200180831161200c57829003601f168201915b5050509183525050600282015473ffffffffffffffffffffffffffffffffffffffff16602082015260038201546040820152600490910154606090910152919050565b61208783838360405180602001604052806000815250612ee3565b505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146120dd576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008361210457826120f25750601681905560015b82600114156121045750601781905560015b836001141561212d578261211b5750601081905560015b826001141561212d5750601181905560015b836002141561215657826121445750601281905560015b82600114156121565750601381905560015b806112f6576040517fb092b44200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff1633146121de576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612087600f83836141b0565b60025473ffffffffffffffffffffffffffffffffffffffff16331461223b576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b323314158061224a5750333b15155b15612281576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60185460ff16156122f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f5465616d20416c6c6f636174696f6e20616c7265616479206d696e7465640000604482015260640160405180910390fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16631b5462e8336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260786024820152604401600060405180830381600087803b15801561238357600080fd5b505af1158015612397573d6000803e3d6000fd5b505050506123ac6123a53390565b607861365f565b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6003546000908210156124755760008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156124175792915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160008181526006602052604090205490919073ffffffffffffffffffffffffffffffffffffffff1680156124705792915050565b612417565b6040517fad820bd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff1633146124f8576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6018805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6060600f8054610c9290614900565b600073ffffffffffffffffffffffffffffffffffffffff82166125a2576040517f4a63b0d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205467ffffffffffffffff1690565b60025473ffffffffffffffffffffffffffffffffffffffff163314612626576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612630600061395d565b565b60025473ffffffffffffffffffffffffffffffffffffffff163314612683576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16156126d8576040517fd9e399d900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612725576040517fdb649fbb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffff0000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091177401000000000000000000000000000000000000000017918290556040517f703dbfe40000000000000000000000000000000000000000000000000000000081526004810184905291169063703dbfe490602401600060405180830381600087803b1580156127d557600080fd5b505af11580156127e9573d6000803e3d6000fd5b50506040805184815242602082015273ffffffffffffffffffffffffffffffffffffffff861693507fbd322cf26f75962cc059b75e120b5b386dfb217b4874d0a20e31106b3dbf52b792500160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205460609067ffffffffffffffff16806128ab576040517f49dc2df800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035460008267ffffffffffffffff8111156128c9576128c96146cf565b6040519080825280602002602001820160405280156128f2578160200160208202803683370190505b50905060008060005b848110156129a95760008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff168015612932578092505b8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a0578185858060010196508151811061297f5761297f614a37565b602002602001018181525050868414156129a0575092979650505050505050565b506001016128fb565b506040517f2625890700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129eb858585856001866139d4565b5050505050565b606060006001018054610c9290614900565b3233141580612a135750333b15155b15612a4a576040517fe08e16c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016017541015612a87576040517f914edb0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018183011015612ac4576040517f82af4ff400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e5482612ad56004546003540390565b011115612b0e576040517f2605101300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6013548102601254830201341015612b52576040517f7b9b085b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015612c3e57601154811115612b94576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601854610100900473ffffffffffffffffffffffffffffffffffffffff16631b5462e8336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260248101849052604401600060405180830381600087803b158015612c2557600080fd5b505af1158015612c39573d6000803e3d6000fd5b505050505b8115611eb557601154821115612c80576040517fdeee748a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611eb5338361365f565b73ffffffffffffffffffffffffffffffffffffffff8216331415612cda576040517f93f5178600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce333611cef565b612d19576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600760205260409020546901000000000000000000900460ff16612e06576040517f27591bac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260076020526040902080546a01000000000000000000007fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff82160467ffffffffffffffff9081164201167201000000000000000000000000000000000000027fffffffffffff0000000000000000ffffffffffffffff00ffffffffffffffffff90911617905573ffffffffffffffffffffffffffffffffffffffff167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d42604051612ed991815260200190565b60405180910390a2565b612eee8484846112fc565b60008373ffffffffffffffffffffffffffffffffffffffff163b118015612fd357506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612f6b90339060009088908890600401614a66565b6020604051808303816000875af1158015612f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fae9190614aaf565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156112f6576040517f49549fca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060613017826003541190565b61304d576040517f5d39406100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000613057612544565b9050600081511161307757604051806020016040528060008152506130a2565b8061308184613fd4565b604051602001613092929190614acc565b6040516020818303038152906040525b9392505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146130fa576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908152600d6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6112f6848484846000604051806020016040528060008152506139d4565b60025473ffffffffffffffffffffffffffffffffffffffff1633146131bc576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601555565b336000908152600760205260409020546901000000000000000000900460ff1615613218576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018110806132275750601e81115b1561325e576040517fb66ed3bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260076020526040902054620151808202907201000000000000000000000000000000000000900467ffffffffffffffff1642820110156132d0576040517f5df8edee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260076020526040902080547fffffffffffffffffffffffffffff000000000000000000ffffffffffffffffff166a010000000000000000000067ffffffffffffffff909416939093029290921769010000000000000000001790915573ffffffffffffffffffffffffffffffffffffffff167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000882604051611c2991815260200190565b600061338483611cef565b156133c45773ffffffffffffffffffffffffffffffffffffffff80841660009081526009602090815260408083209386168352929052205460ff166130a2565b60009392505050565b60055473ffffffffffffffffffffffffffffffffffffffff16331461341e576040517fd57b231500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090205468010000000000000000900460ff16613489576040517f31307b2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152600760205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169055517f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7590611c299042815260200190565b60025473ffffffffffffffffffffffffffffffffffffffff163314613557576040517f5cd8319200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166135a4576040517f6843268c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135ad8161395d565b50565b600081815b85518110156136545760008682815181106135d2576135d2614a37565b60200260200101519050808311613614576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613641565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061364c81614afb565b9150506135b5565b509092149392505050565b73ffffffffffffffffffffffffffffffffffffffff82166136ac576040517f0474812a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806136e3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16801561373e575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205468010000000000000000900460ff165b80156137d957506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152909116906391a2748990602401602060405180830381865afa1580156137b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d99190614954565b15613864576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015290911690630622fd5d90602401600060405180830381600087803b15801561384b57600080fd5b505af115801561385f573d6000803e3d6000fd5b505050505b60035473ffffffffffffffffffffffffffffffffffffffff83166000818152600760209081526040808320805467ffffffffffffffff8082168901167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790558483526006909152812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091555b828110156139555760405160018301929073ffffffffffffffffffffffffffffffffffffffff8616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001016138fc565b506003555050565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6139dd86611cef565b613a13576040517fde1af48d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff871614801590613a405750613a3e8633613379565b155b15613a77576040517fde3abed200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a8286858561410e565b613ab8576040517f83b8038500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516613b05576040517f90171a1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff168015613b60575073ffffffffffffffffffffffffffffffffffffffff851660009081526007602052604090205468010000000000000000900460ff165b8015613bfb57506005546040517f91a2748900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152909116906391a2748990602401602060405180830381865afa158015613bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bfb9190614954565b15613c86576005546040517f0622fd5d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015290911690630622fd5d90602401600060405180830381600087803b158015613c6d57600080fd5b505af1158015613c81573d6000803e3d6000fd5b505050505b60005b83811015613ed957848101600081815260086020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905581613d1e57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8916179055613d53565b600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613ed05760008773ffffffffffffffffffffffffffffffffffffffff163b118015613e9957506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063150b7a0290613e3190339060009087908a90600401614a66565b6020604051808303816000875af1158015613e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e749190614aaf565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15613ed0576040517f49549fca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101613c89565b5073ffffffffffffffffffffffffffffffffffffffff868116600090815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283168b90038316179092558a8616855282852080549283169282168a01909116919091179055878701808452600690925290912054909116158015613f79575060035481105b15613fcb57600081815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505050505050565b60608161401457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561403e578061402881614afb565b91506140379050600a83614a23565b9150614018565b60008167ffffffffffffffff811115614059576140596146cf565b6040519080825280601f01601f191660200182016040528015614083576020820181803683370190505b5090505b8415614106576140986001836149a0565b91506140a5600a86614b34565b6140b0906030614b48565b60f81b8183815181106140c5576140c5614a37565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506140ff600a86614a23565b9450614087565b949350505050565b6000600282101561414b576040517fa9ca8b7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b828110156141a5578473ffffffffffffffffffffffffffffffffffffffff166141788286016123d9565b73ffffffffffffffffffffffffffffffffffffffff161461419d5760009150506130a2565b60010161414e565b506001949350505050565b8280546141bc90614900565b90600052602060002090601f0160209004810192826141de5760008555614242565b82601f10614215578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555614242565b82800160010185558215614242579182015b82811115614242578235825591602001919060010190614227565b5061424e929150614252565b5090565b5b8082111561424e5760008155600101614253565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146135ad57600080fd5b6000602082840312156142a757600080fd5b81356130a281614267565b60005b838110156142cd5781810151838201526020016142b5565b838111156112f65750506000910152565b600081518084526142f68160208601602086016142b2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006130a260208301846142de565b60006020828403121561434d57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146135ad57600080fd5b6000806040838503121561438957600080fd5b823561439481614354565b946020939093013593505050565b60008083601f8401126143b457600080fd5b50813567ffffffffffffffff8111156143cc57600080fd5b6020830191508360208260051b8501011115611ce857600080fd5b600080600080606085870312156143fd57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561442257600080fd5b61442e878288016143a2565b95989497509550505050565b60008060006060848603121561444f57600080fd5b833561445a81614354565b9250602084013561446a81614354565b929592945050506040919091013590565b60008060006040848603121561449057600080fd5b833561449b81614354565b9250602084013567ffffffffffffffff8111156144b757600080fd5b6144c3868287016143a2565b9497909650939450505050565b6000602082840312156144e257600080fd5b81356130a281614354565b6000806000806080858703121561450357600080fd5b843561450e81614354565b9350602085013561451e81614354565b93969395505050506040820135916060013590565b6000806040838503121561454657600080fd5b50508035926020909101359150565b602081526000825160a0602084015261457160c08401826142de565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526145ac82826142de565b91505073ffffffffffffffffffffffffffffffffffffffff604085015116606084015260608401516080840152608084015160a08401528091505092915050565b60008060006060848603121561460257600080fd5b505081359360208301359350604090920135919050565b6000806020838503121561462c57600080fd5b823567ffffffffffffffff8082111561464457600080fd5b818501915085601f83011261465857600080fd5b81358181111561466757600080fd5b86602082850101111561467957600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b818110156146c3578351835292840192918401916001016146a7565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261470f57600080fd5b813567ffffffffffffffff8082111561472a5761472a6146cf565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715614770576147706146cf565b8160405283815286602085880101111561478957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a086880312156147c157600080fd5b85356147cc81614354565b945060208601356147dc81614354565b93506040860135925060608601359150608086013567ffffffffffffffff81111561480657600080fd5b614812888289016146fe565b9150509295509295909350565b80151581146135ad57600080fd5b6000806040838503121561484057600080fd5b823561484b81614354565b9150602083013561485b8161481f565b809150509250929050565b6000806000806080858703121561487c57600080fd5b843561488781614354565b9350602085013561489781614354565b925060408501359150606085013567ffffffffffffffff8111156148ba57600080fd5b6148c6878288016146fe565b91505092959194509250565b600080604083850312156148e557600080fd5b82356148f081614354565b9150602083013561485b81614354565b600181811c9082168061491457607f821691505b6020821081141561494e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561496657600080fd5b81516130a28161481f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156149b2576149b2614971565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149ef576149ef614971565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614a3257614a326149f4565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152614aa560808301846142de565b9695505050505050565b600060208284031215614ac157600080fd5b81516130a281614267565b60008351614ade8184602088016142b2565b835190830190614af28183602088016142b2565b01949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b2d57614b2d614971565b5060010190565b600082614b4357614b436149f4565b500690565b60008219821115614b5b57614b5b614971565b50019056fea26469706673582212201fb992136021118512c28be65a8c6c3390dead01e1e8df55ab537f85ed1817fe64736f6c634300080c0033

Deployed Bytecode Sourcemap

39139:6088:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38458:183;;;;;;;;;;-1:-1:-1;38458:183:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;38458:183:0;;;;;;;;35389:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30079:188::-;;;;;;;;;;-1:-1:-1;30079:188:0;;;;;:::i;:::-;;:::i;:::-;;;1809:42:1;1797:55;;;1779:74;;1767:2;1752:18;30079:188:0;1633:226:1;29536:384:0;;;;;;;;;;-1:-1:-1;29536:384:0;;;;;:::i;:::-;;:::i;:::-;;40026:32;;;;;;;;;;-1:-1:-1;40026:32:0;;;;;;;;27150:161;;;;;;;;;;-1:-1:-1;27270:22:0;;27246:21;;:46;27150:161;;;2489:25:1;;;2477:2;2462:18;27150:161:0;2343:177:1;40341:1311:0;;;;;;:::i;:::-;;:::i;39737:41::-;;;;;;;;;;;;;;;;20813:1182;;;;;;;;;;-1:-1:-1;20813:1182:0;;;;;:::i;:::-;;:::i;43846:369::-;;;;;;;;;;-1:-1:-1;43846:369:0;;;;;:::i;:::-;;:::i;:::-;;;;4687:25:1;;;4743:2;4728:18;;4721:34;;;;4660:18;43846:369:0;4513:248:1;32314:258:0;;;;;;;;;;;;;:::i;30551:294::-;;;;;;;;;;-1:-1:-1;30551:294:0;;;;;:::i;:::-;;:::i;24027:180::-;;;;;;;;;;-1:-1:-1;24027:180:0;;;;;:::i;:::-;;:::i;44481:367::-;;;;;;;;;;-1:-1:-1;44481:367:0;;;;;:::i;:::-;;:::i;:::-;;;;6005:42:1;5993:55;;;5975:74;;6080:2;6065:18;;6058:34;;;;5948:18;44481:367:0;5801:297:1;17622:293:0;;;;;;;;;;-1:-1:-1;17622:293:0;;;;;:::i;:::-;;:::i;39653:32::-;;;;;;;;;;;;;;;;45005:217;;;;;;;;;;;;;:::i;39992:27::-;;;;;;;;;;;;;;;;38092:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22072:142::-;;;;;;;;;;-1:-1:-1;22072:142:0;;;;;:::i;:::-;;:::i;42747:898::-;;;;;;;;;;-1:-1:-1;42747:898:0;;;;;:::i;:::-;;:::i;39957:28::-;;;;;;;;;;;;;;;;42640:101;;;;;;;;;;-1:-1:-1;42640:101:0;;;;;:::i;:::-;;:::i;44221:254::-;;;;;;;;;;;;;:::i;37883:128::-;;;;;;;;;;-1:-1:-1;37883:128:0;;;;;:::i;:::-;37973:22;;37948:4;37973:22;;;:12;:22;;;;;:29;;;;;;;37883:128;16531:703;;;;;;;;;;-1:-1:-1;16531:703:0;;;;;:::i;:::-;;:::i;43651:98::-;;;;;;;;;;-1:-1:-1;43651:98:0;;;;;:::i;:::-;;:::i;42542:92::-;;;;;;;;;;;;;:::i;17325:200::-;;;;;;;;;;-1:-1:-1;17325:200:0;;;;;:::i;:::-;;:::i;34582:95::-;;;;;;;;;;;;;:::i;39692:38::-;;;;;;;;;;;;;;;;39611:35;;;;;;;;;;;;;;;;31630:515;;;;;;;;;;-1:-1:-1;31630:515:0;;;;;:::i;:::-;;:::i;36490:932::-;;;;;;;;;;-1:-1:-1;36490:932:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25047:206::-;;;;;;;;;;-1:-1:-1;25047:206:0;;;;;:::i;:::-;;:::i;34137:94::-;;;;;;;;;;-1:-1:-1;34202:21:0;;;;34137:94;;38291:159;;;;;;;;;;-1:-1:-1;38384:12:0;:28;38291:159;;;38384:28;;;10671:74:1;;38415:26:0;;;;;;10788:14:1;10781:22;10776:2;10761:18;;10754:50;10644:18;38291:159:0;10503:307:1;35563:102:0;;;;;;;;;;;;;:::i;39335:32::-;;;;;;;;;;;;;;;;41658:878;;;;;;:::i;:::-;;:::i;39853:97::-;;;;;;;;;;;;;;;;28352:333;;;;;;;;;;-1:-1:-1;28352:333:0;;;;;:::i;:::-;;:::i;33659:386::-;;;;;;;;;;;;;:::i;39299:29::-;;;;;;;;;;-1:-1:-1;39299:29:0;;;;;;;;22964:396;;;;;;;;;;-1:-1:-1;22964:396:0;;;;;:::i;:::-;;:::i;40065:23::-;;;;;;;;;;-1:-1:-1;40065:23:0;;;;;;;;;;;37563:244;;;;;;;;;;-1:-1:-1;37563:244:0;;;;;:::i;:::-;37664:20;;37621:4;37664:20;;;:12;:20;;;;;:27;;;;;;;37703:42;;;;;;;37757:41;;;;;37563:244;;;;;12647:14:1;;12640:22;12622:41;;12694:2;12679:18;;12672:34;;;;12722:18;;;12715:34;12610:2;12595:18;37563:244:0;12426:329:1;35771:305:0;;;;;;;;;;-1:-1:-1;35771:305:0;;;;;:::i;:::-;;:::i;44856:143::-;;;;;;;;;;-1:-1:-1;44856:143:0;;;;;:::i;:::-;;:::i;39484:31::-;;;;;;;;;;;;;;;;23765:180;;;;;;;;;;-1:-1:-1;23765:180:0;;;;;:::i;:::-;;:::i;43755:85::-;;;;;;;;;;-1:-1:-1;43755:85:0;;;;;:::i;:::-;;:::i;32802:629::-;;;;;;;;;;-1:-1:-1;32802:629:0;;;;;:::i;:::-;;:::i;28879:179::-;;;;;;;;;;-1:-1:-1;28879:179:0;;;;;:::i;:::-;;:::i;31170:226::-;;;;;;;;;;-1:-1:-1;31170:226:0;;;;;:::i;:::-;;:::i;34832:176::-;;;;;;;;;;-1:-1:-1;34832:176:0;;;;;:::i;:::-;;:::i;16254:126::-;;;;;;;;;;-1:-1:-1;16254:126:0;;;;;:::i;:::-;16351:21;;-1:-1:-1;16341:31:0;16254:126;39374:41;;;;;;;;;;;;;;;;38458:183;38526:4;38550:25;;;;;;:54;;-1:-1:-1;38579:25:0;;;;;38550:54;:83;;;-1:-1:-1;38608:25:0;;;;;38550:83;38543:90;38458:183;-1:-1:-1;;38458:183:0:o;35389:98::-;35426:13;35459:15;:20;;35452:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35389:98;:::o;30079:188::-;30138:7;30163:16;30171:7;16351:21;;-1:-1:-1;16341:31:0;16254:126;30163:16;30158:59;;30188:29;;;;;;;;;;;;;;30158:59;-1:-1:-1;30235:24:0;;;;:15;:24;;;;;;;;;30079:188::o;29536:384::-;29600:18;29621:16;29629:7;29621;:16::i;:::-;29600:37;;29658:10;29652:16;;:2;:16;;;29648:46;;;29677:17;;;;;;;;;;;;;;29648:46;15966:10;29709:26;;;;;;;:73;;-1:-1:-1;29740:42:0;29757:10;15966;28879:179;:::i;29740:42::-;29739:43;29709:73;29705:118;;;29791:32;;;;;;;;;;;;;;29705:118;29834:24;;;;:15;:24;;;;;;:29;;;;;;;;;;;;;;29879:33;;29834:24;;29879:33;;;;;;;29589:331;29536:384;;:::o;40341:1311::-;40231:9;15966:10;40231:25;;;:58;;-1:-1:-1;15966:10:0;40260:24;:29;;40231:58;40227:94;;;40298:23;;;;;;;;;;;;;;40227:94;40498:1:::1;40482:13;;:17;40478:45;;;40508:15;;;;;;;;;;;;;;40478:45;40535:84;40554:6;;40535:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;40562:13:0::1;::::0;40587:30:::1;::::0;13942:66:1;15966:10:0;13929:2:1;13925:15;13921:88;40587:30:0::1;::::0;::::1;13909:101:1::0;40562:13:0;;-1:-1:-1;14026:12:1;;;-1:-1:-1;40587:30:0::1;;;;;;;;;;;;;40577:41;;;;;;40535:18;:84::i;:::-;40530:112;;40628:14;;;;;;;;;;;;;;40530:112;40714:1;40693:18;40674:16;:37;:41;40670:71;;;40724:17;;;;;;;;;;;;;;40670:71;40791:9;;40772:16;40756:13;27270:22:::0;;27246:21;;:46;;27150:161;40756:13:::1;:32;:44;40752:72;;;40809:15;;;;;;;;;;;;;;40752:72;40909:14;;40888:18;:35;40871:12;;40852:16;:31;40851:73;40839:9;:85;40835:112;;;40933:14;;;;;;;;;;;;;;40835:112;40966:22:::0;;40963:348:::1;;41099:16;::::0;15966:10;41050:30:::1;::::0;;;:16:::1;:30;::::0;;;;:46;;;::::1;;;41029:67:::0;::::1;:86;41025:114;;;41124:15;;;;;;;;;;;;;;41025:114;15966:10:::0;41154:30:::1;::::0;;;:16:::1;:30;::::0;;;;;:77;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;;41253:5:::1;::::0;:50;;;;;::::1;::::0;::::1;5975:74:1::0;;;;6065:18;;;6058:34;;;41253:50:0;;41154:77:::1;41253:5:::0;;::::1;41154:30;41253:5;::::0;:16:::1;::::0;5948:18:1;;;;;41154:30:0;;41253:50;;;;;41154:30;41253:5;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40963:348;41322:20:::0;;41319:325:::1;;41449:16;::::0;15966:10;41402:30:::1;::::0;;;:16:::1;:30;::::0;;;;:44;::::1;;41383:63:::0;::::1;:82;41379:110;;;41474:15;;;;;;;;;;;;;;41379:110;15966:10:::0;41504:30:::1;::::0;;;:16:::1;:30;::::0;;;;:73;;::::1;::::0;;::::1;::::0;::::1;;::::0;;;::::1;;::::0;;41599:37:::1;::::0;41560:16;41599:5:::1;:37::i;:::-;40341:1311:::0;;;;:::o;20813:1182::-;20896:20;20919:16;20927:7;20919;:16::i;:::-;20896:39;;20951:16;20962:4;20951:10;:16::i;:::-;20946:44;;20976:14;;;;;;;;;;;;;;20946:44;15966:10;21005:28;;;;;;;:81;;-1:-1:-1;15966:10:0;21050:20;21062:7;21050:11;:20::i;:::-;:36;;;;21005:81;:142;;;;-1:-1:-1;21104:43:0;21121:12;15966:10;28879:179;:::i;21104:43::-;21103:44;21005:142;21001:187;;;21156:32;;;;;;;;;;;;;;21001:187;21219:4;21203:20;;:12;:20;;;21199:55;;21232:22;;;;;;;;;;;;;;21199:55;21269:16;;;21265:50;;21294:21;;;;;;;;;;;;;;21265:50;21332:12;:26;;;;;;:53;;;;-1:-1:-1;21362:16:0;;;;;;;:12;:16;;;;;:23;;;;;;21332:53;:108;;;;-1:-1:-1;21389:12:0;:28;:51;;;;;:28;1797:55:1;;;21389:51:0;;;1779:74:1;21389:28:0;;;;:47;;1752:18:1;;21389:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21328:189;;;21456:12;:28;:49;;;;;:28;1797:55:1;;;21456:49:0;;;1779:74:1;21456:28:0;;;;:45;;1752:18:1;;21456:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21328:189;21536:24;;;;:15;:24;;;;;;;;21529:31;;;;;;;;;;21597:18;;;;;:12;:18;;;;;:31;;;;;;;;;;;;;;;;;;21643:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;21643:29:0;;;;;;;;;;;;;21687:20;;;:11;:20;;;;;;:25;;;;;;;;;21749:11;;;21779:24;;;;;;;:38;:77;;;;-1:-1:-1;21835:21:0;;21821:35;;21779:77;21775:157;;;21877:24;;;;:11;:24;;;;;:39;;;;;;;;;;21775:157;21572:371;21979:7;21975:2;21960:27;;21969:4;21960:27;;;;;;;;;;;;20885:1110;20813:1182;;;:::o;43846:369::-;43943:7;43952;43975:80;43994:6;;43975:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44002:13:0;;44027:26;;13942:66:1;13929:2;13925:15;;;13921:88;44027:26:0;;;13909:101:1;44002:13:0;;-1:-1:-1;14026:12:1;;;-1:-1:-1;44027:26:0;13780:264:1;43975:80:0;43970:100;;-1:-1:-1;44065:1:0;;-1:-1:-1;44065:1:0;44057:13;;43970:100;44105:26;;;;;;;:16;:26;;;;;:40;44086:16;;:59;;44105:40;;;44086:59;:::i;:::-;44166:26;;;;;;;:16;:26;;;;;:42;;44147:16;:61;;44166:42;;;;;;44147:61;:::i;:::-;44079:130;;;;43846:369;;;;;;;:::o;32314:258::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;32369:12:::1;:26:::0;;;::::1;;;32364:57;;32404:17;;;;;;;;;;;;;;32364:57;32434:12;:28:::0;:40:::1;::::0;;;;;;;:28:::1;::::0;;::::1;::::0;:38:::1;::::0;:40:::1;::::0;;::::1;::::0;:28:::1;::::0;:40;;;;;;;;:28;;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;32492:12:0::1;32485:19:::0;;;;;;-1:-1:-1;;32530:34:0::1;::::0;32548:15:::1;2489:25:1::0;;32530:34:0::1;::::0;2477:2:1;2462:18;32530:34:0::1;;;;;;;32314:258::o:0;30551:294::-;38695:12;:28;38687:53;38695:28;15966:10;38687:53;38683:90;;38749:24;;;;;;;;;;;;;;38683:90;30619:12:::1;:26:::0;;;::::1;;;30614:58;;30654:18;;;;;;;;;;;;;;30614:58;30687:20;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:27;;;::::1;;;30683:54;;;30723:14;;;;;;;;;;;;;;30683:54;30750:20;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:34;;;::::1;::::0;::::1;::::0;;30807:12:::1;15966:10:::0;;15894:90;30807:12:::1;30800:37;;;30821:15;30800:37;;;;2489:25:1::0;;2477:2;2462:18;;2343:177;30800:37:0::1;;;;;;;;30551:294:::0;:::o;24027:180::-;24145:54;24167:4;24173:2;24177:7;24186:8;24145:54;;;;;;;;;;;;:21;:54::i;44481:367::-;44563:16;44581:21;44613:14;44658:18;;44644:11;;44631:10;:24;;;;:::i;:::-;44630:47;;;;:::i;:::-;44686:23;44712:27;;;:17;:27;;;;;;44613:64;;-1:-1:-1;44686:23:0;44712:41;:27;:88;;44786:14;;;;44712:88;;;44756:27;;;;:17;:27;;;;;;;;44712:88;44686:114;-1:-1:-1;44834:6:0;;-1:-1:-1;;44481:367:0;;;;;;:::o;17622:293::-;17718:20;;;17679:4;17718:20;;;:12;:20;;;;;:27;;;;;;17717:28;:106;;;;-1:-1:-1;17763:20:0;;;;;;;:12;:20;;;;;:42;17808:15;17763:42;;;;;;:60;17717:106;:190;;;;-1:-1:-1;17842:12:0;:26;;;;;;:64;;17902:4;17842:64;;;-1:-1:-1;17872:20:0;;;;;;:12;:20;;;;;:27;;;;;;17871:28;;17622:293::o;45005:217::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;45120:51:::1;::::0;45076:21:::1;::::0;45051:22:::1;::::0;45128:10:::1;::::0;45076:21;;45051:22;45120:51;45051:22;45120:51;45076:21;45128:10;45120:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45104:67;;;45183:4;45178:35;;45196:17;;;;;;;;;;;;;;45178:35;45044:178;;45005:217::o:0;38092:118::-;38146:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38146:21:0;38187:15;38180:22;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38180:22:0;;;-1:-1:-1;;38180:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38092:118;-1:-1:-1;38092:118:0:o;22072:142::-;22167:39;22184:4;22190:2;22194:7;22167:39;;;;;;;;;;;;:16;:39::i;:::-;22072:142;;;:::o;42747:898::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;42840:13:::1;42864:10:::0;42860:238:::1;;42890:13:::0;42886:97:::1;;-1:-1:-1::0;42919:13:0::1;:22:::0;;;42967:4:::1;42886:97;42999:8;43011:1;42999:13;42995:96;;;-1:-1:-1::0;43028:12:0::1;:21:::0;;;43075:4:::1;42995:96;43110:5;43119:1;43110:10;43106:242;;;43136:13:::0;43132:100:::1;;-1:-1:-1::0;43165:16:0::1;:25:::0;;;43216:4:::1;43132:100;43248:8;43260:1;43248:13;43244:97;;;-1:-1:-1::0;43277:13:0::1;:22:::0;;;43325:4:::1;43244:97;43360:5;43369:1;43360:10;43356:241;;;43388:13:::0;43384:96:::1;;-1:-1:-1::0;43417:12:0::1;:21:::0;;;43464:4:::1;43384:96;43496:8;43508:1;43496:13;43492:98;;;-1:-1:-1::0;43525:14:0::1;:23:::0;;;43574:4:::1;43492:98;43610:8;43605:34;;43627:12;;;;;;;;;;;;;;42640:101:::0;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;42714:21:::1;:8;42725:10:::0;;42714:21:::1;:::i;44221:254::-:0;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;40231:9:::1;15966:10:::0;40231:25:::1;;::::0;:58:::1;;-1:-1:-1::0;15966:10:0;40260:24:::1;:29:::0;::::1;40231:58;40227:94;;;40298:23;;;;;;;;;;;;;;40227:94;44301:20:::2;::::0;::::2;;44300:21;44292:64;;;::::0;::::2;::::0;;15577:2:1;44292:64:0::2;::::0;::::2;15559:21:1::0;15616:2;15596:18;;;15589:30;15655:32;15635:18;;;15628:60;15705:18;;44292:64:0::2;;;;;;;;44365:5;::::0;::::2;::::0;::::2;;;:16;15966:10:::0;44365:35:::2;::::0;;::::2;::::0;;;;;;6005:42:1;5993:55;;;44365:35:0::2;::::0;::::2;5975:74:1::0;44396:3:0::2;6065:18:1::0;;;6058:34;5948:18;;44365:35:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;44409:24;44415:12;15966:10:::0;;15894:90;44415:12:::2;44429:3;44409:5;:24::i;:::-;44442:20;:27:::0;;;::::2;44465:4;44442:27;::::0;;44221:254::o;16531:703::-;16653:21;;16594:7;;16643:31;;16639:535;;;16695:17;16715:20;;;:11;:20;;;;;;;;16758:23;;16754:88;;16813:9;16531:703;-1:-1:-1;;16531:703:0:o;16754:88::-;-1:-1:-1;16904:9:0;;;;16952:20;;;;:11;:20;;;;;;16904:9;;-1:-1:-1;16952:20:0;;17005:23;;17001:104;;17068:9;16531:703;-1:-1:-1;;16531:703:0:o;17001:104::-;16864:291;;16639:535;17208:18;;;;;;;;;;;;;;43651:98;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;43727:5:::1;:16:::0;;::::1;::::0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;43651:98::o;42542:92::-;42591:13;42620:8;42613:15;;;;;:::i;17325:200::-;17383:7;17407:22;;;17403:57;;17438:22;;;;;;;;;;;;;;17403:57;-1:-1:-1;17486:22:0;;;;;;:12;:22;;;;;:30;;;;17325:200::o;34582:95::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;34639:30:::1;34666:1;34639:18;:30::i;:::-;34582:95::o:0;31630:515::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;31731:12:::1;:26:::0;;;::::1;;;31727:54;;;31766:15;;;;;;;;;;;;;;31727:54;31796:30;::::0;::::1;31792:68;;31835:25;;;;;;;;;;;;;;31792:68;31873:12;:63:::0;;31947:33;;31873:63:::1;::::0;;::::1;31947:33:::0;;;;;::::1;::::0;;;;31991:53:::1;::::0;;;;::::1;::::0;::::1;2489:25:1::0;;;31991:28:0;::::1;::::0;:40:::1;::::0;2462:18:1;;31991:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;32070:67:0::1;::::0;;4687:25:1;;;32121:15:0::1;4743:2:1::0;4728:18;;4721:34;32070:67:0::1;::::0;::::1;::::0;-1:-1:-1;32070:67:0::1;::::0;-1:-1:-1;4660:18:1;32070:67:0::1;;;;;;;31630:515:::0;;:::o;36490:932::-;36600:20;;;36579:18;36600:20;;;:12;:20;;;;;:28;36550:16;;36600:28;;36643:15;36639:47;;36667:19;;;;;;;;;;;;;;36639:47;36714:21;;36697:14;36788:10;36774:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36774:25:0;;36746:53;;36810:18;36839:20;36902:9;36897:463;36917:6;36913:1;:10;36897:463;;;36949:22;36974:14;;;:11;:14;;;;;;;;37011:28;;37007:106;;37079:14;37064:29;;37007:106;37151:6;37135:22;;:12;:22;;;37131:214;;;37207:1;37182:8;37191:12;;;;;;37182:22;;;;;;;;:::i;:::-;;;;;;:26;;;;;37249:10;37235;:24;37231:95;;;-1:-1:-1;37294:8:0;;36490:932;-1:-1:-1;;;;;;;36490:932:0:o;37231:95::-;-1:-1:-1;36925:3:0;;36897:463;;;;37390:24;;;;;;;;;;;;;;25047:206;25185:60;25204:4;25210:2;25214:7;25223:8;25233:4;25239:5;25185:18;:60::i;:::-;25047:206;;;;;:::o;35563:102::-;35602:13;35635:15;:22;;35628:29;;;;;:::i;41658:878::-;40231:9;15966:10;40231:25;;;:58;;-1:-1:-1;15966:10:0;40260:24;:29;;40231:58;40227:94;;;40298:23;;;;;;;;;;;;;;40227:94;41786:1:::1;41771:12;;:16;41767:44;;;41796:15;;;;;;;;;;;;;;41767:44;41883:1;41862:18;41843:16;:37;:41;41839:71;;;41893:17;;;;;;;;;;;;;;41839:71;41960:9;;41941:16;41925:13;27270:22:::0;;27246:21;;:46;;27150:161;41925:13:::1;:32;:44;41921:72;;;41978:15;;;;;;;;;;;;;;41921:72;42078:14;;42057:18;:35;42040:12;;42021:16;:31;42020:73;42008:9;:85;42004:112;;;42102:14;;;;;;;;;;;;;;42004:112;42135:22:::0;;42132:204:::1;;42219:13;;42198:18;:34;42194:62;;;42241:15;;;;;;;;;;;;;;42194:62;42278:5;::::0;::::1;::::0;::::1;;;:16;15966:10:::0;42278:50:::1;::::0;;::::1;::::0;;;;;;6005:42:1;5993:55;;;42278:50:0::1;::::0;::::1;5975:74:1::0;6065:18;;;6058:34;;;5948:18;;42278:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42132:204;42347:20:::0;;42344:187:::1;;42427:13;;42408:16;:32;42404:60;;;42449:15;;;;;;;;;;;;;;42404:60;42486:37;15966:10:::0;42506:16:::1;42486:5;:37::i;28352:333::-:0;28434:24;;;15966:10;28434:24;28430:54;;;28467:17;;;;;;;;;;;;;;28430:54;28500:24;15966:10;17622:293;:::i;28500:24::-;28495:52;;28533:14;;;;;;;;;;;;;;28495:52;15966:10;28560:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;28629:48;;586:41:1;;;28560:42:0;;15966:10;28629:48;;559:18:1;28629:48:0;;;;;;;28352:333;;:::o;33659:386::-;15966:10;33700:26;;;;:12;:26;;;;;:33;;;;;;33695:63;;33742:16;;;;;;;;;;;;;;33695:63;15966:10;33778:26;;;;:12;:26;;;;;33771:40;;33923:47;33771:40;;;33923:47;;;;;33905:15;:65;33847:124;;;;;;;;;;33998:39;;;34021:15;33998:39;;;;2489:25:1;;2477:2;2462:18;;2343:177;33998:39:0;;;;;;;;33659:386::o;22964:396::-;23079:31;23092:4;23098:2;23102:7;23079:12;:31::i;:::-;23142:1;23125:2;:14;;;:18;:187;;;;-1:-1:-1;23164:82:0;;23267:45;23164:82;;;23267:45;23164:40;;;;23267:45;;23164:82;;15966:10;;23227:1;;23231:7;;23240:5;;23164:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:148;;;;23125:187;23121:231;;;23321:31;;;;;;;;;;;;;;35771:305;35835:13;35866:16;35874:7;16351:21;;-1:-1:-1;16341:31:0;16254:126;35866:16;35861:56;;35891:26;;;;;;;;;;;;;;35861:56;35928:22;35953:9;:7;:9::i;:::-;35928:34;;36005:1;35986:8;35980:22;:26;:88;;;;;;;;;;;;;;;;;36033:8;36043:18;:7;:16;:18::i;:::-;36016:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35980:88;35973:95;35771:305;-1:-1:-1;;;35771:305:0:o;44856:143::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;44955:26:::1;::::0;;;:17:::1;:26;::::0;;;;:37;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44856:143::o;23765:180::-;23879:58;23898:4;23904:2;23908:7;23917:8;23927:5;23879:58;;;;;;;;;;;;:18;:58::i;43755:85::-;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;43813:13:::1;:21:::0;43755:85::o;32802:629::-;15966:10;32857:26;;;;:12;:26;;;;;:33;;;;;;32853:60;;;32899:14;;;;;;;;;;;;;;32853:60;32940:1;32928:9;:13;:31;;;;32957:2;32945:9;:14;32928:31;32924:73;;;32968:29;;;;;;;;;;;;;;32924:73;15966:10;33035:24;33136:26;;;:12;:26;;;;;:48;33074:6;33062:18;;;33136:48;;;;;33099:15;:34;;:85;33095:116;;;33193:18;;;;;;;;;;;;;;33095:116;15966:10;33226:26;;;;:12;:26;;;;;:40;;33281:74;;;;;;;;;;;;;;;33226:40;33281:74;;;;33392:31;;;33413:9;33392:31;;;;2489:25:1;;2477:2;2462:18;;2343:177;28879:179:0;28960:4;28985:18;28996:6;28985:10;:18::i;:::-;28984:19;:66;;29014:26;;;;;;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;28984:66;;;29006:5;28977:73;28879:179;-1:-1:-1;;;28879:179:0:o;31170:226::-;38695:12;:28;38687:53;38695:28;15966:10;38687:53;38683:90;;38749:24;;;;;;;;;;;;;;38683:90;31240:20:::1;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:27;;;::::1;;;31235:57;;31276:16;;;;;;;;;;;;;;31235:57;31312:20;::::0;::::1;;::::0;;;:12:::1;:20;::::0;;;;;;31305:34;;;::::1;::::0;;31355:33;::::1;::::0;::::1;::::0;31372:15:::1;2489:25:1::0;;2477:2;2462:18;;2343:177;34832:176:0;34202:21;;38837:23;34202:21;15966:10;38837:23;38833:52;;38869:16;;;;;;;;;;;;;;38833:52;34909:22:::1;::::0;::::1;34905:56;;34940:21;;;;;;;;;;;;;;34905:56;34972:28;34991:8;34972:18;:28::i;:::-;34832:176:::0;:::o;11246:830::-;11371:4;11411;11371;11428:525;11452:5;:12;11448:1;:16;11428:525;;;11486:20;11509:5;11515:1;11509:8;;;;;;;;:::i;:::-;;;;;;;11486:31;;11554:12;11538;:28;11534:408;;11691:44;;;;;;17638:19:1;;;17673:12;;;17666:28;;;17710:12;;11691:44:0;;;;;;;;;;;;11681:55;;;;;;11666:70;;11534:408;;;11881:44;;;;;;17638:19:1;;;17673:12;;;17666:28;;;17710:12;;11881:44:0;;;;;;;;;;;;11871:55;;;;;;11856:70;;11534:408;-1:-1:-1;11466:3:0;;;;:::i;:::-;;;;11428:525;;;-1:-1:-1;12048:20:0;;;;11246:830;-1:-1:-1;;;11246:830:0:o;18129:768::-;18198:16;;;18194:46;;18223:17;;;;;;;;;;;;;;18194:46;18255:13;18251:44;;18277:18;;;;;;;;;;;;;;18251:44;18312:12;:26;;;;;;:53;;;;-1:-1:-1;18342:16:0;;;;;;;:12;:16;;;;;:23;;;;;;18312:53;:108;;;;-1:-1:-1;18369:12:0;:28;:51;;;;;:28;1797:55:1;;;18369:51:0;;;1779:74:1;18369:28:0;;;;:47;;1752:18:1;;18369:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18308:189;;;18436:12;:28;:49;;;;;:28;1797:55:1;;;18436:49:0;;;1779:74:1;18436:28:0;;;;:45;;1752:18:1;;18436:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18308:189;18557:21;;18593:16;;;18534:20;18593:16;;;:12;:16;;;;;;;;:44;;;;;;;;;;;;;;;;18652:25;;;:11;:25;;;;;:30;;;;;;;;;;18711:115;18731:8;18727:1;:12;18711:115;;;18770:40;;18795:14;;;;;18770:40;;;;18787:1;;18770:40;;18787:1;;18770:40;18741:3;;18711:115;;;-1:-1:-1;18842:21:0;:36;-1:-1:-1;;18129:768:0:o;35168:213::-;35253:21;;;;35285:32;;;;;;;;;;;35333:40;;35253:21;;;35285:32;35253:21;;35333:40;;35234:16;;35333:40;35223:158;35168:213;:::o;25261:1791::-;25420:16;25431:4;25420:10;:16::i;:::-;25415:44;;25445:14;;;;;;;;;;;;;;25415:44;15966:10;25474:20;;;;;;;:60;;-1:-1:-1;25499:35:0;25516:4;15966:10;28879:179;:::i;25499:35::-;25498:36;25474:60;25470:105;;;25543:32;;;;;;;;;;;;;;25470:105;25591:40;25607:4;25613:7;25622:8;25591:15;:40::i;:::-;25586:74;;25640:20;;;;;;;;;;;;;;25586:74;25675:16;;;25671:50;;25700:21;;;;;;;;;;;;;;25671:50;25738:12;:26;;;;;;:53;;;;-1:-1:-1;25768:16:0;;;;;;;:12;:16;;;;;:23;;;;;;25738:53;:108;;;;-1:-1:-1;25795:12:0;:28;:51;;;;;:28;1797:55:1;;;25795:51:0;;;1779:74:1;25795:28:0;;;;:47;;1752:18:1;;25795:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25734:189;;;25862:12;:28;:49;;;;;:28;1797:55:1;;;25862:49:0;;;1779:74:1;25862:28:0;;;;:45;;1752:18:1;;25862:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25734:189;25965:9;25960:734;25980:8;25976:1;:12;25960:734;;;26037:11;;;26014:20;26074:29;;;:15;:29;;;;;26067:36;;;;;;26128:6;26124:165;;26158:25;;;;:11;:25;;;;;:30;;;;;;;;;;26124:165;;;26244:25;;;;:11;:25;;;;;26237:32;;;;;;26124:165;26331:12;26327:2;26312:32;;26321:4;26312:32;;;;;;;;;;;;26367:17;26363:316;;;26428:1;26411:2;:14;;;:18;:208;;;;-1:-1:-1;26458:87:0;;26574:45;26458:87;;;26574:45;26458:40;;;;26574:45;;26458:87;;15966:10;;26521:1;;26525:12;;26539:5;;26458:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:161;;;;26411:208;26408:251;;;26628:31;;;;;;;;;;;;;;26408:251;-1:-1:-1;25990:3:0;;25960:734;;;-1:-1:-1;26710:18:0;;;;;;;;:12;:18;;;;;;;;:46;;;;;;;;;;;;;;;;;;;26771:16;;;;;;;;:44;;;;;;;;;;;;;;;;;;;26852:18;;;26889:24;;;:11;:24;;;;;;;26852:18;;26889:24;:38;:77;;;;-1:-1:-1;26945:21:0;;26931:35;;26889:77;26885:149;;;26987:24;;;;:11;:24;;;;;:31;;;;;;;;;;26885:149;25935:1110;25261:1791;;;;;;:::o;401:723::-;457:13;678:10;674:53;;-1:-1:-1;;705:10:0;;;;;;;;;;;;;;;;;;401:723::o;674:53::-;752:5;737:12;793:78;800:9;;793:78;;826:8;;;;:::i;:::-;;-1:-1:-1;849:10:0;;-1:-1:-1;857:2:0;849:10;;:::i;:::-;;;793:78;;;881:19;913:6;903:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;903:17:0;;881:39;;931:154;938:10;;931:154;;965:11;975:1;965:11;;:::i;:::-;;-1:-1:-1;1034:10:0;1042:2;1034:5;:10;:::i;:::-;1021:24;;:2;:24;:::i;:::-;1008:39;;991:6;998;991:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1062:11:0;1071:2;1062:11;;:::i;:::-;;;931:154;;;1109:6;401:723;-1:-1:-1;;;;401:723:0:o;27558:417::-;27666:4;27698:1;27687:8;:12;27683:48;;;27708:23;;;;;;;;;;;;;;27683:48;27772:9;27767:168;27787:8;27783:1;:12;27767:168;;;27849:15;27825:39;;:20;27843:1;27833:7;:11;27825:7;:20::i;:::-;:39;;;27821:99;;27895:5;27888:12;;;;;27821:99;27797:3;;27767:168;;;-1:-1:-1;27963:4:0;;27558:417;-1:-1:-1;;;;27558:417:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:154::-;1950:42;1943:5;1939:54;1932:5;1929:65;1919:93;;2008:1;2005;1998:12;2023:315;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:1:o;2525:367::-;2588:8;2598:6;2652:3;2645:4;2637:6;2633:17;2629:27;2619:55;;2670:1;2667;2660:12;2619:55;-1:-1:-1;2693:20:1;;2736:18;2725:30;;2722:50;;;2768:1;2765;2758:12;2722:50;2805:4;2797:6;2793:17;2781:29;;2865:3;2858:4;2848:6;2845:1;2841:14;2833:6;2829:27;2825:38;2822:47;2819:67;;;2882:1;2879;2872:12;2897:573;3001:6;3009;3017;3025;3078:2;3066:9;3057:7;3053:23;3049:32;3046:52;;;3094:1;3091;3084:12;3046:52;3130:9;3117:23;3107:33;;3187:2;3176:9;3172:18;3159:32;3149:42;;3242:2;3231:9;3227:18;3214:32;3269:18;3261:6;3258:30;3255:50;;;3301:1;3298;3291:12;3255:50;3340:70;3402:7;3393:6;3382:9;3378:22;3340:70;:::i;:::-;2897:573;;;;-1:-1:-1;3429:8:1;-1:-1:-1;;;;2897:573:1:o;3475:456::-;3552:6;3560;3568;3621:2;3609:9;3600:7;3596:23;3592:32;3589:52;;;3637:1;3634;3627:12;3589:52;3676:9;3663:23;3695:31;3720:5;3695:31;:::i;:::-;3745:5;-1:-1:-1;3802:2:1;3787:18;;3774:32;3815:33;3774:32;3815:33;:::i;:::-;3475:456;;3867:7;;-1:-1:-1;;;3921:2:1;3906:18;;;;3893:32;;3475:456::o;3936:572::-;4031:6;4039;4047;4100:2;4088:9;4079:7;4075:23;4071:32;4068:52;;;4116:1;4113;4106:12;4068:52;4155:9;4142:23;4174:31;4199:5;4174:31;:::i;:::-;4224:5;-1:-1:-1;4280:2:1;4265:18;;4252:32;4307:18;4296:30;;4293:50;;;4339:1;4336;4329:12;4293:50;4378:70;4440:7;4431:6;4420:9;4416:22;4378:70;:::i;:::-;3936:572;;4467:8;;-1:-1:-1;4352:96:1;;-1:-1:-1;;;;3936:572:1:o;4766:247::-;4825:6;4878:2;4866:9;4857:7;4853:23;4849:32;4846:52;;;4894:1;4891;4884:12;4846:52;4933:9;4920:23;4952:31;4977:5;4952:31;:::i;5018:525::-;5104:6;5112;5120;5128;5181:3;5169:9;5160:7;5156:23;5152:33;5149:53;;;5198:1;5195;5188:12;5149:53;5237:9;5224:23;5256:31;5281:5;5256:31;:::i;:::-;5306:5;-1:-1:-1;5363:2:1;5348:18;;5335:32;5376:33;5335:32;5376:33;:::i;:::-;5018:525;;5428:7;;-1:-1:-1;;;;5482:2:1;5467:18;;5454:32;;5533:2;5518:18;5505:32;;5018:525::o;5548:248::-;5616:6;5624;5677:2;5665:9;5656:7;5652:23;5648:32;5645:52;;;5693:1;5690;5683:12;5645:52;-1:-1:-1;;5716:23:1;;;5786:2;5771:18;;;5758:32;;-1:-1:-1;5548:248:1:o;6103:860::-;6294:2;6283:9;6276:21;6257:4;6332:6;6326:13;6375:4;6370:2;6359:9;6355:18;6348:32;6403:52;6450:3;6439:9;6435:19;6421:12;6403:52;:::i;:::-;6389:66;;6504:2;6496:6;6492:15;6486:22;6572:66;6560:9;6552:6;6548:22;6544:95;6539:2;6528:9;6524:18;6517:123;6663:41;6697:6;6681:14;6663:41;:::i;:::-;6649:55;;;6768:42;6762:2;6754:6;6750:15;6744:22;6740:71;6735:2;6724:9;6720:18;6713:99;6867:2;6859:6;6855:15;6849:22;6843:3;6832:9;6828:19;6821:51;6928:3;6920:6;6916:16;6910:23;6903:4;6892:9;6888:20;6881:53;6951:6;6943:14;;;6103:860;;;;:::o;6968:316::-;7045:6;7053;7061;7114:2;7102:9;7093:7;7089:23;7085:32;7082:52;;;7130:1;7127;7120:12;7082:52;-1:-1:-1;;7153:23:1;;;7223:2;7208:18;;7195:32;;-1:-1:-1;7274:2:1;7259:18;;;7246:32;;6968:316;-1:-1:-1;6968:316:1:o;7289:592::-;7360:6;7368;7421:2;7409:9;7400:7;7396:23;7392:32;7389:52;;;7437:1;7434;7427:12;7389:52;7477:9;7464:23;7506:18;7547:2;7539:6;7536:14;7533:34;;;7563:1;7560;7553:12;7533:34;7601:6;7590:9;7586:22;7576:32;;7646:7;7639:4;7635:2;7631:13;7627:27;7617:55;;7668:1;7665;7658:12;7617:55;7708:2;7695:16;7734:2;7726:6;7723:14;7720:34;;;7750:1;7747;7740:12;7720:34;7795:7;7790:2;7781:6;7777:2;7773:15;7769:24;7766:37;7763:57;;;7816:1;7813;7806:12;7763:57;7847:2;7839:11;;;;;7869:6;;-1:-1:-1;7289:592:1;;-1:-1:-1;;;;7289:592:1:o;8156:632::-;8327:2;8379:21;;;8449:13;;8352:18;;;8471:22;;;8298:4;;8327:2;8550:15;;;;8524:2;8509:18;;;8298:4;8593:169;8607:6;8604:1;8601:13;8593:169;;;8668:13;;8656:26;;8737:15;;;;8702:12;;;;8629:1;8622:9;8593:169;;;-1:-1:-1;8779:3:1;;8156:632;-1:-1:-1;;;;;;8156:632:1:o;8793:184::-;8845:77;8842:1;8835:88;8942:4;8939:1;8932:15;8966:4;8963:1;8956:15;8982:777;9024:5;9077:3;9070:4;9062:6;9058:17;9054:27;9044:55;;9095:1;9092;9085:12;9044:55;9131:6;9118:20;9157:18;9194:2;9190;9187:10;9184:36;;;9200:18;;:::i;:::-;9334:2;9328:9;9396:4;9388:13;;9239:66;9384:22;;;9408:2;9380:31;9376:40;9364:53;;;9432:18;;;9452:22;;;9429:46;9426:72;;;9478:18;;:::i;:::-;9518:10;9514:2;9507:22;9553:2;9545:6;9538:18;9599:3;9592:4;9587:2;9579:6;9575:15;9571:26;9568:35;9565:55;;;9616:1;9613;9606:12;9565:55;9680:2;9673:4;9665:6;9661:17;9654:4;9646:6;9642:17;9629:54;9727:1;9720:4;9715:2;9707:6;9703:15;9699:26;9692:37;9747:6;9738:15;;;;;;8982:777;;;;:::o;9764:734::-;9868:6;9876;9884;9892;9900;9953:3;9941:9;9932:7;9928:23;9924:33;9921:53;;;9970:1;9967;9960:12;9921:53;10009:9;9996:23;10028:31;10053:5;10028:31;:::i;:::-;10078:5;-1:-1:-1;10135:2:1;10120:18;;10107:32;10148:33;10107:32;10148:33;:::i;:::-;10200:7;-1:-1:-1;10254:2:1;10239:18;;10226:32;;-1:-1:-1;10305:2:1;10290:18;;10277:32;;-1:-1:-1;10360:3:1;10345:19;;10332:33;10388:18;10377:30;;10374:50;;;10420:1;10417;10410:12;10374:50;10443:49;10484:7;10475:6;10464:9;10460:22;10443:49;:::i;:::-;10433:59;;;9764:734;;;;;;;;:::o;10997:118::-;11083:5;11076:13;11069:21;11062:5;11059:32;11049:60;;11105:1;11102;11095:12;11120:382;11185:6;11193;11246:2;11234:9;11225:7;11221:23;11217:32;11214:52;;;11262:1;11259;11252:12;11214:52;11301:9;11288:23;11320:31;11345:5;11320:31;:::i;:::-;11370:5;-1:-1:-1;11427:2:1;11412:18;;11399:32;11440:30;11399:32;11440:30;:::i;:::-;11489:7;11479:17;;;11120:382;;;;;:::o;11507:665::-;11602:6;11610;11618;11626;11679:3;11667:9;11658:7;11654:23;11650:33;11647:53;;;11696:1;11693;11686:12;11647:53;11735:9;11722:23;11754:31;11779:5;11754:31;:::i;:::-;11804:5;-1:-1:-1;11861:2:1;11846:18;;11833:32;11874:33;11833:32;11874:33;:::i;:::-;11926:7;-1:-1:-1;11980:2:1;11965:18;;11952:32;;-1:-1:-1;12035:2:1;12020:18;;12007:32;12062:18;12051:30;;12048:50;;;12094:1;12091;12084:12;12048:50;12117:49;12158:7;12149:6;12138:9;12134:22;12117:49;:::i;:::-;12107:59;;;11507:665;;;;;;;:::o;12945:388::-;13013:6;13021;13074:2;13062:9;13053:7;13049:23;13045:32;13042:52;;;13090:1;13087;13080:12;13042:52;13129:9;13116:23;13148:31;13173:5;13148:31;:::i;:::-;13198:5;-1:-1:-1;13255:2:1;13240:18;;13227:32;13268:33;13227:32;13268:33;:::i;13338:437::-;13417:1;13413:12;;;;13460;;;13481:61;;13535:4;13527:6;13523:17;13513:27;;13481:61;13588:2;13580:6;13577:14;13557:18;13554:38;13551:218;;;13625:77;13622:1;13615:88;13726:4;13723:1;13716:15;13754:4;13751:1;13744:15;13551:218;;13338:437;;;:::o;14049:245::-;14116:6;14169:2;14157:9;14148:7;14144:23;14140:32;14137:52;;;14185:1;14182;14175:12;14137:52;14217:9;14211:16;14236:28;14258:5;14236:28;:::i;14299:184::-;14351:77;14348:1;14341:88;14448:4;14445:1;14438:15;14472:4;14469:1;14462:15;14488:125;14528:4;14556:1;14553;14550:8;14547:34;;;14561:18;;:::i;:::-;-1:-1:-1;14598:9:1;;14488:125::o;14618:228::-;14658:7;14784:1;14716:66;14712:74;14709:1;14706:81;14701:1;14694:9;14687:17;14683:105;14680:131;;;14791:18;;:::i;:::-;-1:-1:-1;14831:9:1;;14618:228::o;14851:184::-;14903:77;14900:1;14893:88;15000:4;14997:1;14990:15;15024:4;15021:1;15014:15;15040:120;15080:1;15106;15096:35;;15111:18;;:::i;:::-;-1:-1:-1;15145:9:1;;15040:120::o;16046:184::-;16098:77;16095:1;16088:88;16195:4;16192:1;16185:15;16219:4;16216:1;16209:15;16235:512;16429:4;16458:42;16539:2;16531:6;16527:15;16516:9;16509:34;16591:2;16583:6;16579:15;16574:2;16563:9;16559:18;16552:43;;16631:6;16626:2;16615:9;16611:18;16604:34;16674:3;16669:2;16658:9;16654:18;16647:31;16695:46;16736:3;16725:9;16721:19;16713:6;16695:46;:::i;:::-;16687:54;16235:512;-1:-1:-1;;;;;;16235:512:1:o;16752:249::-;16821:6;16874:2;16862:9;16853:7;16849:23;16845:32;16842:52;;;16890:1;16887;16880:12;16842:52;16922:9;16916:16;16941:30;16965:5;16941:30;:::i;17006:470::-;17185:3;17223:6;17217:13;17239:53;17285:6;17280:3;17273:4;17265:6;17261:17;17239:53;:::i;:::-;17355:13;;17314:16;;;;17377:57;17355:13;17314:16;17411:4;17399:17;;17377:57;:::i;:::-;17450:20;;17006:470;-1:-1:-1;;;;17006:470:1:o;17733:195::-;17772:3;17803:66;17796:5;17793:77;17790:103;;;17873:18;;:::i;:::-;-1:-1:-1;17920:1:1;17909:13;;17733:195::o;17933:112::-;17965:1;17991;17981:35;;17996:18;;:::i;:::-;-1:-1:-1;18030:9:1;;17933:112::o;18050:128::-;18090:3;18121:1;18117:6;18114:1;18111:13;18108:39;;;18127:18;;:::i;:::-;-1:-1:-1;18163:9:1;;18050:128::o

Swarm Source

ipfs://1fb992136021118512c28be65a8c6c3390dead01e1e8df55ab537f85ed1817fe
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.