ETH Price: $3,646.69 (+1.87%)
Gas: 6.61 Gwei

Contract

0x0A1F4C550cD7Bc37Af841e81fCf3557269f4E912
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Safe Transfer Fr...197495302024-04-27 22:04:47216 days ago1714255487IN
0x0A1F4C55...269f4E912
0 ETH0.000515735.67365055
Set Approval For...193017272024-02-25 2:50:47279 days ago1708829447IN
0x0A1F4C55...269f4E912
0 ETH0.0005479222.48551109
Set Approval For...188956612023-12-30 3:25:59336 days ago1703906759IN
0x0A1F4C55...269f4E912
0 ETH0.000725315.70058004
Set Approval For...188005382023-12-16 18:55:47349 days ago1702752947IN
0x0A1F4C55...269f4E912
0 ETH0.0011376246.68539813
Set Approval For...188005132023-12-16 18:50:35349 days ago1702752635IN
0x0A1F4C55...269f4E912
0 ETH0.0011979245.43086284
Set Approval For...188005122023-12-16 18:50:23349 days ago1702752623IN
0x0A1F4C55...269f4E912
0 ETH0.001140446.7993808
Set Approval For...187809832023-12-14 1:02:23352 days ago1702515743IN
0x0A1F4C55...269f4E912
0 ETH0.0022603448.92944626
Set Approval For...185915652023-11-17 12:21:47378 days ago1700223707IN
0x0A1F4C55...269f4E912
0 ETH0.0014782732
Toggle Project I...180584312023-09-03 20:44:47453 days ago1693773887IN
0x0A1F4C55...269f4E912
0 ETH0.0004150413.34471597
Update Project P...180559832023-09-03 12:31:11453 days ago1693744271IN
0x0A1F4C55...269f4E912
0 ETH0.0003384114.01208788
Update Project P...180509872023-09-02 19:44:11454 days ago1693683851IN
0x0A1F4C55...269f4E912
0 ETH0.0002906412.03419986
Set Approval For...175252352023-06-21 3:02:47528 days ago1687316567IN
0x0A1F4C55...269f4E912
0 ETH0.0006228713.48334114
Toggle Project I...174431642023-06-09 14:07:35539 days ago1686319655IN
0x0A1F4C55...269f4E912
0 ETH0.0007357225.5122808
Toggle Project I...174431632023-06-09 14:07:23539 days ago1686319643IN
0x0A1F4C55...269f4E912
0 ETH0.0007448425.82857282
Toggle Project I...174431312023-06-09 14:00:59539 days ago1686319259IN
0x0A1F4C55...269f4E912
0 ETH0.0007667426.58817312
Toggle Project I...174431292023-06-09 14:00:35539 days ago1686319235IN
0x0A1F4C55...269f4E912
0 ETH0.000778727.00263924
Update Project A...171613752023-04-30 20:55:59579 days ago1682888159IN
0x0A1F4C55...269f4E912
0 ETH0.0023971248.41302145
Toggle Project I...171374792023-04-27 12:21:47582 days ago1682598107IN
0x0A1F4C55...269f4E912
0 ETH0.0010616636.81492715
Toggle Project I...171374782023-04-27 12:21:35582 days ago1682598095IN
0x0A1F4C55...269f4E912
0 ETH0.001091837.85987354
Update Project D...171374522023-04-27 12:16:23582 days ago1682597783IN
0x0A1F4C55...269f4E912
0 ETH0.0078503635.37907518
Update Project D...171374462023-04-27 12:15:11582 days ago1682597711IN
0x0A1F4C55...269f4E912
0 ETH0.0107815839.39038551
Update Project B...171374452023-04-27 12:14:59582 days ago1682597699IN
0x0A1F4C55...269f4E912
0 ETH0.0035827838.79745185
Update Project M...171374412023-04-27 12:14:11582 days ago1682597651IN
0x0A1F4C55...269f4E912
0 ETH0.0011310833.80197079
Update Project N...171374402023-04-27 12:13:59582 days ago1682597639IN
0x0A1F4C55...269f4E912
0 ETH0.0012163135.09162722
Update Project M...171374382023-04-27 12:13:35582 days ago1682597615IN
0x0A1F4C55...269f4E912
0 ETH0.0013170739.36035148
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NtentArtX

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 345 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File contracts/libs/IERC165.sol

// File: openzeppelin-solidity/contracts/introspection/IERC165.sol
pragma solidity ^0.8.9;

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

// File contracts/libs/ERC165.sol

// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

pragma solidity ^0.8.9;

/**
 * @dev Implementation of the `IERC165` interface.
 *
 * Contracts may inherit from this and call `_registerInterface` to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See `IERC165.supportsInterface`.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        external
        view
        virtual
        override
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See `IERC165.supportsInterface`.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File contracts/libs/IERC721.sol

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.9;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
abstract contract IERC721 is IERC165 {
    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
    );

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

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either `approve` or `setApproveForAll`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual;

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either `approve` or `setApproveForAll`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual;

    function approve(address to, uint256 tokenId) public virtual;

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public virtual;

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual;
}

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

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

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

// File contracts/libs/Address.sol

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.8.9;

/**
 * @dev Collection of functions related to the address type,
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

pragma solidity ^0.8.9;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function concatenate(string memory a, string memory b)
        internal
        pure
        returns (string memory)
    {
        return string(abi.encodePacked(a, b));
    }

    /**
     * @dev converts string to integer
     */

    function str2int(string memory numString) internal pure returns (uint256) {
        uint256 val = 0;
        bytes memory stringBytes = bytes(numString);
        for (uint256 i; i < stringBytes.length; i++) {
            uint256 exp = stringBytes.length - i;
            bytes1 ival = stringBytes[i];
            uint8 uval = uint8(ival);
            uint256 jval = uval - uint256(0x30);

            val += (uint256(jval) * (10**(exp - 1)));
        }
        return val;
    }

    /**
     * @dev get substring of string
     */
    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

    /**
     * @dev gets string length
     */
    function stringLength(string memory str)
        internal
        pure
        returns (uint256 length)
    {
        uint256 i = 0;
        bytes memory string_rep = bytes(str);

        while (i < string_rep.length) {
            if (string_rep[i] >> 7 == 0) i += 1;
            else if (string_rep[i] >> 5 == bytes1(uint8(0x6))) i += 2;
            else if (string_rep[i] >> 4 == bytes1(uint8(0xE))) i += 3;
            else if (string_rep[i] >> 3 == bytes1(uint8(0x1E)))
                i += 4;
                //For safety
            else i += 1;

            length++;
        }
    }

    /**
     * @dev reverses string
     */
    function reverse(string memory _base)
        internal
        pure
        returns (string memory)
    {
        bytes memory _baseBytes = bytes(_base);
        assert(_baseBytes.length > 0);

        string memory _tempValue = new string(_baseBytes.length);
        bytes memory _newValue = bytes(_tempValue);

        for (uint256 i = 0; i < _baseBytes.length; i++) {
            _newValue[_baseBytes.length - i - 1] = _baseBytes[i];
        }

        return string(_newValue);
    }
}

pragma solidity ^0.8.9;

library Ints {
    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);
    }
}

// File contracts/libs/IERC721Receiver.sol

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.9;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
abstract contract IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes memory data
    ) public virtual returns (bytes4);
}

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

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

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */

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

pragma solidity ^0.8.9;

abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Ints for uint256;

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    uint256 internal currentIndex;

    uint256[] internal burnedTokens;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

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

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

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

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

        revert UnableDetermineTokenOwner();
    }

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

    /**
     * @dev Added by @dotjiwa to track burned tokens.
     */
    function isBurned(uint256 tokenId) public view returns (bool) {
        return _ownerships[tokenId].burned;
    }

    function getBurnedTokens() public view returns (uint256[] memory) {
        return burnedTokens;
    }

    /**
     * @dev Brought over from ERC721 by @dotjiwa.
     */

    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

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

                updatedIndex++;
            }

            currentIndex = currentIndex + quantity;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */

    function _burn(uint256 tokenId) internal {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

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

        //update balance of owner
        _addressData[prevOwnership.addr].balance -= 1;
        _addressData[prevOwnership.addr].numberBurned += 1;

        // Keep track of who burned the token, and the timestamp of burning.
        _ownerships[tokenId].addr = prevOwnership.addr;
        _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
        _ownerships[tokenId].burned = true;

        //store burned token id which will update total supply
        burnedTokens.push(tokenId);

        unchecked {
            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

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

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

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

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); //also catches burned tokens
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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

pragma solidity ^0.8.9;

interface NtentTokenUri {
    function tokenUri(uint256 _tokenId) external view returns (string memory);
}

interface NtentTransfer {
    function onTransfer(
        address _from,
        address _to,
        uint256 _tokenId,
        uint256 _quantity
    ) external view returns (string memory);
}

contract NtentArtX is ERC721A {
    using Ints for uint256;
    using Strings for string;

    event Mint(
        uint256 indexed _startTokenId,
        uint256 indexed _endTokenId,
        uint256 indexed _projectId
    );

    event TokenBurned(address indexed _tokenOwner, uint256 indexed _tokenId);

    struct Project {
        string name;
        string artist;
        string description;
        string website;
        string license;
        address purchaseContract;
        address dataContract;
        address tokenUriContract;
        address transferContract;
        bool acceptsMintPass;
        uint256 mintPassProjectId;
        bool dynamic;
        string projectBaseURI;
        string projectBaseIpfsURI;
        uint256 invocations;
        uint256 maxInvocations;
        string scriptJSON;
        mapping(uint256 => string) scripts;
        uint256 scriptCount;
        string ipfsHash;
        bool useHashString;
        bool useIpfs;
        bool active;
        bool locked;
        bool paused;
    }

    uint256 constant ONE_MILLION = 1_000_000;
    mapping(uint256 => Project) projects;

    //All financial functions are stripped from struct for visibility
    mapping(uint256 => address) public projectIdToArtistAddress;
    mapping(uint256 => uint256) public projectIdToPricePerTokenInWei;

    address public ntentAddress;
    uint256 public ntentPercentage = 10;

    mapping(uint256 => string) public staticIpfsImageLink;

    address public admin;
    mapping(address => bool) public isRainbowlisted;
    mapping(address => bool) public isMintRainbowlisted;

    uint256 public nextProjectId = 3;
    uint256 public startProjectId = 3;

    uint256 private _royaltyBps;
    address payable private _royaltyRecipient;
    bytes4 private constant _INTERFACE_ID_ROYALTIES_CREATORCORE = 0xbb3bafd6;
    bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a;
    bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584;

    mapping(address => bool) proxyToApproved;

    modifier onlyValidTokenId(uint256 _tokenId) {
        require(_exists(_tokenId), "Token ID not exists");
        _;
    }

    modifier onlyUnlocked(uint256 _projectId) {
        require(!projects[_projectId].locked, "Only if unlocked");
        _;
    }

    modifier onlyArtist(uint256 _projectId) {
        require(
            msg.sender == projectIdToArtistAddress[_projectId],
            "Only artist"
        );
        _;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "Only admin");
        _;
    }

    modifier onlyRainbowlisted() {
        require(isRainbowlisted[msg.sender], "Only Rainbowlisted");
        _;
    }

    modifier onlyArtistOrRainbowlisted(uint256 _projectId) {
        require(
            isRainbowlisted[msg.sender] ||
                msg.sender == projectIdToArtistAddress[_projectId],
            "Only artist or Rainbowlisted"
        );
        _;
    }

    constructor(string memory _tokenName, string memory _tokenSymbol)
        ERC721A(_tokenName, _tokenSymbol)
    {
        admin = msg.sender;
        isRainbowlisted[msg.sender] = true;
        ntentAddress = msg.sender;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            ERC721A.supportsInterface(interfaceId) ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            interfaceId == _INTERFACE_ID_ROYALTIES_CREATORCORE ||
            interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981 ||
            interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE;
    }

    function _exists(uint256 tokenId) internal view override returns (bool) {
        uint256 projectId = tokenIdToProjectId(tokenId);
        return
            (tokenId <
                ((projectId * ONE_MILLION) +
                    projects[projectId].invocations)) &&
            (tokenId >= (projectId * ONE_MILLION) && !isBurned(tokenId));
    }

    function mint(
        address _to,
        uint256 _projectId,
        uint256 quantity,
        address _by
    ) external returns (uint256 _tokenId) {
        require(
            isMintRainbowlisted[msg.sender],
            "Must mint from Rainbowlisted minter"
        );
        require(
            projects[_projectId].invocations + quantity <=
                projects[_projectId].maxInvocations,
            "Exceeds max invocations"
        );
        require(
            projects[_projectId].active ||
                _by == projectIdToArtistAddress[_projectId],
            "Proj must exist and be active"
        );
        require(
            !projects[_projectId].paused ||
                _by == projectIdToArtistAddress[_projectId],
            "Purchases are paused"
        );

        uint256 tokenId = _mintTokens(_to, _projectId, quantity);

        return tokenId;
    }

    function _mintTokens(
        address _to,
        uint256 _projectId,
        uint256 quantity
    ) internal returns (uint256 _tokenId) {
        uint256 nextStartTokenId = (_projectId * ONE_MILLION) +
            projects[_projectId].invocations;

        projects[_projectId].invocations =
            projects[_projectId].invocations +
            quantity;

        _safeMint(_to, nextStartTokenId, quantity);

        emit Mint(nextStartTokenId, nextStartTokenId + quantity, _projectId);

        return nextStartTokenId;
    }

    function burn(address ownerAddress, uint256 tokenId)
        external
        returns (uint256 _tokenId)
    {
        require(
            isMintRainbowlisted[msg.sender],
            "Must burn from Rainbowlisted minter"
        );
        _burn(tokenId);
        emit TokenBurned(ownerAddress, tokenId);
        return tokenId;
    }

    function updateNtentAddress(address _ntentAddress) public onlyAdmin {
        ntentAddress = _ntentAddress;
    }

    function updateNtentPercentage(uint256 _ntentPercentage) public onlyAdmin {
        require(_ntentPercentage <= 50, "Max of 50%");
        ntentPercentage = _ntentPercentage;
    }

    function addRainbowlisted(address _address) public onlyAdmin {
        isRainbowlisted[_address] = true;
    }

    function removeRainbowlisted(address _address) public onlyAdmin {
        isRainbowlisted[_address] = false;
    }

    function addMintRainbowlisted(address _address) public onlyAdmin {
        isMintRainbowlisted[_address] = true;
    }

    function removeMintRainbowlisted(address _address) public onlyAdmin {
        isMintRainbowlisted[_address] = false;
    }

    function getPricePerTokenInWei(uint256 _projectId)
        public
        view
        returns (uint256 price)
    {
        return projectIdToPricePerTokenInWei[_projectId];
    }

    function toggleProjectIsLocked(uint256 _projectId)
        public
        onlyRainbowlisted
        onlyUnlocked(_projectId)
    {
        projects[_projectId].locked = true;
    }

    function toggleProjectIsActive(uint256 _projectId)
        public
        onlyRainbowlisted
    {
        projects[_projectId].active = !projects[_projectId].active;
    }

    function updateProjectArtistAddress(
        uint256 _projectId,
        address _artistAddress
    ) public onlyArtistOrRainbowlisted(_projectId) {
        projectIdToArtistAddress[_projectId] = _artistAddress;
    }

    function toggleProjectIsPaused(uint256 _projectId)
        public
        onlyArtistOrRainbowlisted(_projectId)
    {
        projects[_projectId].paused = !projects[_projectId].paused;
    }

    function addProject(
        string memory _projectName,
        address _artistAddress,
        uint256 _pricePerTokenInWei,
        address _purchaseContract,
        bool _acceptsMintPass,
        uint256 _mintPassProjectId,
        bool _dynamic
    ) public onlyRainbowlisted {
        uint256 projectId = nextProjectId;
        projectIdToArtistAddress[projectId] = _artistAddress;
        projects[projectId].name = _projectName;
        projects[projectId].purchaseContract = _purchaseContract;
        projects[projectId].acceptsMintPass = _acceptsMintPass;
        projects[projectId].mintPassProjectId = _mintPassProjectId;
        projectIdToPricePerTokenInWei[projectId] = _pricePerTokenInWei;
        projects[projectId].paused = true;
        projects[projectId].dynamic = _dynamic;
        projects[projectId].maxInvocations = ONE_MILLION;
        if (!_dynamic) {
            projects[projectId].useHashString = false;
        } else {
            projects[projectId].useHashString = true;
        }
        nextProjectId = nextProjectId + 1;
    }

    function updateProjectPricePerTokenInWei(
        uint256 _projectId,
        uint256 _pricePerTokenInWei
    ) public onlyArtist(_projectId) {
        projectIdToPricePerTokenInWei[_projectId] = _pricePerTokenInWei;
    }

    function updateProjectName(uint256 _projectId, string memory _projectName)
        public
        onlyUnlocked(_projectId)
        onlyArtistOrRainbowlisted(_projectId)
    {
        projects[_projectId].name = _projectName;
    }

    function updateProjectArtistName(
        uint256 _projectId,
        string memory _projectArtistName
    ) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) {
        projects[_projectId].artist = _projectArtistName;
    }

    function updateProjectPurchaseContractInfo(
        uint256 _projectId,
        address _projectPurchaseContract,
        bool _acceptsMintPass,
        uint256 _mintPassProjectId
    ) public onlyUnlocked(_projectId) onlyRainbowlisted {
        projects[_projectId].purchaseContract = _projectPurchaseContract;
        projects[_projectId].acceptsMintPass = _acceptsMintPass;
        projects[_projectId].mintPassProjectId = _mintPassProjectId;
    }

    function updateProjectDataContractInfo(
        uint256 _projectId,
        address _projectDataContract
    ) public onlyUnlocked(_projectId) onlyRainbowlisted {
        projects[_projectId].dataContract = _projectDataContract;
    }

    function updateTransferContractInfo(
        uint256 _projectId,
        address _projectTransferContract
    ) public onlyUnlocked(_projectId) onlyRainbowlisted {
        projects[_projectId].transferContract = _projectTransferContract;
    }

    function updateProjectTokenUriContractInfo(
        uint256 _projectId,
        address _projectTokenUriContract
    ) public onlyUnlocked(_projectId) onlyRainbowlisted {
        projects[_projectId].tokenUriContract = _projectTokenUriContract;
    }

    function updateProjectDescription(
        uint256 _projectId,
        string memory _projectDescription
    ) public onlyArtist(_projectId) {
        projects[_projectId].description = _projectDescription;
    }

    function updateProjectWebsite(
        uint256 _projectId,
        string memory _projectWebsite
    ) public onlyArtist(_projectId) {
        projects[_projectId].website = _projectWebsite;
    }

    function updateProjectLicense(
        uint256 _projectId,
        string memory _projectLicense
    ) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) {
        projects[_projectId].license = _projectLicense;
    }

    function updateProjectMaxInvocations(
        uint256 _projectId,
        uint256 _maxInvocations
    ) public onlyArtist(_projectId) {
        require(
            (!projects[_projectId].locked ||
                _maxInvocations < projects[_projectId].maxInvocations),
            "Only if unlocked"
        );
        require(
            _maxInvocations > projects[_projectId].invocations,
            "Max invocations exceeds current"
        );
        require(_maxInvocations <= ONE_MILLION, "Cannot exceed 1000000");
        projects[_projectId].maxInvocations = _maxInvocations;
    }

    function toggleProjectUseHashString(uint256 _projectId)
        public
        onlyUnlocked(_projectId)
        onlyArtistOrRainbowlisted(_projectId)
    {
        require(
            projects[_projectId].invocations == 0,
            "Cannot modify after token is minted."
        );
        projects[_projectId].useHashString = !projects[_projectId]
            .useHashString;
    }

    function addProjectScript(uint256 _projectId, string memory _script)
        public
        onlyUnlocked(_projectId)
        onlyArtistOrRainbowlisted(_projectId)
    {
        projects[_projectId].scripts[
            projects[_projectId].scriptCount
        ] = _script;
        projects[_projectId].scriptCount = projects[_projectId].scriptCount + 1;
    }

    function updateProjectScript(
        uint256 _projectId,
        uint256 _scriptId,
        string memory _script
    ) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) {
        require(
            _scriptId < projects[_projectId].scriptCount,
            "scriptId out of range"
        );
        projects[_projectId].scripts[_scriptId] = _script;
    }

    function removeProjectLastScript(uint256 _projectId)
        public
        onlyUnlocked(_projectId)
        onlyArtistOrRainbowlisted(_projectId)
    {
        require(
            projects[_projectId].scriptCount > 0,
            "there are no scripts to remove"
        );
        delete projects[_projectId].scripts[
            projects[_projectId].scriptCount - 1
        ];
        projects[_projectId].scriptCount = projects[_projectId].scriptCount + 1;
    }

    function updateProjectScriptJSON(
        uint256 _projectId,
        string memory _projectScriptJSON
    ) public onlyUnlocked(_projectId) onlyArtistOrRainbowlisted(_projectId) {
        projects[_projectId].scriptJSON = _projectScriptJSON;
    }

    function updateProjectIpfsHash(uint256 _projectId, string memory _ipfsHash)
        public
        onlyUnlocked(_projectId)
        onlyArtistOrRainbowlisted(_projectId)
    {
        projects[_projectId].ipfsHash = _ipfsHash;
    }

    function updateProjectBaseURI(uint256 _projectId, string memory _newBaseURI)
        public
        onlyArtist(_projectId)
    {
        projects[_projectId].projectBaseURI = _newBaseURI;
    }

    function updateProjectBaseIpfsURI(
        uint256 _projectId,
        string memory _projectBaseIpfsURI
    ) public onlyArtist(_projectId) {
        projects[_projectId].projectBaseIpfsURI = _projectBaseIpfsURI;
    }

    function toggleProjectUseIpfsForStatic(uint256 _projectId)
        public
        onlyArtistOrRainbowlisted(_projectId)
    {
        require(
            !projects[_projectId].dynamic,
            "can only set static IPFS hash for static projects"
        );
        projects[_projectId].useIpfs = !projects[_projectId].useIpfs;
    }

    function toggleProjectIsDynamic(uint256 _projectId)
        public
        onlyUnlocked(_projectId)
        onlyArtistOrRainbowlisted(_projectId)
    {
        require(
            projects[_projectId].invocations == 0,
            "Can not switch after a token is minted."
        );
        if (projects[_projectId].dynamic) {
            projects[_projectId].useHashString = false;
        } else {
            projects[_projectId].useHashString = true;
        }
        projects[_projectId].dynamic = !projects[_projectId].dynamic;
    }

    function overrideTokenDynamicImageWithIpfsLink(
        uint256 _tokenId,
        string memory _ipfsHash
    ) public onlyArtistOrRainbowlisted(tokenIdToProjectId(_tokenId)) {
        staticIpfsImageLink[_tokenId] = _ipfsHash;
    }

    function clearTokenIpfsImageUri(uint256 _tokenId)
        public
        onlyArtistOrRainbowlisted(tokenIdToProjectId(_tokenId))
    {
        delete staticIpfsImageLink[tokenIdToProjectId(_tokenId)];
    }

    function projectDetails(uint256 _projectId)
        public
        view
        returns (
            string memory projectName,
            string memory artist,
            string memory description,
            string memory website,
            string memory license,
            bool dynamic
        )
    {
        projectName = projects[_projectId].name;
        artist = projects[_projectId].artist;
        description = projects[_projectId].description;
        website = projects[_projectId].website;
        license = projects[_projectId].license;
        dynamic = projects[_projectId].dynamic;
    }

    function projectTokenInfo(uint256 _projectId)
        public
        view
        returns (
            address artistAddress,
            uint256 pricePerTokenInWei,
            uint256 invocations,
            uint256 maxInvocations,
            bool active,
            address purchaseContract,
            address dataContract,
            address tokenUriContract,
            address transferContract,
            bool acceptsMintPass,
            uint256 mintPassProjectId
        )
    {
        artistAddress = projectIdToArtistAddress[_projectId];
        pricePerTokenInWei = projectIdToPricePerTokenInWei[_projectId];
        invocations = projects[_projectId].invocations;
        maxInvocations = projects[_projectId].maxInvocations;
        active = projects[_projectId].active;
        purchaseContract = projects[_projectId].purchaseContract;
        dataContract = projects[_projectId].dataContract;
        tokenUriContract = projects[_projectId].tokenUriContract;
        transferContract = projects[_projectId].transferContract;
        acceptsMintPass = projects[_projectId].acceptsMintPass;
        mintPassProjectId = projects[_projectId].mintPassProjectId;
    }

    function projectBurnedTokens(uint256 _projectId)
        public
        view
        returns (uint256[] memory)
    {
        uint256 burnedIndex;
        uint256 burnedTokenId;
        uint256 projectBurnedCount = projectBurnedTokensCount(_projectId);
        uint256[] memory burnedTokenIds = new uint256[](projectBurnedCount);

        uint256 burnedTokenLength = burnedTokens.length;
        for (uint256 i; i < burnedTokenLength; i++) {
            burnedTokenId = burnedTokens[i];
            if (tokenIdToProjectId(burnedTokenId) == _projectId) {
                burnedTokenIds[burnedIndex] = burnedTokenId;
            }
        }
        return burnedTokenIds;
    }

    function projectScriptInfo(uint256 _projectId)
        public
        view
        returns (
            string memory scriptJSON,
            uint256 scriptCount,
            bool useHashString,
            string memory ipfsHash,
            bool locked,
            bool paused
        )
    {
        scriptJSON = projects[_projectId].scriptJSON;
        scriptCount = projects[_projectId].scriptCount;
        useHashString = projects[_projectId].useHashString;
        ipfsHash = projects[_projectId].ipfsHash;
        locked = projects[_projectId].locked;
        paused = projects[_projectId].paused;
    }

    function projectScriptByIndex(uint256 _projectId, uint256 _index)
        public
        view
        returns (string memory)
    {
        return projects[_projectId].scripts[_index];
    }

    function projectURIInfo(uint256 _projectId)
        public
        view
        returns (
            string memory projectBaseURI,
            string memory projectBaseIpfsURI,
            bool useIpfs
        )
    {
        projectBaseURI = projects[_projectId].projectBaseURI;
        projectBaseIpfsURI = projects[_projectId].projectBaseIpfsURI;
        useIpfs = projects[_projectId].useIpfs;
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _tokenId
    ) public override {
        _transfer(_from, _to, _tokenId);
    }

    function _beforeTokenTransfers(
        address _from,
        address _to,
        uint256 _tokenId,
        uint256 _quantity
    ) internal view override {
        //check if custom transfer contract, if so, send call.
        if (
            projects[tokenIdToProjectId(_tokenId)].transferContract !=
            address(0)
        ) {
            NtentTransfer ntentTransfer = NtentTransfer(
                projects[tokenIdToProjectId(_tokenId)].transferContract
            );
            ntentTransfer.onTransfer(_from, _to, _tokenId, _quantity);
        }
    }

    function bulkTransfer(
        address[] calldata _addressList,
        uint256[] calldata _tokenList
    ) public onlyAdmin {
        uint256 addressLength = _addressList.length;
        uint256 tokenLength = _tokenList.length;
        require(addressLength > 0, "Address quantity must greater than zero");
        require(
            addressLength == tokenLength,
            "Token quantity must equal address quantity"
        );

        for (uint256 i; i < addressLength; i++) {
            address _toAddress = _addressList[i];
            uint256 _tokenId = _tokenList[i];
            safeTransferFrom(msg.sender, _toAddress, _tokenId);
        }
    }

    function projectShowAllTokens(uint256 _projectId)
        public
        view
        returns (uint256[] memory)
    {
        return projectIdToTokenIds(_projectId);
    }

    function projectIdToTokenIds(uint256 _projectId)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tId;
        uint256 tokenId;
        uint256 projTokenLength = projects[_projectId].invocations;
        uint256 projectBurnedCount = projectBurnedTokensCount(_projectId);
        uint256[] memory projectTokens = new uint256[](
            projTokenLength - projectBurnedCount
        );

        for (uint256 i; i < projTokenLength; i++) {
            tokenId = (_projectId * ONE_MILLION) + i;
            if (isBurned(tokenId) == false) {
                projectTokens[tId] = tokenId;
                tId++;
            }
        }
        return projectTokens;
    }

    function projectBurnedTokensCount(uint256 _projectId)
        public
        view
        returns (uint256)
    {
        uint256 tokenId;
        uint256 count;
        uint256 burnedTokenLength = burnedTokens.length;
        for (uint256 i; i < burnedTokenLength; i++) {
            tokenId = burnedTokens[i];
            if (tokenIdToProjectId(tokenId) == _projectId) {
                count++;
            }
        }
        return count;
    }

    //example input : 1000004
    function tokenIdToProjectId(uint256 _tokenId)
        public
        pure
        returns (uint256)
    {
        //convert to string and reverse
        string memory reversed = _tokenId.toString().reverse();
        //chop off reversed project id from end, reverse back
        string memory strProjectId = reversed
            .substring(6, reversed.stringLength())
            .reverse();

        return strProjectId.str2int();
    }

    function tokensOfOwner(address owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerBalance = balanceOf(owner);
        uint256 foundCount;
        address currOwnershipAddr;

        uint256[] memory ownerTokenIds = new uint256[](ownerBalance);

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i = startProjectId; i < nextProjectId; i++) {
                uint256[] memory projectTokens = projectIdToTokenIds(i);

                for (uint256 ii; ii < projectTokens.length; ii++) {
                    uint256 tokenId = projectTokens[ii];

                    TokenOwnership memory ownership = _ownerships[tokenId];
                    if (ownership.addr != address(0)) {
                        currOwnershipAddr = ownership.addr;
                    }
                    if (currOwnershipAddr == owner) {
                        ownerTokenIds[foundCount] = tokenId;
                        foundCount++;
                    }
                    if (foundCount == ownerBalance) {
                        return ownerTokenIds;
                    }
                }
            }
        }

        revert UnableGetTokenOwnerByIndex();
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        onlyValidTokenId(_tokenId)
        returns (string memory)
    {
        //check if custom tokenUri contract, if so, use that.
        if (
            projects[tokenIdToProjectId(_tokenId)].tokenUriContract !=
            address(0)
        ) {
            NtentTokenUri ntentTokenUri = NtentTokenUri(
                projects[tokenIdToProjectId(_tokenId)].tokenUriContract
            );
            //if returned tokenUri is not empty, else continue
            string memory tUri = ntentTokenUri.tokenUri(_tokenId);
            if(bytes(tUri).length > 0)
                return tUri;
        }

        //check if tokenId has a specified image link
        if (bytes(staticIpfsImageLink[_tokenId]).length > 0) {
            return
                projects[tokenIdToProjectId(_tokenId)]
                    .projectBaseIpfsURI
                    .concatenate(staticIpfsImageLink[_tokenId]);
        }

        //check if the project has a single overall token Uri (mintpass, etc)
        if (
            !projects[tokenIdToProjectId(_tokenId)].dynamic &&
            projects[tokenIdToProjectId(_tokenId)].useIpfs
        ) {
            return
                projects[tokenIdToProjectId(_tokenId)]
                    .projectBaseIpfsURI
                    .concatenate(
                        projects[tokenIdToProjectId(_tokenId)].ipfsHash
                    );
        }

        return
            projects[tokenIdToProjectId(_tokenId)].projectBaseURI.concatenate(
                _tokenId.toString()
            );
    }

    /**
     * Royalties
     */

    function updateRoyalties(address payable recipient, uint256 bps)
        external
        onlyRainbowlisted
    {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
    }

    function getRoyalties(uint256)
        external
        view
        returns (address payable[] memory recipients, uint256[] memory bps)
    {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return (recipients, bps);
    }

    function getFeeRecipients(uint256)
        external
        view
        returns (address payable[] memory recipients)
    {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
        }
        return recipients;
    }

    function getFeeBps(uint256) external view returns (uint256[] memory bps) {
        if (_royaltyRecipient != address(0x0)) {
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return bps;
    }

    function royaltyInfo(uint256, uint256 value)
        external
        view
        returns (address, uint256)
    {
        return (_royaltyRecipient, (value * _royaltyBps) / 10000);
    }

    /**
     * Proxy 
     */

    function flipProxyState(address proxyAddress) public onlyRainbowlisted{
        proxyToApproved[proxyAddress] = !proxyToApproved[proxyAddress];
    }

    //proxy registration
    function isApprovedForAll(address _owner, address _operator) public view override returns (bool){
        if(proxyToApproved[_operator]) return true;
        return super.isApprovedForAll(_owner, _operator);
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {

        uint256 tokenIdsIdx;

                // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i = startProjectId; i < nextProjectId; i++) {
                uint256[] memory projectTokens = projectIdToTokenIds(i);

                for (uint256 ii; ii < projectTokens.length; ii++) {
                    uint256 tokenId = projectTokens[ii];

                    TokenOwnership memory ownership = _ownerships[tokenId];
                    if (!ownership.burned) {
                        if (tokenIdsIdx == index) {
                            return tokenId;
                        }
                        tokenIdsIdx++;
                    }
                }
            }
        }

        revert UnableGetTokenOwnerByIndex();
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public override view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return tokensOfOwner(owner)[index];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"UnableDetermineTokenOwner","type":"error"},{"inputs":[],"name":"UnableGetTokenOwnerByIndex","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_startTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_endTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_tokenOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"TokenBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addMintRainbowlisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_projectName","type":"string"},{"internalType":"address","name":"_artistAddress","type":"address"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"},{"internalType":"address","name":"_purchaseContract","type":"address"},{"internalType":"bool","name":"_acceptsMintPass","type":"bool"},{"internalType":"uint256","name":"_mintPassProjectId","type":"uint256"},{"internalType":"bool","name":"_dynamic","type":"bool"}],"name":"addProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_script","type":"string"}],"name":"addProjectScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addRainbowlisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"},{"internalType":"uint256[]","name":"_tokenList","type":"uint256[]"}],"name":"bulkTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"clearTokenIpfsImageUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"flipProxyState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"getPricePerTokenInWei","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"bps","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":"uint256","name":"tokenId","type":"uint256"}],"name":"isBurned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMintRainbowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRainbowlisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"_by","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ntentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ntentPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_ipfsHash","type":"string"}],"name":"overrideTokenDynamicImageWithIpfsLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectBurnedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectBurnedTokensCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectDetails","outputs":[{"internalType":"string","name":"projectName","type":"string"},{"internalType":"string","name":"artist","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"website","type":"string"},{"internalType":"string","name":"license","type":"string"},{"internalType":"bool","name":"dynamic","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projectIdToArtistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projectIdToPricePerTokenInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectIdToTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"projectScriptByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectScriptInfo","outputs":[{"internalType":"string","name":"scriptJSON","type":"string"},{"internalType":"uint256","name":"scriptCount","type":"uint256"},{"internalType":"bool","name":"useHashString","type":"bool"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"bool","name":"locked","type":"bool"},{"internalType":"bool","name":"paused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectShowAllTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectTokenInfo","outputs":[{"internalType":"address","name":"artistAddress","type":"address"},{"internalType":"uint256","name":"pricePerTokenInWei","type":"uint256"},{"internalType":"uint256","name":"invocations","type":"uint256"},{"internalType":"uint256","name":"maxInvocations","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"address","name":"purchaseContract","type":"address"},{"internalType":"address","name":"dataContract","type":"address"},{"internalType":"address","name":"tokenUriContract","type":"address"},{"internalType":"address","name":"transferContract","type":"address"},{"internalType":"bool","name":"acceptsMintPass","type":"bool"},{"internalType":"uint256","name":"mintPassProjectId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectURIInfo","outputs":[{"internalType":"string","name":"projectBaseURI","type":"string"},{"internalType":"string","name":"projectBaseIpfsURI","type":"string"},{"internalType":"bool","name":"useIpfs","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeMintRainbowlisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"removeProjectLastScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeRainbowlisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":[],"name":"startProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"staticIpfsImageLink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsDynamic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectUseHashString","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"toggleProjectUseIpfsForStatic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenIdToProjectId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ntentAddress","type":"address"}],"name":"updateNtentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ntentPercentage","type":"uint256"}],"name":"updateNtentPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_artistAddress","type":"address"}],"name":"updateProjectArtistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectArtistName","type":"string"}],"name":"updateProjectArtistName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectBaseIpfsURI","type":"string"}],"name":"updateProjectBaseIpfsURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"updateProjectBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_projectDataContract","type":"address"}],"name":"updateProjectDataContractInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectDescription","type":"string"}],"name":"updateProjectDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_ipfsHash","type":"string"}],"name":"updateProjectIpfsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectLicense","type":"string"}],"name":"updateProjectLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_maxInvocations","type":"uint256"}],"name":"updateProjectMaxInvocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectName","type":"string"}],"name":"updateProjectName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"}],"name":"updateProjectPricePerTokenInWei","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_projectPurchaseContract","type":"address"},{"internalType":"bool","name":"_acceptsMintPass","type":"bool"},{"internalType":"uint256","name":"_mintPassProjectId","type":"uint256"}],"name":"updateProjectPurchaseContractInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_scriptId","type":"uint256"},{"internalType":"string","name":"_script","type":"string"}],"name":"updateProjectScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectScriptJSON","type":"string"}],"name":"updateProjectScriptJSON","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_projectTokenUriContract","type":"address"}],"name":"updateProjectTokenUriContractInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"string","name":"_projectWebsite","type":"string"}],"name":"updateProjectWebsite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_projectTransferContract","type":"address"}],"name":"updateTransferContractInfo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a600d55600360125560036013553480156200002057600080fd5b50604051620061aa380380620061aa8339810160408190526200004391620002c0565b8181620000576301ffc9a760e01b620000c9565b81516200006c9060039060208501906200014d565b508051620000829060049060208401906200014d565b5050600f8054336001600160a01b031991821681179092556000828152601060205260409020805460ff19166001179055600c805490911690911790555062000367915050565b6001600160e01b03198082161415620001285760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b8280546200015b906200032a565b90600052602060002090601f0160209004810192826200017f5760008555620001ca565b82601f106200019a57805160ff1916838001178555620001ca565b82800160010185558215620001ca579182015b82811115620001ca578251825591602001919060010190620001ad565b50620001d8929150620001dc565b5090565b5b80821115620001d85760008155600101620001dd565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200021b57600080fd5b81516001600160401b0380821115620002385762000238620001f3565b604051601f8301601f19908116603f01168101908282118183101715620002635762000263620001f3565b816040528381526020925086838588010111156200028057600080fd5b600091505b83821015620002a4578582018301518183018401529082019062000285565b83821115620002b65760008385830101525b9695505050505050565b60008060408385031215620002d457600080fd5b82516001600160401b0380821115620002ec57600080fd5b620002fa8683870162000209565b935060208501519150808211156200031157600080fd5b50620003208582860162000209565b9150509250929050565b600181811c908216806200033f57607f821691505b602082108114156200036157634e487b7160e01b600052602260045260246000fd5b50919050565b615e3380620003776000396000f3fe608060405234801561001057600080fd5b50600436106104d15760003560e01c806370a8a0ad1161028d578063b7b04fae11610161578063c87b56dd116100de578063e935b7b1116100a2578063f73c814b1161007c578063f73c814b14610c90578063f74bfe8e14610ca3578063f851a44014610cb657600080fd5b8063e935b7b114610c54578063e985e9c514610c5d578063f70c0f0414610c7057600080fd5b8063c87b56dd14610bde578063d03c390c14610bf1578063db2ff86114610c04578063db44fe0714610c17578063dce5d85814610c4157600080fd5b8063bcd4f24411610125578063bcd4f24414610b8a578063bee04f9c14610b9d578063c26aff0f14610bb0578063c3f4f54f14610bc3578063c6d7323114610bcb57600080fd5b8063b7b04fae14610b10578063b88d4fde14610b23578063b9c4d9fb14610b36578063bb3bafd614610b56578063bc6e639d14610b7757600080fd5b806395d89b411161020a578063a3b2cca6116101ce578063acad0124116101a8578063acad012414610ad7578063b1656ba314610aea578063b6550e8f14610afd57600080fd5b8063a3b2cca614610a88578063a47d29cb14610a9b578063a784d5c114610ac457600080fd5b806395d89b4114610a3457806397dc86cf14610a3c5780639dc29fac14610a4f578063a11ec70a14610a62578063a22cb46514610a7557600080fd5b80638ba8f14d116102515780638ba8f14d146108da5780638c2c3622146108ed5780638c3c9cdd146109e95780638dd91a56146109fc57806393961c6614610a2157600080fd5b806370a8a0ad1461085e578063742ff77a14610871578063810051d714610891578063826fc391146108b45780638462151c146108c757600080fd5b8063360d223a116103c45780634ae9a7381161034157806369bfd5d6116103055780636c2f5acd116102df5780636c2f5acd146108255780636c31d4e91461083857806370a082311461084b57600080fd5b806369bfd5d6146107ec57806369d14faf146107ff5780636bd5d5911461081257600080fd5b80634ae9a7381461078d5780634f6ccce7146107a05780635c088dcc146107b35780636352211e146107c6578063672b17e9146107d957600080fd5b80633f383cb8116103885780633f383cb81461071c5780633fef6c2a1461072f57806342842e0e1461074257806343fa7f44146107555780634aa6d4171461076857600080fd5b8063360d223a146106c757806337859963146106da5780633839bf99146106ed5780633bdbd5c4146106f65780633e48e8481461070957600080fd5b80631b689c0b11610452578063261eb4e511610416578063261eb4e51461063a578063279018221461064d5780632a55205a146106605780632d9c0205146106925780632f745c59146106b457600080fd5b80631b689c0b146105d55780632002f713146105e857806321c0da791461060b57806323b872dd1461061457806325b75d681461062757600080fd5b80630d170673116104995780630d170673146105665780630ebd4c7f14610579578063153a1f3e1461059957806318160ddd146105ac5780631afe39f8146105c257600080fd5b806301ffc9a7146104d657806306fdde03146104fe578063081812fc14610513578063095ea7b31461053e5780630b8f4d2d14610553575b600080fd5b6104e96104e43660046152f2565b610cc9565b60405190151581526020015b60405180910390f35b610506610d7b565b6040516104f59190615367565b61052661052136600461537a565b610e0d565b6040516001600160a01b0390911681526020016104f5565b61055161054c3660046153a8565b610e51565b005b6105516105613660046153d4565b610edf565b6105516105743660046154bc565b610f4f565b61058c61058736600461537a565b611020565b6040516104f5919061553d565b6105516105a7366004615594565b61107c565b6105b4611200565b6040519081526020016104f5565b6105516105d036600461560f565b611217565b6105b46105e336600461537a565b611393565b6104e96105f63660046153d4565b60106020526000908152604090205460ff1681565b6105b4600d5481565b6105516106223660046156a5565b6113d7565b6105516106353660046154bc565b6113e2565b61050661064836600461537a565b6114b2565b61055161065b36600461537a565b61154c565b61067361066e3660046156e6565b6115ee565b604080516001600160a01b0390931683526020830191909152016104f5565b6106a56106a036600461537a565b611629565b6040516104f593929190615708565b6105b46106c23660046153a8565b61178d565b6105516106d53660046153d4565b611824565b6105516106e83660046154bc565b61188d565b6105b460135481565b61055161070436600461537a565b61190e565b6105516107173660046154bc565b611aa2565b61055161072a3660046153d4565b611b1d565b61055161073d3660046154bc565b611b85565b6105516107503660046156a5565b611c55565b6105516107633660046153d4565b611c70565b61077b61077636600461537a565b611cdb565b6040516104f596959493929190615740565b600c54610526906001600160a01b031681565b6105b46107ae36600461537a565b611e70565b6105516107c136600461537a565b611f5a565b6105266107d436600461537a565b612073565b6105516107e736600461578e565b612085565b61058c6107fa36600461537a565b61216e565b61055161080d3660046157d4565b612243565b6105516108203660046154bc565b6122e2565b6105516108333660046153a8565b61235d565b6105516108463660046157d4565b6123d7565b6105b46108593660046153d4565b612498565b61055161086c36600461537a565b6124e6565b6105b461087f36600461537a565b6000908152600b602052604090205490565b6104e961089f3660046153d4565b60116020526000908152604090205460ff1681565b6105516108c23660046156e6565b612570565b61058c6108d53660046153d4565b6126e3565b6105516108e836600461537a565b61284b565b6109806108fb36600461537a565b6000908152600a6020908152604080832054600b83528184205460099384905291909320600d810154600e8201546013830154600584015460068501546007860154600887015496909801546001600160a01b03998a169a9799959894976201000090940460ff90811697938716969283169583169492841693600160a01b90041691565b604080516001600160a01b039c8d168152602081019b909b528a01989098526060890196909652931515608088015291871660a0870152861660c0860152851660e0850152909316610100830152911515610120820152610140810191909152610160016104f5565b6105066109f73660046156e6565b6128ff565b610a0f610a0a36600461537a565b6129b0565b6040516104f596959493929190615804565b610551610a2f3660046154bc565b612cfb565b610506612d91565b610551610a4a3660046156e6565b612da0565b6105b4610a5d3660046153a8565b612e09565b610551610a7036600461537a565b612eb9565b610551610a8336600461587b565b612f5c565b610551610a963660046154bc565b612ff2565b610526610aa936600461537a565b600a602052600090815260409020546001600160a01b031681565b610551610ad23660046157d4565b61306d565b610551610ae53660046154bc565b61312e565b610551610af83660046158b0565b613240565b61058c610b0b36600461537a565b61337d565b610551610b1e3660046154bc565b61347c565b610551610b313660046158ff565b61354c565b610b49610b4436600461537a565b613580565b6040516104f591906159b7565b610b69610b6436600461537a565b6135f9565b6040516104f59291906159ca565b6105b4610b8536600461537a565b6136ad565b610551610b983660046153d4565b61371b565b61058c610bab36600461537a565b613783565b610551610bbe3660046157d4565b61378e565b61058c61384f565b610551610bd93660046154bc565b6138a6565b610506610bec36600461537a565b613976565b610551610bff36600461537a565b613cf9565b610551610c1236600461537a565b613d7b565b6104e9610c2536600461537a565b600090815260056020526040902054600160e01b900460ff1690565b610551610c4f36600461537a565b613efb565b6105b460125481565b6104e9610c6b3660046159f8565b614036565b6105b4610c7e36600461537a565b600b6020526000908152604090205481565b610551610c9e3660046153d4565b614090565b6105b4610cb1366004615a26565b61410d565b600f54610526906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b1480610cee5750610cee8261431a565b80610d0957506001600160e01b03198216635b5e139f60e01b145b80610d2457506001600160e01b0319821663780e9d6360e01b145b80610d3f57506001600160e01b03198216635d9dd7eb60e11b145b80610d5a57506001600160e01b0319821663152a902d60e11b145b80610d7557506001600160e01b03198216632dde656160e21b145b92915050565b606060038054610d8a90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054610db690615a70565b8015610e035780601f10610dd857610100808354040283529160200191610e03565b820191906000526020600020905b815481529060010190602001808311610de657829003601f168201915b5050505050905090565b6000610e188261436b565b610e35576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610e5c82612073565b9050806001600160a01b0316836001600160a01b03161415610e915760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610eb15750610eaf8133614036565b155b15610ecf576040516367d9dca160e11b815260040160405180910390fd5b610eda8383836143e2565b505050565b600f546001600160a01b03163314610f2b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b60448201526064015b60405180910390fd5b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b60008281526009602052604090206013015482906301000000900460ff1615610f8a5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff1680610fc057506000818152600a60205260409020546001600160a01b031633145b610ffa5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992860190615206565b5050505050565b6015546060906001600160a01b0316156110775760408051600180825281830190925290602080830190803683370190505090506014548160008151811061106a5761106a615acf565b6020026020010181815250505b919050565b600f546001600160a01b031633146110c35760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b8281816111225760405162461bcd60e51b815260206004820152602760248201527f41646472657373207175616e74697479206d7573742067726561746572207468604482015266616e207a65726f60c81b6064820152608401610f22565b8082146111845760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e207175616e74697479206d75737420657175616c2061646472657360448201526973207175616e7469747960b01b6064820152608401610f22565b60005b828110156111f75760008787838181106111a3576111a3615acf565b90506020020160208101906111b891906153d4565b905060008686848181106111ce576111ce615acf565b9050602002013590506111e2338383611c55565b505080806111ef90615afb565b915050611187565b50505050505050565b60025460015460009161121291615b16565b905090565b3360009081526010602052604090205460ff1661126b5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6012546000818152600a6020908152604080832080546001600160a01b0319166001600160a01b038c161790556009825290912089516112ad928b0190615206565b5060008181526009602081815260408084206005810180546001600160a01b0319166001600160a01b038c1617905560088101805460ff60a01b1916600160a01b8b151502179055808401889055600b835293208990555260138101805464010000000064ff0000000019909116179055600a8101805460ff1916841515179055620f4240600e909101558161135b576000818152600960205260409020601301805460ff19169055611378565b6000818152600960205260409020601301805460ff191660011790555b601254611386906001615b2d565b6012555050505050505050565b6000806113a76113a28461443e565b61453b565b905060006113c46113a260066113bc8561461c565b859190614759565b90506113cf81614825565b949350505050565b610eda8383836148c9565b60008281526009602052604090206013015482906301000000900460ff161561141d5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061145357506000818152600a60205260409020546001600160a01b031633145b61148d5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600490920191860190615206565b600e60205260009081526040902080546114cb90615a70565b80601f01602080910402602001604051908101604052809291908181526020018280546114f790615a70565b80156115445780601f1061151957610100808354040283529160200191611544565b820191906000526020600020905b81548152906001019060200180831161152757829003601f168201915b505050505081565b61155581611393565b3360009081526010602052604090205460ff168061158957506000818152600a60205260409020546001600160a01b031633145b6115c35760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600e60006115d084611393565b815260200190815260200160002060006115ea919061528a565b5050565b60155460145460009182916001600160a01b0390911690612710906116139086615b45565b61161d9190615b7a565b915091505b9250929050565b6000818152600960205260408120600b0180546060928392909161164c90615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461167890615a70565b80156116c55780601f1061169a576101008083540402835291602001916116c5565b820191906000526020600020905b8154815290600101906020018083116116a857829003601f168201915b5050506000878152600960205260409020600c018054939650926116eb92509050615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461171790615a70565b80156117645780601f1061173957610100808354040283529160200191611764565b820191906000526020600020905b81548152906001019060200180831161174757829003601f168201915b505050600096875250506009602052604090942060130154929461010090930460ff1692915050565b600061179883612498565b82106117fa5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610f22565b611803836126e3565b828151811061181457611814615acf565b6020026020010151905092915050565b600f546001600160a01b0316331461186b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600a602052604090205482906001600160a01b031633146118e35760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600390920191850190615206565b50505050565b60008181526009602052604090206013015481906301000000900460ff16156119495760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff168061197f57506000818152600a60205260409020546001600160a01b031633145b6119b95760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600960205260409020600d015415611a285760405162461bcd60e51b815260206004820152602760248201527f43616e206e6f7420737769746368206166746572206120746f6b656e2069732060448201526636b4b73a32b21760c91b6064820152608401610f22565b6000838152600960205260409020600a015460ff1615611a60576000838152600960205260409020601301805460ff19169055611a7d565b6000838152600960205260409020601301805460ff191660011790555b50506000908152600960205260409020600a01805460ff19811660ff90911615179055565b6000828152600a602052604090205482906001600160a01b03163314611af85760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600b90920191850190615206565b600f546001600160a01b03163314611b645760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601160205260409020805460ff19169055565b60008281526009602052604090206013015482906301000000900460ff1615611bc05760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff1680611bf657506000818152600a60205260409020546001600160a01b031633145b611c305760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992601290920191860190615206565b610eda8383836040518060200160405280600081525061354c565b600f546001600160a01b03163314611cb75760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b6060600080606060008060096000888152602001908152602001600020600f018054611d0690615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3290615a70565b8015611d7f5780601f10611d5457610100808354040283529160200191611d7f565b820191906000526020600020905b815481529060010190602001808311611d6257829003601f168201915b50505060008a81526009602052604090206011810154601382015460129092018054959b5090995060ff909116975092611dbb92509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054611de790615a70565b8015611e345780601f10611e0957610100808354040283529160200191611e34565b820191906000526020600020905b815481529060010190602001808311611e1757829003601f168201915b5050506000998a5250506009602052604090972060130154959794969395939460ff630100000086048116956401000000009004169350915050565b60135460009081905b601254811015611f40576000611e8e8261337d565b905060005b8151811015611f36576000828281518110611eb057611eb0615acf565b602090810291909101810151600081815260058352604090819020815160608101835290546001600160a01b0381168252600160a01b81046001600160401b031694820194909452600160e01b90930460ff161515908301819052909250611f2c5787861415611f2557509695505050505050565b6001909501945b5050600101611e93565b5050600101611e79565b50604051637339954760e01b815260040160405180910390fd5b33600090815260106020526040902054819060ff1680611f9057506000818152600a60205260409020546001600160a01b031633145b611fca5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000828152600960205260409020600a015460ff16156120465760405162461bcd60e51b815260206004820152603160248201527f63616e206f6e6c7920736574207374617469632049504653206861736820666f60448201527072207374617469632070726f6a6563747360781b6064820152608401610f22565b506000908152600960205260409020601301805461ff001981166101009182900460ff1615909102179055565b600061207e82614aeb565b5192915050565b60008481526009602052604090206013015484906301000000900460ff16156120c05760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166121145760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009384526009602081905260409094206005810180546001600160a01b039095166001600160a01b031990951694909417909355600883018054921515600160a01b0260ff60a01b1990931692909217909155910155565b6060600080600061217e856136ad565b90506000816001600160401b0381111561219a5761219a6153f1565b6040519080825280602002602001820160405280156121c3578160200160208202803683370190505b5060025490915060005b8181101561223757600281815481106121e8576121e8615acf565b90600052602060002001549450876121ff86611393565b1415612225578483878151811061221857612218615acf565b6020026020010181815250505b8061222f81615afb565b9150506121cd565b50909695505050505050565b33600090815260106020526040902054829060ff168061227957506000818152600a60205260409020546001600160a01b031633145b6122b35760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b506000918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000828152600a602052604090205482906001600160a01b031633146123385760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600c90920191850190615206565b3360009081526010602052604090205460ff166123b15760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b601580546001600160a01b0319166001600160a01b039390931692909217909155601455565b60008281526009602052604090206013015482906301000000900460ff16156124125760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166124665760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060080180546001600160a01b0319166001600160a01b03909216919091179055565b60006001600160a01b0382166124c1576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b600f546001600160a01b0316331461252d5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b603281111561256b5760405162461bcd60e51b815260206004820152600a6024820152694d6178206f662035302560b01b6044820152606401610f22565b600d55565b6000828152600a602052604090205482906001600160a01b031633146125c65760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960205260409020601301546301000000900460ff1615806125fe57506000838152600960205260409020600e015482105b61261a5760405162461bcd60e51b8152600401610f2290615aa5565b6000838152600960205260409020600d0154821161267a5760405162461bcd60e51b815260206004820152601f60248201527f4d617820696e766f636174696f6e7320657863656564732063757272656e74006044820152606401610f22565b620f42408211156126cd5760405162461bcd60e51b815260206004820152601560248201527f43616e6e6f7420657863656564203130303030303000000000000000000000006044820152606401610f22565b50600091825260096020526040909120600e0155565b606060006126f083612498565b90506000806000836001600160401b0381111561270f5761270f6153f1565b604051908082528060200260200182016040528015612738578160200160208202803683370190505b506013549091505b601254811015611f405760006127558261337d565b905060005b815181101561284157600082828151811061277757612777615acf565b602090810291909101810151600081815260058352604090819020815160608101835290546001600160a01b038116808352600160a01b82046001600160401b031695830195909552600160e01b900460ff1615159181019190915290925090156127e157805196505b8a6001600160a01b0316876001600160a01b03161415612820578186898151811061280e5761280e615acf565b60209081029190910101526001909701965b888814156128375750939998505050505050505050565b505060010161275a565b5050600101612740565b3360009081526010602052604090205460ff1661289f5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b60008181526009602052604090206013015481906301000000900460ff16156128da5760405162461bcd60e51b8152600401610f2290615aa5565b506000908152600960205260409020601301805463ff00000019166301000000179055565b6000828152600960209081526040808320848452601001909152902080546060919061292a90615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461295690615a70565b80156129a35780601f10612978576101008083540402835291602001916129a3565b820191906000526020600020905b81548152906001019060200180831161298657829003601f168201915b5050505050905092915050565b606080606080606060006009600088815260200190815260200160002060000180546129db90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0790615a70565b8015612a545780601f10612a2957610100808354040283529160200191612a54565b820191906000526020600020905b815481529060010190602001808311612a3757829003601f168201915b50505060008a8152600960205260409020600101805493995092612a7a92509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa690615a70565b8015612af35780601f10612ac857610100808354040283529160200191612af3565b820191906000526020600020905b815481529060010190602001808311612ad657829003601f168201915b50505060008a8152600960205260409020600201805493985092612b1992509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4590615a70565b8015612b925780601f10612b6757610100808354040283529160200191612b92565b820191906000526020600020905b815481529060010190602001808311612b7557829003601f168201915b50505060008a8152600960205260409020600301805493975092612bb892509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612be490615a70565b8015612c315780601f10612c0657610100808354040283529160200191612c31565b820191906000526020600020905b815481529060010190602001808311612c1457829003601f168201915b50505060008a8152600960205260409020600401805493965092612c5792509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8390615a70565b8015612cd05780601f10612ca557610100808354040283529160200191612cd0565b820191906000526020600020905b815481529060010190602001808311612cb357829003601f168201915b5050506000998a52505060096020526040909720600a0154959794969395929460ff90931692915050565b612d0482611393565b3360009081526010602052604090205460ff1680612d3857506000818152600a60205260409020546001600160a01b031633145b612d725760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600e60209081526040909120835161190892850190615206565b606060048054610d8a90615a70565b6000828152600a602052604090205482906001600160a01b03163314612df65760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b506000918252600b602052604090912055565b3360009081526011602052604081205460ff16612e745760405162461bcd60e51b815260206004820152602360248201527f4d757374206275726e2066726f6d205261696e626f776c6973746564206d696e6044820152623a32b960e91b6064820152608401610f22565b612e7d82614ba8565b60405182906001600160a01b038516907f1af5163f80e79b5e554f61e1d052084d3a3fe1166e42a265798c4e2ddce8ffa290600090a350919050565b33600090815260106020526040902054819060ff1680612eef57506000818152600a60205260409020546001600160a01b031633145b612f295760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b506000908152600960205260409020601301805464ff000000001981166401000000009182900460ff1615909102179055565b6001600160a01b038216331415612f865760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152600a602052604090205482906001600160a01b031633146130485760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600290920191850190615206565b60008281526009602052604090206013015482906301000000900460ff16156130a85760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166130fc5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060060180546001600160a01b0319166001600160a01b03909216919091179055565b60008281526009602052604090206013015482906301000000900460ff16156131695760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061319f57506000818152600a60205260409020546001600160a01b031633145b6131d95760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040808320601181015484526010018252909120845161320792860190615206565b50600084815260096020526040902060110154613225906001615b2d565b60009485526009602052604090942060110193909355505050565b60008381526009602052604090206013015483906301000000900460ff161561327b5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054849060ff16806132b157506000818152600a60205260409020546001600160a01b031633145b6132eb5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600085815260096020526040902060110154841061334b5760405162461bcd60e51b815260206004820152601560248201527f7363726970744964206f7574206f662072616e676500000000000000000000006044820152606401610f22565b60008581526009602090815260408083208784526010018252909120845161337592860190615206565b505050505050565b6000818152600960205260408120600d01546060919081908161339f866136ad565b905060006133ad8284615b16565b6001600160401b038111156133c4576133c46153f1565b6040519080825280602002602001820160405280156133ed578160200160208202803683370190505b50905060005b838110156134715780613409620f42408a615b45565b6134139190615b2d565b600081815260056020526040902054909550600160e01b900460ff1661345f578482878151811061344657613446615acf565b60209081029190910101528561345b81615afb565b9650505b8061346981615afb565b9150506133f3565b509695505050505050565b60008281526009602052604090206013015482906301000000900460ff16156134b75760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff16806134ed57506000818152600a60205260409020546001600160a01b031633145b6135275760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600190920191860190615206565b6135578484846148c9565b61356384848484614da4565b611908576040516368d2bf6b60e11b815260040160405180910390fd5b6015546060906001600160a01b031615611077576040805160018082528183019092529060208083019080368337505060155482519293506001600160a01b0316918391506000906135d4576135d4615acf565b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b60155460609081906001600160a01b0316156136a8576040805160018082528183019092529060208083019080368337505060155482519294506001600160a01b03169184915060009061364f5761364f615acf565b6001600160a01b03929092166020928302919091018201526040805160018082528183019092529182810190803683370190505090506014548160008151811061369b5761369b615acf565b6020026020010181815250505b915091565b60025460009081908190815b8181101561371157600281815481106136d4576136d4615acf565b90600052602060002001549350856136eb85611393565b14156136ff57826136fb81615afb565b9350505b8061370981615afb565b9150506136b9565b5090949350505050565b600f546001600160a01b031633146137625760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6060610d758261337d565b60008281526009602052604090206013015482906301000000900460ff16156137c95760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff1661381d5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060070180546001600160a01b0319166001600160a01b03909216919091179055565b60606002805480602002602001604051908101604052809291908181526020018280548015610e0357602002820191906000526020600020905b815481526020019060010190808311613889575050505050905090565b60008281526009602052604090206013015482906301000000900460ff16156138e15760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061391757506000818152600a60205260409020546001600160a01b031633145b6139515760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600f90920191860190615206565b6060816139828161436b565b6139ce5760405162461bcd60e51b815260206004820152601360248201527f546f6b656e204944206e6f7420657869737473000000000000000000000000006044820152606401610f22565b60006009816139dc86611393565b81526020810191909152604001600020600701546001600160a01b031614613abb57600060096000613a0d86611393565b8152602081019190915260409081016000908120600701549151631675f45560e01b8152600481018790526001600160a01b039092169250908290631675f4559060240160006040518083038186803b158015613a6957600080fd5b505afa158015613a7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613aa59190810190615b8e565b805190915015613ab8579250613cf39050565b50505b6000838152600e602052604081208054613ad490615a70565b90501115613c34576000838152600e602052604090208054613c2d9190613afa90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054613b2690615a70565b8015613b735780601f10613b4857610100808354040283529160200191613b73565b820191906000526020600020905b815481529060010190602001808311613b5657829003601f168201915b505050505060096000613b8587611393565b8152602001908152602001600020600c018054613ba190615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054613bcd90615a70565b8015613c1a5780601f10613bef57610100808354040283529160200191613c1a565b820191906000526020600020905b815481529060010190602001808311613bfd57829003601f168201915b5050505050614eaf90919063ffffffff16565b9150613cf3565b60096000613c4185611393565b81526020810191909152604001600020600a015460ff16158015613c8a575060096000613c6d85611393565b8152602081019190915260400160002060130154610100900460ff165b15613cbb57613c2d60096000613c9f86611393565b81526020019081526020016000206012018054613afa90615a70565b613cf0613cc78461443e565b60096000613cd487611393565b8152602001908152602001600020600b018054613ba190615a70565b91505b50919050565b3360009081526010602052604090205460ff16613d4d5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6000908152600960205260409020601301805462ff0000198116620100009182900460ff1615909102179055565b60008181526009602052604090206013015481906301000000900460ff1615613db65760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff1680613dec57506000818152600a60205260409020546001600160a01b031633145b613e265760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600083815260096020526040902060110154613e845760405162461bcd60e51b815260206004820152601e60248201527f746865726520617265206e6f207363726970747320746f2072656d6f766500006044820152606401610f22565b6000838152600960205260408120601181015460109091019190613eaa90600190615b16565b81526020019081526020016000206000613ec4919061528a565b600083815260096020526040902060110154613ee1906001615b2d565b600093845260096020526040909320601101929092555050565b60008181526009602052604090206013015481906301000000900460ff1615613f365760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff1680613f6c57506000818152600a60205260409020546001600160a01b031633145b613fa65760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600960205260409020600d0154156140115760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206d6f6469667920616674657220746f6b656e206973206d696e6044820152633a32b21760e11b6064820152608401610f22565b50506000908152600960205260409020601301805460ff19811660ff90911615179055565b6001600160a01b03811660009081526016602052604081205460ff161561405f57506001610d75565b6001600160a01b0380841660009081526008602090815260408083209386168352929052205460ff165b9392505050565b3360009081526010602052604090205460ff166140e45760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6001600160a01b03166000908152601660205260409020805460ff19811660ff90911615179055565b3360009081526011602052604081205460ff166141785760405162461bcd60e51b815260206004820152602360248201527f4d757374206d696e742066726f6d205261696e626f776c6973746564206d696e6044820152623a32b960e91b6064820152608401610f22565b6000848152600960205260409020600e810154600d9091015461419c908590615b2d565b11156141ea5760405162461bcd60e51b815260206004820152601760248201527f45786365656473206d617820696e766f636174696f6e730000000000000000006044820152606401610f22565b60008481526009602052604090206013015462010000900460ff168061422957506000848152600a60205260409020546001600160a01b038381169116145b6142755760405162461bcd60e51b815260206004820152601d60248201527f50726f6a206d75737420657869737420616e64206265206163746976650000006044820152606401610f22565b600084815260096020526040902060130154640100000000900460ff1615806142b757506000848152600a60205260409020546001600160a01b038381169116145b6143035760405162461bcd60e51b815260206004820152601460248201527f50757263686173657320617265207061757365640000000000000000000000006044820152606401610f22565b6000614310868686614edb565b9695505050505050565b60006001600160e01b031982166380ac58cd60e01b148061434b57506001600160e01b03198216635b5e139f60e01b145b80610d7557506001600160e01b031982166301ffc9a760e01b1492915050565b60008061437783611393565b6000818152600960205260409020600d0154909150614399620f424083615b45565b6143a39190615b2d565b83108015613cf057506143b9620f424082615b45565b8310158015613cf057505050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6060816144625750506040805180820190915260018152600360fc1b602082015290565b8160005b811561448c578061447681615afb565b91506144859050600a83615b7a565b9150614466565b6000816001600160401b038111156144a6576144a66153f1565b6040519080825280601f01601f1916602001820160405280156144d0576020820181803683370190505b5090505b84156113cf576144e5600183615b16565b91506144f2600a86615bfb565b6144fd906030615b2d565b60f81b81838151811061451257614512615acf565b60200101906001600160f81b031916908160001a905350614534600a86615b7a565b94506144d4565b8051606090829061454e5761454e615c0f565b600081516001600160401b03811115614569576145696153f1565b6040519080825280601f01601f191660200182016040528015614593576020820181803683370190505b5090508060005b8351811015614613578381815181106145b5576145b5615acf565b602001015160f81c60f81b8260018387516145d09190615b16565b6145da9190615b16565b815181106145ea576145ea615acf565b60200101906001600160f81b031916908160001a9053508061460b81615afb565b91505061459a565b50949350505050565b600080825b805182101561475257600781838151811061463e5761463e615acf565b01602001516001600160f81b031990811690911c1661466957614662600183615b2d565b9150614740565b8051600360f91b9060059083908590811061468657614686615acf565b01602001516001600160f81b031990811690911c1614156146ac57614662600283615b2d565b8051600760f91b906004908390859081106146c9576146c9615acf565b01602001516001600160f81b031990811690911c1614156146ef57614662600383615b2d565b8051600f60f91b9060039083908590811061470c5761470c615acf565b01602001516001600160f81b031990811690911c16141561473257614662600483615b2d565b61473d600183615b2d565b91505b8261474a81615afb565b935050614621565b5050919050565b60608360006147688585615b16565b6001600160401b0381111561477f5761477f6153f1565b6040519080825280601f01601f1916602001820160405280156147a9576020820181803683370190505b509050845b8481101561481b578281815181106147c8576147c8615acf565b01602001516001600160f81b031916826147e28884615b16565b815181106147f2576147f2615acf565b60200101906001600160f81b031916908160001a9053508061481381615afb565b9150506147ae565b5095945050505050565b60008082815b81518110156148c05760008183516148439190615b16565b9050600083838151811061485957614859615acf565b01602001516001600160f81b03198116915060f81c600061487b603083615b16565b9050614888600185615b16565b61489390600a615d09565b61489d9082615b45565b6148a79088615b2d565b96505050505080806148b890615afb565b91505061482b565b50909392505050565b60006148d482614aeb565b80519091506000906001600160a01b0316336001600160a01b0316148061490b57503361490084610e0d565b6001600160a01b0316145b8061491d5750815161491d9033614036565b90508061493d57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146149725760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661499957604051633a954ecd60e21b815260040160405180910390fd5b6149a68585856001614f81565b6149b660008484600001516143e2565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116614aa457614a588161436b565b15614aa457825160008281526005602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611019565b6040805160608101825260008082526020820181905291810191909152614b118261436b565b614b2e57604051636f96cda160e11b815260040160405180910390fd5b815b600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290614b9e5780516001600160a01b031615614b9e579392505050565b5060001901614b30565b6000614bb382614aeb565b9050614bc781600001516000846001614f81565b614bd760008383600001516143e2565b80516001600160a01b03166000908152600660205260408120805460019290614c0a9084906001600160401b0316615d15565b82546101009290920a6001600160401b0381810219909316918316021790915582516001600160a01b031660009081526006602052604090208054600193509091601091614c61918591600160801b900416615d3d565b82546001600160401b039182166101009390930a9283029282021916919091179091558251600085815260056020526040808220805460ff60e01b1942909616600160a01b026001600160e01b03199091166001600160a01b03958616171794909416600160e01b179093556002805460018181019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0187905586018082529290205491925016614d6457614d188161436b565b15614d6457815160008281526005602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b15614ea757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614de8903390899088908890600401615d68565b602060405180830381600087803b158015614e0257600080fd5b505af1925050508015614e32575060408051601f3d908101601f19168201909252614e2f91810190615d9a565b60015b614e8d573d808015614e60576040519150601f19603f3d011682016040523d82523d6000602084013e614e65565b606091505b508051614e85576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113cf565b5060016113cf565b60608282604051602001614ec4929190615db7565b604051602081830303815290604052905092915050565b6000828152600960205260408120600d01548190614efc620f424086615b45565b614f069190615b2d565b6000858152600960205260409020600d0154909150614f26908490615b2d565b6000858152600960205260409020600d0155614f4385828561506c565b83614f4e8483615b2d565b60405183907f070aa035fe0a09f0d9305bdc2d7a5d93cd4733db3b1ff869b4a7033c9501909a90600090a4949350505050565b6000600981614f8f85611393565b81526020810191909152604001600020600801546001600160a01b03161461190857600060096000614fc085611393565b8152602081019190915260409081016000206008015490516348e3eb8d60e11b81526001600160a01b03878116600483015286811660248301526044820186905260648201859052909116915081906391c7d71a9060840160006040518083038186803b15801561503057600080fd5b505afa158015615044573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133759190810190615b8e565b610eda838383604051806020016040528060008152506119088484848460016001600160a01b0385166150b157604051622e076360e81b815260040160405180910390fd5b826150cf5760405163b562e8dd60e01b815260040160405180910390fd5b6150dc6000868686614f81565b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b018116909202179091558884526005909252822080546001600160e01b031916909317600160a01b42909216919091021790915584905b848110156151f75760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48280156151cd57506151cb6000888487614da4565b155b156151eb576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101615176565b50506001805484019055611019565b82805461521290615a70565b90600052602060002090601f016020900481019282615234576000855561527a565b82601f1061524d57805160ff191683800117855561527a565b8280016001018555821561527a579182015b8281111561527a57825182559160200191906001019061525f565b506152869291506152c7565b5090565b50805461529690615a70565b6000825580601f106152a6575050565b601f0160209004906000526020600020908101906152c491906152c7565b50565b5b8082111561528657600081556001016152c8565b6001600160e01b0319811681146152c457600080fd5b60006020828403121561530457600080fd5b8135614089816152dc565b60005b8381101561532a578181015183820152602001615312565b838111156119085750506000910152565b6000815180845261535381602086016020860161530f565b601f01601f19169290920160200192915050565b602081526000614089602083018461533b565b60006020828403121561538c57600080fd5b5035919050565b6001600160a01b03811681146152c457600080fd5b600080604083850312156153bb57600080fd5b82356153c681615393565b946020939093013593505050565b6000602082840312156153e657600080fd5b813561408981615393565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561542f5761542f6153f1565b604052919050565b60006001600160401b03821115615450576154506153f1565b50601f01601f191660200190565b600061547161546c84615437565b615407565b905082815283838301111561548557600080fd5b828260208301376000602084830101529392505050565b600082601f8301126154ad57600080fd5b6140898383356020850161545e565b600080604083850312156154cf57600080fd5b8235915060208301356001600160401b038111156154ec57600080fd5b6154f88582860161549c565b9150509250929050565b600081518084526020808501945080840160005b8381101561553257815187529582019590820190600101615516565b509495945050505050565b6020815260006140896020830184615502565b60008083601f84011261556257600080fd5b5081356001600160401b0381111561557957600080fd5b6020830191508360208260051b850101111561162257600080fd5b600080600080604085870312156155aa57600080fd5b84356001600160401b03808211156155c157600080fd5b6155cd88838901615550565b909650945060208701359150808211156155e657600080fd5b506155f387828801615550565b95989497509550505050565b8035801515811461107757600080fd5b600080600080600080600060e0888a03121561562a57600080fd5b87356001600160401b0381111561564057600080fd5b61564c8a828b0161549c565b975050602088013561565d81615393565b955060408801359450606088013561567481615393565b9350615682608089016155ff565b925060a0880135915061569760c089016155ff565b905092959891949750929550565b6000806000606084860312156156ba57600080fd5b83356156c581615393565b925060208401356156d581615393565b929592945050506040919091013590565b600080604083850312156156f957600080fd5b50508035926020909101359150565b60608152600061571b606083018661533b565b828103602084015261572d818661533b565b9150508215156040830152949350505050565b60c08152600061575360c083018961533b565b87602084015286151560408401528281036060840152615773818761533b565b9415156080840152505090151560a090910152949350505050565b600080600080608085870312156157a457600080fd5b8435935060208501356157b681615393565b92506157c4604086016155ff565b9396929550929360600135925050565b600080604083850312156157e757600080fd5b8235915060208301356157f981615393565b809150509250929050565b60c08152600061581760c083018961533b565b8281036020840152615829818961533b565b9050828103604084015261583d818861533b565b90508281036060840152615851818761533b565b90508281036080840152615865818661533b565b91505082151560a0830152979650505050505050565b6000806040838503121561588e57600080fd5b823561589981615393565b91506158a7602084016155ff565b90509250929050565b6000806000606084860312156158c557600080fd5b833592506020840135915060408401356001600160401b038111156158e957600080fd5b6158f58682870161549c565b9150509250925092565b6000806000806080858703121561591557600080fd5b843561592081615393565b9350602085013561593081615393565b92506040850135915060608501356001600160401b0381111561595257600080fd5b8501601f8101871361596357600080fd5b6159728782356020840161545e565b91505092959194509250565b600081518084526020808501945080840160005b838110156155325781516001600160a01b031687529582019590820190600101615992565b602081526000614089602083018461597e565b6040815260006159dd604083018561597e565b82810360208401526159ef8185615502565b95945050505050565b60008060408385031215615a0b57600080fd5b8235615a1681615393565b915060208301356157f981615393565b60008060008060808587031215615a3c57600080fd5b8435615a4781615393565b935060208501359250604085013591506060850135615a6581615393565b939692955090935050565b600181811c90821680615a8457607f821691505b60208210811415613cf357634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f13db9b1e481a59881d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415615b0f57615b0f615ae5565b5060010190565b600082821015615b2857615b28615ae5565b500390565b60008219821115615b4057615b40615ae5565b500190565b6000816000190483118215151615615b5f57615b5f615ae5565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615b8957615b89615b64565b500490565b600060208284031215615ba057600080fd5b81516001600160401b03811115615bb657600080fd5b8201601f81018413615bc757600080fd5b8051615bd561546c82615437565b818152856020838501011115615bea57600080fd5b6159ef82602083016020860161530f565b600082615c0a57615c0a615b64565b500690565b634e487b7160e01b600052600160045260246000fd5b600181815b80851115615c60578160001904821115615c4657615c46615ae5565b80851615615c5357918102915b93841c9390800290615c2a565b509250929050565b600082615c7757506001610d75565b81615c8457506000610d75565b8160018114615c9a5760028114615ca457615cc0565b6001915050610d75565b60ff841115615cb557615cb5615ae5565b50506001821b610d75565b5060208310610133831016604e8410600b8410161715615ce3575081810a610d75565b615ced8383615c25565b8060001904821115615d0157615d01615ae5565b029392505050565b60006140898383615c68565b60006001600160401b0383811690831681811015615d3557615d35615ae5565b039392505050565b60006001600160401b03808316818516808303821115615d5f57615d5f615ae5565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152614310608083018461533b565b600060208284031215615dac57600080fd5b8151614089816152dc565b60008351615dc981846020880161530f565b835190830190615d5f81836020880161530f56fe4f6e6c7920617274697374206f72205261696e626f776c697374656400000000a2646970667358221220ea43e44c71b202e1e76d8f5a4647a09af5a76ed773e546e0dcf65a1e6a155e4b64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000096e74656e742e617274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e54454e54580000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106104d15760003560e01c806370a8a0ad1161028d578063b7b04fae11610161578063c87b56dd116100de578063e935b7b1116100a2578063f73c814b1161007c578063f73c814b14610c90578063f74bfe8e14610ca3578063f851a44014610cb657600080fd5b8063e935b7b114610c54578063e985e9c514610c5d578063f70c0f0414610c7057600080fd5b8063c87b56dd14610bde578063d03c390c14610bf1578063db2ff86114610c04578063db44fe0714610c17578063dce5d85814610c4157600080fd5b8063bcd4f24411610125578063bcd4f24414610b8a578063bee04f9c14610b9d578063c26aff0f14610bb0578063c3f4f54f14610bc3578063c6d7323114610bcb57600080fd5b8063b7b04fae14610b10578063b88d4fde14610b23578063b9c4d9fb14610b36578063bb3bafd614610b56578063bc6e639d14610b7757600080fd5b806395d89b411161020a578063a3b2cca6116101ce578063acad0124116101a8578063acad012414610ad7578063b1656ba314610aea578063b6550e8f14610afd57600080fd5b8063a3b2cca614610a88578063a47d29cb14610a9b578063a784d5c114610ac457600080fd5b806395d89b4114610a3457806397dc86cf14610a3c5780639dc29fac14610a4f578063a11ec70a14610a62578063a22cb46514610a7557600080fd5b80638ba8f14d116102515780638ba8f14d146108da5780638c2c3622146108ed5780638c3c9cdd146109e95780638dd91a56146109fc57806393961c6614610a2157600080fd5b806370a8a0ad1461085e578063742ff77a14610871578063810051d714610891578063826fc391146108b45780638462151c146108c757600080fd5b8063360d223a116103c45780634ae9a7381161034157806369bfd5d6116103055780636c2f5acd116102df5780636c2f5acd146108255780636c31d4e91461083857806370a082311461084b57600080fd5b806369bfd5d6146107ec57806369d14faf146107ff5780636bd5d5911461081257600080fd5b80634ae9a7381461078d5780634f6ccce7146107a05780635c088dcc146107b35780636352211e146107c6578063672b17e9146107d957600080fd5b80633f383cb8116103885780633f383cb81461071c5780633fef6c2a1461072f57806342842e0e1461074257806343fa7f44146107555780634aa6d4171461076857600080fd5b8063360d223a146106c757806337859963146106da5780633839bf99146106ed5780633bdbd5c4146106f65780633e48e8481461070957600080fd5b80631b689c0b11610452578063261eb4e511610416578063261eb4e51461063a578063279018221461064d5780632a55205a146106605780632d9c0205146106925780632f745c59146106b457600080fd5b80631b689c0b146105d55780632002f713146105e857806321c0da791461060b57806323b872dd1461061457806325b75d681461062757600080fd5b80630d170673116104995780630d170673146105665780630ebd4c7f14610579578063153a1f3e1461059957806318160ddd146105ac5780631afe39f8146105c257600080fd5b806301ffc9a7146104d657806306fdde03146104fe578063081812fc14610513578063095ea7b31461053e5780630b8f4d2d14610553575b600080fd5b6104e96104e43660046152f2565b610cc9565b60405190151581526020015b60405180910390f35b610506610d7b565b6040516104f59190615367565b61052661052136600461537a565b610e0d565b6040516001600160a01b0390911681526020016104f5565b61055161054c3660046153a8565b610e51565b005b6105516105613660046153d4565b610edf565b6105516105743660046154bc565b610f4f565b61058c61058736600461537a565b611020565b6040516104f5919061553d565b6105516105a7366004615594565b61107c565b6105b4611200565b6040519081526020016104f5565b6105516105d036600461560f565b611217565b6105b46105e336600461537a565b611393565b6104e96105f63660046153d4565b60106020526000908152604090205460ff1681565b6105b4600d5481565b6105516106223660046156a5565b6113d7565b6105516106353660046154bc565b6113e2565b61050661064836600461537a565b6114b2565b61055161065b36600461537a565b61154c565b61067361066e3660046156e6565b6115ee565b604080516001600160a01b0390931683526020830191909152016104f5565b6106a56106a036600461537a565b611629565b6040516104f593929190615708565b6105b46106c23660046153a8565b61178d565b6105516106d53660046153d4565b611824565b6105516106e83660046154bc565b61188d565b6105b460135481565b61055161070436600461537a565b61190e565b6105516107173660046154bc565b611aa2565b61055161072a3660046153d4565b611b1d565b61055161073d3660046154bc565b611b85565b6105516107503660046156a5565b611c55565b6105516107633660046153d4565b611c70565b61077b61077636600461537a565b611cdb565b6040516104f596959493929190615740565b600c54610526906001600160a01b031681565b6105b46107ae36600461537a565b611e70565b6105516107c136600461537a565b611f5a565b6105266107d436600461537a565b612073565b6105516107e736600461578e565b612085565b61058c6107fa36600461537a565b61216e565b61055161080d3660046157d4565b612243565b6105516108203660046154bc565b6122e2565b6105516108333660046153a8565b61235d565b6105516108463660046157d4565b6123d7565b6105b46108593660046153d4565b612498565b61055161086c36600461537a565b6124e6565b6105b461087f36600461537a565b6000908152600b602052604090205490565b6104e961089f3660046153d4565b60116020526000908152604090205460ff1681565b6105516108c23660046156e6565b612570565b61058c6108d53660046153d4565b6126e3565b6105516108e836600461537a565b61284b565b6109806108fb36600461537a565b6000908152600a6020908152604080832054600b83528184205460099384905291909320600d810154600e8201546013830154600584015460068501546007860154600887015496909801546001600160a01b03998a169a9799959894976201000090940460ff90811697938716969283169583169492841693600160a01b90041691565b604080516001600160a01b039c8d168152602081019b909b528a01989098526060890196909652931515608088015291871660a0870152861660c0860152851660e0850152909316610100830152911515610120820152610140810191909152610160016104f5565b6105066109f73660046156e6565b6128ff565b610a0f610a0a36600461537a565b6129b0565b6040516104f596959493929190615804565b610551610a2f3660046154bc565b612cfb565b610506612d91565b610551610a4a3660046156e6565b612da0565b6105b4610a5d3660046153a8565b612e09565b610551610a7036600461537a565b612eb9565b610551610a8336600461587b565b612f5c565b610551610a963660046154bc565b612ff2565b610526610aa936600461537a565b600a602052600090815260409020546001600160a01b031681565b610551610ad23660046157d4565b61306d565b610551610ae53660046154bc565b61312e565b610551610af83660046158b0565b613240565b61058c610b0b36600461537a565b61337d565b610551610b1e3660046154bc565b61347c565b610551610b313660046158ff565b61354c565b610b49610b4436600461537a565b613580565b6040516104f591906159b7565b610b69610b6436600461537a565b6135f9565b6040516104f59291906159ca565b6105b4610b8536600461537a565b6136ad565b610551610b983660046153d4565b61371b565b61058c610bab36600461537a565b613783565b610551610bbe3660046157d4565b61378e565b61058c61384f565b610551610bd93660046154bc565b6138a6565b610506610bec36600461537a565b613976565b610551610bff36600461537a565b613cf9565b610551610c1236600461537a565b613d7b565b6104e9610c2536600461537a565b600090815260056020526040902054600160e01b900460ff1690565b610551610c4f36600461537a565b613efb565b6105b460125481565b6104e9610c6b3660046159f8565b614036565b6105b4610c7e36600461537a565b600b6020526000908152604090205481565b610551610c9e3660046153d4565b614090565b6105b4610cb1366004615a26565b61410d565b600f54610526906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b1480610cee5750610cee8261431a565b80610d0957506001600160e01b03198216635b5e139f60e01b145b80610d2457506001600160e01b0319821663780e9d6360e01b145b80610d3f57506001600160e01b03198216635d9dd7eb60e11b145b80610d5a57506001600160e01b0319821663152a902d60e11b145b80610d7557506001600160e01b03198216632dde656160e21b145b92915050565b606060038054610d8a90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054610db690615a70565b8015610e035780601f10610dd857610100808354040283529160200191610e03565b820191906000526020600020905b815481529060010190602001808311610de657829003601f168201915b5050505050905090565b6000610e188261436b565b610e35576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610e5c82612073565b9050806001600160a01b0316836001600160a01b03161415610e915760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610eb15750610eaf8133614036565b155b15610ecf576040516367d9dca160e11b815260040160405180910390fd5b610eda8383836143e2565b505050565b600f546001600160a01b03163314610f2b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b60448201526064015b60405180910390fd5b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b60008281526009602052604090206013015482906301000000900460ff1615610f8a5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff1680610fc057506000818152600a60205260409020546001600160a01b031633145b610ffa5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992860190615206565b5050505050565b6015546060906001600160a01b0316156110775760408051600180825281830190925290602080830190803683370190505090506014548160008151811061106a5761106a615acf565b6020026020010181815250505b919050565b600f546001600160a01b031633146110c35760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b8281816111225760405162461bcd60e51b815260206004820152602760248201527f41646472657373207175616e74697479206d7573742067726561746572207468604482015266616e207a65726f60c81b6064820152608401610f22565b8082146111845760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e207175616e74697479206d75737420657175616c2061646472657360448201526973207175616e7469747960b01b6064820152608401610f22565b60005b828110156111f75760008787838181106111a3576111a3615acf565b90506020020160208101906111b891906153d4565b905060008686848181106111ce576111ce615acf565b9050602002013590506111e2338383611c55565b505080806111ef90615afb565b915050611187565b50505050505050565b60025460015460009161121291615b16565b905090565b3360009081526010602052604090205460ff1661126b5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6012546000818152600a6020908152604080832080546001600160a01b0319166001600160a01b038c161790556009825290912089516112ad928b0190615206565b5060008181526009602081815260408084206005810180546001600160a01b0319166001600160a01b038c1617905560088101805460ff60a01b1916600160a01b8b151502179055808401889055600b835293208990555260138101805464010000000064ff0000000019909116179055600a8101805460ff1916841515179055620f4240600e909101558161135b576000818152600960205260409020601301805460ff19169055611378565b6000818152600960205260409020601301805460ff191660011790555b601254611386906001615b2d565b6012555050505050505050565b6000806113a76113a28461443e565b61453b565b905060006113c46113a260066113bc8561461c565b859190614759565b90506113cf81614825565b949350505050565b610eda8383836148c9565b60008281526009602052604090206013015482906301000000900460ff161561141d5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061145357506000818152600a60205260409020546001600160a01b031633145b61148d5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600490920191860190615206565b600e60205260009081526040902080546114cb90615a70565b80601f01602080910402602001604051908101604052809291908181526020018280546114f790615a70565b80156115445780601f1061151957610100808354040283529160200191611544565b820191906000526020600020905b81548152906001019060200180831161152757829003601f168201915b505050505081565b61155581611393565b3360009081526010602052604090205460ff168061158957506000818152600a60205260409020546001600160a01b031633145b6115c35760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600e60006115d084611393565b815260200190815260200160002060006115ea919061528a565b5050565b60155460145460009182916001600160a01b0390911690612710906116139086615b45565b61161d9190615b7a565b915091505b9250929050565b6000818152600960205260408120600b0180546060928392909161164c90615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461167890615a70565b80156116c55780601f1061169a576101008083540402835291602001916116c5565b820191906000526020600020905b8154815290600101906020018083116116a857829003601f168201915b5050506000878152600960205260409020600c018054939650926116eb92509050615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461171790615a70565b80156117645780601f1061173957610100808354040283529160200191611764565b820191906000526020600020905b81548152906001019060200180831161174757829003601f168201915b505050600096875250506009602052604090942060130154929461010090930460ff1692915050565b600061179883612498565b82106117fa5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610f22565b611803836126e3565b828151811061181457611814615acf565b6020026020010151905092915050565b600f546001600160a01b0316331461186b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600a602052604090205482906001600160a01b031633146118e35760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600390920191850190615206565b50505050565b60008181526009602052604090206013015481906301000000900460ff16156119495760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff168061197f57506000818152600a60205260409020546001600160a01b031633145b6119b95760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600960205260409020600d015415611a285760405162461bcd60e51b815260206004820152602760248201527f43616e206e6f7420737769746368206166746572206120746f6b656e2069732060448201526636b4b73a32b21760c91b6064820152608401610f22565b6000838152600960205260409020600a015460ff1615611a60576000838152600960205260409020601301805460ff19169055611a7d565b6000838152600960205260409020601301805460ff191660011790555b50506000908152600960205260409020600a01805460ff19811660ff90911615179055565b6000828152600a602052604090205482906001600160a01b03163314611af85760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600b90920191850190615206565b600f546001600160a01b03163314611b645760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601160205260409020805460ff19169055565b60008281526009602052604090206013015482906301000000900460ff1615611bc05760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff1680611bf657506000818152600a60205260409020546001600160a01b031633145b611c305760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992601290920191860190615206565b610eda8383836040518060200160405280600081525061354c565b600f546001600160a01b03163314611cb75760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601060205260409020805460ff19166001179055565b6060600080606060008060096000888152602001908152602001600020600f018054611d0690615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3290615a70565b8015611d7f5780601f10611d5457610100808354040283529160200191611d7f565b820191906000526020600020905b815481529060010190602001808311611d6257829003601f168201915b50505060008a81526009602052604090206011810154601382015460129092018054959b5090995060ff909116975092611dbb92509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054611de790615a70565b8015611e345780601f10611e0957610100808354040283529160200191611e34565b820191906000526020600020905b815481529060010190602001808311611e1757829003601f168201915b5050506000998a5250506009602052604090972060130154959794969395939460ff630100000086048116956401000000009004169350915050565b60135460009081905b601254811015611f40576000611e8e8261337d565b905060005b8151811015611f36576000828281518110611eb057611eb0615acf565b602090810291909101810151600081815260058352604090819020815160608101835290546001600160a01b0381168252600160a01b81046001600160401b031694820194909452600160e01b90930460ff161515908301819052909250611f2c5787861415611f2557509695505050505050565b6001909501945b5050600101611e93565b5050600101611e79565b50604051637339954760e01b815260040160405180910390fd5b33600090815260106020526040902054819060ff1680611f9057506000818152600a60205260409020546001600160a01b031633145b611fca5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000828152600960205260409020600a015460ff16156120465760405162461bcd60e51b815260206004820152603160248201527f63616e206f6e6c7920736574207374617469632049504653206861736820666f60448201527072207374617469632070726f6a6563747360781b6064820152608401610f22565b506000908152600960205260409020601301805461ff001981166101009182900460ff1615909102179055565b600061207e82614aeb565b5192915050565b60008481526009602052604090206013015484906301000000900460ff16156120c05760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166121145760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009384526009602081905260409094206005810180546001600160a01b039095166001600160a01b031990951694909417909355600883018054921515600160a01b0260ff60a01b1990931692909217909155910155565b6060600080600061217e856136ad565b90506000816001600160401b0381111561219a5761219a6153f1565b6040519080825280602002602001820160405280156121c3578160200160208202803683370190505b5060025490915060005b8181101561223757600281815481106121e8576121e8615acf565b90600052602060002001549450876121ff86611393565b1415612225578483878151811061221857612218615acf565b6020026020010181815250505b8061222f81615afb565b9150506121cd565b50909695505050505050565b33600090815260106020526040902054829060ff168061227957506000818152600a60205260409020546001600160a01b031633145b6122b35760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b506000918252600a602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6000828152600a602052604090205482906001600160a01b031633146123385760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600c90920191850190615206565b3360009081526010602052604090205460ff166123b15760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b601580546001600160a01b0319166001600160a01b039390931692909217909155601455565b60008281526009602052604090206013015482906301000000900460ff16156124125760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166124665760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060080180546001600160a01b0319166001600160a01b03909216919091179055565b60006001600160a01b0382166124c1576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b600f546001600160a01b0316331461252d5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b603281111561256b5760405162461bcd60e51b815260206004820152600a6024820152694d6178206f662035302560b01b6044820152606401610f22565b600d55565b6000828152600a602052604090205482906001600160a01b031633146125c65760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960205260409020601301546301000000900460ff1615806125fe57506000838152600960205260409020600e015482105b61261a5760405162461bcd60e51b8152600401610f2290615aa5565b6000838152600960205260409020600d0154821161267a5760405162461bcd60e51b815260206004820152601f60248201527f4d617820696e766f636174696f6e7320657863656564732063757272656e74006044820152606401610f22565b620f42408211156126cd5760405162461bcd60e51b815260206004820152601560248201527f43616e6e6f7420657863656564203130303030303000000000000000000000006044820152606401610f22565b50600091825260096020526040909120600e0155565b606060006126f083612498565b90506000806000836001600160401b0381111561270f5761270f6153f1565b604051908082528060200260200182016040528015612738578160200160208202803683370190505b506013549091505b601254811015611f405760006127558261337d565b905060005b815181101561284157600082828151811061277757612777615acf565b602090810291909101810151600081815260058352604090819020815160608101835290546001600160a01b038116808352600160a01b82046001600160401b031695830195909552600160e01b900460ff1615159181019190915290925090156127e157805196505b8a6001600160a01b0316876001600160a01b03161415612820578186898151811061280e5761280e615acf565b60209081029190910101526001909701965b888814156128375750939998505050505050505050565b505060010161275a565b5050600101612740565b3360009081526010602052604090205460ff1661289f5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b60008181526009602052604090206013015481906301000000900460ff16156128da5760405162461bcd60e51b8152600401610f2290615aa5565b506000908152600960205260409020601301805463ff00000019166301000000179055565b6000828152600960209081526040808320848452601001909152902080546060919061292a90615a70565b80601f016020809104026020016040519081016040528092919081815260200182805461295690615a70565b80156129a35780601f10612978576101008083540402835291602001916129a3565b820191906000526020600020905b81548152906001019060200180831161298657829003601f168201915b5050505050905092915050565b606080606080606060006009600088815260200190815260200160002060000180546129db90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0790615a70565b8015612a545780601f10612a2957610100808354040283529160200191612a54565b820191906000526020600020905b815481529060010190602001808311612a3757829003601f168201915b50505060008a8152600960205260409020600101805493995092612a7a92509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612aa690615a70565b8015612af35780601f10612ac857610100808354040283529160200191612af3565b820191906000526020600020905b815481529060010190602001808311612ad657829003601f168201915b50505060008a8152600960205260409020600201805493985092612b1992509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4590615a70565b8015612b925780601f10612b6757610100808354040283529160200191612b92565b820191906000526020600020905b815481529060010190602001808311612b7557829003601f168201915b50505060008a8152600960205260409020600301805493975092612bb892509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612be490615a70565b8015612c315780601f10612c0657610100808354040283529160200191612c31565b820191906000526020600020905b815481529060010190602001808311612c1457829003601f168201915b50505060008a8152600960205260409020600401805493965092612c5792509050615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054612c8390615a70565b8015612cd05780601f10612ca557610100808354040283529160200191612cd0565b820191906000526020600020905b815481529060010190602001808311612cb357829003601f168201915b5050506000998a52505060096020526040909720600a0154959794969395929460ff90931692915050565b612d0482611393565b3360009081526010602052604090205460ff1680612d3857506000818152600a60205260409020546001600160a01b031633145b612d725760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600e60209081526040909120835161190892850190615206565b606060048054610d8a90615a70565b6000828152600a602052604090205482906001600160a01b03163314612df65760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b506000918252600b602052604090912055565b3360009081526011602052604081205460ff16612e745760405162461bcd60e51b815260206004820152602360248201527f4d757374206275726e2066726f6d205261696e626f776c6973746564206d696e6044820152623a32b960e91b6064820152608401610f22565b612e7d82614ba8565b60405182906001600160a01b038516907f1af5163f80e79b5e554f61e1d052084d3a3fe1166e42a265798c4e2ddce8ffa290600090a350919050565b33600090815260106020526040902054819060ff1680612eef57506000818152600a60205260409020546001600160a01b031633145b612f295760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b506000908152600960205260409020601301805464ff000000001981166401000000009182900460ff1615909102179055565b6001600160a01b038216331415612f865760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152600a602052604090205482906001600160a01b031633146130485760405162461bcd60e51b815260206004820152600b60248201526a13db9b1e48185c9d1a5cdd60aa1b6044820152606401610f22565b6000838152600960209081526040909120835161190892600290920191850190615206565b60008281526009602052604090206013015482906301000000900460ff16156130a85760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff166130fc5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060060180546001600160a01b0319166001600160a01b03909216919091179055565b60008281526009602052604090206013015482906301000000900460ff16156131695760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061319f57506000818152600a60205260409020546001600160a01b031633145b6131d95760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040808320601181015484526010018252909120845161320792860190615206565b50600084815260096020526040902060110154613225906001615b2d565b60009485526009602052604090942060110193909355505050565b60008381526009602052604090206013015483906301000000900460ff161561327b5760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054849060ff16806132b157506000818152600a60205260409020546001600160a01b031633145b6132eb5760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600085815260096020526040902060110154841061334b5760405162461bcd60e51b815260206004820152601560248201527f7363726970744964206f7574206f662072616e676500000000000000000000006044820152606401610f22565b60008581526009602090815260408083208784526010018252909120845161337592860190615206565b505050505050565b6000818152600960205260408120600d01546060919081908161339f866136ad565b905060006133ad8284615b16565b6001600160401b038111156133c4576133c46153f1565b6040519080825280602002602001820160405280156133ed578160200160208202803683370190505b50905060005b838110156134715780613409620f42408a615b45565b6134139190615b2d565b600081815260056020526040902054909550600160e01b900460ff1661345f578482878151811061344657613446615acf565b60209081029190910101528561345b81615afb565b9650505b8061346981615afb565b9150506133f3565b509695505050505050565b60008281526009602052604090206013015482906301000000900460ff16156134b75760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff16806134ed57506000818152600a60205260409020546001600160a01b031633145b6135275760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600190920191860190615206565b6135578484846148c9565b61356384848484614da4565b611908576040516368d2bf6b60e11b815260040160405180910390fd5b6015546060906001600160a01b031615611077576040805160018082528183019092529060208083019080368337505060155482519293506001600160a01b0316918391506000906135d4576135d4615acf565b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b60155460609081906001600160a01b0316156136a8576040805160018082528183019092529060208083019080368337505060155482519294506001600160a01b03169184915060009061364f5761364f615acf565b6001600160a01b03929092166020928302919091018201526040805160018082528183019092529182810190803683370190505090506014548160008151811061369b5761369b615acf565b6020026020010181815250505b915091565b60025460009081908190815b8181101561371157600281815481106136d4576136d4615acf565b90600052602060002001549350856136eb85611393565b14156136ff57826136fb81615afb565b9350505b8061370981615afb565b9150506136b9565b5090949350505050565b600f546001600160a01b031633146137625760405162461bcd60e51b815260206004820152600a60248201526927b7363c9030b236b4b760b11b6044820152606401610f22565b6001600160a01b03166000908152601060205260409020805460ff19169055565b6060610d758261337d565b60008281526009602052604090206013015482906301000000900460ff16156137c95760405162461bcd60e51b8152600401610f2290615aa5565b3360009081526010602052604090205460ff1661381d5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b5060009182526009602052604090912060070180546001600160a01b0319166001600160a01b03909216919091179055565b60606002805480602002602001604051908101604052809291908181526020018280548015610e0357602002820191906000526020600020905b815481526020019060010190808311613889575050505050905090565b60008281526009602052604090206013015482906301000000900460ff16156138e15760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054839060ff168061391757506000818152600a60205260409020546001600160a01b031633145b6139515760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000848152600960209081526040909120845161101992600f90920191860190615206565b6060816139828161436b565b6139ce5760405162461bcd60e51b815260206004820152601360248201527f546f6b656e204944206e6f7420657869737473000000000000000000000000006044820152606401610f22565b60006009816139dc86611393565b81526020810191909152604001600020600701546001600160a01b031614613abb57600060096000613a0d86611393565b8152602081019190915260409081016000908120600701549151631675f45560e01b8152600481018790526001600160a01b039092169250908290631675f4559060240160006040518083038186803b158015613a6957600080fd5b505afa158015613a7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613aa59190810190615b8e565b805190915015613ab8579250613cf39050565b50505b6000838152600e602052604081208054613ad490615a70565b90501115613c34576000838152600e602052604090208054613c2d9190613afa90615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054613b2690615a70565b8015613b735780601f10613b4857610100808354040283529160200191613b73565b820191906000526020600020905b815481529060010190602001808311613b5657829003601f168201915b505050505060096000613b8587611393565b8152602001908152602001600020600c018054613ba190615a70565b80601f0160208091040260200160405190810160405280929190818152602001828054613bcd90615a70565b8015613c1a5780601f10613bef57610100808354040283529160200191613c1a565b820191906000526020600020905b815481529060010190602001808311613bfd57829003601f168201915b5050505050614eaf90919063ffffffff16565b9150613cf3565b60096000613c4185611393565b81526020810191909152604001600020600a015460ff16158015613c8a575060096000613c6d85611393565b8152602081019190915260400160002060130154610100900460ff165b15613cbb57613c2d60096000613c9f86611393565b81526020019081526020016000206012018054613afa90615a70565b613cf0613cc78461443e565b60096000613cd487611393565b8152602001908152602001600020600b018054613ba190615a70565b91505b50919050565b3360009081526010602052604090205460ff16613d4d5760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6000908152600960205260409020601301805462ff0000198116620100009182900460ff1615909102179055565b60008181526009602052604090206013015481906301000000900460ff1615613db65760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff1680613dec57506000818152600a60205260409020546001600160a01b031633145b613e265760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b600083815260096020526040902060110154613e845760405162461bcd60e51b815260206004820152601e60248201527f746865726520617265206e6f207363726970747320746f2072656d6f766500006044820152606401610f22565b6000838152600960205260408120601181015460109091019190613eaa90600190615b16565b81526020019081526020016000206000613ec4919061528a565b600083815260096020526040902060110154613ee1906001615b2d565b600093845260096020526040909320601101929092555050565b60008181526009602052604090206013015481906301000000900460ff1615613f365760405162461bcd60e51b8152600401610f2290615aa5565b33600090815260106020526040902054829060ff1680613f6c57506000818152600a60205260409020546001600160a01b031633145b613fa65760405162461bcd60e51b815260206004820152601c6024820152600080516020615dde8339815191526044820152606401610f22565b6000838152600960205260409020600d0154156140115760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f74206d6f6469667920616674657220746f6b656e206973206d696e6044820152633a32b21760e11b6064820152608401610f22565b50506000908152600960205260409020601301805460ff19811660ff90911615179055565b6001600160a01b03811660009081526016602052604081205460ff161561405f57506001610d75565b6001600160a01b0380841660009081526008602090815260408083209386168352929052205460ff165b9392505050565b3360009081526010602052604090205460ff166140e45760405162461bcd60e51b815260206004820152601260248201527113db9b1e4814985a5b989bdddb1a5cdd195960721b6044820152606401610f22565b6001600160a01b03166000908152601660205260409020805460ff19811660ff90911615179055565b3360009081526011602052604081205460ff166141785760405162461bcd60e51b815260206004820152602360248201527f4d757374206d696e742066726f6d205261696e626f776c6973746564206d696e6044820152623a32b960e91b6064820152608401610f22565b6000848152600960205260409020600e810154600d9091015461419c908590615b2d565b11156141ea5760405162461bcd60e51b815260206004820152601760248201527f45786365656473206d617820696e766f636174696f6e730000000000000000006044820152606401610f22565b60008481526009602052604090206013015462010000900460ff168061422957506000848152600a60205260409020546001600160a01b038381169116145b6142755760405162461bcd60e51b815260206004820152601d60248201527f50726f6a206d75737420657869737420616e64206265206163746976650000006044820152606401610f22565b600084815260096020526040902060130154640100000000900460ff1615806142b757506000848152600a60205260409020546001600160a01b038381169116145b6143035760405162461bcd60e51b815260206004820152601460248201527f50757263686173657320617265207061757365640000000000000000000000006044820152606401610f22565b6000614310868686614edb565b9695505050505050565b60006001600160e01b031982166380ac58cd60e01b148061434b57506001600160e01b03198216635b5e139f60e01b145b80610d7557506001600160e01b031982166301ffc9a760e01b1492915050565b60008061437783611393565b6000818152600960205260409020600d0154909150614399620f424083615b45565b6143a39190615b2d565b83108015613cf057506143b9620f424082615b45565b8310158015613cf057505050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6060816144625750506040805180820190915260018152600360fc1b602082015290565b8160005b811561448c578061447681615afb565b91506144859050600a83615b7a565b9150614466565b6000816001600160401b038111156144a6576144a66153f1565b6040519080825280601f01601f1916602001820160405280156144d0576020820181803683370190505b5090505b84156113cf576144e5600183615b16565b91506144f2600a86615bfb565b6144fd906030615b2d565b60f81b81838151811061451257614512615acf565b60200101906001600160f81b031916908160001a905350614534600a86615b7a565b94506144d4565b8051606090829061454e5761454e615c0f565b600081516001600160401b03811115614569576145696153f1565b6040519080825280601f01601f191660200182016040528015614593576020820181803683370190505b5090508060005b8351811015614613578381815181106145b5576145b5615acf565b602001015160f81c60f81b8260018387516145d09190615b16565b6145da9190615b16565b815181106145ea576145ea615acf565b60200101906001600160f81b031916908160001a9053508061460b81615afb565b91505061459a565b50949350505050565b600080825b805182101561475257600781838151811061463e5761463e615acf565b01602001516001600160f81b031990811690911c1661466957614662600183615b2d565b9150614740565b8051600360f91b9060059083908590811061468657614686615acf565b01602001516001600160f81b031990811690911c1614156146ac57614662600283615b2d565b8051600760f91b906004908390859081106146c9576146c9615acf565b01602001516001600160f81b031990811690911c1614156146ef57614662600383615b2d565b8051600f60f91b9060039083908590811061470c5761470c615acf565b01602001516001600160f81b031990811690911c16141561473257614662600483615b2d565b61473d600183615b2d565b91505b8261474a81615afb565b935050614621565b5050919050565b60608360006147688585615b16565b6001600160401b0381111561477f5761477f6153f1565b6040519080825280601f01601f1916602001820160405280156147a9576020820181803683370190505b509050845b8481101561481b578281815181106147c8576147c8615acf565b01602001516001600160f81b031916826147e28884615b16565b815181106147f2576147f2615acf565b60200101906001600160f81b031916908160001a9053508061481381615afb565b9150506147ae565b5095945050505050565b60008082815b81518110156148c05760008183516148439190615b16565b9050600083838151811061485957614859615acf565b01602001516001600160f81b03198116915060f81c600061487b603083615b16565b9050614888600185615b16565b61489390600a615d09565b61489d9082615b45565b6148a79088615b2d565b96505050505080806148b890615afb565b91505061482b565b50909392505050565b60006148d482614aeb565b80519091506000906001600160a01b0316336001600160a01b0316148061490b57503361490084610e0d565b6001600160a01b0316145b8061491d5750815161491d9033614036565b90508061493d57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146149725760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661499957604051633a954ecd60e21b815260040160405180910390fd5b6149a68585856001614f81565b6149b660008484600001516143e2565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116614aa457614a588161436b565b15614aa457825160008281526005602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611019565b6040805160608101825260008082526020820181905291810191909152614b118261436b565b614b2e57604051636f96cda160e11b815260040160405180910390fd5b815b600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290614b9e5780516001600160a01b031615614b9e579392505050565b5060001901614b30565b6000614bb382614aeb565b9050614bc781600001516000846001614f81565b614bd760008383600001516143e2565b80516001600160a01b03166000908152600660205260408120805460019290614c0a9084906001600160401b0316615d15565b82546101009290920a6001600160401b0381810219909316918316021790915582516001600160a01b031660009081526006602052604090208054600193509091601091614c61918591600160801b900416615d3d565b82546001600160401b039182166101009390930a9283029282021916919091179091558251600085815260056020526040808220805460ff60e01b1942909616600160a01b026001600160e01b03199091166001600160a01b03958616171794909416600160e01b179093556002805460018181019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0187905586018082529290205491925016614d6457614d188161436b565b15614d6457815160008281526005602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b03909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b15614ea757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614de8903390899088908890600401615d68565b602060405180830381600087803b158015614e0257600080fd5b505af1925050508015614e32575060408051601f3d908101601f19168201909252614e2f91810190615d9a565b60015b614e8d573d808015614e60576040519150601f19603f3d011682016040523d82523d6000602084013e614e65565b606091505b508051614e85576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113cf565b5060016113cf565b60608282604051602001614ec4929190615db7565b604051602081830303815290604052905092915050565b6000828152600960205260408120600d01548190614efc620f424086615b45565b614f069190615b2d565b6000858152600960205260409020600d0154909150614f26908490615b2d565b6000858152600960205260409020600d0155614f4385828561506c565b83614f4e8483615b2d565b60405183907f070aa035fe0a09f0d9305bdc2d7a5d93cd4733db3b1ff869b4a7033c9501909a90600090a4949350505050565b6000600981614f8f85611393565b81526020810191909152604001600020600801546001600160a01b03161461190857600060096000614fc085611393565b8152602081019190915260409081016000206008015490516348e3eb8d60e11b81526001600160a01b03878116600483015286811660248301526044820186905260648201859052909116915081906391c7d71a9060840160006040518083038186803b15801561503057600080fd5b505afa158015615044573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133759190810190615b8e565b610eda838383604051806020016040528060008152506119088484848460016001600160a01b0385166150b157604051622e076360e81b815260040160405180910390fd5b826150cf5760405163b562e8dd60e01b815260040160405180910390fd5b6150dc6000868686614f81565b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b018116909202179091558884526005909252822080546001600160e01b031916909317600160a01b42909216919091021790915584905b848110156151f75760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48280156151cd57506151cb6000888487614da4565b155b156151eb576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101615176565b50506001805484019055611019565b82805461521290615a70565b90600052602060002090601f016020900481019282615234576000855561527a565b82601f1061524d57805160ff191683800117855561527a565b8280016001018555821561527a579182015b8281111561527a57825182559160200191906001019061525f565b506152869291506152c7565b5090565b50805461529690615a70565b6000825580601f106152a6575050565b601f0160209004906000526020600020908101906152c491906152c7565b50565b5b8082111561528657600081556001016152c8565b6001600160e01b0319811681146152c457600080fd5b60006020828403121561530457600080fd5b8135614089816152dc565b60005b8381101561532a578181015183820152602001615312565b838111156119085750506000910152565b6000815180845261535381602086016020860161530f565b601f01601f19169290920160200192915050565b602081526000614089602083018461533b565b60006020828403121561538c57600080fd5b5035919050565b6001600160a01b03811681146152c457600080fd5b600080604083850312156153bb57600080fd5b82356153c681615393565b946020939093013593505050565b6000602082840312156153e657600080fd5b813561408981615393565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561542f5761542f6153f1565b604052919050565b60006001600160401b03821115615450576154506153f1565b50601f01601f191660200190565b600061547161546c84615437565b615407565b905082815283838301111561548557600080fd5b828260208301376000602084830101529392505050565b600082601f8301126154ad57600080fd5b6140898383356020850161545e565b600080604083850312156154cf57600080fd5b8235915060208301356001600160401b038111156154ec57600080fd5b6154f88582860161549c565b9150509250929050565b600081518084526020808501945080840160005b8381101561553257815187529582019590820190600101615516565b509495945050505050565b6020815260006140896020830184615502565b60008083601f84011261556257600080fd5b5081356001600160401b0381111561557957600080fd5b6020830191508360208260051b850101111561162257600080fd5b600080600080604085870312156155aa57600080fd5b84356001600160401b03808211156155c157600080fd5b6155cd88838901615550565b909650945060208701359150808211156155e657600080fd5b506155f387828801615550565b95989497509550505050565b8035801515811461107757600080fd5b600080600080600080600060e0888a03121561562a57600080fd5b87356001600160401b0381111561564057600080fd5b61564c8a828b0161549c565b975050602088013561565d81615393565b955060408801359450606088013561567481615393565b9350615682608089016155ff565b925060a0880135915061569760c089016155ff565b905092959891949750929550565b6000806000606084860312156156ba57600080fd5b83356156c581615393565b925060208401356156d581615393565b929592945050506040919091013590565b600080604083850312156156f957600080fd5b50508035926020909101359150565b60608152600061571b606083018661533b565b828103602084015261572d818661533b565b9150508215156040830152949350505050565b60c08152600061575360c083018961533b565b87602084015286151560408401528281036060840152615773818761533b565b9415156080840152505090151560a090910152949350505050565b600080600080608085870312156157a457600080fd5b8435935060208501356157b681615393565b92506157c4604086016155ff565b9396929550929360600135925050565b600080604083850312156157e757600080fd5b8235915060208301356157f981615393565b809150509250929050565b60c08152600061581760c083018961533b565b8281036020840152615829818961533b565b9050828103604084015261583d818861533b565b90508281036060840152615851818761533b565b90508281036080840152615865818661533b565b91505082151560a0830152979650505050505050565b6000806040838503121561588e57600080fd5b823561589981615393565b91506158a7602084016155ff565b90509250929050565b6000806000606084860312156158c557600080fd5b833592506020840135915060408401356001600160401b038111156158e957600080fd5b6158f58682870161549c565b9150509250925092565b6000806000806080858703121561591557600080fd5b843561592081615393565b9350602085013561593081615393565b92506040850135915060608501356001600160401b0381111561595257600080fd5b8501601f8101871361596357600080fd5b6159728782356020840161545e565b91505092959194509250565b600081518084526020808501945080840160005b838110156155325781516001600160a01b031687529582019590820190600101615992565b602081526000614089602083018461597e565b6040815260006159dd604083018561597e565b82810360208401526159ef8185615502565b95945050505050565b60008060408385031215615a0b57600080fd5b8235615a1681615393565b915060208301356157f981615393565b60008060008060808587031215615a3c57600080fd5b8435615a4781615393565b935060208501359250604085013591506060850135615a6581615393565b939692955090935050565b600181811c90821680615a8457607f821691505b60208210811415613cf357634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f13db9b1e481a59881d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415615b0f57615b0f615ae5565b5060010190565b600082821015615b2857615b28615ae5565b500390565b60008219821115615b4057615b40615ae5565b500190565b6000816000190483118215151615615b5f57615b5f615ae5565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615b8957615b89615b64565b500490565b600060208284031215615ba057600080fd5b81516001600160401b03811115615bb657600080fd5b8201601f81018413615bc757600080fd5b8051615bd561546c82615437565b818152856020838501011115615bea57600080fd5b6159ef82602083016020860161530f565b600082615c0a57615c0a615b64565b500690565b634e487b7160e01b600052600160045260246000fd5b600181815b80851115615c60578160001904821115615c4657615c46615ae5565b80851615615c5357918102915b93841c9390800290615c2a565b509250929050565b600082615c7757506001610d75565b81615c8457506000610d75565b8160018114615c9a5760028114615ca457615cc0565b6001915050610d75565b60ff841115615cb557615cb5615ae5565b50506001821b610d75565b5060208310610133831016604e8410600b8410161715615ce3575081810a610d75565b615ced8383615c25565b8060001904821115615d0157615d01615ae5565b029392505050565b60006140898383615c68565b60006001600160401b0383811690831681811015615d3557615d35615ae5565b039392505050565b60006001600160401b03808316818516808303821115615d5f57615d5f615ae5565b01949350505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152614310608083018461533b565b600060208284031215615dac57600080fd5b8151614089816152dc565b60008351615dc981846020880161530f565b835190830190615d5f81836020880161530f56fe4f6e6c7920617274697374206f72205261696e626f776c697374656400000000a2646970667358221220ea43e44c71b202e1e76d8f5a4647a09af5a76ed773e546e0dcf65a1e6a155e4b64736f6c63430008090033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000096e74656e742e617274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064e54454e54580000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): ntent.art
Arg [1] : _tokenSymbol (string): NTENTX

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 6e74656e742e6172740000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4e54454e54580000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

31895:29889:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35200:609;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35200:609:0;;;;;;;;18176:100;;;:::i;:::-;;;;;;;:::i;19763:245::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:55:1;;;1674:74;;1662:2;1647:18;19763:245:0;1528:226:1;19339:358:0;;;;;;:::i;:::-;;:::i;:::-;;38587:120;;;;;;:::i;:::-;;:::i;41186:236::-;;;;;;:::i;:::-;;:::i;59408:235::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52816:678::-;;;;;;:::i;:::-;;:::i;15044:122::-;;;:::i;:::-;;;6061:25:1;;;6049:2;6034:18;15044:122:0;5915:177:1;39853:1090:0;;;;;;:::i;:::-;;:::i;54924:451::-;;;;;;:::i;:::-;;:::i;33445:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33312:35;;;;;;52045:168;;;;;;:::i;:::-;;:::i;43355:241::-;;;;;;:::i;:::-;;:::i;33356:53::-;;;;;;:::i;:::-;;:::i;47994:211::-;;;;;;:::i;:::-;;:::i;59651:194::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8047:55:1;;;8029:74;;8134:2;8119:18;;8112:34;;;;8002:18;59651:194:0;7855:297:1;51621:416:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;61539:242::-;;;;;;:::i;:::-;;:::i;38029:115::-;;;;;;:::i;:::-;;:::i;43146:201::-;;;;;;:::i;:::-;;:::i;33598:33::-;;;;;;47183:557;;;;;;:::i;:::-;;:::i;46392:198::-;;;;;;:::i;:::-;;:::i;38715:124::-;;;;;;:::i;:::-;;:::i;46146:238::-;;;;;;:::i;:::-;;:::i;20975:185::-;;;;;;:::i;:::-;;:::i;38343:112::-;;;;;;:::i;:::-;;:::i;50777:632::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;33278:27::-;;;;;-1:-1:-1;;;;;33278:27:0;;;60582:949;;;;;;:::i;:::-;;:::i;46830:345::-;;;;;;:::i;:::-;;:::i;17170:124::-;;;;;;:::i;:::-;;:::i;41687:460::-;;;;;;:::i;:::-;;:::i;50076:693::-;;;;;;:::i;:::-;;:::i;39419:222::-;;;;;;:::i;:::-;;:::i;46598:224::-;;;;;;:::i;:::-;;:::i;58448:191::-;;;;;;:::i;:::-;;:::i;42402:248::-;;;;;;:::i;:::-;;:::i;15661:206::-;;;;;;:::i;:::-;;:::i;38152:183::-;;;;;;:::i;:::-;;:::i;38847:186::-;;;;;;:::i;:::-;38946:13;38984:41;;;:29;:41;;;;;;;38847:186;33499:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43604:607;;;;;;:::i;:::-;;:::i;55383:1341::-;;;;;;:::i;:::-;;:::i;39041:186::-;;;;;;:::i;:::-;;:::i;48852:1216::-;;;;;;:::i;:::-;48960:21;49390:36;;;:24;:36;;;;;;;;;49458:29;:41;;;;;;49524:8;:20;;;;;;;;:32;;;;49584:35;;;;49639:27;;;;49696:37;;;;49759:33;;;;49822:37;;;;49889;;;;50022:38;;;;;-1:-1:-1;;;;;49390:36:0;;;;49458:41;;49524:32;;49584:35;;49639:27;;;;;;;;;49696:37;;;;49759:33;;;;49822:37;;;49889;;;;-1:-1:-1;;;49955:36:0;;;;48852:1216;;;;;-1:-1:-1;;;;;10932:15:1;;;10914:34;;10979:2;10964:18;;10957:34;;;;11007:18;;11000:34;;;;11065:2;11050:18;;11043:34;;;;11121:14;;11114:22;11108:3;11093:19;;11086:51;11174:15;;;11168:3;11153:19;;11146:44;11227:15;;11221:3;11206:19;;11199:44;11280:15;;11274:3;11259:19;;11252:44;11333:15;;;11327:3;11312:19;;11305:44;11393:14;;11386:22;11380:3;11365:19;;11358:51;11440:3;11425:19;;11418:36;;;;10840:3;10825:19;48852:1216:0;10437:1023:1;51417:196:0;;;;;;:::i;:::-;;:::i;48213:631::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;47748:238::-;;;;;;:::i;:::-;;:::i;18345:104::-;;;:::i;40951:227::-;;;;;;:::i;:::-;;:::i;37674:347::-;;;;;;:::i;:::-;;:::i;39649:196::-;;;;;;:::i;:::-;;:::i;20080:302::-;;;;;;:::i;:::-;;:::i;42921:217::-;;;;;;:::i;:::-;;:::i;33139:59::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;33139:59:0;;;42155:239;;;;;;:::i;:::-;;:::i;44624:368::-;;;;;;:::i;:::-;;:::i;45000:389::-;;;;;;:::i;:::-;;:::i;53688:725::-;;;;;;:::i;:::-;;:::i;41430:249::-;;;;;;:::i;:::-;;:::i;21231:321::-;;;;;;:::i;:::-;;:::i;59076:324::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58647:421::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;54421:464::-;;;;;;:::i;:::-;;:::i;38463:116::-;;;;;;:::i;:::-;;:::i;53502:178::-;;;;;;:::i;:::-;;:::i;42658:255::-;;;;;;:::i;:::-;;:::i;17498:104::-;;;:::i;45885:253::-;;;;;;:::i;:::-;;:::i;56732:1670::-;;;;;;:::i;:::-;;:::i;39235:176::-;;;;;;:::i;:::-;;:::i;45397:480::-;;;;;;:::i;:::-;;:::i;17375:115::-;;;;;;:::i;:::-;17431:4;17455:20;;;:11;:20;;;;;:27;-1:-1:-1;;;17455:27:0;;;;;17375:115;44219:397;;;;;;:::i;:::-;;:::i;33559:32::-;;;;;;60073:216;;;;;;:::i;:::-;;:::i;33205:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;59888:151;;;;;;:::i;:::-;;:::i;36182:925::-;;;;;;:::i;:::-;;:::i;33418:20::-;;;;;-1:-1:-1;;;;;33418:20:0;;;35200:609;35339:4;-1:-1:-1;;;;;;35381:40:0;;-1:-1:-1;;;35381:40:0;;:95;;;35438:38;35464:11;35438:25;:38::i;:::-;35381:160;;;-1:-1:-1;;;;;;;35493:48:0;;-1:-1:-1;;;35493:48:0;35381:160;:227;;;-1:-1:-1;;;;;;;35558:50:0;;-1:-1:-1;;;35558:50:0;35381:227;:294;;;-1:-1:-1;;;;;;;35625:50:0;;-1:-1:-1;;;35625:50:0;35381:294;:357;;;-1:-1:-1;;;;;;;35692:46:0;;-1:-1:-1;;;35692:46:0;35381:357;:420;;;-1:-1:-1;;;;;;;35755:46:0;;-1:-1:-1;;;35755:46:0;35381:420;35361:440;35200:609;-1:-1:-1;;35200:609:0:o;18176:100::-;18230:13;18263:5;18256:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18176:100;:::o;19763:245::-;19867:7;19897:16;19905:7;19897;:16::i;:::-;19892:64;;19922:34;;-1:-1:-1;;;19922:34:0;;;;;;;;;;;19892:64;-1:-1:-1;19976:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;19976:24:0;;19763:245::o;19339:358::-;19412:13;19428:24;19444:7;19428:15;:24::i;:::-;19412:40;;19473:5;-1:-1:-1;;;;;19467:11:0;:2;-1:-1:-1;;;;;19467:11:0;;19463:48;;;19487:24;;-1:-1:-1;;;19487:24:0;;;;;;;;;;;19463:48;175:10;-1:-1:-1;;;;;19528:21:0;;;;;;:63;;-1:-1:-1;19554:37:0;19571:5;175:10;60073:216;:::i;19554:37::-;19553:38;19528:63;19524:124;;;19613:35;;-1:-1:-1;;;19613:35:0;;;;;;;;;;;19524:124;19661:28;19670:2;19674:7;19683:5;19661:8;:28::i;:::-;19401:296;19339:358;;:::o;38587:120::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;;;;;;;;;-1:-1:-1;;;;;38663:29:0::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;38663:36:0::1;38695:4;38663:36;::::0;;38587:120::o;41186:236::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;41346:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;41374:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:40;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;;34255:1:::1;41186:236:::0;;;:::o;59408:235::-;59496:17;;59459:20;;-1:-1:-1;;;;;59496:17:0;:33;59492:123;;59552:16;;;59566:1;59552:16;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59552:16:0;59546:22;;59592:11;;59583:3;59587:1;59583:6;;;;;;;;:::i;:::-;;;;;;:20;;;;;59492:123;59408:235;;;:::o;52816:678::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;52979:12;53031:10;53067:17;53059:69:::1;;;::::0;-1:-1:-1;;;53059:69:0;;17974:2:1;53059:69:0::1;::::0;::::1;17956:21:1::0;18013:2;17993:18;;;17986:30;18052:34;18032:18;;;18025:62;-1:-1:-1;;;18103:18:1;;;18096:37;18150:19;;53059:69:0::1;17772:403:1::0;53059:69:0::1;53178:11;53161:13;:28;53139:120;;;::::0;-1:-1:-1;;;53139:120:0;;18382:2:1;53139:120:0::1;::::0;::::1;18364:21:1::0;18421:2;18401:18;;;18394:30;18460:34;18440:18;;;18433:62;-1:-1:-1;;;18511:18:1;;;18504:40;18561:19;;53139:120:0::1;18180:406:1::0;53139:120:0::1;53277:9;53272:215;53292:13;53288:1;:17;53272:215;;;53327:18;53348:12;;53361:1;53348:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;53327:36;;53378:16;53397:10;;53408:1;53397:13;;;;;;;:::i;:::-;;;;;;;53378:32;;53425:50;53442:10;53454;53466:8;53425:16;:50::i;:::-;53312:175;;53307:3;;;;;:::i;:::-;;;;53272:215;;;;52944:550;;52816:678:::0;;;;:::o;15044:122::-;15139:12;:19;15124:12;;15097:7;;15124:34;;;:::i;:::-;15117:41;;15044:122;:::o;39853:1090::-;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;40173:13:::1;::::0;40153:17:::1;40197:35:::0;;;:24:::1;:35;::::0;;;;;;;:52;;-1:-1:-1;;;;;;40197:52:0::1;-1:-1:-1::0;;;;;40197:52:0;::::1;;::::0;;40260:8:::1;:19:::0;;;;;:39;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;40310:19:0::1;::::0;;;:8:::1;:19;::::0;;;;;;;:36:::1;::::0;::::1;:56:::0;;-1:-1:-1;;;;;;40310:56:0::1;-1:-1:-1::0;;;;;40310:56:0;::::1;;::::0;;40377:35:::1;::::0;::::1;:54:::0;;-1:-1:-1;;;;40377:54:0::1;-1:-1:-1::0;;;40377:54:0;::::1;;;;::::0;;40442:37;;::::1;:58:::0;;;40511:29:::1;:40:::0;;;;:62;;;40584:19;:26:::1;::::0;::::1;:33:::0;;;-1:-1:-1;;40584:33:0;;::::1;;::::0;;40628:27:::1;::::0;::::1;:38:::0;;-1:-1:-1;;40628:38:0::1;::::0;::::1;;;::::0;;33007:9:::1;40677:34;::::0;;::::1;:48:::0;40628:38;40736:156:::1;;40802:5;40766:19:::0;;;:8:::1;:19;::::0;;;;:33:::1;;:41:::0;;-1:-1:-1;;40766:41:0::1;::::0;;40736:156:::1;;;40840:19;::::0;;;:8:::1;:19;::::0;;;;:33:::1;;:40:::0;;-1:-1:-1;;40840:40:0::1;40876:4;40840:40;::::0;;40736:156:::1;40918:13;::::0;:17:::1;::::0;40934:1:::1;40918:17;:::i;:::-;40902:13;:33:::0;-1:-1:-1;;;;;;;;39853:1090:0:o;54924:451::-;55018:7;55084:22;55109:29;:19;:8;:17;:19::i;:::-;:27;:29::i;:::-;55084:54;;55212:26;55241:84;:60;55274:1;55277:23;:8;:21;:23::i;:::-;55241:8;;:60;:32;:60::i;:84::-;55212:113;;55345:22;:12;:20;:22::i;:::-;55338:29;54924:451;-1:-1:-1;;;;54924:451:0:o;52045:168::-;52174:31;52184:5;52191:3;52196:8;52174:9;:31::i;43355:241::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;43519:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;43542:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:46;;::::2;::::0;:28:::2;::::0;;::::2;::::0;:46;::::2;::::0;::::2;:::i;33356:53::-:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47994:211::-;48095:28;48114:8;48095:18;:28::i;:::-;34794:10;34778:27;;;;:15;:27;;;;;;;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;48148:19:::1;:49;48168:28;48187:8;48168:18;:28::i;:::-;48148:49;;;;;;;;;;;;48141:56;;;;:::i;:::-;47994:211:::0;;:::o;59651:194::-;59788:17;;59816:11;;59746:7;;;;-1:-1:-1;;;;;59788:17:0;;;;59831:5;;59808:19;;:5;:19;:::i;:::-;59807:29;;;;:::i;:::-;59780:57;;;;59651:194;;;;;;:::o;51621:416::-;51817:12;51874:20;;;:8;:20;;;;;:35;;51857:52;;51727:28;;;;51817:12;;51857:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51941:20:0;;;;:8;:20;;;;;:39;;51920:60;;51857:52;;-1:-1:-1;51941:39:0;51920:60;;-1:-1:-1;51920:60:0;-1:-1:-1;51920:60:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52001:20:0;;;;-1:-1:-1;;52001:8:0;:20;;;;;;:28;;;51621:416;;52001:28;;;;;;;51621:416;-1:-1:-1;;51621:416:0:o;61539:242::-;61628:7;61664:16;61674:5;61664:9;:16::i;:::-;61656:5;:24;61648:80;;;;-1:-1:-1;;;61648:80:0;;20105:2:1;61648:80:0;;;20087:21:1;20144:2;20124:18;;;20117:30;20183:34;20163:18;;;20156:62;-1:-1:-1;;;20234:18:1;;;20227:41;20285:19;;61648:80:0;19903:407:1;61648:80:0;61746:20;61760:5;61746:13;:20::i;:::-;61767:5;61746:27;;;;;;;;:::i;:::-;;;;;;;61739:34;;61539:242;;;;:::o;38029:115::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;38108:12:::1;:28:::0;;-1:-1:-1;;;;;;38108:28:0::1;-1:-1:-1::0;;;;;38108:28:0;;;::::1;::::0;;;::::1;::::0;;38029:115::o;43146:201::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;43293:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:46;;::::1;::::0;:28:::1;::::0;;::::1;::::0;:46;::::1;::::0;::::1;:::i;:::-;;43146:201:::0;;;:::o;47183:557::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;47320:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;47370:20:::2;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;:37;47348:126:::2;;;::::0;-1:-1:-1;;;47348:126:0;;20857:2:1;47348:126:0::2;::::0;::::2;20839:21:1::0;20896:2;20876:18;;;20869:30;20935:34;20915:18;;;20908:62;-1:-1:-1;;;20986:18:1;;;20979:37;21033:19;;47348:126:0::2;20655:403:1::0;47348:126:0::2;47489:20;::::0;;;:8:::2;:20;::::0;;;;:28:::2;;::::0;::::2;;47485:177;;;47571:5;47534:20:::0;;;:8:::2;:20;::::0;;;;:34:::2;;:42:::0;;-1:-1:-1;;47534:42:0::2;::::0;;47485:177:::2;;;47609:20;::::0;;;:8:::2;:20;::::0;;;;:34:::2;;:41:::0;;-1:-1:-1;;47609:41:0::2;47646:4;47609:41;::::0;;47485:177:::2;-1:-1:-1::0;;47704:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:28:::2;;::::0;;-1:-1:-1;;47672:60:0;::::2;47704:28;::::0;;::::2;47703:29;47672:60;::::0;;47183:557::o;46392:198::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;46533:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:49;;::::1;::::0;:35:::1;::::0;;::::1;::::0;:49;::::1;::::0;::::1;:::i;38715:124::-:0;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;-1:-1:-1;;;;;38794:29:0::1;38826:5;38794:29:::0;;;:19:::1;:29;::::0;;;;:37;;-1:-1:-1;;38794:37:0::1;::::0;;38715:124::o;46146:238::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;46307:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;46335:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:41;;::::2;::::0;:29:::2;::::0;;::::2;::::0;:41;::::2;::::0;::::2;:::i;20975:185::-:0;21113:39;21130:4;21136:2;21140:7;21113:39;;;;;;;;;;;;:16;:39::i;38343:112::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;-1:-1:-1;;;;;38415:25:0::1;;::::0;;;:15:::1;:25;::::0;;;;:32;;-1:-1:-1;;38415:32:0::1;38443:4;38415:32;::::0;;38343:112::o;50777:632::-;50886:24;50925:19;50959:18;50992:22;51029:11;51055;51107:8;:20;51116:10;51107:20;;;;;;;;;;;:31;;51094:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51163:20:0;;;;:8;:20;;;;;:32;;;;51222:34;;;;51278:29;;;;51267:40;;51094:44;;-1:-1:-1;51163:32:0;;-1:-1:-1;51222:34:0;;;;;-1:-1:-1;51278:29:0;51267:40;;-1:-1:-1;51267:40:0;-1:-1:-1;51267:40:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51327:20:0;;;;-1:-1:-1;;51327:8:0;:20;;;;;;:27;;;50777:632;;;;;;51267:40;;51327:27;;;;;;;51374;;;;;-1:-1:-1;50777:632:0;-1:-1:-1;;50777:632:0:o;60582:949::-;60874:14;;60649:7;;;;60857:608;60894:13;;60890:1;:17;60857:608;;;60933:30;60966:22;60986:1;60966:19;:22::i;:::-;60933:55;;61014:10;61009:441;61031:13;:20;61026:2;:25;61009:441;;;61082:15;61100:13;61114:2;61100:17;;;;;;;;:::i;:::-;;;;;;;;;;;;61142:31;61176:20;;;:11;:20;;;;;;;61142:54;;;;;;;;;-1:-1:-1;;;;;61142:54:0;;;;-1:-1:-1;;;61142:54:0;;-1:-1:-1;;;;;61142:54:0;;;;;;;;-1:-1:-1;;;61142:54:0;;;;;;;;;;;;;61100:17;;-1:-1:-1;61219:212:0;;61288:5;61273:11;:20;61269:99;;;-1:-1:-1;61333:7:0;60582:949;-1:-1:-1;;;;;;60582:949:0:o;61269:99::-;61394:13;;;;;61219:212;-1:-1:-1;;61053:4:0;;61009:441;;;-1:-1:-1;;60909:3:0;;60857:608;;;;61495:28;;-1:-1:-1;;;61495:28:0;;;;;;;;;;;46830:345;34794:10;34778:27;;;;:15;:27;;;;;;46940:10;;34778:27;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;46991:20:::1;::::0;;;:8:::1;:20;::::0;;;;:28:::1;;::::0;::::1;;46990:29;46968:128;;;::::0;-1:-1:-1;;;46968:128:0;;21265:2:1;46968:128:0::1;::::0;::::1;21247:21:1::0;21304:2;21284:18;;;21277:30;21343:34;21323:18;;;21316:62;-1:-1:-1;;;21394:18:1;;;21387:47;21451:19;;46968:128:0::1;21063:413:1::0;46968:128:0::1;-1:-1:-1::0;47139:20:0::1;::::0;;;:8:::1;:20;::::0;;;;:28:::1;;::::0;;-1:-1:-1;;47107:60:0;::::1;47139:28;::::0;;;::::1;;;47138:29;47107:60:::0;;::::1;;::::0;;46830:345::o;17170:124::-;17234:7;17261:20;17273:7;17261:11;:20::i;:::-;:25;;17170:124;-1:-1:-1;;17170:124:0:o;41687:460::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34628:10:::1;34612:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;34604:58;;;::::0;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0::1;::::0;::::1;19177:21:1::0;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0::1;18993:342:1::0;34604:58:0::1;-1:-1:-1::0;41939:20:0::2;::::0;;;:8:::2;:20;::::0;;;;;;;:37:::2;::::0;::::2;:64:::0;;-1:-1:-1;;;;;41939:64:0;;::::2;-1:-1:-1::0;;;;;;41939:64:0;;::::2;::::0;;;::::2;::::0;;;42014:36:::2;::::0;::::2;:55:::0;;;::::2;;-1:-1:-1::0;;;42014:55:0::2;-1:-1:-1::0;;;;42014:55:0;;::::2;::::0;;;::::2;::::0;;;42080:38;::::2;:59:::0;41687:460::o;50076:693::-;50173:16;50207:19;50237:21;50269:26;50298:36;50323:10;50298:24;:36::i;:::-;50269:65;;50345:31;50393:18;-1:-1:-1;;;;;50379:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50379:33:0;-1:-1:-1;50453:12:0;:19;50345:67;;-1:-1:-1;50425:25:0;50483:247;50503:17;50499:1;:21;50483:247;;;50558:12;50571:1;50558:15;;;;;;;;:::i;:::-;;;;;;;;;50542:31;;50629:10;50592:33;50611:13;50592:18;:33::i;:::-;:47;50588:131;;;50690:13;50660:14;50675:11;50660:27;;;;;;;;:::i;:::-;;;;;;:43;;;;;50588:131;50522:3;;;;:::i;:::-;;;;50483:247;;;-1:-1:-1;50747:14:0;;50076:693;-1:-1:-1;;;;;;50076:693:0:o;39419:222::-;34794:10;34778:27;;;;:15;:27;;;;;;39557:10;;34778:27;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;-1:-1:-1;39580:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;:53;;-1:-1:-1;;;;;;39580:53:0::1;-1:-1:-1::0;;;;;39580:53:0;;::::1;::::0;;;::::1;::::0;;39419:222::o;46598:224::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;46753:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:61;;::::1;::::0;:39:::1;::::0;;::::1;::::0;:61;::::1;::::0;::::1;:::i;58448:191::-:0;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;58574:17:::1;:29:::0;;-1:-1:-1;;;;;;58574:29:0::1;-1:-1:-1::0;;;;;58574:29:0;;;::::1;::::0;;;::::1;::::0;;;58614:11:::1;:17:::0;58448:191::o;42402:248::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34628:10:::1;34612:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;34604:58;;;::::0;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0::1;::::0;::::1;19177:21:1::0;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0::1;18993:342:1::0;34604:58:0::1;-1:-1:-1::0;42578:20:0::2;::::0;;;:8:::2;:20;::::0;;;;;:37:::2;;:64:::0;;-1:-1:-1;;;;;;42578:64:0::2;-1:-1:-1::0;;;;;42578:64:0;;::::2;::::0;;;::::2;::::0;;42402:248::o;15661:206::-;15725:7;-1:-1:-1;;;;;15749:19:0;;15745:60;;15777:28;;-1:-1:-1;;;15777:28:0;;;;;;;;;;;15745:60;-1:-1:-1;;;;;;15831:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;15831:27:0;;15661:206::o;38152:183::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;38265:2:::1;38245:16;:22;;38237:45;;;::::0;-1:-1:-1;;;38237:45:0;;21683:2:1;38237:45:0::1;::::0;::::1;21665:21:1::0;21722:2;21702:18;;;21695:30;-1:-1:-1;;;21741:18:1;;;21734:40;21791:18;;38237:45:0::1;21481:334:1::0;38237:45:0::1;38293:15;:34:::0;38152:183::o;43604:607::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;43776:20:::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;;;::::1;;;43775:28;::::0;:102:::1;;-1:-1:-1::0;43842:20:0::1;::::0;;;:8:::1;:20;::::0;;;;:35:::1;;::::0;43824:53;::::1;43775:102;43752:170;;;;-1:-1:-1::0;;;43752:170:0::1;;;;;;;:::i;:::-;43973:20;::::0;;;:8:::1;:20;::::0;;;;:32:::1;;::::0;43955:50;::::1;43933:131;;;::::0;-1:-1:-1;;;43933:131:0;;22022:2:1;43933:131:0::1;::::0;::::1;22004:21:1::0;22061:2;22041:18;;;22034:30;22100:33;22080:18;;;22073:61;22151:18;;43933:131:0::1;21820:355:1::0;43933:131:0::1;33007:9;44083:15;:30;;44075:64;;;::::0;-1:-1:-1;;;44075:64:0;;22382:2:1;44075:64:0::1;::::0;::::1;22364:21:1::0;22421:2;22401:18;;;22394:30;22460:23;22440:18;;;22433:51;22501:18;;44075:64:0::1;22180:345:1::0;44075:64:0::1;-1:-1:-1::0;44150:20:0::1;::::0;;;:8:::1;:20;::::0;;;;;:35:::1;;:53:::0;43604:607::o;55383:1341::-;55469:16;55503:20;55526:16;55536:5;55526:9;:16::i;:::-;55503:39;;55553:18;55582:25;55620:30;55667:12;-1:-1:-1;;;;;55653:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55653:27:0;-1:-1:-1;55856:14:0;;55620:60;;-1:-1:-1;55839:819:0;55876:13;;55872:1;:17;55839:819;;;55915:30;55948:22;55968:1;55948:19;:22::i;:::-;55915:55;;55996:10;55991:652;56013:13;:20;56008:2;:25;55991:652;;;56064:15;56082:13;56096:2;56082:17;;;;;;;;:::i;:::-;;;;;;;;;;;;56124:31;56158:20;;;:11;:20;;;;;;;56124:54;;;;;;;;;-1:-1:-1;;;;;56124:54:0;;;;;-1:-1:-1;;;56124:54:0;;-1:-1:-1;;;;;56124:54:0;;;;;;;;-1:-1:-1;;;56124:54:0;;;;;;;;;;;;;56082:17;;-1:-1:-1;56124:54:0;56205:28;56201:119;;56282:14;;;-1:-1:-1;56201:119:0;56367:5;-1:-1:-1;;;;;56346:26:0;:17;-1:-1:-1;;;;;56346:26:0;;56342:157;;;56429:7;56401:13;56415:10;56401:25;;;;;;;;:::i;:::-;;;;;;;;;;:35;56463:12;;;;;56342:157;56539:12;56525:10;:26;56521:103;;;-1:-1:-1;56587:13:0;;55383:1341;-1:-1:-1;;;;;;;;;55383:1341:0:o;56521:103::-;-1:-1:-1;;56035:4:0;;55991:652;;;-1:-1:-1;;55891:3:0;;55839:819;;39041:186;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;34196:20:::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;:20;;:27;;::::1;;;34195:28;34187:57;;;;-1:-1:-1::0;;;34187:57:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;39185:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:27:::2;;:34:::0;;-1:-1:-1;;39185:34:0::2;::::0;::::2;::::0;;39041:186::o;51417:196::-;51569:20;;;;:8;:20;;;;;;;;:36;;;:28;;:36;;;;;51562:43;;51531:13;;51569:36;51562:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51417:196;;;;:::o;48213:631::-;48319:25;48359:20;48394:25;48434:21;48470;48506:12;48560:8;:20;48569:10;48560:20;;;;;;;;;;;:25;;48546:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48605:20:0;;;;:8;:20;;;;;:27;;48596:36;;48546:39;;-1:-1:-1;48605:27:0;48596:36;;-1:-1:-1;48596:36:0;-1:-1:-1;48596:36:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48657:20:0;;;;:8;:20;;;;;:32;;48643:46;;48596:36;;-1:-1:-1;48657:32:0;48643:46;;-1:-1:-1;48643:46:0;-1:-1:-1;48643:46:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48710:20:0;;;;:8;:20;;;;;:28;;48700:38;;48643:46;;-1:-1:-1;48710:28:0;48700:38;;-1:-1:-1;48700:38:0;-1:-1:-1;48700:38:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48759:20:0;;;;:8;:20;;;;;:28;;48749:38;;48700;;-1:-1:-1;48759:28:0;48749:38;;-1:-1:-1;48749:38:0;-1:-1:-1;48749:38:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48808:20:0;;;;-1:-1:-1;;48808:8:0;:20;;;;;;:28;;;48213:631;;;;;;;;48808:28;;;;;48213:631;-1:-1:-1;;48213:631:0:o;47748:238::-;47896:28;47915:8;47896:18;:28::i;:::-;34794:10;34778:27;;;;:15;:27;;;;;;;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;47937:29:::1;::::0;;;:19:::1;:29;::::0;;;;;;;:41;;::::1;::::0;;::::1;::::0;::::1;:::i;18345:104::-:0;18401:13;18434:7;18427:14;;;;;:::i;40951:227::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;-1:-1:-1;41107:41:0::1;::::0;;;:29:::1;:41;::::0;;;;;:63;40951:227::o;37674:347::-;37839:10;37763:16;37819:31;;;:19;:31;;;;;;;;37797:116;;;;-1:-1:-1;;;37797:116:0;;22732:2:1;37797:116:0;;;22714:21:1;22771:2;22751:18;;;22744:30;22810:34;22790:18;;;22783:62;-1:-1:-1;;;22861:18:1;;;22854:33;22904:19;;37797:116:0;22530:399:1;37797:116:0;37924:14;37930:7;37924:5;:14::i;:::-;37954:34;;37980:7;;-1:-1:-1;;;;;37954:34:0;;;;;;;;-1:-1:-1;38006:7:0;37674:347;-1:-1:-1;37674:347:0:o;39649:196::-;34794:10;34778:27;;;;:15;:27;;;;;;39751:10;;34778:27;;;:98;;-1:-1:-1;34840:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;34840:36:0;34826:10;:50;34778:98;34756:176;;;;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0;;;17467:21:1;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0;17283:352:1;34756:176:0;-1:-1:-1;39810:20:0::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;;-1:-1:-1;;39779:58:0;::::1;39810:27:::0;;;;::::1;;;39809:28;39779:58:::0;;::::1;;::::0;;39649:196::o;20080:302::-;-1:-1:-1;;;;;20194:24:0;;175:10;20194:24;20190:54;;;20227:17;;-1:-1:-1;;;20227:17:0;;;;;;;;;;;20190:54;175:10;20257:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;20257:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;20257:53:0;;;;;;;;;;20326:48;;540:41:1;;;20257:42:0;;175:10;20326:48;;513:18:1;20326:48:0;;;;;;;20080:302;;:::o;42921:217::-;34359:36;;;;:24;:36;;;;;;;;-1:-1:-1;;;;;34359:36:0;34345:10;:50;34323:111;;;;-1:-1:-1;;;34323:111:0;;20517:2:1;34323:111:0;;;20499:21:1;20556:2;20536:18;;;20529:30;-1:-1:-1;;;20575:18:1;;;20568:41;20626:18;;34323:111:0;20315:335:1;34323:111:0;43076:20:::1;::::0;;;:8:::1;:20;::::0;;;;;;;:54;;::::1;::::0;:32:::1;::::0;;::::1;::::0;:54;::::1;::::0;::::1;:::i;42155:239::-:0;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34628:10:::1;34612:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;34604:58;;;::::0;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0::1;::::0;::::1;19177:21:1::0;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0::1;18993:342:1::0;34604:58:0::1;-1:-1:-1::0;42330:20:0::2;::::0;;;:8:::2;:20;::::0;;;;;:33:::2;;:56:::0;;-1:-1:-1;;;;;;42330:56:0::2;-1:-1:-1::0;;;;;42330:56:0;;::::2;::::0;;;::::2;::::0;;42155:239::o;44624:368::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;44778:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;44806:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;44849:32:::2;::::0;::::2;::::0;44806:86;;:28:::2;;:86:::0;;;;;:96;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;44948:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;:36:::2;::::0;44983:1:::2;44948:36;:::i;:::-;44913:20;::::0;;;:8:::2;:20;::::0;;;;;:32:::2;;:71:::0;;;;-1:-1:-1;;;44624:368:0:o;45000:389::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;45183:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;45240:20:::2;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;45228:44;::::2;45206:115;;;::::0;-1:-1:-1;;;45206:115:0;;23136:2:1;45206:115:0::2;::::0;::::2;23118:21:1::0;23175:2;23155:18;;;23148:30;23214:23;23194:18;;;23187:51;23255:18;;45206:115:0::2;22934:345:1::0;45206:115:0::2;45332:20;::::0;;;:8:::2;:20;::::0;;;;;;;:39;;;:28:::2;;:39:::0;;;;;:49;;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;;34255:1:::1;45000:389:::0;;;;:::o;53688:725::-;53819:11;53893:20;;;:8;:20;;;;;:32;;;53785:16;;53819:11;;;;53965:36;53902:10;53965:24;:36::i;:::-;53936:65;-1:-1:-1;54012:30:0;54073:36;53936:65;54073:15;:36;:::i;:::-;-1:-1:-1;;;;;54045:75:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54045:75:0;;54012:108;;54138:9;54133:242;54153:15;54149:1;:19;54133:242;;;54229:1;54201:24;33007:9;54201:10;:24;:::i;:::-;54200:30;;;;:::i;:::-;17431:4;17455:20;;;:11;:20;;;;;:27;54190:40;;-1:-1:-1;;;;17455:27:0;;;;54245:119;;54317:7;54296:13;54310:3;54296:18;;;;;;;;:::i;:::-;;;;;;;;;;:28;54343:5;;;;:::i;:::-;;;;54245:119;54170:3;;;;:::i;:::-;;;;54133:242;;;-1:-1:-1;54392:13:0;53688:725;-1:-1:-1;;;;;;53688:725:0:o;41430:249::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;41600:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;41623:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:48;;::::2;::::0;:27:::2;::::0;;::::2;::::0;:48;::::2;::::0;::::2;:::i;21231:321::-:0;21390:28;21400:4;21406:2;21410:7;21390:9;:28::i;:::-;21434:48;21457:4;21463:2;21467:7;21476:5;21434:22;:48::i;:::-;21429:115;;21504:40;;-1:-1:-1;;;21504:40:0;;;;;;;;;;;59076:324;59218:17;;59161:35;;-1:-1:-1;;;;;59218:17:0;:33;59214:151;;59281:24;;;59303:1;59281:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59336:17:0;;59320:13;;;;-1:-1:-1;;;;;;59336:17:0;;59320:13;;-1:-1:-1;59336:17:0;;59320:13;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;59320:33:0;;;-1:-1:-1;;;;;59320:33:0;;;;;59076:324;;;:::o;58647:421::-;58807:17;;58728:35;;;;-1:-1:-1;;;;;58807:17:0;:33;58803:223;;58870:24;;;58892:1;58870:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58925:17:0;;58909:13;;;;-1:-1:-1;;;;;;58925:17:0;;58909:13;;-1:-1:-1;58925:17:0;;58909:13;;;;:::i;:::-;-1:-1:-1;;;;;58909:33:0;;;;:13;;;;;;;;;;:33;58963:16;;;58977:1;58963:16;;;;;;;;;;;;;;58909:13;58963:16;;;;;-1:-1:-1;58963:16:0;58957:22;;59003:11;;58994:3;58998:1;58994:6;;;;;;;;:::i;:::-;;;;;;:20;;;;;58803:223;58647:421;;;:::o;54421:464::-;54626:12;:19;54523:7;;;;;;;54656:199;54676:17;54672:1;:21;54656:199;;;54725:12;54738:1;54725:15;;;;;;;;:::i;:::-;;;;;;;;;54715:25;;54790:10;54759:27;54778:7;54759:18;:27::i;:::-;:41;54755:89;;;54821:7;;;;:::i;:::-;;;;54755:89;54695:3;;;;:::i;:::-;;;;54656:199;;;-1:-1:-1;54872:5:0;;54421:464;-1:-1:-1;;;;54421:464:0:o;38463:116::-;34516:5;;-1:-1:-1;;;;;34516:5:0;34502:10;:19;34494:42;;;;-1:-1:-1;;;34494:42:0;;16801:2:1;34494:42:0;;;16783:21:1;16840:2;16820:18;;;16813:30;-1:-1:-1;;;16859:18:1;;;16852:40;16909:18;;34494:42:0;16599:334:1;34494:42:0;-1:-1:-1;;;;;38538:25:0::1;38566:5;38538:25:::0;;;:15:::1;:25;::::0;;;;:33;;-1:-1:-1;;38538:33:0::1;::::0;;38463:116::o;53502:178::-;53600:16;53641:31;53661:10;53641:19;:31::i;42658:255::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34628:10:::1;34612:27;::::0;;;:15:::1;:27;::::0;;;;;::::1;;34604:58;;;::::0;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0::1;::::0;::::1;19177:21:1::0;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0::1;18993:342:1::0;34604:58:0::1;-1:-1:-1::0;42841:20:0::2;::::0;;;:8:::2;:20;::::0;;;;;:37:::2;;:64:::0;;-1:-1:-1;;;;;;42841:64:0::2;-1:-1:-1::0;;;;;42841:64:0;;::::2;::::0;;;::::2;::::0;;42658:255::o;17498:104::-;17546:16;17582:12;17575:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17498:104;:::o;45885:253::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;46055:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;46078:20:::2;::::0;;;:8:::2;:20;::::0;;;;;;;:52;;::::2;::::0;:31:::2;::::0;;::::2;::::0;:52;::::2;::::0;::::2;:::i;56732:1670::-:0;56870:13;56842:8;34065:17;34073:8;34065:7;:17::i;:::-;34057:49;;;;-1:-1:-1;;;34057:49:0;;23486:2:1;34057:49:0;;;23468:21:1;23525:2;23505:18;;;23498:30;23564:21;23544:18;;;23537:49;23603:18;;34057:49:0;23284:343:1;34057:49:0;57062:1:::1;56982:8;57062:1:::0;56991:28:::1;57010:8:::0;56991:18:::1;:28::i;:::-;56982:38:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;56982:38:0;:55:::1;;::::0;-1:-1:-1;;;;;56982:55:0::1;:82;56964:473;;57091:27;57153:8;:38;57162:28;57181:8;57162:18;:28::i;:::-;57153:38:::0;;::::1;::::0;::::1;::::0;;;;;;;;-1:-1:-1;57153:38:0;;;:55:::1;;::::0;57323:32;;-1:-1:-1;;;57323:32:0;;::::1;::::0;::::1;6061:25:1::0;;;-1:-1:-1;;;;;57153:55:0;;::::1;::::0;-1:-1:-1;;57153:55:0;;57323:22:::1;::::0;6034:18:1;;57323:32:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;57323:32:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;57373:18:::0;;57302:53;;-1:-1:-1;57373:22:0;57370:55:::1;;57421:4:::0;-1:-1:-1;57414:11:0::1;::::0;-1:-1:-1;57414:11:0::1;57370:55;57076:361;;56964:473;57554:1;57514:29:::0;;;:19:::1;:29;::::0;;;;57508:43;;::::1;::::0;::::1;:::i;:::-;;;:47;57504:248;;;57710:29;::::0;;;:19:::1;:29;::::0;;;;57596:144;;::::1;::::0;57710:29;57596:144:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:38;57605:28;57624:8;57605:18;:28::i;:::-;57596:38;;;;;;;;;;;:79;;:113;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:144;;;;:::i;:::-;57572:168;;;;57504:248;57862:8;:38;57871:28;57890:8;57871:18;:28::i;:::-;57862:38:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57862:38:0;:46:::1;;::::0;::::1;;57861:47;:110:::0;::::1;;;;57925:8;:38;57934:28;57953:8;57934:18;:28::i;:::-;57925:38:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57925:38:0;:46:::1;;::::0;::::1;::::0;::::1;;;57861:110;57843:401;;;58022:210;58162:8;:38;58171:28;58190:8;58171:18;:28::i;:::-;58162:38;;;;;;;;;;;:47;;58022:210;;;;;:::i;57843:401::-;58276:118;58360:19;:8;:17;:19::i;:::-;58276:8;:38;58285:28;58304:8;58285:18;:28::i;:::-;58276:38;;;;;;;;;;;:53;;:65;;;;;:::i;:118::-;58256:138;;34117:1;56732:1670:::0;;;;:::o;39235:176::-;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;39376:20:::1;::::0;;;:8:::1;:20;::::0;;;;:27:::1;;::::0;;-1:-1:-1;;39345:58:0;::::1;39376:27:::0;;;;::::1;;;39375:28;39345:58:::0;;::::1;;::::0;;39235:176::o;45397:480::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;45535:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;45620:1:::2;45585:20:::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;45563:116:::2;;;::::0;-1:-1:-1;;;45563:116:0;;24475:2:1;45563:116:0::2;::::0;::::2;24457:21:1::0;24514:2;24494:18;;;24487:30;24553:32;24533:18;;;24526:60;24603:18;;45563:116:0::2;24273:354:1::0;45563:116:0::2;45697:20;::::0;;;:8:::2;:20;::::0;;;;45740:32:::2;::::0;::::2;::::0;45697:28:::2;::::0;;::::2;::::0;:20;45740:36:::2;::::0;45775:1:::2;::::0;45740:36:::2;:::i;:::-;45697:90;;;;;;;;;;;;45690:97;;;;:::i;:::-;45833:20;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;:36:::2;::::0;45868:1:::2;45833:36;:::i;:::-;45798:20;::::0;;;:8:::2;:20;::::0;;;;;:32:::2;;:71:::0;;;;-1:-1:-1;;45397:480:0:o;44219:397::-;34196:20;;;;:8;:20;;;;;:27;;;:20;;:27;;;;;34195:28;34187:57;;;;-1:-1:-1;;;34187:57:0;;;;;;;:::i;:::-;34794:10:::1;34778:27;::::0;;;:15:::1;:27;::::0;;;;;44360:10;;34778:27:::1;;::::0;:98:::1;;-1:-1:-1::0;34840:36:0::1;::::0;;;:24:::1;:36;::::0;;;;;-1:-1:-1;;;;;34840:36:0::1;34826:10;:50;34778:98;34756:176;;;::::0;-1:-1:-1;;;34756:176:0;;17485:2:1;34756:176:0::1;::::0;::::1;17467:21:1::0;17524:2;17504:18;;;17497:30;-1:-1:-1;;;;;;;;;;;17543:18:1;;;17536:58;17611:18;;34756:176:0::1;17283:352:1::0;34756:176:0::1;44410:20:::2;::::0;;;:8:::2;:20;::::0;;;;:32:::2;;::::0;:37;44388:123:::2;;;::::0;-1:-1:-1;;;44388:123:0;;24834:2:1;44388:123:0::2;::::0;::::2;24816:21:1::0;24873:2;24853:18;;;24846:30;24912:34;24892:18;;;24885:62;-1:-1:-1;;;24963:18:1;;;24956:34;25007:19;;44388:123:0::2;24632:400:1::0;44388:123:0::2;-1:-1:-1::0;;44560:20:0::2;::::0;;;:8:::2;:20;::::0;;;;:48:::2;;::::0;;-1:-1:-1;;44522:86:0;::::2;44560:48;::::0;;::::2;44559:49;44522:86;::::0;;44219:397::o;60073:216::-;-1:-1:-1;;;;;60183:26:0;;60164:4;60183:26;;;:15;:26;;;;;;;;60180:42;;;-1:-1:-1;60218:4:0;60211:11;;60180:42;-1:-1:-1;;;;;20624:25:0;;;20595:4;20624:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;60240:41;60233:48;60073:216;-1:-1:-1;;;60073:216:0:o;59888:151::-;34628:10;34612:27;;;;:15;:27;;;;;;;;34604:58;;;;-1:-1:-1;;;34604:58:0;;19195:2:1;34604:58:0;;;19177:21:1;19234:2;19214:18;;;19207:30;-1:-1:-1;;;19253:18:1;;;19246:48;19311:18;;34604:58:0;18993:342:1;34604:58:0;-1:-1:-1;;;;;60002:29:0::1;;::::0;;;:15:::1;:29;::::0;;;;;;-1:-1:-1;;59969:62:0;::::1;60002:29;::::0;;::::1;60001:30;59969:62;::::0;;59888:151::o;36182:925::-;36392:10;36321:16;36372:31;;;:19;:31;;;;;;;;36350:116;;;;-1:-1:-1;;;36350:116:0;;25239:2:1;36350:116:0;;;25221:21:1;25278:2;25258:18;;;25251:30;25317:34;25297:18;;;25290:62;-1:-1:-1;;;25368:18:1;;;25361:33;25411:19;;36350:116:0;25037:399:1;36350:116:0;36563:20;;;;:8;:20;;;;;:35;;;;36499:32;;;;;:43;;36534:8;;36499:43;:::i;:::-;:99;;36477:172;;;;-1:-1:-1;;;36477:172:0;;25643:2:1;36477:172:0;;;25625:21:1;25682:2;25662:18;;;25655:30;25721:25;25701:18;;;25694:53;25764:18;;36477:172:0;25441:347:1;36477:172:0;36682:20;;;;:8;:20;;;;;:27;;;;;;;;;:91;;-1:-1:-1;36737:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;36730:43:0;;;36737:36;;36730:43;36682:91;36660:170;;;;-1:-1:-1;;;36660:170:0;;25995:2:1;36660:170:0;;;25977:21:1;26034:2;26014:18;;;26007:30;26073:31;26053:18;;;26046:59;26122:18;;36660:170:0;25793:353:1;36660:170:0;36864:20;;;;:8;:20;;;;;:27;;;;;;;;36863:28;;:92;;-1:-1:-1;36919:36:0;;;;:24;:36;;;;;;-1:-1:-1;;;;;36912:43:0;;;36919:36;;36912:43;36863:92;36841:162;;;;-1:-1:-1;;;36841:162:0;;26353:2:1;36841:162:0;;;26335:21:1;26392:2;26372:18;;;26365:30;26431:22;26411:18;;;26404:50;26471:18;;36841:162:0;26151:344:1;36841:162:0;37016:15;37034:38;37046:3;37051:10;37063:8;37034:11;:38::i;:::-;37016:56;36182:925;-1:-1:-1;;;;;;36182:925:0:o;15238:359::-;15385:4;-1:-1:-1;;;;;;15427:40:0;;-1:-1:-1;;;15427:40:0;;:105;;-1:-1:-1;;;;;;;15484:48:0;;-1:-1:-1;;;15484:48:0;15427:105;:162;;;-1:-1:-1;;;;;;;15549:40:0;;-1:-1:-1;;;15549:40:0;15407:182;15238:359;-1:-1:-1;;15238:359:0:o;35817:357::-;35883:4;35900:17;35920:27;35939:7;35920:18;:27::i;:::-;36056:19;;;;:8;:19;;;;;:31;;;35900:47;;-1:-1:-1;36008:23:0;33007:9;35900:47;36008:23;:::i;:::-;36007:80;;;;:::i;:::-;35979:7;:109;35978:188;;;;-1:-1:-1;36119:23:0;33007:9;36119;:23;:::i;:::-;36107:7;:36;;:58;;;;-1:-1:-1;;;17431:4:0;17455:20;;;:11;:20;;;;;:27;-1:-1:-1;;;17455:27:0;;;;36147:18;;35817:357::o;28648:196::-;28763:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;28763:29:0;-1:-1:-1;;;;;28763:29:0;;;;;;;;;28808:28;;28763:24;;28808:28;;;;;;;28648:196;;;:::o;10336:723::-;10392:13;10613:10;10609:53;;-1:-1:-1;;10640:10:0;;;;;;;;;;;;-1:-1:-1;;;10640:10:0;;;;;10336:723::o;10609:53::-;10687:5;10672:12;10728:78;10735:9;;10728:78;;10761:8;;;;:::i;:::-;;-1:-1:-1;10784:10:0;;-1:-1:-1;10792:2:0;10784:10;;:::i;:::-;;;10728:78;;;10816:19;10848:6;-1:-1:-1;;;;;10838:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10838:17:0;;10816:39;;10866:154;10873:10;;10866:154;;10900:11;10910:1;10900:11;;:::i;:::-;;-1:-1:-1;10969:10:0;10977:2;10969:5;:10;:::i;:::-;10956:24;;:2;:24;:::i;:::-;10943:39;;10926:6;10933;10926:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10926:56:0;;;;;;;;-1:-1:-1;10997:11:0;11006:2;10997:11;;:::i;:::-;;;10866:154;;9614:503;9789:17;;9702:13;;9765:5;;9782:29;;;;:::i;:::-;9824:24;9862:10;:17;-1:-1:-1;;;;;9851:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9851:29:0;-1:-1:-1;9824:56:0;-1:-1:-1;9824:56:0;9891:22;9946:127;9970:10;:17;9966:1;:21;9946:127;;;10048:10;10059:1;10048:13;;;;;;;;:::i;:::-;;;;;;;;;10009:9;10043:1;10039;10019:10;:17;:21;;;;:::i;:::-;:25;;;;:::i;:::-;10009:36;;;;;;;;:::i;:::-;;;;:52;-1:-1:-1;;;;;10009:52:0;;;;;;;;-1:-1:-1;9989:3:0;;;;:::i;:::-;;;;9946:127;;;-1:-1:-1;10099:9:0;9614:503;-1:-1:-1;;;;9614:503:0:o;8949:610::-;9040:14;;9128:3;9145:407;9156:10;:17;9152:1;:21;9145:407;;;9211:1;9194:10;9205:1;9194:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9194:13:0;;;:18;;;:23;9190:325;;9219:6;9224:1;9219:6;;:::i;:::-;;;9190:325;;;9249:13;;-1:-1:-1;;;9271:18:0;9266:1;;9249:10;;9260:1;;9249:13;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9249:13:0;;;:18;;;:40;;9245:270;;;9291:6;9296:1;9291:6;;:::i;9245:270::-;9321:13;;-1:-1:-1;;;9343:18:0;9338:1;;9321:10;;9332:1;;9321:13;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9321:13:0;;;:18;;;:40;;9317:198;;;9363:6;9368:1;9363:6;;:::i;9317:198::-;9393:13;;-1:-1:-1;;;9415:19:0;9410:1;;9393:10;;9404:1;;9393:13;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9393:13:0;;;:18;;;:41;;9389:126;;;9453:6;9458:1;9453:6;;:::i;9389:126::-;9509:6;9514:1;9509:6;;:::i;:::-;;;9389:126;9532:8;;;;:::i;:::-;;;;9145:407;;;9061:498;;8949:610;;;:::o;8472:419::-;8605:13;8661:3;8631:21;8708;8719:10;8708:8;:21;:::i;:::-;-1:-1:-1;;;;;8698:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8698:32:0;-1:-1:-1;8676:54:0;-1:-1:-1;8758:10:0;8741:111;8774:8;8770:1;:12;8741:111;;;8829:8;8838:1;8829:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;8829:11:0;8804:6;8811:14;8815:10;8811:1;:14;:::i;:::-;8804:22;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;8804:36:0;;;;;;;;-1:-1:-1;8784:3:0;;;;:::i;:::-;;;;8741:111;;;-1:-1:-1;8876:6:0;8472:419;-1:-1:-1;;;;;8472:419:0:o;7919:490::-;7984:7;;8063:9;7984:7;8084:297;8104:11;:18;8100:1;:22;8084:297;;;8144:11;8179:1;8158:11;:18;:22;;;;:::i;:::-;8144:36;;8195:11;8209;8221:1;8209:14;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;8209:14:0;;;-1:-1:-1;8209:14:0;;8238:10;8292:20;8307:4;8209:14;8292:20;:::i;:::-;8277:35;-1:-1:-1;8359:7:0;8365:1;8359:3;:7;:::i;:::-;8354:13;;:2;:13;:::i;:::-;8337:31;;8345:4;8337:31;:::i;:::-;8329:40;;;;:::i;:::-;;;8129:252;;;;8124:3;;;;;:::i;:::-;;;;8084:297;;;-1:-1:-1;8398:3:0;;7919:490;-1:-1:-1;;;7919:490:0:o;26512:2018::-;26628:35;26666:20;26678:7;26666:11;:20::i;:::-;26741:18;;26628:58;;-1:-1:-1;26699:22:0;;-1:-1:-1;;;;;26725:34:0;175:10;-1:-1:-1;;;;;26725:34:0;;:87;;;-1:-1:-1;175:10:0;26776:20;26788:7;26776:11;:20::i;:::-;-1:-1:-1;;;;;26776:36:0;;26725:87;:154;;;-1:-1:-1;26846:18:0;;26829:50;;175:10;60073:216;:::i;26829:50::-;26699:181;;26898:17;26893:66;;26924:35;;-1:-1:-1;;;26924:35:0;;;;;;;;;;;26893:66;26996:4;-1:-1:-1;;;;;26974:26:0;:13;:18;;;-1:-1:-1;;;;;26974:26:0;;26970:67;;27009:28;;-1:-1:-1;;;27009:28:0;;;;;;;;;;;26970:67;-1:-1:-1;;;;;27081:16:0;;27077:52;;27106:23;;-1:-1:-1;;;27106:23:0;;;;;;;;;;;27077:52;27142:43;27164:4;27170:2;27174:7;27183:1;27142:21;:43::i;:::-;27250:49;27267:1;27271:7;27280:13;:18;;;27250:8;:49::i;:::-;-1:-1:-1;;;;;27595:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;27595:31:0;;;-1:-1:-1;;;;;27595:31:0;;;-1:-1:-1;;27595:31:0;;;;;;;27641:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;27641:29:0;;;;;;;;;;;27687:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;27732:61:0;;;;-1:-1:-1;;;27777:15:0;27732:61;;;;;;;;;;;28067:11;;;28097:24;;;;;:29;28067:11;;28097:29;28093:321;;28165:20;28173:11;28165:7;:20::i;:::-;28161:238;;;28242:18;;;28210:24;;;:11;:24;;;;;;;;:50;;28325:54;;;;-1:-1:-1;;;;;28283:96:0;-1:-1:-1;;;28283:96:0;-1:-1:-1;;;;;;28283:96:0;;;-1:-1:-1;;;;;28210:50:0;;;28283:96;;;;;;;28161:238;27570:855;28461:7;28457:2;-1:-1:-1;;;;;28442:27:0;28451:4;-1:-1:-1;;;;;28442:27:0;;;;;;;;;;;28480:42;43146:201;16499:609;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;16631:16:0;16639:7;16631;:16::i;:::-;16626:61;;16656:31;;-1:-1:-1;;;16656:31:0;;;;;;;;;;;16626:61;16745:7;16725:318;16792:31;16826:17;;;:11;:17;;;;;;;;;16792:51;;;;;;;;;-1:-1:-1;;;;;16792:51:0;;;;-1:-1:-1;;;16792:51:0;;-1:-1:-1;;;;;16792:51:0;;;;;;;;-1:-1:-1;;;16792:51:0;;;;;;;;;;;;;;16862:166;;16912:14;;-1:-1:-1;;;;;16912:28:0;;16908:101;;16976:9;16499:609;-1:-1:-1;;;16499:609:0:o;16908:101::-;-1:-1:-1;;;16765:6:0;16725:318;;24641:1617;24693:35;24731:20;24743:7;24731:11;:20::i;:::-;24693:58;;24764:65;24786:13;:18;;;24814:1;24818:7;24827:1;24764:21;:65::i;:::-;24894:49;24911:1;24915:7;24924:13;:18;;;24894:8;:49::i;:::-;25004:18;;-1:-1:-1;;;;;24991:32:0;;;;;:12;:32;;;;;:45;;25035:1;;24991:32;:45;;25035:1;;-1:-1:-1;;;;;24991:45:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;24991:45:0;;;;;;;;;;;;;;;25060:18;;-1:-1:-1;;;;;25047:32:0;-1:-1:-1;25047:32:0;;;:12;:32;;;;;:50;;-1:-1:-1;;;25047:32:0;;:45;;:50;;-1:-1:-1;;;;;25047:50:0;;;;:::i;:::-;;;-1:-1:-1;;;;;25047:50:0;;;;;;;;;;;;;;;;;;;;;;;25216:18;;-1:-1:-1;25188:20:0;;;:11;:20;;;;;;:46;;-1:-1:-1;;;;25290:15:0;25245:61;;;-1:-1:-1;;;25245:61:0;-1:-1:-1;;;;;;25245:61:0;;;-1:-1:-1;;;;;25188:46:0;;;25245:61;;25317:34;;;;-1:-1:-1;;;25317:34:0;;;;25428:12;:26;;-1:-1:-1;25428:26:0;;;;;;;;;;;25749:11;;25779:24;;;;;;:29;25749:11;;-1:-1:-1;25779:29:0;25775:321;;25847:20;25855:11;25847:7;:20::i;:::-;25843:238;;;25924:18;;;25892:24;;;:11;:24;;;;;;;;:50;;26007:54;;;;-1:-1:-1;;;;;25965:96:0;-1:-1:-1;;;25965:96:0;-1:-1:-1;;;;;;25965:96:0;;;-1:-1:-1;;;;;25892:50:0;;;25965:96;;;;;;;25843:238;-1:-1:-1;26133:18:0;;26124:49;;26165:7;;26161:1;;-1:-1:-1;;;;;26124:49:0;;;;;;26161:1;;26124:49;47994:211;;:::o;29409:919::-;29564:4;-1:-1:-1;;;;;29585:13:0;;7482:20;7530:8;29581:740;;29638:175;;-1:-1:-1;;;29638:175:0;;-1:-1:-1;;;;;29638:36:0;;;;;:175;;175:10;;29732:4;;29759:7;;29789:5;;29638:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29638:175:0;;;;;;;;-1:-1:-1;;29638:175:0;;;;;;;;;;;;:::i;:::-;;;29617:649;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30000:13:0;;29996:255;;30048:40;;-1:-1:-1;;;30048:40:0;;;;;;;;;;;29996:255;30201:6;30195:13;30186:6;30182:2;30178:15;30171:38;29617:649;-1:-1:-1;;;;;;29877:55:0;-1:-1:-1;;;29877:55:0;;-1:-1:-1;29870:62:0;;29581:740;-1:-1:-1;30305:4:0;30298:11;;7670:181;7775:13;7837:1;7840;7820:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7806:37;;7670:181;;;;:::o;37115:551::-;37239:16;37337:20;;;:8;:20;;;;;:32;;;37239:16;;37296:24;33007:9;37346:10;37296:24;:::i;:::-;37295:74;;;;:::i;:::-;37430:20;;;;:8;:20;;;;;:32;;;37268:101;;-1:-1:-1;37430:56:0;;37478:8;;37430:56;:::i;:::-;37382:20;;;;:8;:20;;;;;:32;;:104;37499:42;37509:3;37514:16;37532:8;37499:9;:42::i;:::-;37611:10;37582:27;37601:8;37582:16;:27;:::i;:::-;37559:63;;37564:16;;37559:63;;;;;37642:16;37115:551;-1:-1:-1;;;;37115:551:0:o;52221:587::-;52556:1;52476:8;52556:1;52485:28;52504:8;52485:18;:28::i;:::-;52476:38;;;;;;;;;;;-1:-1:-1;52476:38:0;:55;;;-1:-1:-1;;;;;52476:55:0;:82;52458:343;;52585:27;52647:8;:38;52656:28;52675:8;52656:18;:28::i;:::-;52647:38;;;;;;;;;;;;;-1:-1:-1;52647:38:0;:55;;;52732:57;;-1:-1:-1;;;52732:57:0;;-1:-1:-1;;;;;30154:15:1;;;52732:57:0;;;30136:34:1;30206:15;;;30186:18;;;30179:43;30238:18;;;30231:34;;;30281:18;;;30274:34;;;52647:55:0;;;;-1:-1:-1;52647:55:0;;52732:24;;30047:19:1;;52732:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52732:57:0;;;;;;;;;;;;:::i;21934:174::-;22059:41;22069:2;22073:12;22087:8;22059:41;;;;;;;;;;;;22625:46;22631:2;22635:12;22649:8;22659:5;22666:4;-1:-1:-1;;;;;23112:16:0;;23108:48;;23137:19;;-1:-1:-1;;;23137:19:0;;;;;;;;;;;23108:48;23171:13;23167:44;;23193:18;;-1:-1:-1;;;23193:18:0;;;;;;;;;;;23167:44;23224:61;23254:1;23258:2;23262:12;23276:8;23224:21;:61::i;:::-;-1:-1:-1;;;;;23563:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;23622:49:0;;-1:-1:-1;;;;;23563:44:0;;;;;;;23622:49;;;;-1:-1:-1;;23563:44:0;;;;;;23622:49;;;;;;;;;;;;;;;;23688:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;23738:66:0;;;;-1:-1:-1;;;23788:15:0;23738:66;;;;;;;;;;;23688:25;;23873:391;23893:8;23889:1;:12;23873:391;;;23932:38;;23957:12;;-1:-1:-1;;;;;23932:38:0;;;23949:1;;23932:38;;23949:1;;23932:38;24015:4;:89;;;;;24045:59;24076:1;24080:2;24084:12;24098:5;24045:22;:59::i;:::-;24044:60;24015:89;23989:225;;;24154:40;;-1:-1:-1;;;24154:40:0;;;;;;;;;;;23989:225;24234:14;;;;;23903:3;23873:391;;;-1:-1:-1;;24295:12:0;;;:23;;24280:38;;24342:60;43146:201;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1759:154::-;-1:-1:-1;;;;;1838:5:1;1834:54;1827:5;1824:65;1814:93;;1903:1;1900;1893:12;1918:315;1986:6;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2102:9;2089:23;2121:31;2146:5;2121:31;:::i;:::-;2171:5;2223:2;2208:18;;;;2195:32;;-1:-1:-1;;;1918:315:1:o;2238:247::-;2297:6;2350:2;2338:9;2329:7;2325:23;2321:32;2318:52;;;2366:1;2363;2356:12;2318:52;2405:9;2392:23;2424:31;2449:5;2424:31;:::i;2490:127::-;2551:10;2546:3;2542:20;2539:1;2532:31;2582:4;2579:1;2572:15;2606:4;2603:1;2596:15;2622:275;2693:2;2687:9;2758:2;2739:13;;-1:-1:-1;;2735:27:1;2723:40;;-1:-1:-1;;;;;2778:34:1;;2814:22;;;2775:62;2772:88;;;2840:18;;:::i;:::-;2876:2;2869:22;2622:275;;-1:-1:-1;2622:275:1:o;2902:187::-;2951:4;-1:-1:-1;;;;;2976:6:1;2973:30;2970:56;;;3006:18;;:::i;:::-;-1:-1:-1;3072:2:1;3051:15;-1:-1:-1;;3047:29:1;3078:4;3043:40;;2902:187::o;3094:338::-;3159:5;3188:53;3204:36;3233:6;3204:36;:::i;:::-;3188:53;:::i;:::-;3179:62;;3264:6;3257:5;3250:21;3304:3;3295:6;3290:3;3286:16;3283:25;3280:45;;;3321:1;3318;3311:12;3280:45;3370:6;3365:3;3358:4;3351:5;3347:16;3334:43;3424:1;3417:4;3408:6;3401:5;3397:18;3393:29;3386:40;3094:338;;;;;:::o;3437:222::-;3480:5;3533:3;3526:4;3518:6;3514:17;3510:27;3500:55;;3551:1;3548;3541:12;3500:55;3573:80;3649:3;3640:6;3627:20;3620:4;3612:6;3608:17;3573:80;:::i;3664:390::-;3742:6;3750;3803:2;3791:9;3782:7;3778:23;3774:32;3771:52;;;3819:1;3816;3809:12;3771:52;3855:9;3842:23;3832:33;;3916:2;3905:9;3901:18;3888:32;-1:-1:-1;;;;;3935:6:1;3932:30;3929:50;;;3975:1;3972;3965:12;3929:50;3998;4040:7;4031:6;4020:9;4016:22;3998:50;:::i;:::-;3988:60;;;3664:390;;;;;:::o;4059:435::-;4112:3;4150:5;4144:12;4177:6;4172:3;4165:19;4203:4;4232:2;4227:3;4223:12;4216:19;;4269:2;4262:5;4258:14;4290:1;4300:169;4314:6;4311:1;4308:13;4300:169;;;4375:13;;4363:26;;4409:12;;;;4444:15;;;;4336:1;4329:9;4300:169;;;-1:-1:-1;4485:3:1;;4059:435;-1:-1:-1;;;;;4059:435:1:o;4499:261::-;4678:2;4667:9;4660:21;4641:4;4698:56;4750:2;4739:9;4735:18;4727:6;4698:56;:::i;4765:367::-;4828:8;4838:6;4892:3;4885:4;4877:6;4873:17;4869:27;4859:55;;4910:1;4907;4900:12;4859:55;-1:-1:-1;4933:20:1;;-1:-1:-1;;;;;4965:30:1;;4962:50;;;5008:1;5005;4998:12;4962:50;5045:4;5037:6;5033:17;5021:29;;5105:3;5098:4;5088:6;5085:1;5081:14;5073:6;5069:27;5065:38;5062:47;5059:67;;;5122:1;5119;5112:12;5137:773;5259:6;5267;5275;5283;5336:2;5324:9;5315:7;5311:23;5307:32;5304:52;;;5352:1;5349;5342:12;5304:52;5392:9;5379:23;-1:-1:-1;;;;;5462:2:1;5454:6;5451:14;5448:34;;;5478:1;5475;5468:12;5448:34;5517:70;5579:7;5570:6;5559:9;5555:22;5517:70;:::i;:::-;5606:8;;-1:-1:-1;5491:96:1;-1:-1:-1;5694:2:1;5679:18;;5666:32;;-1:-1:-1;5710:16:1;;;5707:36;;;5739:1;5736;5729:12;5707:36;;5778:72;5842:7;5831:8;5820:9;5816:24;5778:72;:::i;:::-;5137:773;;;;-1:-1:-1;5869:8:1;-1:-1:-1;;;;5137:773:1:o;6097:160::-;6162:20;;6218:13;;6211:21;6201:32;;6191:60;;6247:1;6244;6237:12;6262:874;6379:6;6387;6395;6403;6411;6419;6427;6480:3;6468:9;6459:7;6455:23;6451:33;6448:53;;;6497:1;6494;6487:12;6448:53;6537:9;6524:23;-1:-1:-1;;;;;6562:6:1;6559:30;6556:50;;;6602:1;6599;6592:12;6556:50;6625;6667:7;6658:6;6647:9;6643:22;6625:50;:::i;:::-;6615:60;;;6725:2;6714:9;6710:18;6697:32;6738:31;6763:5;6738:31;:::i;:::-;6788:5;-1:-1:-1;6840:2:1;6825:18;;6812:32;;-1:-1:-1;6896:2:1;6881:18;;6868:32;6909:33;6868:32;6909:33;:::i;:::-;6961:7;-1:-1:-1;6987:36:1;7018:3;7003:19;;6987:36;:::i;:::-;6977:46;;7070:3;7059:9;7055:19;7042:33;7032:43;;7094:36;7125:3;7114:9;7110:19;7094:36;:::i;:::-;7084:46;;6262:874;;;;;;;;;;:::o;7141:456::-;7218:6;7226;7234;7287:2;7275:9;7266:7;7262:23;7258:32;7255:52;;;7303:1;7300;7293:12;7255:52;7342:9;7329:23;7361:31;7386:5;7361:31;:::i;:::-;7411:5;-1:-1:-1;7468:2:1;7453:18;;7440:32;7481:33;7440:32;7481:33;:::i;:::-;7141:456;;7533:7;;-1:-1:-1;;;7587:2:1;7572:18;;;;7559:32;;7141:456::o;7602:248::-;7670:6;7678;7731:2;7719:9;7710:7;7706:23;7702:32;7699:52;;;7747:1;7744;7737:12;7699:52;-1:-1:-1;;7770:23:1;;;7840:2;7825:18;;;7812:32;;-1:-1:-1;7602:248:1:o;8157:464::-;8376:2;8365:9;8358:21;8339:4;8402:45;8443:2;8432:9;8428:18;8420:6;8402:45;:::i;:::-;8495:9;8487:6;8483:22;8478:2;8467:9;8463:18;8456:50;8523:33;8549:6;8541;8523:33;:::i;:::-;8515:41;;;8606:6;8599:14;8592:22;8587:2;8576:9;8572:18;8565:50;8157:464;;;;;;:::o;8626:701::-;8917:3;8906:9;8899:22;8880:4;8944:46;8985:3;8974:9;8970:19;8962:6;8944:46;:::i;:::-;9026:6;9021:2;9010:9;9006:18;8999:34;9083:6;9076:14;9069:22;9064:2;9053:9;9049:18;9042:50;9140:9;9132:6;9128:22;9123:2;9112:9;9108:18;9101:50;9168:33;9194:6;9186;9168:33;:::i;:::-;9245:14;;9238:22;9232:3;9217:19;;9210:51;-1:-1:-1;;9305:14:1;;9298:22;9292:3;9277:19;;;9270:51;9160:41;8626:701;-1:-1:-1;;;;8626:701:1:o;9332:452::-;9415:6;9423;9431;9439;9492:3;9480:9;9471:7;9467:23;9463:33;9460:53;;;9509:1;9506;9499:12;9460:53;9545:9;9532:23;9522:33;;9605:2;9594:9;9590:18;9577:32;9618:31;9643:5;9618:31;:::i;:::-;9668:5;-1:-1:-1;9692:35:1;9723:2;9708:18;;9692:35;:::i;:::-;9332:452;;;;-1:-1:-1;9682:45:1;;9774:2;9759:18;9746:32;;-1:-1:-1;;9332:452:1:o;9789:315::-;9857:6;9865;9918:2;9906:9;9897:7;9893:23;9889:32;9886:52;;;9934:1;9931;9924:12;9886:52;9970:9;9957:23;9947:33;;10030:2;10019:9;10015:18;10002:32;10043:31;10068:5;10043:31;:::i;:::-;10093:5;10083:15;;;9789:315;;;;;:::o;11465:957::-;11828:3;11817:9;11810:22;11791:4;11855:46;11896:3;11885:9;11881:19;11873:6;11855:46;:::i;:::-;11949:9;11941:6;11937:22;11932:2;11921:9;11917:18;11910:50;11983:33;12009:6;12001;11983:33;:::i;:::-;11969:47;;12064:9;12056:6;12052:22;12047:2;12036:9;12032:18;12025:50;12098:33;12124:6;12116;12098:33;:::i;:::-;12084:47;;12179:9;12171:6;12167:22;12162:2;12151:9;12147:18;12140:50;12213:33;12239:6;12231;12213:33;:::i;:::-;12199:47;;12295:9;12287:6;12283:22;12277:3;12266:9;12262:19;12255:51;12323:33;12349:6;12341;12323:33;:::i;:::-;12315:41;;;12407:6;12400:14;12393:22;12387:3;12376:9;12372:19;12365:51;11465:957;;;;;;;;;:::o;12427:315::-;12492:6;12500;12553:2;12541:9;12532:7;12528:23;12524:32;12521:52;;;12569:1;12566;12559:12;12521:52;12608:9;12595:23;12627:31;12652:5;12627:31;:::i;:::-;12677:5;-1:-1:-1;12701:35:1;12732:2;12717:18;;12701:35;:::i;:::-;12691:45;;12427:315;;;;;:::o;12747:458::-;12834:6;12842;12850;12903:2;12891:9;12882:7;12878:23;12874:32;12871:52;;;12919:1;12916;12909:12;12871:52;12955:9;12942:23;12932:33;;13012:2;13001:9;12997:18;12984:32;12974:42;;13067:2;13056:9;13052:18;13039:32;-1:-1:-1;;;;;13086:6:1;13083:30;13080:50;;;13126:1;13123;13116:12;13080:50;13149;13191:7;13182:6;13171:9;13167:22;13149:50;:::i;:::-;13139:60;;;12747:458;;;;;:::o;13210:795::-;13305:6;13313;13321;13329;13382:3;13370:9;13361:7;13357:23;13353:33;13350:53;;;13399:1;13396;13389:12;13350:53;13438:9;13425:23;13457:31;13482:5;13457:31;:::i;:::-;13507:5;-1:-1:-1;13564:2:1;13549:18;;13536:32;13577:33;13536:32;13577:33;:::i;:::-;13629:7;-1:-1:-1;13683:2:1;13668:18;;13655:32;;-1:-1:-1;13738:2:1;13723:18;;13710:32;-1:-1:-1;;;;;13754:30:1;;13751:50;;;13797:1;13794;13787:12;13751:50;13820:22;;13873:4;13865:13;;13861:27;-1:-1:-1;13851:55:1;;13902:1;13899;13892:12;13851:55;13925:74;13991:7;13986:2;13973:16;13968:2;13964;13960:11;13925:74;:::i;:::-;13915:84;;;13210:795;;;;;;;:::o;14010:492::-;14071:3;14109:5;14103:12;14136:6;14131:3;14124:19;14162:4;14191:2;14186:3;14182:12;14175:19;;14228:2;14221:5;14217:14;14249:1;14259:218;14273:6;14270:1;14267:13;14259:218;;;14338:13;;-1:-1:-1;;;;;14334:62:1;14322:75;;14417:12;;;;14452:15;;;;14295:1;14288:9;14259:218;;14507:285;14702:2;14691:9;14684:21;14665:4;14722:64;14782:2;14771:9;14767:18;14759:6;14722:64;:::i;14797:489::-;15070:2;15059:9;15052:21;15033:4;15096:64;15156:2;15145:9;15141:18;15133:6;15096:64;:::i;:::-;15208:9;15200:6;15196:22;15191:2;15180:9;15176:18;15169:50;15236:44;15273:6;15265;15236:44;:::i;:::-;15228:52;14797:489;-1:-1:-1;;;;;14797:489:1:o;15291:388::-;15359:6;15367;15420:2;15408:9;15399:7;15395:23;15391:32;15388:52;;;15436:1;15433;15426:12;15388:52;15475:9;15462:23;15494:31;15519:5;15494:31;:::i;:::-;15544:5;-1:-1:-1;15601:2:1;15586:18;;15573:32;15614:33;15573:32;15614:33;:::i;15684:525::-;15770:6;15778;15786;15794;15847:3;15835:9;15826:7;15822:23;15818:33;15815:53;;;15864:1;15861;15854:12;15815:53;15903:9;15890:23;15922:31;15947:5;15922:31;:::i;:::-;15972:5;-1:-1:-1;16024:2:1;16009:18;;15996:32;;-1:-1:-1;16075:2:1;16060:18;;16047:32;;-1:-1:-1;16131:2:1;16116:18;;16103:32;16144:33;16103:32;16144:33;:::i;:::-;15684:525;;;;-1:-1:-1;15684:525:1;;-1:-1:-1;;15684:525:1:o;16214:380::-;16293:1;16289:12;;;;16336;;;16357:61;;16411:4;16403:6;16399:17;16389:27;;16357:61;16464:2;16456:6;16453:14;16433:18;16430:38;16427:161;;;16510:10;16505:3;16501:20;16498:1;16491:31;16545:4;16542:1;16535:15;16573:4;16570:1;16563:15;16938:340;17140:2;17122:21;;;17179:2;17159:18;;;17152:30;-1:-1:-1;;;17213:2:1;17198:18;;17191:46;17269:2;17254:18;;16938:340::o;17640:127::-;17701:10;17696:3;17692:20;17689:1;17682:31;17732:4;17729:1;17722:15;17756:4;17753:1;17746:15;18591:127;18652:10;18647:3;18643:20;18640:1;18633:31;18683:4;18680:1;18673:15;18707:4;18704:1;18697:15;18723:135;18762:3;-1:-1:-1;;18783:17:1;;18780:43;;;18803:18;;:::i;:::-;-1:-1:-1;18850:1:1;18839:13;;18723:135::o;18863:125::-;18903:4;18931:1;18928;18925:8;18922:34;;;18936:18;;:::i;:::-;-1:-1:-1;18973:9:1;;18863:125::o;19340:128::-;19380:3;19411:1;19407:6;19404:1;19401:13;19398:39;;;19417:18;;:::i;:::-;-1:-1:-1;19453:9:1;;19340:128::o;19473:168::-;19513:7;19579:1;19575;19571:6;19567:14;19564:1;19561:21;19556:1;19549:9;19542:17;19538:45;19535:71;;;19586:18;;:::i;:::-;-1:-1:-1;19626:9:1;;19473:168::o;19646:127::-;19707:10;19702:3;19698:20;19695:1;19688:31;19738:4;19735:1;19728:15;19762:4;19759:1;19752:15;19778:120;19818:1;19844;19834:35;;19849:18;;:::i;:::-;-1:-1:-1;19883:9:1;;19778:120::o;23632:636::-;23712:6;23765:2;23753:9;23744:7;23740:23;23736:32;23733:52;;;23781:1;23778;23771:12;23733:52;23814:9;23808:16;-1:-1:-1;;;;;23839:6:1;23836:30;23833:50;;;23879:1;23876;23869:12;23833:50;23902:22;;23955:4;23947:13;;23943:27;-1:-1:-1;23933:55:1;;23984:1;23981;23974:12;23933:55;24013:2;24007:9;24038:49;24054:32;24083:2;24054:32;:::i;24038:49::-;24110:2;24103:5;24096:17;24150:7;24145:2;24140;24136;24132:11;24128:20;24125:33;24122:53;;;24171:1;24168;24161:12;24122:53;24184:54;24235:2;24230;24223:5;24219:14;24214:2;24210;24206:11;24184:54;:::i;26500:112::-;26532:1;26558;26548:35;;26563:18;;:::i;:::-;-1:-1:-1;26597:9:1;;26500:112::o;26617:127::-;26678:10;26673:3;26669:20;26666:1;26659:31;26709:4;26706:1;26699:15;26733:4;26730:1;26723:15;26749:422;26838:1;26881:5;26838:1;26895:270;26916:7;26906:8;26903:21;26895:270;;;26975:4;26971:1;26967:6;26963:17;26957:4;26954:27;26951:53;;;26984:18;;:::i;:::-;27034:7;27024:8;27020:22;27017:55;;;27054:16;;;;27017:55;27133:22;;;;27093:15;;;;26895:270;;;26899:3;26749:422;;;;;:::o;27176:806::-;27225:5;27255:8;27245:80;;-1:-1:-1;27296:1:1;27310:5;;27245:80;27344:4;27334:76;;-1:-1:-1;27381:1:1;27395:5;;27334:76;27426:4;27444:1;27439:59;;;;27512:1;27507:130;;;;27419:218;;27439:59;27469:1;27460:10;;27483:5;;;27507:130;27544:3;27534:8;27531:17;27528:43;;;27551:18;;:::i;:::-;-1:-1:-1;;27607:1:1;27593:16;;27622:5;;27419:218;;27721:2;27711:8;27708:16;27702:3;27696:4;27693:13;27689:36;27683:2;27673:8;27670:16;27665:2;27659:4;27656:12;27652:35;27649:77;27646:159;;;-1:-1:-1;27758:19:1;;;27790:5;;27646:159;27837:34;27862:8;27856:4;27837:34;:::i;:::-;27907:6;27903:1;27899:6;27895:19;27886:7;27883:32;27880:58;;;27918:18;;:::i;:::-;27956:20;;27176:806;-1:-1:-1;;;27176:806:1:o;27987:131::-;28047:5;28076:36;28103:8;28097:4;28076:36;:::i;28123:229::-;28162:4;-1:-1:-1;;;;;28259:10:1;;;;28229;;28281:12;;;28278:38;;;28296:18;;:::i;:::-;28333:13;;28123:229;-1:-1:-1;;;28123:229:1:o;28357:236::-;28396:3;-1:-1:-1;;;;;28469:2:1;28466:1;28462:10;28499:2;28496:1;28492:10;28530:3;28526:2;28522:12;28517:3;28514:21;28511:47;;;28538:18;;:::i;:::-;28574:13;;28357:236;-1:-1:-1;;;;28357:236:1:o;28598:512::-;28792:4;-1:-1:-1;;;;;28902:2:1;28894:6;28890:15;28879:9;28872:34;28954:2;28946:6;28942:15;28937:2;28926:9;28922:18;28915:43;;28994:6;28989:2;28978:9;28974:18;28967:34;29037:3;29032:2;29021:9;29017:18;29010:31;29058:46;29099:3;29088:9;29084:19;29076:6;29058:46;:::i;29115:249::-;29184:6;29237:2;29225:9;29216:7;29212:23;29208:32;29205:52;;;29253:1;29250;29243:12;29205:52;29285:9;29279:16;29304:30;29328:5;29304:30;:::i;29369:470::-;29548:3;29586:6;29580:13;29602:53;29648:6;29643:3;29636:4;29628:6;29624:17;29602:53;:::i;:::-;29718:13;;29677:16;;;;29740:57;29718:13;29677:16;29774:4;29762:17;;29740:57;:::i

Swarm Source

ipfs://ea43e44c71b202e1e76d8f5a4647a09af5a76ed773e546e0dcf65a1e6a155e4b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.