ETH Price: $3,482.96 (+0.99%)

Token

INHIBITOR (INHIB)
 

Overview

Max Total Supply

528 INHIB

Holders

269

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
famevault.eth
Balance
1 INHIB
0xebb3ca189310aa936201c0737c335bcae70c8695
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:
INHIBITOR

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

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

/**
 * 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.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 */
abstract contract ERC721L {
    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 OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

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

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

    address private _contractOwner;
    collectionData internal _collectionData;
    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 virtual 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 ();
    }

    /**
     * @dev Returns the number of tokens in `_owner`'s account.
     */
    function balanceOf(address _owner) public view returns (uint256) {
        require(_owner != address(0), "Address 0");
        return uint256(_addressData[_owner].balance);
    }

    /**
     * @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 {
        require(to != address(0), "Address 0");
        require(quantity > 0, "Quantity 0");

        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 {
        require(to != address(0), "Address 0");
        require(quantity > 0, "Quantity 0");

        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);
                require(to.code.length == 0 ||
                        ERC721TokenReceiver(to).onERC721Received(_msgSender(), address(0), updatedIndex, _data) ==
                        ERC721TokenReceiver.onERC721Received.selector, "Unsafe Destination");
                updatedIndex++;
            }

            _collectionData.index = updatedIndex;
        }
    }

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

    /**
     * @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 virtual {
        address currentOwner = ownerOf(tokenId);
        require(isUnlocked(from), "ERC721L: Tokens Locked");
        require((_msgSender() == currentOwner ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(currentOwner,_msgSender())), "ERC721L: Not Approved");
        require(currentOwner == from, "ERC721L: Not Owner");
        require(to != address(0), "ERC721L: Address 0");

        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);
        require(to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(_msgSender(), address(0), tokenId, _data) ==
                ERC721TokenReceiver.onERC721Received.selector, "Unsafe Destination");
    }

    /**
     * @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 safe, bytes memory _data) internal {
        require(isUnlocked(from), "ERC721L: Tokens Locked");
        require(_msgSender() == from || isApprovedForAll(from,_msgSender()), "ERC721L: Not Approved");
        require(multiOwnerCheck(from, startID, quantity), "ERC721L: Not Batchable");
        require(to != address(0), "ERC721L: Address 0");
        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 (safe){
                    require(to.code.length == 0 ||
                        ERC721TokenReceiver(to).onERC721Received(_msgSender(), address(0), currentToken, _data) ==
                        ERC721TokenReceiver.onERC721Received.selector, "Unsafe Destination");
                }
            }

            _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 the total amount of tokens created by the contract.
     */
    function totalCreated() public view returns (uint256) {
        return _collectionData.index;
    }

    /**
     * @dev Returns the total amount of tokens burned by the contract.
     */
    function totalBurned() public view returns (uint256) {
        return _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) {
        require(quantity > 1, "Low Quantity");
        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 {
        require(operator != _msgSender(), "ERC721L: Address is Owner");
        require(isUnlocked(_msgSender()), "ERC721L: Tokens Locked");

        _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);
        require(_msgSender() == tokenOwner || isApprovedForAll(tokenOwner, _msgSender()), "ERC721L: Not Approved");
        _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) {
        require(_exists(tokenId), "ERC721L: Null ID");
        return _tokenApprovals[tokenId];
    }

    /**
     * @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 {
        require(!_addressData[_msgSender()].locked, "Tokens currently locked");
        require(_cooldown > 0 && _cooldown < 31, "Invalid Cooldown");
        unchecked {
            uint256 proposedCooldown = _cooldown * 1 days;
            require(block.timestamp + proposedCooldown > _addressData[_msgSender()].lockedUnlockTimestamp, "Proposed cooldown too small");
            _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 {
        require(_addressData[_msgSender()].locked, "Tokens currently unlocked");

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

    /**
     * @dev Returns the token collection name.
     */
    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) {
        require(_exists(tokenId), "ERC721L: Null ID");
        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;
        require(totalOwned > 0, "balance 0");
        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();
    }

    function owner() public view returns (address) {
        return _contractOwner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Caller not owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        address oldOwner = _contractOwner;
        _contractOwner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /**
     * @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 the token collection information.
     */
    function collectionInformation() public view returns (collectionData memory) {
        return _collectionData;
    }

    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

}

abstract contract ERC721LBurnable is ERC721L {
    
    function _exists(uint256 tokenId) public view override returns (bool) {
        if (tokenId < _collectionData.index && _ownerships[tokenId] != address(0x000000000000000000000000000000000000dEaD)){
            unchecked {
                address currentOwner = _ownerships[tokenId];
                if (currentOwner != address(0)) {
                    return true;
                }

                while (true) {
                    tokenId--;
                    currentOwner = _ownerships[tokenId];
                    if (currentOwner == address(0x000000000000000000000000000000000000dEaD)) {
                        return false;
                    }
                    if (currentOwner != address(0)) {
                        return true;
                    }
                }
            }
        }

        return false;
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        unchecked {
            if (tokenId < _collectionData.index) {
                address ownership = _ownerships[tokenId];
                if (ownership != address(0x000000000000000000000000000000000000dEaD)) {
                    if (ownership != address(0)) {
                        return ownership;
                    }
                    while (true) {
                        tokenId--;
                        ownership = _ownerships[tokenId];
                        if (ownership != address(0)) {
                            if (ownership == address(0x000000000000000000000000000000000000dEaD)) {
                                revert ("Null Owner");
                            }
                            return ownership;
                        }
                        
                        
                    }
                }
            }
        }

        revert ();
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function burn(uint256 tokenId) public {
        address prevOwner = ownerOf(tokenId);
        require(isUnlocked(prevOwner), "ERC721L: Tokens Locked");
        require((_msgSender() == prevOwner ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwner, _msgSender())), "ERC721L: Not Approved");

        delete _tokenApprovals[tokenId];
        unchecked {
            _addressData[prevOwner].balance -= 1;
            _ownerships[tokenId] = address(0x000000000000000000000000000000000000dEaD);
            _collectionData.burned++;
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId] == address(0) && nextTokenId < _collectionData.index) {
                _ownerships[nextTokenId] = prevOwner;

            }
        }

        emit Transfer(prevOwner, address(0x000000000000000000000000000000000000dEaD), tokenId);
    }

    /**
     * @dev Destroys `tokenIDs`.
     * The approval is cleared when each token is burned.
     *
     * Requirements:
     *
     * - `tokenIDs` must exist.
     * - caller must be Owner or Approved for token usage.
     *
     * Emits a {Transfer} event.
     */
    function batchBurn(uint256 startID, uint256 quantity) public {
        address currentOwner = ownerOf(startID);
        require(isUnlocked(currentOwner), "ERC721L: Tokens Locked");
        require(multiOwnerCheck(currentOwner, startID, quantity), "ERC721L: Not Batchable");
        require(_msgSender() == currentOwner || isApprovedForAll(currentOwner, _msgSender()), "ERC721M: Not Approved");
        
        unchecked {
            for (uint256 i; i < quantity; i++) {
                uint256 currentToken = startID + i;
                delete _tokenApprovals[currentToken];

                if (i == 0){
                    _ownerships[currentToken] = address(0x000000000000000000000000000000000000dEaD);
                } else {
                    delete _ownerships[currentToken];
                }
                emit Transfer(currentOwner, address(0x000000000000000000000000000000000000dEaD), currentToken);
            }
            _addressData[currentOwner].balance -= uint64(quantity);
            _collectionData.burned += uint128(quantity);
            uint256 nextTokenId = startID + quantity;
            if (_ownerships[nextTokenId] == address(0) && nextTokenId < _collectionData.index) {
                _ownerships[nextTokenId] = currentOwner;

            }
        }

    }

}

contract INHIBITOR is ERC721LBurnable {

    address public royaltyAddress;
    uint256 public royaltySize = 750;
    uint256 public royaltyDenominator = 10000;
    mapping(uint256 => address) private _royaltyReceivers;

    uint256 maxSupply = 7777;
    string private _baseURI = "ipfs://QmaQ2FarHPpr5TbjQmv6knusDeNBXETzWxRGnWzLsTgn4G/";
    uint256 public publicMaxMint = 5;
    uint256 public priceInhibitor = .02 ether;
    bool public publicActive;
    address public genesisAddress;

  constructor(address _genesisAddress) ERC721L("INHIBITOR", "INHIB") {
      genesisAddress = _genesisAddress;
      royaltyAddress = owner();
  }

  modifier callerIsUser() {
    require(tx.origin == _msgSender() && _msgSender().code.length == 0, "Contract Caller");
    _;
  }

  modifier isGenesisContract() {
    require(genesisAddress == _msgSender(), "Caller not Genesis Contract");
    _;
  }

  function mintHelper(address _minter, uint256 _quantity) public isGenesisContract {
    unchecked {
        require(totalCreated() + _quantity <= maxSupply, "Insufficient supply");
    }

    _mint(_minter, _quantity);
  }

  function publicMint(uint256 _quantity) public payable callerIsUser() {
    require(publicActive, "Public sale not active");
    require(_quantity > 0 && _quantity <= publicMaxMint, "Invalid quantity");

    unchecked {
        require(totalCreated() + _quantity <= maxSupply, "Insufficient supply remaining");
        require(msg.value >= priceInhibitor * _quantity, "Insufficient payment");
    }

    _mint(_msgSender(), _quantity);
  }

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

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

  function setPublicState(bool _state) external onlyOwner {
    publicActive = _state;
  }

  function setPublicMaxMint(uint256 _newLimit) external onlyOwner {
    publicMaxMint = _newLimit;
  }

  function setInhibitorPrice(uint256 _price) external onlyOwner {
    priceInhibitor = _price;
  }

  function setGenesisAddress(address _address) external onlyOwner {
    genesisAddress = _address;
  }

  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}('');
        require(sent, "Transfer Error");    
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_genesisAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"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"},{"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startID","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"batchBurn","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":"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":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionInformation","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"burned","type":"uint256"}],"internalType":"struct ERC721L.collectionData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"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":"_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":[{"internalType":"address","name":"_minter","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintHelper","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":"priceInhibitor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"address","name":"_address","type":"address"}],"name":"setGenesisAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setInhibitorPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setPublicMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicState","outputs":[],"stateMutability":"nonpayable","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":[{"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":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCreated","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6102ee600a55612710600b55611e61600d5560e060405260366080818152906200460f60a03980516200003b91600e9160209091019062000198565b506005600f5566470de4df8200006010553480156200005957600080fd5b5060405162004645380380620046458339810160408190526200007c916200023e565b604080518082018252600981526824a72424a124aa27a960b91b60208083019182528351808501909452600584526424a72424a160d91b908401528151919291620000ca9160019162000198565b508051620000e090600290602084019062000198565b50620000ec3362000148565b505060118054610100600160a81b0319166101006001600160a01b03841602179055620001216000546001600160a01b031690565b600980546001600160a01b0319166001600160a01b039290921691909117905550620002ad565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001a69062000270565b90600052602060002090601f016020900481019282620001ca576000855562000215565b82601f10620001e557805160ff191683800117855562000215565b8280016001018555821562000215579182015b8281111562000215578251825591602001919060010190620001f8565b506200022392915062000227565b5090565b5b8082111562000223576000815560010162000228565b6000602082840312156200025157600080fd5b81516001600160a01b03811681146200026957600080fd5b9392505050565b600181811c908216806200028557607f821691505b60208210811415620002a757634e487b7160e01b600052602260045260246000fd5b50919050565b61435280620002bd6000396000f3fe60806040526004361061031e5760003560e01c8063844e0acd116101a5578063b88d4fde116100ec578063d9b3c80111610095578063eab8a7121161006f578063eab8a71214610978578063f2fde38b14610998578063f8e76cc0146109b8578063fd8d7ed3146109d857600080fd5b8063d9b3c80114610918578063dd46706414610938578063e985e9c51461095857600080fd5b8063c87b56dd116100c6578063c87b56dd146108c3578063cd6a3ea5146108e3578063d89135cd1461090357600080fd5b8063b88d4fde146107d6578063c48156af146107f6578063c62223311461081657600080fd5b806397309a5b1161014e578063a69df4b511610128578063a69df4b514610774578063ab82782c14610789578063ad2f852a146107a957600080fd5b806397309a5b1461071e578063a22cb46514610734578063a59585a81461075457600080fd5b806387d381cf1161017f57806387d381cf146106be5780638da5cb5b146106de57806395d89b411461070957600080fd5b8063844e0acd1461065c5780638462151c14610671578063860cad791461069e57600080fd5b8063305c7d4a1161026957806355f804b3116102125780636c0360eb116101ec5780636c0360eb1461061257806370a0823114610627578063715018a61461064757600080fd5b806355f804b3146105a05780636065fb33146105c05780636352211e146105f257600080fd5b80633ffea8c8116102435780633ffea8c81461053e57806342842e0e1461056057806342966c681461058057600080fd5b8063305c7d4a146104f95780633ccfd60b1461050f5780633f2981cf1461052457600080fd5b80631d7d5ae4116102cb5780632a55205a116102a55780632a55205a1461047a5780632bbf532a146104c65780632db11544146104e657600080fd5b80631d7d5ae41461042457806323b872dd1461043a57806329dc11021461045a57600080fd5b8063095ea7b3116102fc578063095ea7b3146103bf57806318160ddd146103e15780631b5462e81461040457600080fd5b806301ffc9a71461032357806306fdde0314610358578063081812fc1461037a575b600080fd5b34801561032f57600080fd5b5061034361033e366004613ba2565b6109ee565b60405190151581526020015b60405180910390f35b34801561036457600080fd5b5061036d610ad3565b60405161034f9190613c35565b34801561038657600080fd5b5061039a610395366004613c48565b610b68565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034f565b3480156103cb57600080fd5b506103df6103da366004613c8a565b610c07565b005b3480156103ed57600080fd5b50600454600354035b60405190815260200161034f565b34801561041057600080fd5b506103df61041f366004613c8a565b610d24565b34801561043057600080fd5b506103f660105481565b34801561044657600080fd5b506103df610455366004613cb4565b610e2f565b34801561046657600080fd5b506103df610475366004613cf0565b611229565b34801561048657600080fd5b5061049a610495366004613d32565b61124b565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161034f565b3480156104d257600080fd5b506103436104e1366004613d54565b6112e8565b6103df6104f4366004613c48565b611377565b34801561050557600080fd5b506103f6600f5481565b34801561051b57600080fd5b506103df6115c0565b34801561053057600080fd5b506011546103439060ff1681565b34801561054a57600080fd5b506105536116f5565b60405161034f9190613d6f565b34801561056c57600080fd5b506103df61057b366004613cb4565b61186a565b34801561058c57600080fd5b506103df61059b366004613c48565b61188a565b3480156105ac57600080fd5b506103df6105bb366004613de7565b611b4a565b3480156105cc57600080fd5b5060115461039a90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156105fe57600080fd5b5061039a61060d366004613c48565b611bd7565b34801561061e57600080fd5b5061036d611d14565b34801561063357600080fd5b506103f6610642366004613d54565b611d23565b34801561065357600080fd5b506103df611dd5565b34801561066857600080fd5b506003546103f6565b34801561067d57600080fd5b5061069161068c366004613d54565b611e62565b60405161034f9190613e59565b3480156106aa57600080fd5b506103df6106b9366004613d32565b611ffa565b3480156106ca57600080fd5b506103df6106d9366004613f77565b612375565b3480156106ea57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039a565b34801561071557600080fd5b5061036d61238b565b34801561072a57600080fd5b506103f6600a5481565b34801561074057600080fd5b506103df61074f366004613ff9565b61239c565b34801561076057600080fd5b506103df61076f366004613c48565b612522565b34801561078057600080fd5b506103df6125a8565b34801561079557600080fd5b506103df6107a4366004613d54565b612716565b3480156107b557600080fd5b5060095461039a9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107e257600080fd5b506103df6107f136600461402c565b6127e3565b34801561080257600080fd5b506103df610811366004614094565b612935565b34801561082257600080fd5b506108a6610831366004613d54565b73ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205460ff78010000000000000000000000000000000000000000000000008204169167ffffffffffffffff68010000000000000000830481169270010000000000000000000000000000000090041690565b60408051931515845260208401929092529082015260600161034f565b3480156108cf57600080fd5b5061036d6108de366004613c48565b6129e7565b3480156108ef57600080fd5b506103df6108fe366004613c8a565b612ab4565b34801561090f57600080fd5b506004546103f6565b34801561092457600080fd5b506103df610933366004613cf0565b612b88565b34801561094457600080fd5b506103df610953366004613c48565b612ba6565b34801561096457600080fd5b506103436109733660046140af565b612e12565b34801561098457600080fd5b506103df610993366004613c48565b612e66565b3480156109a457600080fd5b506103df6109b3366004613d54565b612eec565b3480156109c457600080fd5b506103436109d3366004613c48565b612ff3565b3480156109e457600080fd5b506103f6600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161480610a8157507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610acd57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060016000018054610ae5906140d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b11906140d9565b8015610b5e5780601f10610b3357610100808354040283529160200191610b5e565b820191906000526020600020905b815481529060010190602001808311610b4157829003601f168201915b5050505050905090565b6000610b7382612ff3565b610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4552433732314c3a204e756c6c2049440000000000000000000000000000000060448201526064015b60405180910390fd5b5060009081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c1282611bd7565b90503373ffffffffffffffffffffffffffffffffffffffff82161480610c3d5750610c3d8133612e12565b610ca3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314c3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60115473ffffffffffffffffffffffffffffffffffffffff610100909104163314610dab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616c6c6572206e6f742047656e6573697320436f6e747261637400000000006044820152606401610bd5565b600d5481610db860035490565b011115610e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e73756666696369656e7420737570706c79000000000000000000000000006044820152606401610bd5565b610e2b82826130f8565b5050565b6000610e3a82611bd7565b9050610e45846112e8565b610eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b3373ffffffffffffffffffffffffffffffffffffffff82161480610eec575033610ed483610b68565b73ffffffffffffffffffffffffffffffffffffffff16145b80610efc5750610efc8133612e12565b610f62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314c3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4552433732314c3a204e6f74204f776e657200000000000000000000000000006044820152606401610bd5565b73ffffffffffffffffffffffffffffffffffffffff8316611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4552433732314c3a2041646472657373203000000000000000000000000000006044820152606401610bd5565b600082815260076020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff88811685526006845282852080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018316179092558983168088528588208054938416938316600190810190931693909317909255888752600590955283862080549093161790915591850180845292205416158015611175575060035481105b156111c757600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b50818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b6112458484848460405180602001604052806000815250612375565b50505050565b6000806000600b54600a5485611261919061415c565b61126b91906141c8565b6000868152600c60205260408120549192509073ffffffffffffffffffffffffffffffffffffffff166112b65760095473ffffffffffffffffffffffffffffffffffffffff166112dc565b6000868152600c602052604090205473ffffffffffffffffffffffffffffffffffffffff165b96919550909350505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260408120547801000000000000000000000000000000000000000000000000900460ff16158015610acd57505073ffffffffffffffffffffffffffffffffffffffff16600090815260066020526040902054426801000000000000000090910467ffffffffffffffff161090565b32331480156113855750333b155b6113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f436f6e74726163742043616c6c657200000000000000000000000000000000006044820152606401610bd5565b60115460ff16611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5075626c69632073616c65206e6f7420616374697665000000000000000000006044820152606401610bd5565b6000811180156114695750600f548111155b6114cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964207175616e74697479000000000000000000000000000000006044820152606401610bd5565b600d54816114dc60035490565b011115611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e73756666696369656e7420737570706c792072656d61696e696e670000006044820152606401610bd5565b80601054023410156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e73756666696369656e74207061796d656e740000000000000000000000006044820152606401610bd5565b6115bd33826130f8565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b6040514790600090339083908381818185875af1925050503d8060008114611685576040519150601f19603f3d011682016040523d82523d6000602084013e61168a565b606091505b5050905080610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5472616e73666572204572726f720000000000000000000000000000000000006044820152606401610bd5565b6117206040518060800160405280606081526020016060815260200160008152602001600081525090565b600160405180608001604052908160008201805461173d906140d9565b80601f0160208091040260200160405190810160405280929190818152602001828054611769906140d9565b80156117b65780601f1061178b576101008083540402835291602001916117b6565b820191906000526020600020905b81548152906001019060200180831161179957829003601f168201915b505050505081526020016001820180546117cf906140d9565b80601f01602080910402602001604051908101604052809291908181526020018280546117fb906140d9565b80156118485780601f1061181d57610100808354040283529160200191611848565b820191906000526020600020905b81548152906001019060200180831161182b57829003601f168201915b5050505050815260200160028201548152602001600382015481525050905090565b611885838383604051806020016040528060008152506127e3565b505050565b600061189582611bd7565b90506118a0816112e8565b611906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b3373ffffffffffffffffffffffffffffffffffffffff8216148061194757503361192f83610b68565b73ffffffffffffffffffffffffffffffffffffffff16145b8061195757506119578133612e12565b6119bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314c3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b600082815260076020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff85811685526006845282852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff80831691909101167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790558685526005909352818420805490911661dead179055600480546001908101909155850180845292205416158015611aac575060035481105b15611afe57600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b50604051829061dead9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b611885600e8383613abd565b60035460009082101561031e5760008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1661dead8114611d0e5773ffffffffffffffffffffffffffffffffffffffff811615611c345792915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160008181526005602052604090205490919073ffffffffffffffffffffffffffffffffffffffff168015611d095773ffffffffffffffffffffffffffffffffffffffff811661dead1415610acd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e756c6c204f776e6572000000000000000000000000000000000000000000006044820152606401610bd5565b611c34565b50600080fd5b6060600e8054610ae5906140d9565b600073ffffffffffffffffffffffffffffffffffffffff8216611da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f41646472657373203000000000000000000000000000000000000000000000006044820152606401610bd5565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205467ffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b611e6060006132d8565b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526006602052604090205460609067ffffffffffffffff1680611efc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f62616c616e6365203000000000000000000000000000000000000000000000006044820152606401610bd5565b60035460008267ffffffffffffffff811115611f1a57611f1a613e9d565b604051908082528060200260200182016040528015611f43578160200160208202803683370190505b50905060008060005b84811015611d0e5760008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff168015611f83578092505b8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ff15781858580600101965081518110611fd057611fd06141dc565b60200260200101818152505086841415611ff1575092979650505050505050565b50600101611f4c565b600061200583611bd7565b9050612010816112e8565b612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b61208181848461334d565b6120e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a204e6f7420426174636861626c65000000000000000000006044820152606401610bd5565b3373ffffffffffffffffffffffffffffffffffffffff8216148061211057506121108133612e12565b612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314d3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b60005b8281101561227f57838101600081815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055816121fa57600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905561222f565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b604051819061dead9073ffffffffffffffffffffffffffffffffffffffff8616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a450600101612179565b5073ffffffffffffffffffffffffffffffffffffffff8082166000908152600660209081526040808320805467ffffffffffffffff808216899003167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909116179055600480546fffffffffffffffffffffffffffffffff881601905586860180845260059092529091205490911615801561231c575060035481105b15611245576000818152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905550505050565b6123848585858560018661341e565b5050505050565b6060600180018054610ae5906140d9565b73ffffffffffffffffffffffffffffffffffffffff821633141561241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732314c3a2041646472657373206973204f776e6572000000000000006044820152606401610bd5565b612425336112e8565b61248b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b33600081815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b600f55565b336000908152600660205260409020547801000000000000000000000000000000000000000000000000900460ff1661263d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f546f6b656e732063757272656e746c7920756e6c6f636b6564000000000000006044820152606401610bd5565b33600081815260066020526040902080547001000000000000000000000000000000007fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff82160467ffffffffffffffff90811642011668010000000000000000027fffffffffffffff00ffffffffffffffff0000000000000000ffffffffffffffff90911617905573ffffffffffffffffffffffffffffffffffffffff167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d4260405161270c91815260200190565b60405180910390a2565b60005473ffffffffffffffffffffffffffffffffffffffff163314612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b6011805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6127ee848484610e2f565b73ffffffffffffffffffffffffffffffffffffffff83163b15806128cf57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906128689033906000908890889060040161420b565b6020604051808303816000875af1158015612887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ab9190614254565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e736166652044657374696e6174696f6e00000000000000000000000000006044820152606401610bd5565b60005473ffffffffffffffffffffffffffffffffffffffff1633146129b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60606129f282612ff3565b612a58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4552433732314c3a204e756c6c204944000000000000000000000000000000006044820152606401610bd5565b6000612a62611d14565b90506000815111612a825760405180602001604052806000815250612aad565b80612a8c84613983565b604051602001612a9d929190614271565b6040516020818303038152906040525b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612b35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b6000908152600c6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6112458484848460006040518060200160405280600081525061341e565b336000908152600660205260409020547801000000000000000000000000000000000000000000000000900460ff1615612c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f546f6b656e732063757272656e746c79206c6f636b65640000000000000000006044820152606401610bd5565b600081118015612c4c5750601f81105b612cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c696420436f6f6c646f776e000000000000000000000000000000006044820152606401610bd5565b336000908152600660205260409020546201518082029068010000000000000000900467ffffffffffffffff1642820111612d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f706f73656420636f6f6c646f776e20746f6f20736d616c6c00000000006044820152606401610bd5565b33600081815260066020526040902080547fffffffffffffff000000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff909416939093029290921778010000000000000000000000000000000000000000000000001790915573ffffffffffffffffffffffffffffffffffffffff167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000882604051612e0791815260200190565b60405180910390a250565b6000612e1d836112e8565b15612e5d5773ffffffffffffffffffffffffffffffffffffffff80841660009081526008602090815260408083209386168352929052205460ff16612aad565b60009392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612ee7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b601055565b60005473ffffffffffffffffffffffffffffffffffffffff163314612f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b73ffffffffffffffffffffffffffffffffffffffff8116612fea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610bd5565b6115bd816132d8565b6003546000908210801561302d575060008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1661dead14155b156130f05760008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156130665750600192915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160008181526005602052604090205490919073ffffffffffffffffffffffffffffffffffffffff1661dead8114156130c65750600092915050565b73ffffffffffffffffffffffffffffffffffffffff8116156130eb5750600192915050565b613066565b506000919050565b73ffffffffffffffffffffffffffffffffffffffff8216613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f41646472657373203000000000000000000000000000000000000000000000006044820152606401610bd5565b600081116131df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5175616e746974792030000000000000000000000000000000000000000000006044820152606401610bd5565b60035473ffffffffffffffffffffffffffffffffffffffff83166000818152600660209081526040808320805467ffffffffffffffff8082168901167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790558483526005909152812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091555b828110156132d05760405160018301929073ffffffffffffffffffffffffffffffffffffffff8616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101613277565b506003555050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600182116133b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4c6f77205175616e7469747900000000000000000000000000000000000000006044820152606401610bd5565b60005b82811015613413578473ffffffffffffffffffffffffffffffffffffffff166133e6828601611bd7565b73ffffffffffffffffffffffffffffffffffffffff161461340b576000915050612aad565b6001016133bc565b506001949350505050565b613427866112e8565b61348d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b3373ffffffffffffffffffffffffffffffffffffffff871614806134b657506134b68633612e12565b61351c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314c3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b61352786858561334d565b61358d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a204e6f7420426174636861626c65000000000000000000006044820152606401610bd5565b73ffffffffffffffffffffffffffffffffffffffff851661360a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4552433732314c3a2041646472657373203000000000000000000000000000006044820152606401610bd5565b60005b8381101561388857848101600081815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055816136a257600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790556136d7565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561387f5773ffffffffffffffffffffffffffffffffffffffff87163b158061381957506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063150b7a02906137b290339060009087908a9060040161420b565b6020604051808303816000875af11580156137d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f59190614254565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b61387f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e736166652044657374696e6174696f6e00000000000000000000000000006044820152606401610bd5565b5060010161360d565b5073ffffffffffffffffffffffffffffffffffffffff868116600090815260066020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283168b90038316179092558a8616855282852080549283169282168a01909116919091179055878701808452600590925290912054909116158015613928575060035481105b1561397a57600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505050505050565b6060816139c357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156139ed57806139d7816142a0565b91506139e69050600a836141c8565b91506139c7565b60008167ffffffffffffffff811115613a0857613a08613e9d565b6040519080825280601f01601f191660200182016040528015613a32576020820181803683370190505b5090505b8415613ab557613a476001836142d9565b9150613a54600a866142f0565b613a5f906030614304565b60f81b818381518110613a7457613a746141dc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613aae600a866141c8565b9450613a36565b949350505050565b828054613ac9906140d9565b90600052602060002090601f016020900481019282613aeb5760008555613b4f565b82601f10613b22578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613b4f565b82800160010185558215613b4f579182015b82811115613b4f578235825591602001919060010190613b34565b50613b5b929150613b5f565b5090565b5b80821115613b5b5760008155600101613b60565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146115bd57600080fd5b600060208284031215613bb457600080fd5b8135612aad81613b74565b60005b83811015613bda578181015183820152602001613bc2565b838111156112455750506000910152565b60008151808452613c03816020860160208601613bbf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612aad6020830184613beb565b600060208284031215613c5a57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613c8557600080fd5b919050565b60008060408385031215613c9d57600080fd5b613ca683613c61565b946020939093013593505050565b600080600060608486031215613cc957600080fd5b613cd284613c61565b9250613ce060208501613c61565b9150604084013590509250925092565b60008060008060808587031215613d0657600080fd5b613d0f85613c61565b9350613d1d60208601613c61565b93969395505050506040820135916060013590565b60008060408385031215613d4557600080fd5b50508035926020909101359150565b600060208284031215613d6657600080fd5b612aad82613c61565b602081526000825160806020840152613d8b60a0840182613beb565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152613dc68282613beb565b91505060408401516060840152606084015160808401528091505092915050565b60008060208385031215613dfa57600080fd5b823567ffffffffffffffff80821115613e1257600080fd5b818501915085601f830112613e2657600080fd5b813581811115613e3557600080fd5b866020828501011115613e4757600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015613e9157835183529284019291840191600101613e75565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112613edd57600080fd5b813567ffffffffffffffff80821115613ef857613ef8613e9d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613f3e57613f3e613e9d565b81604052838152866020858801011115613f5757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215613f8f57600080fd5b613f9886613c61565b9450613fa660208701613c61565b93506040860135925060608601359150608086013567ffffffffffffffff811115613fd057600080fd5b613fdc88828901613ecc565b9150509295509295909350565b80358015158114613c8557600080fd5b6000806040838503121561400c57600080fd5b61401583613c61565b915061402360208401613fe9565b90509250929050565b6000806000806080858703121561404257600080fd5b61404b85613c61565b935061405960208601613c61565b925060408501359150606085013567ffffffffffffffff81111561407c57600080fd5b61408887828801613ecc565b91505092959194509250565b6000602082840312156140a657600080fd5b612aad82613fe9565b600080604083850312156140c257600080fd5b6140cb83613c61565b915061402360208401613c61565b600181811c908216806140ed57607f821691505b60208210811415614127577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141945761419461412d565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826141d7576141d7614199565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261424a6080830184613beb565b9695505050505050565b60006020828403121561426657600080fd5b8151612aad81613b74565b60008351614283818460208801613bbf565b835190830190614297818360208801613bbf565b01949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142d2576142d261412d565b5060010190565b6000828210156142eb576142eb61412d565b500390565b6000826142ff576142ff614199565b500690565b600082198211156143175761431761412d565b50019056fea264697066735822122009bc70150c9680bd38af050aeff2800edb582c4602c67bc5c4ccaed339889b0464736f6c634300080c0033697066733a2f2f516d615132466172485070723554626a516d76366b6e757344654e425845547a577852476e577a4c7354676e34472f0000000000000000000000006483cb39ca184de2f98b255d8a507c021efbb4bd

Deployed Bytecode

0x60806040526004361061031e5760003560e01c8063844e0acd116101a5578063b88d4fde116100ec578063d9b3c80111610095578063eab8a7121161006f578063eab8a71214610978578063f2fde38b14610998578063f8e76cc0146109b8578063fd8d7ed3146109d857600080fd5b8063d9b3c80114610918578063dd46706414610938578063e985e9c51461095857600080fd5b8063c87b56dd116100c6578063c87b56dd146108c3578063cd6a3ea5146108e3578063d89135cd1461090357600080fd5b8063b88d4fde146107d6578063c48156af146107f6578063c62223311461081657600080fd5b806397309a5b1161014e578063a69df4b511610128578063a69df4b514610774578063ab82782c14610789578063ad2f852a146107a957600080fd5b806397309a5b1461071e578063a22cb46514610734578063a59585a81461075457600080fd5b806387d381cf1161017f57806387d381cf146106be5780638da5cb5b146106de57806395d89b411461070957600080fd5b8063844e0acd1461065c5780638462151c14610671578063860cad791461069e57600080fd5b8063305c7d4a1161026957806355f804b3116102125780636c0360eb116101ec5780636c0360eb1461061257806370a0823114610627578063715018a61461064757600080fd5b806355f804b3146105a05780636065fb33146105c05780636352211e146105f257600080fd5b80633ffea8c8116102435780633ffea8c81461053e57806342842e0e1461056057806342966c681461058057600080fd5b8063305c7d4a146104f95780633ccfd60b1461050f5780633f2981cf1461052457600080fd5b80631d7d5ae4116102cb5780632a55205a116102a55780632a55205a1461047a5780632bbf532a146104c65780632db11544146104e657600080fd5b80631d7d5ae41461042457806323b872dd1461043a57806329dc11021461045a57600080fd5b8063095ea7b3116102fc578063095ea7b3146103bf57806318160ddd146103e15780631b5462e81461040457600080fd5b806301ffc9a71461032357806306fdde0314610358578063081812fc1461037a575b600080fd5b34801561032f57600080fd5b5061034361033e366004613ba2565b6109ee565b60405190151581526020015b60405180910390f35b34801561036457600080fd5b5061036d610ad3565b60405161034f9190613c35565b34801561038657600080fd5b5061039a610395366004613c48565b610b68565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034f565b3480156103cb57600080fd5b506103df6103da366004613c8a565b610c07565b005b3480156103ed57600080fd5b50600454600354035b60405190815260200161034f565b34801561041057600080fd5b506103df61041f366004613c8a565b610d24565b34801561043057600080fd5b506103f660105481565b34801561044657600080fd5b506103df610455366004613cb4565b610e2f565b34801561046657600080fd5b506103df610475366004613cf0565b611229565b34801561048657600080fd5b5061049a610495366004613d32565b61124b565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161034f565b3480156104d257600080fd5b506103436104e1366004613d54565b6112e8565b6103df6104f4366004613c48565b611377565b34801561050557600080fd5b506103f6600f5481565b34801561051b57600080fd5b506103df6115c0565b34801561053057600080fd5b506011546103439060ff1681565b34801561054a57600080fd5b506105536116f5565b60405161034f9190613d6f565b34801561056c57600080fd5b506103df61057b366004613cb4565b61186a565b34801561058c57600080fd5b506103df61059b366004613c48565b61188a565b3480156105ac57600080fd5b506103df6105bb366004613de7565b611b4a565b3480156105cc57600080fd5b5060115461039a90610100900473ffffffffffffffffffffffffffffffffffffffff1681565b3480156105fe57600080fd5b5061039a61060d366004613c48565b611bd7565b34801561061e57600080fd5b5061036d611d14565b34801561063357600080fd5b506103f6610642366004613d54565b611d23565b34801561065357600080fd5b506103df611dd5565b34801561066857600080fd5b506003546103f6565b34801561067d57600080fd5b5061069161068c366004613d54565b611e62565b60405161034f9190613e59565b3480156106aa57600080fd5b506103df6106b9366004613d32565b611ffa565b3480156106ca57600080fd5b506103df6106d9366004613f77565b612375565b3480156106ea57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661039a565b34801561071557600080fd5b5061036d61238b565b34801561072a57600080fd5b506103f6600a5481565b34801561074057600080fd5b506103df61074f366004613ff9565b61239c565b34801561076057600080fd5b506103df61076f366004613c48565b612522565b34801561078057600080fd5b506103df6125a8565b34801561079557600080fd5b506103df6107a4366004613d54565b612716565b3480156107b557600080fd5b5060095461039a9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107e257600080fd5b506103df6107f136600461402c565b6127e3565b34801561080257600080fd5b506103df610811366004614094565b612935565b34801561082257600080fd5b506108a6610831366004613d54565b73ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205460ff78010000000000000000000000000000000000000000000000008204169167ffffffffffffffff68010000000000000000830481169270010000000000000000000000000000000090041690565b60408051931515845260208401929092529082015260600161034f565b3480156108cf57600080fd5b5061036d6108de366004613c48565b6129e7565b3480156108ef57600080fd5b506103df6108fe366004613c8a565b612ab4565b34801561090f57600080fd5b506004546103f6565b34801561092457600080fd5b506103df610933366004613cf0565b612b88565b34801561094457600080fd5b506103df610953366004613c48565b612ba6565b34801561096457600080fd5b506103436109733660046140af565b612e12565b34801561098457600080fd5b506103df610993366004613c48565b612e66565b3480156109a457600080fd5b506103df6109b3366004613d54565b612eec565b3480156109c457600080fd5b506103436109d3366004613c48565b612ff3565b3480156109e457600080fd5b506103f6600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161480610a8157507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610acd57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060016000018054610ae5906140d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b11906140d9565b8015610b5e5780601f10610b3357610100808354040283529160200191610b5e565b820191906000526020600020905b815481529060010190602001808311610b4157829003601f168201915b5050505050905090565b6000610b7382612ff3565b610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4552433732314c3a204e756c6c2049440000000000000000000000000000000060448201526064015b60405180910390fd5b5060009081526007602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610c1282611bd7565b90503373ffffffffffffffffffffffffffffffffffffffff82161480610c3d5750610c3d8133612e12565b610ca3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314c3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b60008281526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60115473ffffffffffffffffffffffffffffffffffffffff610100909104163314610dab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f43616c6c6572206e6f742047656e6573697320436f6e747261637400000000006044820152606401610bd5565b600d5481610db860035490565b011115610e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e73756666696369656e7420737570706c79000000000000000000000000006044820152606401610bd5565b610e2b82826130f8565b5050565b6000610e3a82611bd7565b9050610e45846112e8565b610eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b3373ffffffffffffffffffffffffffffffffffffffff82161480610eec575033610ed483610b68565b73ffffffffffffffffffffffffffffffffffffffff16145b80610efc5750610efc8133612e12565b610f62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314c3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4552433732314c3a204e6f74204f776e657200000000000000000000000000006044820152606401610bd5565b73ffffffffffffffffffffffffffffffffffffffff8316611074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4552433732314c3a2041646472657373203000000000000000000000000000006044820152606401610bd5565b600082815260076020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff88811685526006845282852080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018316179092558983168088528588208054938416938316600190810190931693909317909255888752600590955283862080549093161790915591850180845292205416158015611175575060035481105b156111c757600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b50818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b6112458484848460405180602001604052806000815250612375565b50505050565b6000806000600b54600a5485611261919061415c565b61126b91906141c8565b6000868152600c60205260408120549192509073ffffffffffffffffffffffffffffffffffffffff166112b65760095473ffffffffffffffffffffffffffffffffffffffff166112dc565b6000868152600c602052604090205473ffffffffffffffffffffffffffffffffffffffff165b96919550909350505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260408120547801000000000000000000000000000000000000000000000000900460ff16158015610acd57505073ffffffffffffffffffffffffffffffffffffffff16600090815260066020526040902054426801000000000000000090910467ffffffffffffffff161090565b32331480156113855750333b155b6113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f436f6e74726163742043616c6c657200000000000000000000000000000000006044820152606401610bd5565b60115460ff16611457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5075626c69632073616c65206e6f7420616374697665000000000000000000006044820152606401610bd5565b6000811180156114695750600f548111155b6114cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c6964207175616e74697479000000000000000000000000000000006044820152606401610bd5565b600d54816114dc60035490565b011115611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e73756666696369656e7420737570706c792072656d61696e696e670000006044820152606401610bd5565b80601054023410156115b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e73756666696369656e74207061796d656e740000000000000000000000006044820152606401610bd5565b6115bd33826130f8565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b6040514790600090339083908381818185875af1925050503d8060008114611685576040519150601f19603f3d011682016040523d82523d6000602084013e61168a565b606091505b5050905080610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5472616e73666572204572726f720000000000000000000000000000000000006044820152606401610bd5565b6117206040518060800160405280606081526020016060815260200160008152602001600081525090565b600160405180608001604052908160008201805461173d906140d9565b80601f0160208091040260200160405190810160405280929190818152602001828054611769906140d9565b80156117b65780601f1061178b576101008083540402835291602001916117b6565b820191906000526020600020905b81548152906001019060200180831161179957829003601f168201915b505050505081526020016001820180546117cf906140d9565b80601f01602080910402602001604051908101604052809291908181526020018280546117fb906140d9565b80156118485780601f1061181d57610100808354040283529160200191611848565b820191906000526020600020905b81548152906001019060200180831161182b57829003601f168201915b5050505050815260200160028201548152602001600382015481525050905090565b611885838383604051806020016040528060008152506127e3565b505050565b600061189582611bd7565b90506118a0816112e8565b611906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b3373ffffffffffffffffffffffffffffffffffffffff8216148061194757503361192f83610b68565b73ffffffffffffffffffffffffffffffffffffffff16145b8061195757506119578133612e12565b6119bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314c3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b600082815260076020908152604080832080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff85811685526006845282852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff67ffffffffffffffff80831691909101167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790558685526005909352818420805490911661dead179055600480546001908101909155850180845292205416158015611aac575060035481105b15611afe57600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b50604051829061dead9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b611885600e8383613abd565b60035460009082101561031e5760008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1661dead8114611d0e5773ffffffffffffffffffffffffffffffffffffffff811615611c345792915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160008181526005602052604090205490919073ffffffffffffffffffffffffffffffffffffffff168015611d095773ffffffffffffffffffffffffffffffffffffffff811661dead1415610acd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f4e756c6c204f776e6572000000000000000000000000000000000000000000006044820152606401610bd5565b611c34565b50600080fd5b6060600e8054610ae5906140d9565b600073ffffffffffffffffffffffffffffffffffffffff8216611da2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f41646472657373203000000000000000000000000000000000000000000000006044820152606401610bd5565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205467ffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b611e6060006132d8565b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526006602052604090205460609067ffffffffffffffff1680611efc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f62616c616e6365203000000000000000000000000000000000000000000000006044820152606401610bd5565b60035460008267ffffffffffffffff811115611f1a57611f1a613e9d565b604051908082528060200260200182016040528015611f43578160200160208202803683370190505b50905060008060005b84811015611d0e5760008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff168015611f83578092505b8873ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ff15781858580600101965081518110611fd057611fd06141dc565b60200260200101818152505086841415611ff1575092979650505050505050565b50600101611f4c565b600061200583611bd7565b9050612010816112e8565b612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b61208181848461334d565b6120e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a204e6f7420426174636861626c65000000000000000000006044820152606401610bd5565b3373ffffffffffffffffffffffffffffffffffffffff8216148061211057506121108133612e12565b612176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314d3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b60005b8281101561227f57838101600081815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055816121fa57600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905561222f565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b604051819061dead9073ffffffffffffffffffffffffffffffffffffffff8616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a450600101612179565b5073ffffffffffffffffffffffffffffffffffffffff8082166000908152600660209081526040808320805467ffffffffffffffff808216899003167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909116179055600480546fffffffffffffffffffffffffffffffff881601905586860180845260059092529091205490911615801561231c575060035481105b15611245576000818152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905550505050565b6123848585858560018661341e565b5050505050565b6060600180018054610ae5906140d9565b73ffffffffffffffffffffffffffffffffffffffff821633141561241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732314c3a2041646472657373206973204f776e6572000000000000006044820152606401610bd5565b612425336112e8565b61248b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b33600081815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146125a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b600f55565b336000908152600660205260409020547801000000000000000000000000000000000000000000000000900460ff1661263d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f546f6b656e732063757272656e746c7920756e6c6f636b6564000000000000006044820152606401610bd5565b33600081815260066020526040902080547001000000000000000000000000000000007fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff82160467ffffffffffffffff90811642011668010000000000000000027fffffffffffffff00ffffffffffffffff0000000000000000ffffffffffffffff90911617905573ffffffffffffffffffffffffffffffffffffffff167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d4260405161270c91815260200190565b60405180910390a2565b60005473ffffffffffffffffffffffffffffffffffffffff163314612797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b6011805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6127ee848484610e2f565b73ffffffffffffffffffffffffffffffffffffffff83163b15806128cf57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906128689033906000908890889060040161420b565b6020604051808303816000875af1158015612887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ab9190614254565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e736166652044657374696e6174696f6e00000000000000000000000000006044820152606401610bd5565b60005473ffffffffffffffffffffffffffffffffffffffff1633146129b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60606129f282612ff3565b612a58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4552433732314c3a204e756c6c204944000000000000000000000000000000006044820152606401610bd5565b6000612a62611d14565b90506000815111612a825760405180602001604052806000815250612aad565b80612a8c84613983565b604051602001612a9d929190614271565b6040516020818303038152906040525b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612b35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b6000908152600c6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6112458484848460006040518060200160405280600081525061341e565b336000908152600660205260409020547801000000000000000000000000000000000000000000000000900460ff1615612c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f546f6b656e732063757272656e746c79206c6f636b65640000000000000000006044820152606401610bd5565b600081118015612c4c5750601f81105b612cb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e76616c696420436f6f6c646f776e000000000000000000000000000000006044820152606401610bd5565b336000908152600660205260409020546201518082029068010000000000000000900467ffffffffffffffff1642820111612d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f706f73656420636f6f6c646f776e20746f6f20736d616c6c00000000006044820152606401610bd5565b33600081815260066020526040902080547fffffffffffffff000000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff909416939093029290921778010000000000000000000000000000000000000000000000001790915573ffffffffffffffffffffffffffffffffffffffff167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000882604051612e0791815260200190565b60405180910390a250565b6000612e1d836112e8565b15612e5d5773ffffffffffffffffffffffffffffffffffffffff80841660009081526008602090815260408083209386168352929052205460ff16612aad565b60009392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612ee7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b601055565b60005473ffffffffffffffffffffffffffffffffffffffff163314612f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f43616c6c6572206e6f74206f776e6572000000000000000000000000000000006044820152606401610bd5565b73ffffffffffffffffffffffffffffffffffffffff8116612fea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a65726f206164647265737300000000000000000000000000000000000000006044820152606401610bd5565b6115bd816132d8565b6003546000908210801561302d575060008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1661dead14155b156130f05760008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1680156130665750600192915050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160008181526005602052604090205490919073ffffffffffffffffffffffffffffffffffffffff1661dead8114156130c65750600092915050565b73ffffffffffffffffffffffffffffffffffffffff8116156130eb5750600192915050565b613066565b506000919050565b73ffffffffffffffffffffffffffffffffffffffff8216613175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f41646472657373203000000000000000000000000000000000000000000000006044820152606401610bd5565b600081116131df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5175616e746974792030000000000000000000000000000000000000000000006044820152606401610bd5565b60035473ffffffffffffffffffffffffffffffffffffffff83166000818152600660209081526040808320805467ffffffffffffffff8082168901167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790558483526005909152812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169092179091555b828110156132d05760405160018301929073ffffffffffffffffffffffffffffffffffffffff8616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101613277565b506003555050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600182116133b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4c6f77205175616e7469747900000000000000000000000000000000000000006044820152606401610bd5565b60005b82811015613413578473ffffffffffffffffffffffffffffffffffffffff166133e6828601611bd7565b73ffffffffffffffffffffffffffffffffffffffff161461340b576000915050612aad565b6001016133bc565b506001949350505050565b613427866112e8565b61348d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a20546f6b656e73204c6f636b6564000000000000000000006044820152606401610bd5565b3373ffffffffffffffffffffffffffffffffffffffff871614806134b657506134b68633612e12565b61351c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4552433732314c3a204e6f7420417070726f76656400000000000000000000006044820152606401610bd5565b61352786858561334d565b61358d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4552433732314c3a204e6f7420426174636861626c65000000000000000000006044820152606401610bd5565b73ffffffffffffffffffffffffffffffffffffffff851661360a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4552433732314c3a2041646472657373203000000000000000000000000000006044820152606401610bd5565b60005b8381101561388857848101600081815260076020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055816136a257600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790556136d7565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b808773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561387f5773ffffffffffffffffffffffffffffffffffffffff87163b158061381957506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff89169063150b7a02906137b290339060009087908a9060040161420b565b6020604051808303816000875af11580156137d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f59190614254565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b61387f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e736166652044657374696e6174696f6e00000000000000000000000000006044820152606401610bd5565b5060010161360d565b5073ffffffffffffffffffffffffffffffffffffffff868116600090815260066020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000080821667ffffffffffffffff9283168b90038316179092558a8616855282852080549283169282168a01909116919091179055878701808452600590925290912054909116158015613928575060035481105b1561397a57600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505050505050565b6060816139c357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156139ed57806139d7816142a0565b91506139e69050600a836141c8565b91506139c7565b60008167ffffffffffffffff811115613a0857613a08613e9d565b6040519080825280601f01601f191660200182016040528015613a32576020820181803683370190505b5090505b8415613ab557613a476001836142d9565b9150613a54600a866142f0565b613a5f906030614304565b60f81b818381518110613a7457613a746141dc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613aae600a866141c8565b9450613a36565b949350505050565b828054613ac9906140d9565b90600052602060002090601f016020900481019282613aeb5760008555613b4f565b82601f10613b22578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613b4f565b82800160010185558215613b4f579182015b82811115613b4f578235825591602001919060010190613b34565b50613b5b929150613b5f565b5090565b5b80821115613b5b5760008155600101613b60565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146115bd57600080fd5b600060208284031215613bb457600080fd5b8135612aad81613b74565b60005b83811015613bda578181015183820152602001613bc2565b838111156112455750506000910152565b60008151808452613c03816020860160208601613bbf565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612aad6020830184613beb565b600060208284031215613c5a57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613c8557600080fd5b919050565b60008060408385031215613c9d57600080fd5b613ca683613c61565b946020939093013593505050565b600080600060608486031215613cc957600080fd5b613cd284613c61565b9250613ce060208501613c61565b9150604084013590509250925092565b60008060008060808587031215613d0657600080fd5b613d0f85613c61565b9350613d1d60208601613c61565b93969395505050506040820135916060013590565b60008060408385031215613d4557600080fd5b50508035926020909101359150565b600060208284031215613d6657600080fd5b612aad82613c61565b602081526000825160806020840152613d8b60a0840182613beb565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152613dc68282613beb565b91505060408401516060840152606084015160808401528091505092915050565b60008060208385031215613dfa57600080fd5b823567ffffffffffffffff80821115613e1257600080fd5b818501915085601f830112613e2657600080fd5b813581811115613e3557600080fd5b866020828501011115613e4757600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015613e9157835183529284019291840191600101613e75565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112613edd57600080fd5b813567ffffffffffffffff80821115613ef857613ef8613e9d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613f3e57613f3e613e9d565b81604052838152866020858801011115613f5757600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a08688031215613f8f57600080fd5b613f9886613c61565b9450613fa660208701613c61565b93506040860135925060608601359150608086013567ffffffffffffffff811115613fd057600080fd5b613fdc88828901613ecc565b9150509295509295909350565b80358015158114613c8557600080fd5b6000806040838503121561400c57600080fd5b61401583613c61565b915061402360208401613fe9565b90509250929050565b6000806000806080858703121561404257600080fd5b61404b85613c61565b935061405960208601613c61565b925060408501359150606085013567ffffffffffffffff81111561407c57600080fd5b61408887828801613ecc565b91505092959194509250565b6000602082840312156140a657600080fd5b612aad82613fe9565b600080604083850312156140c257600080fd5b6140cb83613c61565b915061402360208401613c61565b600181811c908216806140ed57607f821691505b60208210811415614127577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141945761419461412d565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826141d7576141d7614199565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261424a6080830184613beb565b9695505050505050565b60006020828403121561426657600080fd5b8151612aad81613b74565b60008351614283818460208801613bbf565b835190830190614297818360208801613bbf565b01949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142d2576142d261412d565b5060010190565b6000828210156142eb576142eb61412d565b500390565b6000826142ff576142ff614199565b500690565b600082198211156143175761431761412d565b50019056fea264697066735822122009bc70150c9680bd38af050aeff2800edb582c4602c67bc5c4ccaed339889b0464736f6c634300080c0033

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

0000000000000000000000006483cb39ca184de2f98b255d8a507c021efbb4bd

-----Decoded View---------------
Arg [0] : _genesisAddress (address): 0x6483cb39ca184DE2F98B255d8a507c021EFBb4bd

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006483cb39ca184de2f98b255d8a507c021efbb4bd


Deployed Bytecode Sourcemap

35869:2985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30812:340;;;;;;;;;;-1:-1:-1;30812:340:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;30812:340:0;;;;;;;;27552:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25829:174::-;;;;;;;;;;-1:-1:-1;25829:174:0;;;;;:::i;:::-;;:::i;:::-;;;1809:42:1;1797:55;;;1779:74;;1767:2;1752:18;25829:174:0;1633:226:1;25355:315:0;;;;;;;;;;-1:-1:-1;25355:315:0;;;;;:::i;:::-;;:::i;:::-;;22566:161;;;;;;;;;;-1:-1:-1;22686:22:0;;;22662:21;:46;22566:161;;;2470:25:1;;;2458:2;2443:18;22566:161:0;2324:177:1;36791:227:0;;;;;;;;;;-1:-1:-1;36791:227:0;;;;;:::i;:::-;;:::i;36260:41::-;;;;;;;;;;;;;;;;16681:979;;;;;;;;;;-1:-1:-1;16681:979:0;;;;;:::i;:::-;;:::i;19680:180::-;;;;;;;;;;-1:-1:-1;19680:180:0;;;;;:::i;:::-;;:::i;38099:367::-;;;;;;;;;;-1:-1:-1;38099:367:0;;;;;:::i;:::-;;:::i;:::-;;;;3698:42:1;3686:55;;;3668:74;;3773:2;3758:18;;3751:34;;;;3641:18;38099:367:0;3494:297:1;16200:181:0;;;;;;;;;;-1:-1:-1;16200:181:0;;;;;:::i;:::-;;:::i;37024:448::-;;;;;;:::i;:::-;;:::i;36221:32::-;;;;;;;;;;;;;;;;38623:226;;;;;;;;;;;;;:::i;36308:24::-;;;;;;;;;;-1:-1:-1;36308:24:0;;;;;;;;30686:118;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17737:142::-;;;;;;;;;;-1:-1:-1;17737:142:0;;;;;:::i;:::-;;:::i;33330:915::-;;;;;;;;;;-1:-1:-1;33330:915:0;;;;;:::i;:::-;;:::i;37576:101::-;;;;;;;;;;-1:-1:-1;37576:101:0;;;;;:::i;:::-;;:::i;36339:29::-;;;;;;;;;;-1:-1:-1;36339:29:0;;;;;;;;;;;32090:1011;;;;;;;;;;-1:-1:-1;32090:1011:0;;;;;:::i;:::-;;:::i;37478:92::-;;;;;;;;;;;;;:::i;13775:181::-;;;;;;;;;;-1:-1:-1;13775:181:0;;;;;:::i;:::-;;:::i;29755:103::-;;;;;;;;;;;;;:::i;22826:101::-;;;;;;;;;;-1:-1:-1;22898:21:0;;22826:101;;28642:898;;;;;;;;;;-1:-1:-1;28642:898:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34537:1323::-;;;;;;;;;;-1:-1:-1;34537:1323:0;;;;;:::i;:::-;;:::i;20700:206::-;;;;;;;;;;-1:-1:-1;20700:206:0;;;;;:::i;:::-;;:::i;29548:87::-;;;;;;;;;;-1:-1:-1;29586:7:0;29613:14;;;29548:87;;27726:102;;;;;;;;;;;;;:::i;35952:32::-;;;;;;;;;;;;;;;;24156:348;;;;;;;;;;-1:-1:-1;24156:348:0;;;;;:::i;:::-;;:::i;37779:102::-;;;;;;;;;;-1:-1:-1;37779:102:0;;;;;:::i;:::-;;:::i;27084:394::-;;;;;;;;;;;;;:::i;37991:102::-;;;;;;;;;;-1:-1:-1;37991:102:0;;;;;:::i;:::-;;:::i;35916:29::-;;;;;;;;;;-1:-1:-1;35916:29:0;;;;;;;;18629:384;;;;;;;;;;-1:-1:-1;18629:384:0;;;;;:::i;:::-;;:::i;37683:90::-;;;;;;;;;;-1:-1:-1;37683:90:0;;;;;:::i;:::-;;:::i;30381:224::-;;;;;;;;;;-1:-1:-1;30381:224:0;;;;;:::i;:::-;30482:20;;30439:4;30482:20;;;:12;:20;;;;;:27;;;;;;;30511:42;;;;;;;30555:41;;;;;30381:224;;;;;8930:14:1;;8923:22;8905:41;;8977:2;8962:18;;8955:34;;;;9005:18;;;8998:34;8893:2;8878:18;30381:224:0;8709:329:1;27934:294:0;;;;;;;;;;-1:-1:-1;27934:294:0;;;;;:::i;:::-;;:::i;38474:143::-;;;;;;;;;;-1:-1:-1;38474:143:0;;;;;:::i;:::-;;:::i;23025:101::-;;;;;;;;;;-1:-1:-1;23096:22:0;;23025:101;;19418:180;;;;;;;;;;-1:-1:-1;19418:180:0;;;;;:::i;:::-;;:::i;26233:623::-;;;;;;;;;;-1:-1:-1;26233:623:0;;;;;:::i;:::-;;:::i;24698:179::-;;;;;;;;;;-1:-1:-1;24698:179:0;;;;;:::i;:::-;;:::i;37887:98::-;;;;;;;;;;-1:-1:-1;37887:98:0;;;;;:::i;:::-;;:::i;29866:167::-;;;;;;;;;;-1:-1:-1;29866:167:0;;;;;:::i;:::-;;:::i;31219:863::-;;;;;;;;;;-1:-1:-1;31219:863:0;;;;;:::i;:::-;;:::i;35991:41::-;;;;;;;;;;;;;;;;30812:340;30888:4;30925:25;;;;;;:101;;-1:-1:-1;31001:25:0;;;;;30925:101;:177;;;-1:-1:-1;31077:25:0;;;;;30925:177;30905:197;30812:340;-1:-1:-1;;30812:340:0:o;27552:98::-;27589:13;27622:15;:20;;27615:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27552:98;:::o;25829:174::-;25888:7;25916:16;25924:7;25916;:16::i;:::-;25908:45;;;;;;;9952:2:1;25908:45:0;;;9934:21:1;9991:2;9971:18;;;9964:30;10030:18;10010;;;10003:46;10066:18;;25908:45:0;;;;;;;;;-1:-1:-1;25971:24:0;;;;:15;:24;;;;;;;;;25829:174::o;25355:315::-;25419:18;25440:16;25448:7;25440;:16::i;:::-;25419:37;-1:-1:-1;12432:10:0;25475:26;;;;;:72;;-1:-1:-1;25505:42:0;25522:10;12432;24698:179;:::i;25505:42::-;25467:106;;;;;;;10297:2:1;25467:106:0;;;10279:21:1;10336:2;10316:18;;;10309:30;10375:23;10355:18;;;10348:51;10416:18;;25467:106:0;10095:345:1;25467:106:0;25584:24;;;;:15;:24;;;;;;:29;;;;;;;;;;;;;;25629:33;;25584:24;;25629:33;;;;;;;25408:262;25355:315;;:::o;36791:227::-;36709:14;;:30;:14;;;;;12432:10;36709:30;36701:70;;;;;;;10647:2:1;36701:70:0;;;10629:21:1;10686:2;10666:18;;;10659:30;10725:29;10705:18;;;10698:57;10772:18;;36701:70:0;10445:351:1;36701:70:0;36938:9:::1;;36925;36908:14;22898:21:::0;;;22826:101;36908:14:::1;:26;:39;;36900:71;;;::::0;::::1;::::0;;11003:2:1;36900:71:0::1;::::0;::::1;10985:21:1::0;11042:2;11022:18;;;11015:30;11081:21;11061:18;;;11054:49;11120:18;;36900:71:0::1;10801:343:1::0;36900:71:0::1;36987:25;36993:7;37002:9;36987:5;:25::i;:::-;36791:227:::0;;:::o;16681:979::-;16772:20;16795:16;16803:7;16795;:16::i;:::-;16772:39;;16830:16;16841:4;16830:10;:16::i;:::-;16822:51;;;;;;;11351:2:1;16822:51:0;;;11333:21:1;11390:2;11370:18;;;11363:30;11429:24;11409:18;;;11402:52;11471:18;;16822:51:0;11149:346:1;16822:51:0;12432:10;16893:28;;;;;:81;;-1:-1:-1;12432:10:0;16938:20;16950:7;16938:11;:20::i;:::-;:36;;;16893:81;:141;;;-1:-1:-1;16991:43:0;17008:12;12432:10;24698:179;:::i;16991:43::-;16884:177;;;;;;;10297:2:1;16884:177:0;;;10279:21:1;10336:2;10316:18;;;10309:30;10375:23;10355:18;;;10348:51;10416:18;;16884:177:0;10095:345:1;16884:177:0;17096:4;17080:20;;:12;:20;;;17072:51;;;;;;;11702:2:1;17072:51:0;;;11684:21:1;11741:2;11721:18;;;11714:30;11780:20;11760:18;;;11753:48;11818:18;;17072:51:0;11500:342:1;17072:51:0;17142:16;;;17134:47;;;;;;;12049:2:1;17134:47:0;;;12031:21:1;12088:2;12068:18;;;12061:30;12127:20;12107:18;;;12100:48;12165:18;;17134:47:0;11847:342:1;17134:47:0;17201:24;;;;:15;:24;;;;;;;;17194:31;;;;;;;;;;17262:18;;;;;:12;:18;;;;;:31;;;;;;;;;;;;;;;;;;17308:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;17308:29:0;;;;;;;;;;;;;17352:20;;;:11;:20;;;;;;:25;;;;;;;;;17414:11;;;17444:24;;;;;;;:38;:77;;;;-1:-1:-1;17500:21:0;;17486:35;;17444:77;17440:157;;;17542:24;;;;:11;:24;;;;;:39;;;;;;;;;;17440:157;17237:371;17644:7;17640:2;17625:27;;17634:4;17625:27;;;;;;;;;;;;16761:899;16681:979;;;:::o;19680:180::-;19798:54;19820:4;19826:2;19830:7;19839:8;19798:54;;;;;;;;;;;;:21;:54::i;:::-;19680:180;;;;:::o;38099:367::-;38181:16;38199:21;38231:14;38276:18;;38262:11;;38249:10;:24;;;;:::i;:::-;38248:47;;;;:::i;:::-;38304:23;38330:27;;;:17;:27;;;;;;38231:64;;-1:-1:-1;38304:23:0;38330:41;:27;:88;;38404:14;;;;38330:88;;;38374:27;;;;:17;:27;;;;;;;;38330:88;38304:114;38452:6;;-1:-1:-1;38099:367:0;;-1:-1:-1;;;;38099:367:0:o;16200:181::-;16282:20;;;16257:4;16282:20;;;:12;:20;;;;;:27;;;;;;16281:28;:92;;;;-1:-1:-1;;16313:20:0;;;;;;:12;:20;;;;;:42;16358:15;16313:42;;;;;;:60;;16200:181::o;37024:448::-;36567:9;12432:10;36567:25;:58;;;;-1:-1:-1;12432:10:0;36596:24;:29;36567:58;36559:86;;;;;;;13132:2:1;36559:86:0;;;13114:21:1;13171:2;13151:18;;;13144:30;13210:17;13190:18;;;13183:45;13245:18;;36559:86:0;12930:339:1;36559:86:0;37108:12:::1;::::0;::::1;;37100:47;;;::::0;::::1;::::0;;13476:2:1;37100:47:0::1;::::0;::::1;13458:21:1::0;13515:2;13495:18;;;13488:30;13554:24;13534:18;;;13527:52;13596:18;;37100:47:0::1;13274:346:1::0;37100:47:0::1;37174:1;37162:9;:13;:43;;;;;37192:13;;37179:9;:26;;37162:43;37154:72;;;::::0;::::1;::::0;;13827:2:1;37154:72:0::1;::::0;::::1;13809:21:1::0;13866:2;13846:18;;;13839:30;13905:18;13885;;;13878:46;13941:18;;37154:72:0::1;13625:340:1::0;37154:72:0::1;37294:9;;37281;37264:14;22898:21:::0;;;22826:101;37264:14:::1;:26;:39;;37256:81;;;::::0;::::1;::::0;;14172:2:1;37256:81:0::1;::::0;::::1;14154:21:1::0;14211:2;14191:18;;;14184:30;14250:31;14230:18;;;14223:59;14299:18;;37256:81:0::1;13970:353:1::0;37256:81:0::1;37386:9;37369:14;;:26;37356:9;:39;;37348:72;;;::::0;::::1;::::0;;14530:2:1;37348:72:0::1;::::0;::::1;14512:21:1::0;14569:2;14549:18;;;14542:30;14608:22;14588:18;;;14581:50;14648:18;;37348:72:0::1;14328:344:1::0;37348:72:0::1;37436:30;12432:10:::0;37456:9:::1;37436:5;:30::i;:::-;37024:448:::0;:::o;38623:226::-;29586:7;29613:14;29683:23;29613:14;12432:10;29683:23;29675:52;;;;;;;14879:2:1;29675:52:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:18;14937;;;14930:46;14993:18;;29675:52:0;14677:340:1;29675:52:0;38746:51:::1;::::0;38698:21:::1;::::0;38673:22:::1;::::0;38754:10:::1;::::0;38698:21;;38673:22;38746:51;38673:22;38746:51;38698:21;38754:10;38746:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38730:67;;;38816:4;38808:31;;;::::0;::::1;::::0;;15434:2:1;38808:31:0::1;::::0;::::1;15416:21:1::0;15473:2;15453:18;;;15446:30;15512:16;15492:18;;;15485:44;15546:18;;38808:31:0::1;15232:338:1::0;30686:118:0;30740:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30740:21:0;30781:15;30774:22;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30686:118;:::o;17737:142::-;17832:39;17849:4;17855:2;17859:7;17832:39;;;;;;;;;;;;:16;:39::i;:::-;17737:142;;;:::o;33330:915::-;33379:17;33399:16;33407:7;33399;:16::i;:::-;33379:36;;33434:21;33445:9;33434:10;:21::i;:::-;33426:56;;;;;;;11351:2:1;33426:56:0;;;11333:21:1;11390:2;11370:18;;;11363:30;11429:24;11409:18;;;11402:52;11471:18;;33426:56:0;11149:346:1;33426:56:0;12432:10;33502:25;;;;;:78;;-1:-1:-1;12432:10:0;33544:20;33556:7;33544:11;:20::i;:::-;:36;;;33502:78;:136;;;-1:-1:-1;33597:41:0;33614:9;12432:10;24698:179;:::i;33597:41::-;33493:172;;;;;;;10297:2:1;33493:172:0;;;10279:21:1;10336:2;10316:18;;;10309:30;10375:23;10355:18;;;10348:51;10416:18;;33493:172:0;10095:345:1;33493:172:0;33685:24;;;;:15;:24;;;;;;;;33678:31;;;;;;;;;;33745:23;;;;;:12;:23;;;;;:36;;;;;;;;;;;;;;;;;;;33796:20;;;:11;:20;;;;;;:74;;;;;33827:42;33796:74;;;33885:22;:24;;33678:31;33885:24;;;;;;33946:11;;33976:24;;;;;;;:38;:77;;;;-1:-1:-1;34032:21:0;;34018:35;;33976:77;33972:156;;;34074:24;;;;:11;:24;;;;;:36;;;;;;;;;;33972:156;-1:-1:-1;34156:81:0;;34229:7;;34184:42;;34156:81;;;;;;;;;33368:877;33330:915;:::o;37576:101::-;29586:7;29613:14;29683:23;29613:14;12432:10;29683:23;29675:52;;;;;;;14879:2:1;29675:52:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:18;14937;;;14930:46;14993:18;;29675:52:0;14677:340:1;29675:52:0;37650:21:::1;:8;37661:10:::0;;37650:21:::1;:::i;32090:1011::-:0;32213:21;;32154:7;;32203:31;;32199:862;;;32255:17;32275:20;;;:11;:20;;;;;;;;32339:42;32318:64;;32314:732;;32411:23;;;;32407:96;;32470:9;32090:1011;-1:-1:-1;;32090:1011:0:o;32407:96::-;-1:-1:-1;32565:9:0;;;;32613:20;;;;:11;:20;;;;;;32565:9;;-1:-1:-1;32613:20:0;;32664:23;;32660:292;;32724:64;;;32745:42;32724:64;32720:158;;;32825:21;;;;;15777:2:1;32825:21:0;;;15759::1;15816:2;15796:18;;;15789:30;15855:12;15835:18;;;15828:40;15885:18;;32825:21:0;15575:334:1;32660:292:0;32525:502;;;32236:825;33084:9;;;37478:92;37527:13;37556:8;37549:15;;;;;:::i;13775:181::-;13831:7;13859:20;;;13851:42;;;;;;;16116:2:1;13851:42:0;;;16098:21:1;16155:1;16135:18;;;16128:29;16193:11;16173:18;;;16166:39;16222:18;;13851:42:0;15914:332:1;13851:42:0;-1:-1:-1;13919:20:0;;;;;;:12;:20;;;;;:28;;;;13775:181::o;29755:103::-;29586:7;29613:14;29683:23;29613:14;12432:10;29683:23;29675:52;;;;;;;14879:2:1;29675:52:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:18;14937;;;14930:46;14993:18;;29675:52:0;14677:340:1;29675:52:0;29820:30:::1;29847:1;29820:18;:30::i;:::-;29755:103::o:0;28642:898::-;28752:20;;;28731:18;28752:20;;;:12;:20;;;;;:28;28702:16;;28752:28;;28799:14;28791:36;;;;;;;16453:2:1;28791:36:0;;;16435:21:1;16492:1;16472:18;;;16465:29;16530:11;16510:18;;;16503:39;16559:18;;28791:36:0;16251:332:1;28791:36:0;28855:21;;28838:14;28929:10;28915:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28915:25:0;;28887:53;;28951:18;28980:20;29043:9;29038:463;29058:6;29054:1;:10;29038:463;;;29090:22;29115:14;;;:11;:14;;;;;;;;29152:28;;29148:106;;29220:14;29205:29;;29148:106;29292:6;29276:22;;:12;:22;;;29272:214;;;29348:1;29323:8;29332:12;;;;;;29323:22;;;;;;;;:::i;:::-;;;;;;:26;;;;;29390:10;29376;:24;29372:95;;;-1:-1:-1;29435:8:0;;28642:898;-1:-1:-1;;;;;;;28642:898:0:o;29372:95::-;-1:-1:-1;29066:3:0;;29038:463;;34537:1323;34609:20;34632:16;34640:7;34632;:16::i;:::-;34609:39;;34667:24;34678:12;34667:10;:24::i;:::-;34659:59;;;;;;;11351:2:1;34659:59:0;;;11333:21:1;11390:2;11370:18;;;11363:30;11429:24;11409:18;;;11402:52;11471:18;;34659:59:0;11149:346:1;34659:59:0;34737:48;34753:12;34767:7;34776:8;34737:15;:48::i;:::-;34729:83;;;;;;;16979:2:1;34729:83:0;;;16961:21:1;17018:2;16998:18;;;16991:30;17057:24;17037:18;;;17030:52;17099:18;;34729:83:0;16777:346:1;34729:83:0;12432:10;34831:28;;;;;:76;;-1:-1:-1;34863:44:0;34880:12;12432:10;24698:179;:::i;34863:44::-;34823:110;;;;;;;17330:2:1;34823:110:0;;;17312:21:1;17369:2;17349:18;;;17342:30;17408:23;17388:18;;;17381:51;17449:18;;34823:110:0;17128:345:1;34823:110:0;34984:9;34979:506;34999:8;34995:1;:12;34979:506;;;35056:11;;;35033:20;35093:29;;;:15;:29;;;;;35086:36;;;;;;35147:6;35143:214;;35177:25;;;;:11;:25;;;;;:79;;;;35213:42;35177:79;;;35143:214;;;35312:25;;;;:11;:25;;;;;35305:32;;;;;;35143:214;35380:89;;35456:12;;35411:42;;35380:89;;;;;;;;;-1:-1:-1;35009:3:0;;34979:506;;;-1:-1:-1;35499:26:0;;;;;;;;:12;:26;;;;;;;;:54;;;;;;;;;;;;;;;;;35568:22;:43;;;;;;;;35648:18;;;35685:24;;;:11;:24;;;;;;;35648:18;;35685:24;:38;:77;;;;-1:-1:-1;35741:21:0;;35727:35;;35685:77;35681:159;;;35783:24;;;;:11;:24;;;;;:39;;;;;;;;;;;;34954:897;34598:1262;34537:1323;;:::o;20700:206::-;20838:60;20857:4;20863:2;20867:7;20876:8;20886:4;20892:5;20838:18;:60::i;:::-;20700:206;;;;;:::o;27726:102::-;27765:13;27798:15;:22;;27791:29;;;;;:::i;24156:348::-;24242:24;;;12432:10;24242:24;;24234:62;;;;;;;17680:2:1;24234:62:0;;;17662:21:1;17719:2;17699:18;;;17692:30;17758:27;17738:18;;;17731:55;17803:18;;24234:62:0;17478:349:1;24234:62:0;24315:24;12432:10;16200:181;:::i;24315:24::-;24307:59;;;;;;;11351:2:1;24307:59:0;;;11333:21:1;11390:2;11370:18;;;11363:30;11429:24;11409:18;;;11402:52;11471:18;;24307:59:0;11149:346:1;24307:59:0;12432:10;24379:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;24448:48;;586:41:1;;;24379:42:0;;12432:10;24448:48;;559:18:1;24448:48:0;;;;;;;24156:348;;:::o;37779:102::-;29586:7;29613:14;29683:23;29613:14;12432:10;29683:23;29675:52;;;;;;;14879:2:1;29675:52:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:18;14937;;;14930:46;14993:18;;29675:52:0;14677:340:1;29675:52:0;37850:13:::1;:25:::0;37779:102::o;27084:394::-;12432:10;27128:26;;;;:12;:26;;;;;:33;;;;;;27120:71;;;;;;;18034:2:1;27120:71:0;;;18016:21:1;18073:2;18053:18;;;18046:30;18112:27;18092:18;;;18085:55;18157:18;;27120:71:0;17832:349:1;27120:71:0;12432:10;27211:26;;;;:12;:26;;;;;27204:40;;27356:47;27204:40;;;27356:47;;;;;27338:15;:65;27280:124;;;;;;;;;;27431:39;;;27454:15;27431:39;;;;2470:25:1;;2458:2;2443:18;;2324:177;27431:39:0;;;;;;;;27084:394::o;37991:102::-;29586:7;29613:14;29683:23;29613:14;12432:10;29683:23;29675:52;;;;;;;14879:2:1;29675:52:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:18;14937;;;14930:46;14993:18;;29675:52:0;14677:340:1;29675:52:0;38062:14:::1;:25:::0;;::::1;::::0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;37991:102::o;18629:384::-;18744:31;18757:4;18763:2;18767:7;18744:12;:31::i;:::-;18794:14;;;;:19;;:188;;-1:-1:-1;18834:82:0;;18937:45;18834:82;;;18937:45;18834:40;;;;18937:45;;18834:82;;12432:10;;18897:1;;18901:7;;18910:5;;18834:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:148;;;18794:188;18786:219;;;;;;;19159:2:1;18786:219:0;;;19141:21:1;19198:2;19178:18;;;19171:30;19237:20;19217:18;;;19210:48;19275:18;;18786:219:0;18957:342:1;37683:90:0;29586:7;29613:14;29683:23;29613:14;12432:10;29683:23;29675:52;;;;;;;14879:2:1;29675:52:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:18;14937;;;14930:46;14993:18;;29675:52:0;14677:340:1;29675:52:0;37746:12:::1;:21:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;37683:90::o;27934:294::-;27998:13;28032:16;28040:7;28032;:16::i;:::-;28024:45;;;;;;;9952:2:1;28024:45:0;;;9934:21:1;9991:2;9971:18;;;9964:30;10030:18;10010;;;10003:46;10066:18;;28024:45:0;9750:340:1;28024:45:0;28080:22;28105:9;:7;:9::i;:::-;28080:34;;28157:1;28138:8;28132:22;:26;:88;;;;;;;;;;;;;;;;;28185:8;28195:18;:7;:16;:18::i;:::-;28168:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28132:88;28125:95;27934:294;-1:-1:-1;;;27934:294:0:o;38474:143::-;29586:7;29613:14;29683:23;29613:14;12432:10;29683:23;29675:52;;;;;;;14879:2:1;29675:52:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:18;14937;;;14930:46;14993:18;;29675:52:0;14677:340:1;29675:52:0;38573:26:::1;::::0;;;:17:::1;:26;::::0;;;;:37;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;38474:143::o;19418:180::-;19532:58;19551:4;19557:2;19561:7;19570:8;19580:5;19532:58;;;;;;;;;;;;:18;:58::i;26233:623::-;12432:10;26293:26;;;;:12;:26;;;;;:33;;;;;;26292:34;26284:70;;;;;;;19981:2:1;26284:70:0;;;19963:21:1;20020:2;20000:18;;;19993:30;20059:25;20039:18;;;20032:53;20102:18;;26284:70:0;19779:347:1;26284:70:0;26385:1;26373:9;:13;:31;;;;;26402:2;26390:9;:14;26373:31;26365:60;;;;;;;20333:2:1;26365:60:0;;;20315:21:1;20372:2;20352:18;;;20345:30;20411:18;20391;;;20384:46;20447:18;;26365:60:0;20131:340:1;26365:60:0;12432:10;26461:24;26566:26;;;:12;:26;;;;;:48;26500:6;26488:18;;;26566:48;;;;;26529:15;:34;;:85;26521:125;;;;;;;20678:2:1;26521:125:0;;;20660:21:1;20717:2;20697:18;;;20690:30;20756:29;20736:18;;;20729:57;20803:18;;26521:125:0;20476:351:1;26521:125:0;12432:10;26661:26;;;;:12;:26;;;;;:40;;26716:74;;;;;;;;;;;;;;;26661:40;26716:74;;;;26817:31;;;26838:9;26817:31;;;;2470:25:1;;2458:2;2443:18;;2324:177;26817:31:0;;;;;;;;26233:623;:::o;24698:179::-;24779:4;24804:18;24815:6;24804:10;:18::i;:::-;24803:19;:66;;24833:26;;;;;;;;:18;:26;;;;;;;;:36;;;;;;;;;;;;24803:66;;;24825:5;24796:73;24698:179;-1:-1:-1;;;24698:179:0:o;37887:98::-;29586:7;29613:14;29683:23;29613:14;12432:10;29683:23;29675:52;;;;;;;14879:2:1;29675:52:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:18;14937;;;14930:46;14993:18;;29675:52:0;14677:340:1;29675:52:0;37956:14:::1;:23:::0;37887:98::o;29866:167::-;29586:7;29613:14;29683:23;29613:14;12432:10;29683:23;29675:52;;;;;;;14879:2:1;29675:52:0;;;14861:21:1;14918:2;14898:18;;;14891:30;14957:18;14937;;;14930:46;14993:18;;29675:52:0;14677:340:1;29675:52:0;29947:22:::1;::::0;::::1;29939:47;;;::::0;::::1;::::0;;21034:2:1;29939:47:0::1;::::0;::::1;21016:21:1::0;21073:2;21053:18;;;21046:30;21112:14;21092:18;;;21085:42;21144:18;;29939:47:0::1;20832:336:1::0;29939:47:0::1;29997:28;30016:8;29997:18;:28::i;31219:863::-:0;31314:21;;31283:4;;31304:31;;:110;;;;-1:-1:-1;31339:20:0;;;;:11;:20;;;;;;:75;:20;31371:42;31339:75;;31304:110;31300:750;;;31459:20;31482;;;:11;:20;;;;;;;;31525:26;;31521:86;;-1:-1:-1;31583:4:0;;31219:863;-1:-1:-1;;31219:863:0:o;31521:86::-;-1:-1:-1;31663:9:0;;;;31710:20;;;;:11;:20;;;;;;31663:9;;-1:-1:-1;31710:20:0;;31781:42;31757:67;;31753:136;;;-1:-1:-1;31860:5:0;;31219:863;-1:-1:-1;;31219:863:0:o;31753:136::-;31915:26;;;;31911:94;;-1:-1:-1;31977:4:0;;31219:863;-1:-1:-1;;31219:863:0:o;31911:94::-;31627:397;;31300:750;-1:-1:-1;32069:5:0;;31219:863;-1:-1:-1;31219:863:0:o;14170:550::-;14243:16;;;14235:38;;;;;;;16116:2:1;14235:38:0;;;16098:21:1;16155:1;16135:18;;;16128:29;16193:11;16173:18;;;16166:39;16222:18;;14235:38:0;15914:332:1;14235:38:0;14303:1;14292:8;:12;14284:35;;;;;;;21375:2:1;14284:35:0;;;21357:21:1;21414:2;21394:18;;;21387:30;21453:12;21433:18;;;21426:40;21483:18;;14284:35:0;21173:334:1;14284:35:0;14380:21;;14416:16;;;14357:20;14416:16;;;:12;:16;;;;;;;;:44;;;;;;;;;;;;;;;;14475:25;;;:11;:25;;;;;:30;;;;;;;;;;14534:115;14554:8;14550:1;:12;14534:115;;;14593:40;;14618:14;;;;;14593:40;;;;14610:1;;14593:40;;14610:1;;14593:40;14564:3;;14534:115;;;-1:-1:-1;14665:21:0;:36;-1:-1:-1;;14170:550:0:o;30041:199::-;30107:16;30126:14;;;30151:25;;;;;;;;;;30192:40;;30126:14;;;;;;;30192:40;;30107:16;30192:40;30096:144;30041:199;:::o;23373:406::-;23481:4;23517:1;23506:8;:12;23498:37;;;;;;;21714:2:1;23498:37:0;;;21696:21:1;21753:2;21733:18;;;21726:30;21792:14;21772:18;;;21765:42;21824:18;;23498:37:0;21512:336:1;23498:37:0;23576:9;23571:168;23591:8;23587:1;:12;23571:168;;;23653:15;23629:39;;:20;23647:1;23637:7;:11;23629:7;:20::i;:::-;:39;;;23625:99;;23699:5;23692:12;;;;;23625:99;23601:3;;23571:168;;;-1:-1:-1;23767:4:0;;23373:406;-1:-1:-1;;;;23373:406:0:o;20914:1554::-;21063:16;21074:4;21063:10;:16::i;:::-;21055:51;;;;;;;11351:2:1;21055:51:0;;;11333:21:1;11390:2;11370:18;;;11363:30;11429:24;11409:18;;;11402:52;11471:18;;21055:51:0;11149:346:1;21055:51:0;12432:10;21125:20;;;;;:59;;-1:-1:-1;21149:35:0;21166:4;12432:10;24698:179;:::i;21149:35::-;21117:93;;;;;;;10297:2:1;21117:93:0;;;10279:21:1;10336:2;10316:18;;;10309:30;10375:23;10355:18;;;10348:51;10416:18;;21117:93:0;10095:345:1;21117:93:0;21229:40;21245:4;21251:7;21260:8;21229:15;:40::i;:::-;21221:75;;;;;;;16979:2:1;21221:75:0;;;16961:21:1;17018:2;16998:18;;;16991:30;17057:24;17037:18;;;17030:52;17099:18;;21221:75:0;16777:346:1;21221:75:0;21315:16;;;21307:47;;;;;;;12049:2:1;21307:47:0;;;12031:21:1;12088:2;12068:18;;;12061:30;12127:20;12107:18;;;12100:48;12165:18;;21307:47:0;11847:342:1;21307:47:0;21395:9;21390:710;21410:8;21406:1;:12;21390:710;;;21467:11;;;21444:20;21504:29;;;:15;:29;;;;;21497:36;;;;;;21558:6;21554:165;;21588:25;;;;:11;:25;;;;;:30;;;;;;;;;;21554:165;;;21674:25;;;;:11;:25;;;;;21667:32;;;;;;21554:165;21761:12;21757:2;21742:32;;21751:4;21742:32;;;;;;;;;;;;21797:4;21793:292;;;21833:14;;;;:19;;:209;;-1:-1:-1;21881:87:0;;21997:45;21881:87;;;21997:45;21881:40;;;;21997:45;;21881:87;;12432:10;;21944:1;;21948:12;;21962:5;;21881:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:161;;;21833:209;21825:240;;;;;;;19159:2:1;21825:240:0;;;19141:21:1;19198:2;19178:18;;;19171:30;19237:20;19217:18;;;19210:48;19275:18;;21825:240:0;18957:342:1;21825:240:0;-1:-1:-1;21420:3:0;;21390:710;;;-1:-1:-1;22116:18:0;;;;;;;;:12;:18;;;;;;;;:46;;;;;;;;;;;;;;;;;;;22177:16;;;;;;;;:44;;;;;;;;;;;;;;;;;;;22258:18;;;22295:24;;;:11;:24;;;;;;;22258:18;;22295:24;:38;:77;;;;-1:-1:-1;22351:21:0;;22337:35;;22295:77;22291:149;;;22393:24;;;;:11;:24;;;;;:31;;;;;;;;;;22291:149;21365:1086;20914:1554;;;;;;:::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;-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:196::-;1932:20;;1992:42;1981:54;;1971:65;;1961:93;;2050:1;2047;2040:12;1961:93;1864:196;;;:::o;2065:254::-;2133:6;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2233:29;2252:9;2233:29;:::i;:::-;2223:39;2309:2;2294:18;;;;2281:32;;-1:-1:-1;;;2065:254:1:o;2506:328::-;2583:6;2591;2599;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;2691:29;2710:9;2691:29;:::i;:::-;2681:39;;2739:38;2773:2;2762:9;2758:18;2739:38;:::i;:::-;2729:48;;2824:2;2813:9;2809:18;2796:32;2786:42;;2506:328;;;;;:::o;2839:397::-;2925:6;2933;2941;2949;3002:3;2990:9;2981:7;2977:23;2973:33;2970:53;;;3019:1;3016;3009:12;2970:53;3042:29;3061:9;3042:29;:::i;:::-;3032:39;;3090:38;3124:2;3113:9;3109:18;3090:38;:::i;:::-;2839:397;;3080:48;;-1:-1:-1;;;;3175:2:1;3160:18;;3147:32;;3226:2;3211:18;3198:32;;2839:397::o;3241:248::-;3309:6;3317;3370:2;3358:9;3349:7;3345:23;3341:32;3338:52;;;3386:1;3383;3376:12;3338:52;-1:-1:-1;;3409:23:1;;;3479:2;3464:18;;;3451:32;;-1:-1:-1;3241:248:1:o;3796:186::-;3855:6;3908:2;3896:9;3887:7;3883:23;3879:32;3876:52;;;3924:1;3921;3914:12;3876:52;3947:29;3966:9;3947:29;:::i;3987:750::-;4178:2;4167:9;4160:21;4141:4;4216:6;4210:13;4259:4;4254:2;4243:9;4239:18;4232:32;4287:52;4334:3;4323:9;4319:19;4305:12;4287:52;:::i;:::-;4273:66;;4388:2;4380:6;4376:15;4370:22;4456:66;4444:9;4436:6;4432:22;4428:95;4423:2;4412:9;4408:18;4401:123;4547:41;4581:6;4565:14;4547:41;:::i;:::-;4533:55;;;4642:2;4634:6;4630:15;4624:22;4619:2;4608:9;4604:18;4597:50;4703:2;4695:6;4691:15;4685:22;4678:4;4667:9;4663:20;4656:52;4725:6;4717:14;;;3987:750;;;;:::o;4742:592::-;4813:6;4821;4874:2;4862:9;4853:7;4849:23;4845:32;4842:52;;;4890:1;4887;4880:12;4842:52;4930:9;4917:23;4959:18;5000:2;4992:6;4989:14;4986:34;;;5016:1;5013;5006:12;4986:34;5054:6;5043:9;5039:22;5029:32;;5099:7;5092:4;5088:2;5084:13;5080:27;5070:55;;5121:1;5118;5111:12;5070:55;5161:2;5148:16;5187:2;5179:6;5176:14;5173:34;;;5203:1;5200;5193:12;5173:34;5248:7;5243:2;5234:6;5230:2;5226:15;5222:24;5219:37;5216:57;;;5269:1;5266;5259:12;5216:57;5300:2;5292:11;;;;;5322:6;;-1:-1:-1;4742:592:1;;-1:-1:-1;;;;4742:592:1:o;5339:632::-;5510:2;5562:21;;;5632:13;;5535:18;;;5654:22;;;5481:4;;5510:2;5733:15;;;;5707:2;5692:18;;;5481:4;5776:169;5790:6;5787:1;5784:13;5776:169;;;5851:13;;5839:26;;5920:15;;;;5885:12;;;;5812:1;5805:9;5776:169;;;-1:-1:-1;5962:3:1;;5339:632;-1:-1:-1;;;;;;5339:632:1:o;5976:184::-;6028:77;6025:1;6018:88;6125:4;6122:1;6115:15;6149:4;6146:1;6139:15;6165:777;6207:5;6260:3;6253:4;6245:6;6241:17;6237:27;6227:55;;6278:1;6275;6268:12;6227:55;6314:6;6301:20;6340:18;6377:2;6373;6370:10;6367:36;;;6383:18;;:::i;:::-;6517:2;6511:9;6579:4;6571:13;;6422:66;6567:22;;;6591:2;6563:31;6559:40;6547:53;;;6615:18;;;6635:22;;;6612:46;6609:72;;;6661:18;;:::i;:::-;6701:10;6697:2;6690:22;6736:2;6728:6;6721:18;6782:3;6775:4;6770:2;6762:6;6758:15;6754:26;6751:35;6748:55;;;6799:1;6796;6789:12;6748:55;6863:2;6856:4;6848:6;6844:17;6837:4;6829:6;6825:17;6812:54;6910:1;6903:4;6898:2;6890:6;6886:15;6882:26;6875:37;6930:6;6921:15;;;;;;6165:777;;;;:::o;6947:606::-;7051:6;7059;7067;7075;7083;7136:3;7124:9;7115:7;7111:23;7107:33;7104:53;;;7153:1;7150;7143:12;7104:53;7176:29;7195:9;7176:29;:::i;:::-;7166:39;;7224:38;7258:2;7247:9;7243:18;7224:38;:::i;:::-;7214:48;;7309:2;7298:9;7294:18;7281:32;7271:42;;7360:2;7349:9;7345:18;7332:32;7322:42;;7415:3;7404:9;7400:19;7387:33;7443:18;7435:6;7432:30;7429:50;;;7475:1;7472;7465:12;7429:50;7498:49;7539:7;7530:6;7519:9;7515:22;7498:49;:::i;:::-;7488:59;;;6947:606;;;;;;;;:::o;7558:160::-;7623:20;;7679:13;;7672:21;7662:32;;7652:60;;7708:1;7705;7698:12;7723:254;7788:6;7796;7849:2;7837:9;7828:7;7824:23;7820:32;7817:52;;;7865:1;7862;7855:12;7817:52;7888:29;7907:9;7888:29;:::i;:::-;7878:39;;7936:35;7967:2;7956:9;7952:18;7936:35;:::i;:::-;7926:45;;7723:254;;;;;:::o;7982:537::-;8077:6;8085;8093;8101;8154:3;8142:9;8133:7;8129:23;8125:33;8122:53;;;8171:1;8168;8161:12;8122:53;8194:29;8213:9;8194:29;:::i;:::-;8184:39;;8242:38;8276:2;8265:9;8261:18;8242:38;:::i;:::-;8232:48;;8327:2;8316:9;8312:18;8299:32;8289:42;;8382:2;8371:9;8367:18;8354:32;8409:18;8401:6;8398:30;8395:50;;;8441:1;8438;8431:12;8395:50;8464:49;8505:7;8496:6;8485:9;8481:22;8464:49;:::i;:::-;8454:59;;;7982:537;;;;;;;:::o;8524:180::-;8580:6;8633:2;8621:9;8612:7;8608:23;8604:32;8601:52;;;8649:1;8646;8639:12;8601:52;8672:26;8688:9;8672:26;:::i;9043:260::-;9111:6;9119;9172:2;9160:9;9151:7;9147:23;9143:32;9140:52;;;9188:1;9185;9178:12;9140:52;9211:29;9230:9;9211:29;:::i;:::-;9201:39;;9259:38;9293:2;9282:9;9278:18;9259:38;:::i;9308:437::-;9387:1;9383:12;;;;9430;;;9451:61;;9505:4;9497:6;9493:17;9483:27;;9451:61;9558:2;9550:6;9547:14;9527:18;9524:38;9521:218;;;9595:77;9592:1;9585:88;9696:4;9693:1;9686:15;9724:4;9721:1;9714:15;9521:218;;9308:437;;;:::o;12194:184::-;12246:77;12243:1;12236:88;12343:4;12340:1;12333:15;12367:4;12364:1;12357:15;12383:228;12423:7;12549:1;12481:66;12477:74;12474:1;12471:81;12466:1;12459:9;12452:17;12448:105;12445:131;;;12556:18;;:::i;:::-;-1:-1:-1;12596:9:1;;12383:228::o;12616:184::-;12668:77;12665:1;12658:88;12765:4;12762:1;12755:15;12789:4;12786:1;12779:15;12805:120;12845:1;12871;12861:35;;12876:18;;:::i;:::-;-1:-1:-1;12910:9:1;;12805:120::o;16588:184::-;16640:77;16637:1;16630:88;16737:4;16734:1;16727:15;16761:4;16758:1;16751:15;18186:512;18380:4;18409:42;18490:2;18482:6;18478:15;18467:9;18460:34;18542:2;18534:6;18530:15;18525:2;18514:9;18510:18;18503:43;;18582:6;18577:2;18566:9;18562:18;18555:34;18625:3;18620:2;18609:9;18605:18;18598:31;18646:46;18687:3;18676:9;18672:19;18664:6;18646:46;:::i;:::-;18638:54;18186:512;-1:-1:-1;;;;;;18186:512:1:o;18703:249::-;18772:6;18825:2;18813:9;18804:7;18800:23;18796:32;18793:52;;;18841:1;18838;18831:12;18793:52;18873:9;18867:16;18892:30;18916:5;18892:30;:::i;19304:470::-;19483:3;19521:6;19515:13;19537:53;19583:6;19578:3;19571:4;19563:6;19559:17;19537:53;:::i;:::-;19653:13;;19612:16;;;;19675:57;19653:13;19612:16;19709:4;19697:17;;19675:57;:::i;:::-;19748:20;;19304:470;-1:-1:-1;;;;19304:470:1:o;21853:195::-;21892:3;21923:66;21916:5;21913:77;21910:103;;;21993:18;;:::i;:::-;-1:-1:-1;22040:1:1;22029:13;;21853:195::o;22053:125::-;22093:4;22121:1;22118;22115:8;22112:34;;;22126:18;;:::i;:::-;-1:-1:-1;22163:9:1;;22053:125::o;22183:112::-;22215:1;22241;22231:35;;22246:18;;:::i;:::-;-1:-1:-1;22280:9:1;;22183:112::o;22300:128::-;22340:3;22371:1;22367:6;22364:1;22361:13;22358:39;;;22377:18;;:::i;:::-;-1:-1:-1;22413:9:1;;22300:128::o

Swarm Source

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