ETH Price: $3,398.85 (+2.93%)

Token

ChekorX (CoX)
 

Overview

Max Total Supply

163 CoX

Holders

69

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 CoX
0x38136C2dA6347352Fe71ad8ca5E3D757719778cd
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Chekorx

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-08
*/

pragma solidity ^0.8.23;
// SPDX-License-Identifier: MIT

// ChekorX

// contract code starts on line 1300

// apologies for the monolithic single file.
// gotta figure out how to do multi file verification.

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)
/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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

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

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

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

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

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

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

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

/// @notice Library to encode strings in Base64.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Base64.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Base64.sol)
/// @author Modified from (https://github.com/Brechtpd/base64/blob/main/base64.sol) by Brecht Devos - <[email protected]>.
library Base64 {
    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// See: https://datatracker.ietf.org/doc/html/rfc4648
    /// @param fileSafe  Whether to replace '+' with '-' and '/' with '_'.
    /// @param noPadding Whether to strip away the padding.
    function encode(bytes memory data, bool fileSafe, bool noPadding)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                // Multiply by 4/3 rounded up.
                // The `shl(2, ...)` is equivalent to multiplying by 4.
                let encodedLength := shl(2, div(add(dataLength, 2), 3))

                // Set `result` to point to the start of the free memory.
                result := mload(0x40)

                // Store the table into the scratch space.
                // Offsetted by -1 byte so that the `mload` will load the character.
                // We will rewrite the free memory pointer at `0x40` later with
                // the allocated size.
                // The magic constant 0x0230 will translate "-_" + "+/".
                mstore(0x1f, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef")
                mstore(0x3f, sub("ghijklmnopqrstuvwxyz0123456789-_", mul(iszero(fileSafe), 0x0230)))

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, encodedLength)

                // Run over the input, 3 bytes at a time.
                for {} 1 {} {
                    data := add(data, 3) // Advance 3 bytes.
                    let input := mload(data)

                    // Write 4 bytes. Optimized for fewer stack operations.
                    mstore8(0, mload(and(shr(18, input), 0x3F)))
                    mstore8(1, mload(and(shr(12, input), 0x3F)))
                    mstore8(2, mload(and(shr(6, input), 0x3F)))
                    mstore8(3, mload(and(input, 0x3F)))
                    mstore(ptr, mload(0x00))

                    ptr := add(ptr, 4) // Advance 4 bytes.
                    if iszero(lt(ptr, end)) { break }
                }
                mstore(0x40, add(end, 0x20)) // Allocate the memory.
                // Equivalent to `o = [0, 2, 1][dataLength % 3]`.
                let o := div(2, mod(dataLength, 3))
                // Offset `ptr` and pad with '='. We can simply write over the end.
                mstore(sub(ptr, o), shl(240, 0x3d3d))
                // Set `o` to zero if there is padding.
                o := mul(iszero(iszero(noPadding)), o)
                mstore(sub(ptr, o), 0) // Zeroize the slot after the string.
                mstore(result, sub(encodedLength, o)) // Store the length.
            }
        }
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, false, false)`.
    function encode(bytes memory data) internal pure returns (string memory result) {
        result = encode(data, false, false);
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, fileSafe, false)`.
    function encode(bytes memory data, bool fileSafe)
        internal
        pure
        returns (string memory result)
    {
        result = encode(data, fileSafe, false);
    }

    /// @dev Decodes base64 encoded `data`.
    ///
    /// Supports:
    /// - RFC 4648 (both standard and file-safe mode).
    /// - RFC 3501 (63: ',').
    ///
    /// Does not support:
    /// - Line breaks.
    ///
    /// Note: For performance reasons,
    /// this function will NOT revert on invalid `data` inputs.
    /// Outputs for invalid inputs will simply be undefined behaviour.
    /// It is the user's responsibility to ensure that the `data`
    /// is a valid base64 encoded string.
    function decode(string memory data) internal pure returns (bytes memory result) {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                let decodedLength := mul(shr(2, dataLength), 3)

                for {} 1 {} {
                    // If padded.
                    if iszero(and(dataLength, 3)) {
                        let t := xor(mload(add(data, dataLength)), 0x3d3d)
                        // forgefmt: disable-next-item
                        decodedLength := sub(
                            decodedLength,
                            add(iszero(byte(30, t)), iszero(byte(31, t)))
                        )
                        break
                    }
                    // If non-padded.
                    decodedLength := add(decodedLength, sub(and(dataLength, 3), 1))
                    break
                }
                result := mload(0x40)

                // Write the length of the bytes.
                mstore(result, decodedLength)

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, decodedLength)

                // Load the table into the scratch space.
                // Constants are optimized for smaller bytecode with zero gas overhead.
                // `m` also doubles as the mask of the upper 6 bits.
                let m := 0xfc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc
                mstore(0x5b, m)
                mstore(0x3b, 0x04080c1014181c2024282c3034383c4044484c5054585c6064)
                mstore(0x1a, 0xf8fcf800fcd0d4d8dce0e4e8ecf0f4)

                for {} 1 {} {
                    // Read 4 bytes.
                    data := add(data, 4)
                    let input := mload(data)

                    // Write 3 bytes.
                    // forgefmt: disable-next-item
                    mstore(ptr, or(
                        and(m, mload(byte(28, input))),
                        shr(6, or(
                            and(m, mload(byte(29, input))),
                            shr(6, or(
                                and(m, mload(byte(30, input))),
                                shr(6, mload(byte(31, input)))
                            ))
                        ))
                    ))
                    ptr := add(ptr, 3)
                    if iszero(lt(ptr, end)) { break }
                }
                mstore(0x40, add(end, 0x20)) // Allocate the memory.
                mstore(end, 0) // Zeroize the slot after the bytes.
                mstore(0x60, 0) // Restore the zero slot.
            }
        }
    }
}

// from: https://eips.ethereum.org/EIPS/eip-2981#simple-summary
///
/// @dev Interface for the NFT Royalty Standard
///
interface IERC2981 is IERC165 {
    /// ERC165 bytes to add to interface array - set in parent contract
    /// implementing this standard
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view returns (
        address receiver,
        uint256 royaltyAmount
    );
}

// from: https://eips.ethereum.org/EIPS/eip-4906
// interface id for IERC4906: '0x49064906'
/// @title EIP-721 Metadata Update Extension
interface IERC4906 is IERC165, IERC721 {
    /// @dev This event emits when the metadata of a token is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFT.
    event MetadataUpdate(uint256 _tokenId);

    /// @dev This event emits when the metadata of a range of tokens is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFTs.
    event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}

//===============================================
// ChekorX

interface efficaxInterface{
  function tokenURI(address, uint256) external view returns (string memory);
}

interface checksInterface{
  function svg(uint256) external view returns (string memory);
}

contract Chekorx is ERC721, IERC2981, IERC4906, Ownable {
  using Counters for Counters.Counter;

  struct Token {
    bytes18 salt;
    uint72 charity;
    uint16 flips;
    bool locked;
  }

  mapping(uint256 => Token) internal token;
  mapping(address => uint256) public mintsBy;

  Counters.Counter private supply;
  uint256 internal constant smileMod = 25;
  uint256 internal constant maxMints = 3;
  uint256 internal constant ownerMaxMints = 10;
  uint256 public mintFee = 0.01 ether;
  uint256 public mintCharity = 0.001 ether;
  uint256 public minFlipFee = 0.0002 ether;
  uint256 public constant maxSupply = 1000;
  bool public mintEnabled;
  bool public mintLocked;
  uint256 internal constant royaltyPercent = 5;
  string public externalURL = "https://nometa.online/chekorx";
  string public constant description =
    "An on-chain hack of FRESH HELL #1, ALGO BRO by XCOPY. Not to be used for making important life decisions. CC0";
  string internal constant nameStart = "ChekorX #";
  uint256 internal start;
  uint256 internal duration;
  bool public isLocked;
  /// @notice this address may send from charityBank via sendCharity()
  address public charityDelegate;
  /// @notice the current value of this contract earmarked for charity
  uint256 public charityBank;
  /// @notice the sum of all values withdrawn from this contract via sendCharity()
  uint256 public charityWithdrawn;
  address internal constant efficaxAddress = 0x323d8d9aB29731849345b97758eD4C1323A1e487;
  address internal constant checksAddress = 0x036721e5A769Cc48B3189EFbb9ccE4471E8A48B1;
  address internal constant freshHellAddress = 0xbB6EefD83DaaB02Fa1a697EB9D8495eEc9f9B384;

  constructor() payable ERC721('ChekorX','CoX') {
    charityDelegate = msg.sender;
  }

  efficaxInterface EfficaxContract = efficaxInterface(efficaxAddress);
  checksInterface ChecksContract = checksInterface(checksAddress);

  modifier tokenExists(uint256 _tokenId) {
    require(_exists(_tokenId), "token does not exist");
    _;
  }

  // interface id for IERC2981: '0x2a55205a'
  // interface id for IERC4906: '0x49064906'
  function supportsInterface(bytes4 interfaceId)
        public view override(IERC165, ERC721) returns (bool) {
    return
        interfaceId == type(IERC721).interfaceId ||
        interfaceId == type(IERC721Metadata).interfaceId ||
        interfaceId == type(IERC2981).interfaceId ||
        interfaceId == bytes4(0x49064906) ||
        super.supportsInterface(interfaceId);
  }

  receive() external payable {}

  /// @notice Locks the minting state. This cannot be undone.
  function lockMint() external onlyOwner {
    mintLocked = true;
  }

  /// @notice Toggles bool mintEnabled
  function toggleMint() external onlyOwner {
    require(!mintLocked, "minting has been locked");
    mintEnabled = !mintEnabled;
  }

  function safeIterate(uint256 _number) internal pure returns(uint256) {
    unchecked {
      return _number + 1;
    }
  }

  /// @notice mint given number of tokens
  /// @param _mints the number of tokens to mint. Limit 5 per address.
  function mint(uint256 _mints) external payable {
    require(mintEnabled, "minting has been disabled");
    address msgSender = msg.sender;
    uint256 mints = _mints;
    uint256 charity = mintCharity;
    unchecked {
      require((mintsBy[msgSender] + mints) <= maxMints, "mint limit of 3");
      require((supply.current() + mints) <= maxSupply, "exceeds max supply");
      require(msg.value == mints * mintFee, "invald value for tranasction");
      charityBank += mints * charity;
      mintsBy[msgSender] += mints;
    }
    for (uint256 count = 1; count <= mints; count = safeIterate(count)) {
      supply.increment();
      uint256 tokenId = supply.current();
      Token storage thisToken = token[tokenId];
      bytes32 salt = keccak256(abi.encodePacked(
                                          block.prevrandao,
                                          msgSender,
                                          tokenId,
                                          block.number,
                                          count
                                          ));
      thisToken.salt = bytes18(salt);
      thisToken.charity = uint72(charity);
      _safeMint(msgSender, tokenId);
    }
  }

  function ownerMint(uint256 _mints) external payable onlyOwner {
    // can mint when disabled
    address msgSender = owner();
    uint256 mints = _mints;
    uint256 charity = mintCharity;
    unchecked {
      require((mintsBy[msgSender] + mints) <= ownerMaxMints, "mint limit of 5");
      require((supply.current() + mints) <= maxSupply, "exceeds max supply");
      uint256 charityRequired = mints * charity;
      require(msg.value == charityRequired, "invald value for tranasction");
      charityBank += charityRequired;
      mintsBy[msgSender] += mints;
    }
    for (uint256 count = 1; count <= mints; count = safeIterate(count)) {
      supply.increment();
      uint256 tokenId = supply.current();
      Token storage thisToken = token[tokenId];
      bytes32 salt = keccak256(abi.encodePacked(
                                          block.prevrandao,
                                          msgSender,
                                          tokenId,
                                          block.number,
                                          count
                                          ));
      thisToken.salt = bytes18(salt);
      thisToken.charity = uint72(charity);
      _safeMint(msgSender, tokenId);
    }
  }

  /// @notice flip your token. Who knows what you'll get
  /// @param _tokenId the id of the token to be flipped
  function flip(uint256 _tokenId) external payable tokenExists(_tokenId) {
    address msgSender = msg.sender;
    uint256 tokenId = _tokenId;
    uint256 msgValue = msg.value;
    // testing minFlipFee cost - i don't think there's a difference
    require(msgValue >= minFlipFee, "incorrect value sent");
    require(msgSender == ownerOf(tokenId), "not token owner");
    require(!flipped(), "flip is broken. please stand by");
    Token storage thisToken = token[tokenId];
    require(!thisToken.locked, "token has been locked");
    bytes32 salt = keccak256(abi.encodePacked(
                                        block.prevrandao,
                                        msgSender,
                                        block.number,
                                        tokenId
                                        ));
    thisToken.salt = bytes18(salt);
    unchecked {
      thisToken.flips += 1;
      thisToken.charity += uint72(msgValue);
      charityBank += msgValue;
    }

    emit MetadataUpdate(tokenId);
  }

  /// @notice permanently lock a token from being flipped again.
  /// @param _tokenId the id of the token to be locked
  function lockFlip(uint256 _tokenId) external tokenExists(_tokenId) {
    uint256 tokenId = _tokenId;
    require(msg.sender == ownerOf(tokenId), "not token owner");
    token[tokenId].locked = true;
  }

  /// @notice called with the sale price to determine how much royalty is owed and to whom.
  /// @param _tokenId the NFT asset queried for royalty information
  /// @param _salePrice the sale price of the NFT asset specified by _tokenId
  /// @return receiver address of who should be sent the royalty payment
  /// @return royaltyAmount the royalty payment amount for _salePrice
  function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
                external view tokenExists(_tokenId)
                returns(address receiver, uint256 royaltyAmount) {
    return (owner(), _salePrice * royaltyPercent / 100);
  }

  function setIt(uint256 _start, uint256 _duration) external onlyOwner {
    require(!isLocked, "not fooling anyone");
    require(_duration <= 432000, "over max duration");
    start = _start;
    duration = _duration;
  }

  function lockIt() external onlyOwner {
    start = 0;
    isLocked = true;
  }

  function flipped() internal view returns(bool) {
    if (start == 0) {return false;}
    if (isLocked) {return false;}
    uint256 time = block.timestamp;
    uint256 end;
    unchecked{end = start + duration;}
    return (time > start && time < end);
  }

  function emitUpdate() external onlyOwner {
    emit BatchMetadataUpdate(1, supply.current());
  }

//======================================================================
// artwork

  /// @notice this is external only for calldata slicing.
  function decodeAlgoBro(bytes calldata _bstring)
                  external pure returns(string memory) {
    string memory svg64 = string(_bstring[107:57067]);
    return string(Base64.decode(svg64));
  }

  /// @notice get the metadata string of ALGO BRO from 0xdiid's Efficax contract
  function getAlgoBro() internal view returns(string memory) {
    return this.decodeAlgoBro(abi.encodePacked(
                                EfficaxContract.tokenURI(freshHellAddress, 1)
                                ));
  }

  /// @notice get the svg string for checks #1
  function getChecks() internal view returns(string memory) {
    return ChecksContract.svg(1);
  }

  function generateColours(bytes calldata _salt)
              pure external returns(string memory, string memory) {
    return (string.concat(
                'rgb(',
                Strings.toString(uint8(_salt[31])), ',',
                Strings.toString(uint8(_salt[30])), ',',
                Strings.toString(uint8(_salt[29])), ')'
                ),
            string.concat(
                'rgb(',
                Strings.toString(uint8(_salt[28])), ',',
                Strings.toString(uint8(_salt[27])), ',',
                Strings.toString(uint8(_salt[26])), ')'
                ));
  }

  /// @notice this will determine your fate.
  function getResult(uint256 _tokenId) internal view
              returns(uint256, string memory, string memory) {
      uint256 salt = uint144(token[_tokenId].salt);
      uint256 result;
      if (salt % smileMod == 0) {
        result = 2;
      } else {
        result = salt % 2;
      }
      (string memory colour1, string memory colour2) = this.generateColours(abi.encodePacked(salt));
      return (result, colour1, colour2);
    }

  /// @notice builds and returns the svg as a string
  /// @param _tokenId If you've come this far, you know what this means.
  function generateSVG(uint256 _tokenId)
                public view tokenExists(_tokenId) returns(string memory) {
    (uint256 result, string memory colour1, string memory colour2) = getResult(_tokenId);
    string memory class;
    string memory groupBlock;
    string memory groups;
    string memory extraStyle;
    string memory checks;
    if (flipped()) {
      result = 2;
    }
    if (result == 1) {
      class = 'mouth';
      groupBlock = string.concat(
              '<use class="tick1" href="#Tick1"/>',
              '<use class="tick2" href="#Tick2"/>',
              '<use class="tick3" href="#Tick3"/>',
              '<use class="tick4" href="#Tick4"/>',
            '</g>'
            );
      groups = string.concat(
            '<g transform="scale(6) translate(-1250 -1450)">',
            groupBlock,
            '<g transform="scale(3) translate(-2330 -1200)">',
            groupBlock
            );
      extraStyle = string.concat(
            '.mouth{fill:',colour1,'}',
            '.tick1{fill:',colour1,';animation-delay:0.5s}',
            '.tick2{fill:#4fc7f9}',
            '.tick3{fill:#51ff82}',
            '.tick4{fill:',colour2,'}'
            );
    } else {
      class = 'teeth';
      groupBlock = string.concat(
              '<use class="frame1" href="#X1"/>',
              '<use class="frame2" href="#X2"/>',
              '<use class="frame3" href="#X3"/>',
              '<use class="frame4" href="#X4"/>',
            '</g>'
            );
      groups = string.concat(
            '<g transform="scale(5) translate(-1868 -920)">',
            groupBlock,
            '<g transform="scale(1) translate(-1068 -120)">',
            groupBlock
            );

      extraStyle = string.concat(
            '.teeth{fill:',colour1,'}',
            '.frame1{fill:',colour1,';animation-delay:0.5s}',
            '.frame2{fill:#ff42d5}',
            '.frame3{fill:#ff0c0c}',
            '.frame4{fill:',colour2,'}'
            );
    }
    if (result == 2) {
      groups = string.concat(
            '<g transform="scale(1) translate(-800 -1000)">',
              '<use href="#MOUTH"/>',
              '<use class="frame1" transform="scale(1 0.8) translate(0 560)" href="#MOUTH"/>',
              '<use href="#TEETH"/>',
              '<use class="tick3" transform="translate(5 10)" href="#TEETH"/>',
            '</g>',
            '<g transform="scale(1.5) rotate(20) translate(-1000 -1120)">',
            groupBlock,
            '<g transform="scale(2) rotate(-15) translate(-1768 -820)">',
            groupBlock,
            '<use class="tick1" transform="scale(3) translate(220 130)" href="#check"/>',
            '<use class="tick2" transform="scale(3) translate(223 132)" href="#check"/>',
            '<use class="tick3" transform="scale(2) rotate(20) translate(778 -15)" href="#check"/>',
            '<use class="tick4" transform="scale(2) rotate(20) translate(780 -13)" href="#check"/>'
            );
      checks = getChecks();
    }
    string memory style = string.concat(
            '<style type="text/css">',
            '.border { fill:', colour2, '; animation: borderAnimation 0.16s infinite alternate;}',
            extraStyle,
            '@keyframes borderAnimation {0%,50%{fill:', colour1, ';}51%,100%{fill:', colour2, ';}}',
            '</style>'
            );
    return string.concat(
            '<svg style="background-color:#111111" ',
                'viewBox="0 0 800 800" xmlns="http://www.w3.org/2000/svg">',
              '<svg class="inner" width="100%" height="100%" viewBox="0 0 2000 2000">',
                '<defs>',
                  getAlgoBro(),
                  checks,
                '</defs>',
                '<rect width="100%" height="100%" fill="#0c1b2c"/>',
                '<rect x="4%" y="4%" class="border" width="92%" height="92%"/>',
                '<rect x="8%" y="8%" class="',class, '" width="84%" height="84%"/>',
                '<rect x="10%" y="10%" class="head" width="80%" height="80%"/>',
                groups,
                style,
              '</svg>',
            '</svg>'
            );
  }

  /// @notice returns the token svg image as a data uri
  /// @param _tokenId the id of the token
  function imageURI(uint256 _tokenId) public view tokenExists(_tokenId) returns(string memory) {
    return string.concat(
              "data:image/svg+xml;base64,",
              Base64.encode(bytes(generateSVG(_tokenId)))
              );
  }

  function genMetaData(uint256 _tokenId) internal view returns(string memory) {
    uint256 tokenId = _tokenId;
    return string.concat(
            'data:application/json;base64,',
            Base64.encode(abi.encodePacked(
                        '{"name":"',
                        nameStart,
                        Strings.toString(tokenId),
                        '","description":"',
                        description,
                        '",',
                        '"external_url":"',
                        externalURL,
                        '","attributes":',
                        genAttribs(tokenId),
                        ',"image":"',
                        imageURI(tokenId),
                        '"}'
                        )));
  }


  function genAttribs(uint256 _tokenId) internal view returns(string memory) {
    uint256 tokenId = _tokenId;
    Token memory thisToken = token[tokenId];
    (uint256 result, string memory colour1, string memory colour2) = getResult(tokenId);
    string memory _flip;
    if (result == 0) {
      _flip = "x";
    } else if (result == 1) {
      _flip = "check";
    } else {
      _flip = "smile";
    }
    string memory lock;
    if (thisToken.locked) {
      lock = "locked";
      } else {
        lock = "unlocked";
      }
    string memory started;
    if (flipped()) {
      started = '"},{"trait_type":"IPittyTheFoo","value":"you';
      lock = "locked";
    }
    string memory flips = Strings.toString(thisToken.flips);
    string memory charity;
    unchecked {
      charity = string.concat(
                    '},{"trait_type":"charityGwei)","value":',
                    Strings.toString(thisToken.charity / 1e9)
                    );
    }
    return string.concat(
                    '[{"trait_type":"flip","value":"',
                    _flip,
                    '"},{"trait_type":"colour1","value":"',
                    colour1,
                    '"},{"trait_type":"colour2","value":"',
                    colour2,
                    '"},{"trait_type":"flips","value":',
                    flips,
                    charity,
                    '},{"trait_type":"state","value":"',
                    lock,
                    started,
                    '"}]'
                    );
  }

  // @notice returns the number of tokens in the collection
  function totalSupply() external view returns (uint256) {
      return supply.current();
  }

  /// @notice returns metadata for the token
  /// @param _tokenId the id of the token
  function tokenURI(uint256 _tokenId)
        public view virtual override tokenExists(_tokenId) returns (string memory) {
  return genMetaData(_tokenId);
  }

  /// @notice Set the external address for metadata. onlyOwner
  /// @param _url The new external url.
  function setExternalURL(string calldata _url) external onlyOwner {
      externalURL = _url;
  }

  /// @notice update the minimum fee required for flipping a token
  function setFlipFee(uint256 _fee) external onlyOwner {
    minFlipFee = _fee;
  }

  /// @notice set an address as the charity delegate
  // only the charity delegate can send the funds from charityBank
  function setCharityDelegate(address _delegate) external onlyOwner {
    charityDelegate = _delegate;
  }

  /// @notice withdraw contract balance minus charityBank
  function withdraw() external onlyOwner {
    uint256 withdrawValue = address(this).balance - charityBank;
    (bool success, ) = payable(msg.sender).call{value: withdrawValue}("");
    require(success);
  }

  /// @notice send funds from the charityBank to an address
  /// @param _charity the address to send funds to
  /// @param _amount the value to send. 0 will send the full value of charityBank
  function sendCharity(address _charity, uint256 _amount) external {
    require(msg.sender == charityDelegate, "sender not delegated");
    uint256 bank = charityBank;
    uint256 amount = _amount;
    require(amount <= bank, "not enough funds in bank");
    if (amount == 0) {
      amount = bank;
    }
    unchecked {
      charityWithdrawn += amount;
      charityBank -= amount;
    }
   (bool success, ) = payable(_charity).call{value: amount}("");
   require(success);
  }
 }

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityBank","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_bstring","type":"bytes"}],"name":"decodeAlgoBro","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emitUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"externalURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"flip","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_salt","type":"bytes"}],"name":"generateColours","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"generateSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"imageURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"lockFlip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockIt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minFlipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCharity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mints","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"_charity","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendCharity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setCharityDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setExternalURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFlipFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setIt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

662386f26fc10000600a5566038d7ea4c68000600b5565b5e620f48000600c5560c0604052601d60809081527f68747470733a2f2f6e6f6d6574612e6f6e6c696e652f6368656b6f727800000060a052600e906200005e908262000229565b50601480546001600160a01b031990811673323d8d9ab29731849345b97758ed4c1323a1e487179091556015805490911673036721e5a769cc48b3189efbb9cce4471e8a48b11790556040805180820182526007815266086d0cad6dee4b60cb1b60208083019190915282518084019093526003835262086deb60eb1b90830152905f620000ed838262000229565b506001620000fc828262000229565b50505062000119620001136200013660201b60201c565b6200013a565b60118054610100600160a81b0319163361010002179055620002f5565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620001b457607f821691505b602082108103620001d357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200022457805f5260205f20601f840160051c81016020851015620002005750805b601f840160051c820191505b8181101562000221575f81556001016200020c565b50505b505050565b81516001600160401b038111156200024557620002456200018b565b6200025d816200025684546200019f565b84620001d9565b602080601f83116001811462000293575f84156200027b5750858301515b5f19600386901b1c1916600185901b178555620002ed565b5f85815260208120601f198616915b82811015620002c357888601518255948401946001909101908401620002a2565b5085821015620002e157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b61470d80620003035f395ff3fe6080604052600436106102a8575f3560e01c80638f742d161161016f578063c35436cc116100d8578063d5abeb0111610092578063e985e9c51161006d578063e985e9c5146107dc578063ee65686314610823578063f19e75d414610838578063f2fde38b1461084b575f80fd5b8063d5abeb0114610795578063df3c3a30146107aa578063e0b6bb67146107c8575f80fd5b8063c35436cc146106f7578063c87b56dd14610716578063cf079b5a14610735578063d123973014610754578063d3dd5fe01461076d578063d46b04e814610781575f80fd5b8063abf2b84011610129578063abf2b84014610652578063b081f77314610671578063b63a50c914610690578063b88d4fde146106af578063b99edfb2146106ce578063bd8e05a6146106e2575f80fd5b80638f742d16146105b557806395d89b41146105d4578063a0712d68146105e8578063a22cb465146105fb578063a4e2d6341461061a578063a88d78f014610633575f80fd5b806337869b6c1161021157806370a08231116101cb57806370a0823114610510578063715018a61461052f578063724441dd146105435780637284e4161461057057806384b67786146105845780638da5cb5b14610598575f80fd5b806337869b6c146104665780633ccfd60b1461048a57806342842e0e1461049e57806362ce030c146104bd5780636352211e146104d25780636dcee4ca146104f1575f80fd5b806318160ddd1161026257806318160ddd146103a2578063221e885d146103b657806323b872dd146103c95780632a55205a146103e85780632e5b466514610426578063368660381461043b575f80fd5b806301dbcd4a146102b357806301ffc9a7146102d457806306fdde0314610308578063081812fc14610329578063095ea7b31461036057806313966db51461037f575f80fd5b366102af57005b5f80fd5b3480156102be575f80fd5b506102d26102cd366004612f80565b61086a565b005b3480156102df575f80fd5b506102f36102ee366004612fd4565b6108af565b60405190151581526020015b60405180910390f35b348015610313575f80fd5b5061031c61092a565b6040516102ff919061303c565b348015610334575f80fd5b5061034861034336600461304e565b6109b9565b6040516001600160a01b0390911681526020016102ff565b34801561036b575f80fd5b506102d261037a366004613080565b610a3f565b34801561038a575f80fd5b50610394600a5481565b6040519081526020016102ff565b3480156103ad575f80fd5b50610394610b4e565b6102d26103c436600461304e565b610b5d565b3480156103d4575f80fd5b506102d26103e33660046130a8565b610e06565b3480156103f3575f80fd5b506104076104023660046130e1565b610e37565b604080516001600160a01b0390931683526020830191909152016102ff565b348015610431575f80fd5b50610394600b5481565b348015610446575f80fd5b50610394610455366004613101565b60086020525f908152604090205481565b348015610471575f80fd5b506011546103489061010090046001600160a01b031681565b348015610495575f80fd5b506102d2610e8e565b3480156104a9575f80fd5b506102d26104b83660046130a8565b610f1f565b3480156104c8575f80fd5b5061039460125481565b3480156104dd575f80fd5b506103486104ec36600461304e565b610f39565b3480156104fc575f80fd5b5061031c61050b36600461304e565b610faf565b34801561051b575f80fd5b5061039461052a366004613101565b61132c565b34801561053a575f80fd5b506102d26113b1565b34801561054e575f80fd5b5061056261055d366004612f80565b6113e6565b6040516102ff92919061311a565b34801561057b575f80fd5b5061031c6114ca565b34801561058f575f80fd5b506102d26114e6565b3480156105a3575f80fd5b506006546001600160a01b0316610348565b3480156105c0575f80fd5b5061031c6105cf36600461304e565b611556565b3480156105df575f80fd5b5061031c6115b6565b6102d26105f636600461304e565b6115c5565b348015610606575f80fd5b506102d2610615366004613147565b6117f1565b348015610625575f80fd5b506011546102f39060ff1681565b34801561063e575f80fd5b506102d261064d36600461304e565b6117fc565b34801561065d575f80fd5b506102d261066c36600461304e565b6118a0565b34801561067c575f80fd5b506102d261068b3660046130e1565b6118cf565b34801561069b575f80fd5b5061031c6106aa366004612f80565b611993565b3480156106ba575f80fd5b506102d26106c93660046131ec565b6119ef565b3480156106d9575f80fd5b5061031c611a27565b3480156106ed575f80fd5b5061039460135481565b348015610702575f80fd5b506102d2610711366004613101565b611ab3565b348015610721575f80fd5b5061031c61073036600461304e565b611b05565b348015610740575f80fd5b506102d261074f366004613080565b611b3d565b34801561075f575f80fd5b50600d546102f39060ff1681565b348015610778575f80fd5b506102d2611c5c565b34801561078c575f80fd5b506102d2611cf2565b3480156107a0575f80fd5b506103946103e881565b3480156107b5575f80fd5b50600d546102f390610100900460ff1681565b3480156107d3575f80fd5b506102d2611d2f565b3480156107e7575f80fd5b506102f36107f6366004613290565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b34801561082e575f80fd5b50610394600c5481565b6102d261084636600461304e565b611d6a565b348015610856575f80fd5b506102d2610865366004613101565b611f82565b6006546001600160a01b0316331461089d5760405162461bcd60e51b8152600401610894906132c1565b60405180910390fd5b600e6108aa82848361336c565b505050565b5f6001600160e01b031982166380ac58cd60e01b14806108df57506001600160e01b03198216635b5e139f60e01b145b806108fa57506001600160e01b0319821663152a902d60e11b145b8061091557506001600160e01b03198216632483248360e11b145b8061092457506109248261201d565b92915050565b60605f8054610938906132f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610964906132f6565b80156109af5780601f10610986576101008083540402835291602001916109af565b820191905f5260205f20905b81548152906001019060200180831161099257829003601f168201915b5050505050905090565b5f6109c38261206c565b610a245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610894565b505f908152600460205260409020546001600160a01b031690565b5f610a4982610f39565b9050806001600160a01b0316836001600160a01b031603610ab65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610894565b336001600160a01b0382161480610ad25750610ad281336107f6565b610b445760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610894565b6108aa8383612088565b5f610b5860095490565b905090565b80610b678161206c565b610b835760405162461bcd60e51b815260040161089490613426565b600c54339083903490811015610bd25760405162461bcd60e51b81526020600482015260146024820152731a5b98dbdc9c9958dd081d985b1d59481cd95b9d60621b6044820152606401610894565b610bdb82610f39565b6001600160a01b0316836001600160a01b031614610c2d5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b6044820152606401610894565b610c356120f5565b15610c825760405162461bcd60e51b815260206004820152601f60248201527f666c69702069732062726f6b656e2e20706c65617365207374616e64206279006044820152606401610894565b5f8281526007602052604090208054600160e81b900460ff1615610ce05760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881a185cc81899595b881b1bd8dad959605a1b6044820152606401610894565b604080514460208201526bffffffffffffffffffffffff19606087901b1691810191909152436054820152607481018490525f9060940160408051601f19818403018152908290528051602090910120835468ffffffffffffffffff600160901b61ffff600160d81b607086901c71ffffffffffffffffffffffffffffffffffff19861681178290048316600101909216027fffffff0000ffffffffffffffffff00000000000000000000000000000000000090941617929092178281048216880190911690910268ffffffffffffffffff60901b19909116178455601280548601905591507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790610df59086815260200190565b60405180910390a150505050505050565b610e103382612133565b610e2c5760405162461bcd60e51b815260040161089490613454565b6108aa838383612216565b5f8083610e438161206c565b610e5f5760405162461bcd60e51b815260040161089490613426565b6006546001600160a01b03166064610e786005876134b9565b610e8291906134e4565b92509250509250929050565b6006546001600160a01b03163314610eb85760405162461bcd60e51b8152600401610894906132c1565b5f60125447610ec791906134f7565b6040519091505f90339083908381818185875af1925050503d805f8114610f09576040519150601f19603f3d011682016040523d82523d5f602084013e610f0e565b606091505b5050905080610f1b575f80fd5b5050565b6108aa83838360405180602001604052805f8152506119ef565b5f818152600260205260408120546001600160a01b0316806109245760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610894565b606081610fbb8161206c565b610fd75760405162461bcd60e51b815260040161089490613426565b5f805f610fe3866123ae565b9250925092506060806060806060610ff96120f5565b1561100357600297505b8760010361115d57604051806040016040528060058152602001640dadeeae8d60db1b81525094506040516020016110fd907f3c75736520636c6173733d227469636b312220687265663d22235469636b3122815261179f60f11b602082018190527f3c75736520636c6173733d227469636b322220687265663d22235469636b32226022830152604282018190527f3c75736520636c6173733d227469636b332220687265663d22235469636b33226044830152606482018190527f3c75736520636c6173733d227469636b342220687265663d22235469636b342260668301526086820152631e17b39f60e11b6088820152608c0190565b60405160208183030381529060405293508384604051602001611121929190613525565b6040516020818303038152906040529250868787604051602001611147939291906135d5565b604051602081830303815290604052915061128b565b604051806040016040528060058152602001640e8cacae8d60db1b815250945060405160200161122f907f3c75736520636c6173733d226672616d65312220687265663d22235831222f3e81527f3c75736520636c6173733d226672616d65322220687265663d22235832222f3e60208201527f3c75736520636c6173733d226672616d65332220687265663d22235833222f3e60408201527f3c75736520636c6173733d226672616d65342220687265663d22235834222f3e6060820152631e17b39f60e11b608082015260840190565b604051602081830303815290604052935083846040516020016112539291906136d4565b604051602081830303815290604052925086878760405160200161127993929190613782565b60405160208183030381529060405291505b876002036112c25783846040516020016112a6929190613879565b60405160208183030381529060405292506112bf61249e565b90505b5f868389896040516020016112da9493929190613c09565b60405160208183030381529060405290506112f361250d565b8287868460405160200161130b959493929190613d51565b6040516020818303038152906040529a505050505050505050505b50919050565b5f6001600160a01b0382166113965760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610894565b506001600160a01b03165f9081526003602052604090205490565b6006546001600160a01b031633146113db5760405162461bcd60e51b8152600401610894906132c1565b6113e45f6125d8565b565b60608061140e8484601f8181106113ff576113ff613fc6565b919091013560f81c9050612629565b6114248585601e8181106113ff576113ff613fc6565b61143a8686601d8181106113ff576113ff613fc6565b60405160200161144c93929190613fda565b6040516020818303038152906040526114718585601c8181106113ff576113ff613fc6565b6114878686601b8181106113ff576113ff613fc6565b61149d8787601a8181106113ff576113ff613fc6565b6040516020016114af93929190613fda565b604051602081830303815290604052915091505b9250929050565b6040518060a00160405280606d815260200161466b606d913981565b6006546001600160a01b031633146115105760405162461bcd60e51b8152600401610894906132c1565b7f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c600161153c60095490565b6040805192835260208301919091520160405180910390a1565b6060816115628161206c565b61157e5760405162461bcd60e51b815260040161089490613426565b61158f61158a84610faf565b612726565b60405160200161159f9190614051565b604051602081830303815290604052915050919050565b606060018054610938906132f6565b600d5460ff166116175760405162461bcd60e51b815260206004820152601960248201527f6d696e74696e6720686173206265656e2064697361626c6564000000000000006044820152606401610894565b600b54335f8181526008602052604090205490918391600390830111156116725760405162461bcd60e51b815260206004820152600f60248201526e6d696e74206c696d6974206f66203360881b6044820152606401610894565b6103e88261167f60095490565b0111156116c35760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b6044820152606401610894565b600a54820234146117165760405162461bcd60e51b815260206004820152601c60248201527f696e76616c642076616c756520666f72207472616e61736374696f6e000000006044820152606401610894565b601280548383020190556001600160a01b0383165f90815260086020526040902080548301905560015b8281116117ea57611755600980546001019055565b5f61175f60095490565b5f8181526007602090815260408083209051939450926117899144918a91879143918a9101614095565b60408051601f198184030181529190528051602090910120825468ffffffffffffffffff8716600160901b026001600160d81b0319909116607083901c1717835590506117d68784612733565b5050506117e38160010190565b9050611740565b5050505050565b610f1b33838361274c565b806118068161206c565b6118225760405162461bcd60e51b815260040161089490613426565b8161182c81610f39565b6001600160a01b0316336001600160a01b03161461187e5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b6044820152606401610894565b5f908152600760205260409020805460ff60e81b1916600160e81b1790555050565b6006546001600160a01b031633146118ca5760405162461bcd60e51b8152600401610894906132c1565b600c55565b6006546001600160a01b031633146118f95760405162461bcd60e51b8152600401610894906132c1565b60115460ff16156119415760405162461bcd60e51b81526020600482015260126024820152716e6f7420666f6f6c696e6720616e796f6e6560701b6044820152606401610894565b620697808111156119885760405162461bcd60e51b815260206004820152601160248201527037bb32b91036b0bc10323ab930ba34b7b760791b6044820152606401610894565b600f91909155601055565b60605f6119a561deeb606b85876140ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509293506119e792508391506128199050565b949350505050565b6119f93383612133565b611a155760405162461bcd60e51b815260040161089490613454565b611a2184848484612913565b50505050565b600e8054611a34906132f6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a60906132f6565b8015611aab5780601f10611a8257610100808354040283529160200191611aab565b820191905f5260205f20905b815481529060010190602001808311611a8e57829003601f168201915b505050505081565b6006546001600160a01b03163314611add5760405162461bcd60e51b8152600401610894906132c1565b601180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b606081611b118161206c565b611b2d5760405162461bcd60e51b815260040161089490613426565b611b3683612946565b9392505050565b60115461010090046001600160a01b03163314611b935760405162461bcd60e51b81526020600482015260146024820152731cd95b99195c881b9bdd0819195b1959d85d195960621b6044820152606401610894565b6012548181811115611be75760405162461bcd60e51b815260206004820152601860248201527f6e6f7420656e6f7567682066756e647320696e2062616e6b00000000000000006044820152606401610894565b805f03611bf15750805b60138054820190556012805482900390556040515f906001600160a01b0386169083908381818185875af1925050503d805f8114611c4a576040519150601f19603f3d011682016040523d82523d5f602084013e611c4f565b606091505b50509050806117ea575f80fd5b6006546001600160a01b03163314611c865760405162461bcd60e51b8152600401610894906132c1565b600d54610100900460ff1615611cde5760405162461bcd60e51b815260206004820152601760248201527f6d696e74696e6720686173206265656e206c6f636b65640000000000000000006044820152606401610894565b600d805460ff19811660ff90911615179055565b6006546001600160a01b03163314611d1c5760405162461bcd60e51b8152600401610894906132c1565b5f600f556011805460ff19166001179055565b6006546001600160a01b03163314611d595760405162461bcd60e51b8152600401610894906132c1565b600d805461ff001916610100179055565b6006546001600160a01b03163314611d945760405162461bcd60e51b8152600401610894906132c1565b5f611da76006546001600160a01b031690565b600b546001600160a01b0382165f908152600860205260409020549192508391600a9083011115611e0c5760405162461bcd60e51b815260206004820152600f60248201526e6d696e74206c696d6974206f66203560881b6044820152606401610894565b6103e882611e1960095490565b011115611e5d5760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b6044820152606401610894565b818102348114611eaf5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c642076616c756520666f72207472616e61736374696f6e000000006044820152606401610894565b6012805490910190556001600160a01b0383165f90815260086020526040902080548301905560015b8281116117ea57611eed600980546001019055565b5f611ef760095490565b5f818152600760209081526040808320905193945092611f219144918a91879143918a9101614095565b60408051601f198184030181529190528051602090910120825468ffffffffffffffffff8716600160901b026001600160d81b0319909116607083901c171783559050611f6e8784612733565b505050611f7b8160010190565b9050611ed8565b6006546001600160a01b03163314611fac5760405162461bcd60e51b8152600401610894906132c1565b6001600160a01b0381166120115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610894565b61201a816125d8565b50565b5f6001600160e01b031982166380ac58cd60e01b148061204d57506001600160e01b03198216635b5e139f60e01b145b8061092457506301ffc9a760e01b6001600160e01b0319831614610924565b5f908152600260205260409020546001600160a01b0316151590565b5f81815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906120bc82610f39565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f600f545f0361210457505f90565b60115460ff161561211457505f90565b601054600f5442918101908211801561212c57508082105b9250505090565b5f61213d8261206c565b61219e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610894565b5f6121a883610f39565b9050806001600160a01b0316846001600160a01b031614806121e35750836001600160a01b03166121d8846109b9565b6001600160a01b0316145b806119e757506001600160a01b038082165f9081526005602090815260408083209388168352929052205460ff166119e7565b826001600160a01b031661222982610f39565b6001600160a01b03161461228d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610894565b6001600160a01b0382166122ef5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610894565b6122f95f82612088565b6001600160a01b0383165f9081526003602052604081208054600192906123219084906134f7565b90915550506001600160a01b0382165f90815260036020526040812080546001929061234e9084906140f1565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5f81815260076020526040812054606090819071ffffffffffffffffffffffffffffffffffff16836123e1601983614104565b5f036123ef575060026123fd565b6123fa600283614104565b90505b5f80306001600160a01b031663724441dd8560405160200161242191815260200190565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161244c919061303c565b5f60405180830381865afa158015612466573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261248d9190810190614159565b939990985092965091945050505050565b6015546040516344b285db60e01b8152600160048201526060916001600160a01b0316906344b285db906024015b5f60405180830381865afa1580156124e6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b5891908101906141b9565b60145460405163e9dc637560e01b815273bb6eefd83daab02fa1a697eb9d8495eec9f9b384600482015260016024820152606091309163b63a50c9916001600160a01b03169063e9dc6375906044015f60405180830381865afa158015612576573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261259d91908101906141b9565b6040516020016125ad91906141eb565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016124cc919061303c565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6060815f0361264f5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115612678578061266281614206565b91506126719050600a836134e4565b9150612652565b5f8167ffffffffffffffff81111561269257612692613180565b6040519080825280601f01601f1916602001820160405280156126bc576020820181803683370190505b5090505b84156119e7576126d16001836134f7565b91506126de600a86614104565b6126e99060306140f1565b60f81b8183815181106126fe576126fe613fc6565b60200101906001600160f81b03191690815f1a90535061271f600a866134e4565b94506126c0565b6060610924825f806129e0565b610f1b828260405180602001604052805f815250612ac5565b816001600160a01b0316836001600160a01b0316036127ad5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610894565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060815180156113265760038160021c026003821661284e5783820151613d3d18601e81901a1560ff90911615019003612857565b60038216015f19015b60405192508083526020830181810191507ffc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc80605b527804080c1014181c2024282c3034383c4044484c5054585c6064603b526ef8fcf800fcd0d4d8dce0e4e8ecf0f4601a525b600486019550855180601f1a5160061c81601e1a5183161760061c81601d1a5183161760061c81601c1a518316178352506003820191508282106128be575050602081016040525f8152505f60605250919050565b61291e848484612216565b61292a84848484612af7565b611a215760405162461bcd60e51b81526004016108949061421e565b60605f8290506129d0604051806040016040528060098152602001684368656b6f7258202360b81b81525061297a83612629565b6040518060a00160405280606d815260200161466b606d9139600e61299e86612bf4565b6129a787611556565b6040516020016129bc96959493929190614270565b604051602081830303815290604052612726565b60405160200161159f91906143e8565b606083518015612abd576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16515f53603f81600c1c1651600153603f8160061c1651600253603f811651600353505f518252600482019150808210612a5057602001604052613d3d60f01b60038406600204808303919091525f8615159091029182900352900382525b509392505050565b612acf8383612e11565b612adb5f848484612af7565b6108aa5760405162461bcd60e51b81526004016108949061421e565b5f6001600160a01b0384163b15612be957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b3a90339089908890889060040161442c565b6020604051808303815f875af1925050508015612b74575060408051601f3d908101601f19168201909252612b7191810190614468565b60015b612bcf573d808015612ba1576040519150601f19603f3d011682016040523d82523d5f602084013e612ba6565b606091505b5080515f03612bc75760405162461bcd60e51b81526004016108949061421e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119e7565b506001949350505050565b5f81815260076020908152604080832081516080810183529054607081901b6dffffffffffffffffffffffffffff19168252600160901b810468ffffffffffffffffff1693820193909352600160d81b830461ffff1691810191909152600160e81b90910460ff161515606080830191909152918391908080612c76856123ae565b9250925092506060835f03612ca357506040805180820190915260018152600f60fb1b6020820152612ceb565b83600103612ccd5750604080518082019091526005815264636865636b60d81b6020820152612ceb565b50604080518082019091526005815264736d696c6560d81b60208201525b6060856060015115612d1a57506040805180820190915260068152651b1bd8dad95960d21b6020820152612d3b565b506040805180820190915260088152671d5b9b1bd8dad95960c21b60208201525b6060612d456120f5565b15612d87576040518060600160405280602c815260200161463f602c91399050604051806040016040528060068152602001651b1bd8dad95960d21b81525091505b5f612d99886040015161ffff16612629565b90506060612dd3633b9aca008a6020015168ffffffffffffffffff1681612dc257612dc26134d0565b0468ffffffffffffffffff16612629565b604051602001612de39190614483565b60405160208183030381529060405290508487878484888860405160200161130b97969594939291906144d7565b6001600160a01b038216612e675760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610894565b612e708161206c565b15612ebd5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610894565b6001600160a01b0382165f908152600360205260408120805460019290612ee59084906140f1565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8083601f840112612f52575f80fd5b50813567ffffffffffffffff811115612f69575f80fd5b6020830191508360208285010111156114c3575f80fd5b5f8060208385031215612f91575f80fd5b823567ffffffffffffffff811115612fa7575f80fd5b612fb385828601612f42565b90969095509350505050565b6001600160e01b03198116811461201a575f80fd5b5f60208284031215612fe4575f80fd5b8135611b3681612fbf565b5f5b83811015613009578181015183820152602001612ff1565b50505f910152565b5f8151808452613028816020860160208601612fef565b601f01601f19169290920160200192915050565b602081525f611b366020830184613011565b5f6020828403121561305e575f80fd5b5035919050565b80356001600160a01b038116811461307b575f80fd5b919050565b5f8060408385031215613091575f80fd5b61309a83613065565b946020939093013593505050565b5f805f606084860312156130ba575f80fd5b6130c384613065565b92506130d160208501613065565b9150604084013590509250925092565b5f80604083850312156130f2575f80fd5b50508035926020909101359150565b5f60208284031215613111575f80fd5b611b3682613065565b604081525f61312c6040830185613011565b828103602084015261313e8185613011565b95945050505050565b5f8060408385031215613158575f80fd5b61316183613065565b915060208301358015158114613175575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131bd576131bd613180565b604052919050565b5f67ffffffffffffffff8211156131de576131de613180565b50601f01601f191660200190565b5f805f80608085870312156131ff575f80fd5b61320885613065565b935061321660208601613065565b925060408501359150606085013567ffffffffffffffff811115613238575f80fd5b8501601f81018713613248575f80fd5b803561325b613256826131c5565b613194565b81815288602083850101111561326f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156132a1575f80fd5b6132aa83613065565b91506132b860208401613065565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061330a57607f821691505b60208210810361132657634e487b7160e01b5f52602260045260245ffd5b601f8211156108aa57805f5260205f20601f840160051c8101602085101561334d5750805b601f840160051c820191505b818110156117ea575f8155600101613359565b67ffffffffffffffff83111561338457613384613180565b6133988361339283546132f6565b83613328565b5f601f8411600181146133c9575f85156133b25750838201355b5f19600387901b1c1916600186901b1783556117ea565b5f83815260208120601f198716915b828110156133f857868501358255602094850194600190920191016133d8565b5086821015613414575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252601490820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610924576109246134a5565b634e487b7160e01b5f52601260045260245ffd5b5f826134f2576134f26134d0565b500490565b81810381811115610924576109246134a5565b5f815161351b818560208601612fef565b9290920192915050565b7f3c67207472616e73666f726d3d227363616c65283629207472616e736c61746581526e141698991a981016989a1a9814911f60891b60208201525f835161357481602f850160208801612fef565b7f3c67207472616e73666f726d3d227363616c65283329207472616e736c617465602f918401918201526e14169919999810169899181814911f60891b604f82015283516135c981605e840160208801612fef565b01605e01949350505050565b6b1736b7baba343db334b6361d60a11b81525f84516135fb81600c850160208901612fef565b607d60f81b600c918401918201526b173a34b1b598bdb334b6361d60a11b600d8201528451613631816019840160208901612fef565b753b616e696d6174696f6e2d64656c61793a302e35737d60501b60199290910191820152732e7469636b327b66696c6c3a233466633766397d60601b602f820152732e7469636b337b66696c6c3a233531666638327d60601b60438201526b173a34b1b59a3db334b6361d60a11b605782015283516136b7816063840160208801612fef565b016063016136c881607d60f81b9052565b60010195945050505050565b7f3c67207472616e73666f726d3d227363616c65283529207472616e736c61746581526d1416989c1b1c10169c991814911f60911b60208201525f835161372281602e850160208801612fef565b7f3c67207472616e73666f726d3d227363616c65283129207472616e736c617465602e918401918201526d141698981b1c101698991814911f60911b604e820152835161377681605c840160208801612fef565b01605c01949350505050565b6b173a32b2ba343db334b6361d60a11b81525f84516137a881600c850160208901612fef565b607d60f81b600c918401918201526c17333930b6b298bdb334b6361d60991b600d82015284516137df81601a840160208901612fef565b753b616e696d6174696f6e2d64656c61793a302e35737d60501b601a9290910191820152742e6672616d65327b66696c6c3a236666343264357d60581b6030820152742e6672616d65337b66696c6c3a236666306330637d60581b60458201526c17333930b6b29a3db334b6361d60991b605a8201528351613868816067840160208801612fef565b016067016136c881607d60f81b9052565b7f3c67207472616e73666f726d3d227363616c65283129207472616e736c61746581526d14169c181810169898181814911f60911b6020820152731e3ab9b290343932b31e9111a6a7aaaa2411179f60611b602e8201527f3c75736520636c6173733d226672616d653122207472616e73666f726d3d227360428201527f63616c65283120302e3829207472616e736c617465283020353630292220687260628201526c32b31e9111a6a7aaaa2411179f60991b6082820152731e3ab9b290343932b31e9111aa22a2aa2411179f60611b608f8201527f3c75736520636c6173733d227469636b3322207472616e73666f726d3d22747260a38201527f616e736c6174652835203130292220687265663d22235445455448222f3e000060c3820152631e17b39f60e11b60e18201527f3c67207472616e73666f726d3d227363616c6528312e352920726f746174652860e58201527f323029207472616e736c617465282d31303030202d3131323029223e000000006101058201525f6119e7613b9c613b2f613acd613a6b613a65613a1661012189018b61350a565b7f3c67207472616e73666f726d3d227363616c6528322920726f74617465282d3181527f3529207472616e736c617465282d31373638202d38323029223e0000000000006020820152603a0190565b8861350a565b7f3c75736520636c6173733d227469636b3122207472616e73666f726d3d22736381527f616c65283329207472616e736c6174652832323020313330292220687265663d6020820152691111b1b432b1b591179f60b11b6040820152604a0190565b7f3c75736520636c6173733d227469636b3222207472616e73666f726d3d22736381527f616c65283329207472616e736c6174652832323320313332292220687265663d6020820152691111b1b432b1b591179f60b11b6040820152604a0190565b7f3c75736520636c6173733d227469636b3322207472616e73666f726d3d22736381527f616c6528322920726f7461746528323029207472616e736c617465283737382060208201527416989a949110343932b31e9111b1b432b1b591179f60591b604082015260550190565b7f3c75736520636c6173733d227469636b3422207472616e73666f726d3d22736381527f616c6528322920726f7461746528323029207472616e736c6174652837383020602082015274169899949110343932b31e9111b1b432b1b591179f60591b604082015260550190565b7f3c7374796c6520747970653d22746578742f637373223e00000000000000000081526e173137b93232b9103d903334b6361d60891b60178201525f8551613c58816026850160208a01612fef565b7f3b20616e696d6174696f6e3a20626f72646572416e696d6174696f6e20302e316026918401918201527f367320696e66696e69746520616c7465726e6174653b7d00000000000000000060468201528551613cbb81605d840160208a01612fef565b7f406b65796672616d657320626f72646572416e696d6174696f6e207b30252c35605d9290910191820152671812bdb334b6361d60c11b607d820152613d04608582018661350a565b6f1dbe9a98929618981812bdb334b6361d60811b81529050613d29601082018561350a565b623b7d7d60e81b8152671e17b9ba3cb6329f60c11b6003820152600b01979650505050505050565b7f3c737667207374796c653d226261636b67726f756e642d636f6c6f723a23313181526501898989891160d51b60208201527f76696577426f783d2230203020383030203830302220786d6c6e733d2268747460268201527f703a2f2f7777772e77332e6f72672f323030302f737667223e0000000000000060468201527f3c73766720636c6173733d22696e6e6572222077696474683d22313030252220605f8201527f6865696768743d2231303025222076696577426f783d22302030203230303020607f8201526519181818111f60d11b609f820152651e3232b3399f60d11b60a58201525f613e50613e4a60ab84018961350a565b8761350a565b661e17b232b3399f60c91b81527f3c726563742077696474683d223130302522206865696768743d223130302522600782015270103334b6361e9111983198b1193191179f60791b60278201527f3c7265637420783d2234252220793d2234252220636c6173733d22626f72646560388201527f72222077696474683d2239322522206865696768743d22393225222f3e0000006058820152607581017f3c7265637420783d2238252220793d2238252220636c6173733d22000000000081529050613f1f601b82018761350a565b7f222077696474683d2238342522206865696768743d22383425222f3e00000000815290507f3c7265637420783d223130252220793d223130252220636c6173733d22686561601c8201527f64222077696474683d2238302522206865696768743d22383025222f3e000000603c820152613fa5613f9f60598301613e4a565b8561350a565b651e17b9bb339f60d11b8082526006820152600c0198975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b630e4cec4560e31b81525f8451613ff8816004850160208901612fef565b8083019050600b60fa1b806004830152855161401b816005850160208a01612fef565b60059201918201528351614036816006840160208801612fef565b602960f81b6006929091019182015260070195945050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525f825161408881601a850160208701612fef565b91909101601a0192915050565b94855260609390931b6bffffffffffffffffffffffff1916602085015260348401919091526054830152607482015260940190565b5f80858511156140d8575f80fd5b838611156140e4575f80fd5b5050820193919092039150565b80820180821115610924576109246134a5565b5f82614112576141126134d0565b500690565b5f82601f830112614126575f80fd5b8151614134613256826131c5565b818152846020838601011115614148575f80fd5b6119e7826020830160208701612fef565b5f806040838503121561416a575f80fd5b825167ffffffffffffffff80821115614181575f80fd5b61418d86838701614117565b935060208501519150808211156141a2575f80fd5b506141af85828601614117565b9150509250929050565b5f602082840312156141c9575f80fd5b815167ffffffffffffffff8111156141df575f80fd5b6119e784828501614117565b5f82516141fc818460208701612fef565b9190910192915050565b5f60018201614217576142176134a5565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b683d913730b6b2911d1160b91b815286515f9060206142958260098601838d01612fef565b8851918401916142ac816009850160208d01612fef565b701116113232b9b1b934b83a34b7b7111d1160791b6009939091019283015287516142de81601a850160208c01612fef565b61088b60f21b601a93909101928301526f1132bc3a32b93730b62fbab936111d1160811b601c8301528654602c905f90614317816132f6565b6001828116801561432f576001811461434a57614379565b60ff198416602c890152602c83151584028901019450614379565b8c5f5260205f205f5b8481101561436e5781548a8201890152908301908801614353565b5050602c8389010194505b505050506143d86143ca6143c46143ae6143a8856e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b8c61350a565b69161134b6b0b3b2911d1160b11b8152600a0190565b8961350a565b61227d60f01b815260020190565b9c9b505050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161441f81601d850160208701612fef565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061445e90830184613011565b9695505050505050565b5f60208284031215614478575f80fd5b8151611b3681612fbf565b7f7d2c7b2274726169745f74797065223a22636861726974794777656929222c228152663b30b63ab2911d60c91b60208201525f82516144ca816027850160208701612fef565b9190910160270192915050565b7f5b7b2274726169745f74797065223a22666c6970222c2276616c7565223a220081525f885161450e81601f850160208d01612fef565b7f227d2c7b2274726169745f74797065223a22636f6c6f757231222c2276616c75601f918401918201526332911d1160e11b603f8201819052895161455a816043850160208e01612fef565b7f227d2c7b2274726169745f74797065223a22636f6c6f757232222c2276616c75604393909101928301526063820152875161459d816067840160208c01612fef565b7f227d2c7b2274726169745f74797065223a22666c697073222c2276616c75652260679290910191820152601d60f91b6087820152614624613f9f613e4a6145f16145eb608886018c61350a565b8a61350a565b7f7d2c7b2274726169745f74797065223a227374617465222c2276616c7565223a8152601160f91b602082015260210190565b62227d5d60e81b81526003019a995050505050505050505056fe227d2c7b2274726169745f74797065223a22495069747479546865466f6f222c2276616c7565223a22796f75416e206f6e2d636861696e206861636b206f662046524553482048454c4c2023312c20414c474f2042524f2062792058434f50592e204e6f7420746f206265207573656420666f72206d616b696e6720696d706f7274616e74206c696665206465636973696f6e732e20434330a26469706673582212205bcda8aa133bdcc8dc00ab313fbfb322ea8618c6231865adc441e3bb6ab6ce9d64736f6c63430008170033

Deployed Bytecode

0x6080604052600436106102a8575f3560e01c80638f742d161161016f578063c35436cc116100d8578063d5abeb0111610092578063e985e9c51161006d578063e985e9c5146107dc578063ee65686314610823578063f19e75d414610838578063f2fde38b1461084b575f80fd5b8063d5abeb0114610795578063df3c3a30146107aa578063e0b6bb67146107c8575f80fd5b8063c35436cc146106f7578063c87b56dd14610716578063cf079b5a14610735578063d123973014610754578063d3dd5fe01461076d578063d46b04e814610781575f80fd5b8063abf2b84011610129578063abf2b84014610652578063b081f77314610671578063b63a50c914610690578063b88d4fde146106af578063b99edfb2146106ce578063bd8e05a6146106e2575f80fd5b80638f742d16146105b557806395d89b41146105d4578063a0712d68146105e8578063a22cb465146105fb578063a4e2d6341461061a578063a88d78f014610633575f80fd5b806337869b6c1161021157806370a08231116101cb57806370a0823114610510578063715018a61461052f578063724441dd146105435780637284e4161461057057806384b67786146105845780638da5cb5b14610598575f80fd5b806337869b6c146104665780633ccfd60b1461048a57806342842e0e1461049e57806362ce030c146104bd5780636352211e146104d25780636dcee4ca146104f1575f80fd5b806318160ddd1161026257806318160ddd146103a2578063221e885d146103b657806323b872dd146103c95780632a55205a146103e85780632e5b466514610426578063368660381461043b575f80fd5b806301dbcd4a146102b357806301ffc9a7146102d457806306fdde0314610308578063081812fc14610329578063095ea7b31461036057806313966db51461037f575f80fd5b366102af57005b5f80fd5b3480156102be575f80fd5b506102d26102cd366004612f80565b61086a565b005b3480156102df575f80fd5b506102f36102ee366004612fd4565b6108af565b60405190151581526020015b60405180910390f35b348015610313575f80fd5b5061031c61092a565b6040516102ff919061303c565b348015610334575f80fd5b5061034861034336600461304e565b6109b9565b6040516001600160a01b0390911681526020016102ff565b34801561036b575f80fd5b506102d261037a366004613080565b610a3f565b34801561038a575f80fd5b50610394600a5481565b6040519081526020016102ff565b3480156103ad575f80fd5b50610394610b4e565b6102d26103c436600461304e565b610b5d565b3480156103d4575f80fd5b506102d26103e33660046130a8565b610e06565b3480156103f3575f80fd5b506104076104023660046130e1565b610e37565b604080516001600160a01b0390931683526020830191909152016102ff565b348015610431575f80fd5b50610394600b5481565b348015610446575f80fd5b50610394610455366004613101565b60086020525f908152604090205481565b348015610471575f80fd5b506011546103489061010090046001600160a01b031681565b348015610495575f80fd5b506102d2610e8e565b3480156104a9575f80fd5b506102d26104b83660046130a8565b610f1f565b3480156104c8575f80fd5b5061039460125481565b3480156104dd575f80fd5b506103486104ec36600461304e565b610f39565b3480156104fc575f80fd5b5061031c61050b36600461304e565b610faf565b34801561051b575f80fd5b5061039461052a366004613101565b61132c565b34801561053a575f80fd5b506102d26113b1565b34801561054e575f80fd5b5061056261055d366004612f80565b6113e6565b6040516102ff92919061311a565b34801561057b575f80fd5b5061031c6114ca565b34801561058f575f80fd5b506102d26114e6565b3480156105a3575f80fd5b506006546001600160a01b0316610348565b3480156105c0575f80fd5b5061031c6105cf36600461304e565b611556565b3480156105df575f80fd5b5061031c6115b6565b6102d26105f636600461304e565b6115c5565b348015610606575f80fd5b506102d2610615366004613147565b6117f1565b348015610625575f80fd5b506011546102f39060ff1681565b34801561063e575f80fd5b506102d261064d36600461304e565b6117fc565b34801561065d575f80fd5b506102d261066c36600461304e565b6118a0565b34801561067c575f80fd5b506102d261068b3660046130e1565b6118cf565b34801561069b575f80fd5b5061031c6106aa366004612f80565b611993565b3480156106ba575f80fd5b506102d26106c93660046131ec565b6119ef565b3480156106d9575f80fd5b5061031c611a27565b3480156106ed575f80fd5b5061039460135481565b348015610702575f80fd5b506102d2610711366004613101565b611ab3565b348015610721575f80fd5b5061031c61073036600461304e565b611b05565b348015610740575f80fd5b506102d261074f366004613080565b611b3d565b34801561075f575f80fd5b50600d546102f39060ff1681565b348015610778575f80fd5b506102d2611c5c565b34801561078c575f80fd5b506102d2611cf2565b3480156107a0575f80fd5b506103946103e881565b3480156107b5575f80fd5b50600d546102f390610100900460ff1681565b3480156107d3575f80fd5b506102d2611d2f565b3480156107e7575f80fd5b506102f36107f6366004613290565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b34801561082e575f80fd5b50610394600c5481565b6102d261084636600461304e565b611d6a565b348015610856575f80fd5b506102d2610865366004613101565b611f82565b6006546001600160a01b0316331461089d5760405162461bcd60e51b8152600401610894906132c1565b60405180910390fd5b600e6108aa82848361336c565b505050565b5f6001600160e01b031982166380ac58cd60e01b14806108df57506001600160e01b03198216635b5e139f60e01b145b806108fa57506001600160e01b0319821663152a902d60e11b145b8061091557506001600160e01b03198216632483248360e11b145b8061092457506109248261201d565b92915050565b60605f8054610938906132f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610964906132f6565b80156109af5780601f10610986576101008083540402835291602001916109af565b820191905f5260205f20905b81548152906001019060200180831161099257829003601f168201915b5050505050905090565b5f6109c38261206c565b610a245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610894565b505f908152600460205260409020546001600160a01b031690565b5f610a4982610f39565b9050806001600160a01b0316836001600160a01b031603610ab65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610894565b336001600160a01b0382161480610ad25750610ad281336107f6565b610b445760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610894565b6108aa8383612088565b5f610b5860095490565b905090565b80610b678161206c565b610b835760405162461bcd60e51b815260040161089490613426565b600c54339083903490811015610bd25760405162461bcd60e51b81526020600482015260146024820152731a5b98dbdc9c9958dd081d985b1d59481cd95b9d60621b6044820152606401610894565b610bdb82610f39565b6001600160a01b0316836001600160a01b031614610c2d5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b6044820152606401610894565b610c356120f5565b15610c825760405162461bcd60e51b815260206004820152601f60248201527f666c69702069732062726f6b656e2e20706c65617365207374616e64206279006044820152606401610894565b5f8281526007602052604090208054600160e81b900460ff1615610ce05760405162461bcd60e51b81526020600482015260156024820152741d1bdad95b881a185cc81899595b881b1bd8dad959605a1b6044820152606401610894565b604080514460208201526bffffffffffffffffffffffff19606087901b1691810191909152436054820152607481018490525f9060940160408051601f19818403018152908290528051602090910120835468ffffffffffffffffff600160901b61ffff600160d81b607086901c71ffffffffffffffffffffffffffffffffffff19861681178290048316600101909216027fffffff0000ffffffffffffffffff00000000000000000000000000000000000090941617929092178281048216880190911690910268ffffffffffffffffff60901b19909116178455601280548601905591507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce790610df59086815260200190565b60405180910390a150505050505050565b610e103382612133565b610e2c5760405162461bcd60e51b815260040161089490613454565b6108aa838383612216565b5f8083610e438161206c565b610e5f5760405162461bcd60e51b815260040161089490613426565b6006546001600160a01b03166064610e786005876134b9565b610e8291906134e4565b92509250509250929050565b6006546001600160a01b03163314610eb85760405162461bcd60e51b8152600401610894906132c1565b5f60125447610ec791906134f7565b6040519091505f90339083908381818185875af1925050503d805f8114610f09576040519150601f19603f3d011682016040523d82523d5f602084013e610f0e565b606091505b5050905080610f1b575f80fd5b5050565b6108aa83838360405180602001604052805f8152506119ef565b5f818152600260205260408120546001600160a01b0316806109245760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610894565b606081610fbb8161206c565b610fd75760405162461bcd60e51b815260040161089490613426565b5f805f610fe3866123ae565b9250925092506060806060806060610ff96120f5565b1561100357600297505b8760010361115d57604051806040016040528060058152602001640dadeeae8d60db1b81525094506040516020016110fd907f3c75736520636c6173733d227469636b312220687265663d22235469636b3122815261179f60f11b602082018190527f3c75736520636c6173733d227469636b322220687265663d22235469636b32226022830152604282018190527f3c75736520636c6173733d227469636b332220687265663d22235469636b33226044830152606482018190527f3c75736520636c6173733d227469636b342220687265663d22235469636b342260668301526086820152631e17b39f60e11b6088820152608c0190565b60405160208183030381529060405293508384604051602001611121929190613525565b6040516020818303038152906040529250868787604051602001611147939291906135d5565b604051602081830303815290604052915061128b565b604051806040016040528060058152602001640e8cacae8d60db1b815250945060405160200161122f907f3c75736520636c6173733d226672616d65312220687265663d22235831222f3e81527f3c75736520636c6173733d226672616d65322220687265663d22235832222f3e60208201527f3c75736520636c6173733d226672616d65332220687265663d22235833222f3e60408201527f3c75736520636c6173733d226672616d65342220687265663d22235834222f3e6060820152631e17b39f60e11b608082015260840190565b604051602081830303815290604052935083846040516020016112539291906136d4565b604051602081830303815290604052925086878760405160200161127993929190613782565b60405160208183030381529060405291505b876002036112c25783846040516020016112a6929190613879565b60405160208183030381529060405292506112bf61249e565b90505b5f868389896040516020016112da9493929190613c09565b60405160208183030381529060405290506112f361250d565b8287868460405160200161130b959493929190613d51565b6040516020818303038152906040529a505050505050505050505b50919050565b5f6001600160a01b0382166113965760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610894565b506001600160a01b03165f9081526003602052604090205490565b6006546001600160a01b031633146113db5760405162461bcd60e51b8152600401610894906132c1565b6113e45f6125d8565b565b60608061140e8484601f8181106113ff576113ff613fc6565b919091013560f81c9050612629565b6114248585601e8181106113ff576113ff613fc6565b61143a8686601d8181106113ff576113ff613fc6565b60405160200161144c93929190613fda565b6040516020818303038152906040526114718585601c8181106113ff576113ff613fc6565b6114878686601b8181106113ff576113ff613fc6565b61149d8787601a8181106113ff576113ff613fc6565b6040516020016114af93929190613fda565b604051602081830303815290604052915091505b9250929050565b6040518060a00160405280606d815260200161466b606d913981565b6006546001600160a01b031633146115105760405162461bcd60e51b8152600401610894906132c1565b7f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c600161153c60095490565b6040805192835260208301919091520160405180910390a1565b6060816115628161206c565b61157e5760405162461bcd60e51b815260040161089490613426565b61158f61158a84610faf565b612726565b60405160200161159f9190614051565b604051602081830303815290604052915050919050565b606060018054610938906132f6565b600d5460ff166116175760405162461bcd60e51b815260206004820152601960248201527f6d696e74696e6720686173206265656e2064697361626c6564000000000000006044820152606401610894565b600b54335f8181526008602052604090205490918391600390830111156116725760405162461bcd60e51b815260206004820152600f60248201526e6d696e74206c696d6974206f66203360881b6044820152606401610894565b6103e88261167f60095490565b0111156116c35760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b6044820152606401610894565b600a54820234146117165760405162461bcd60e51b815260206004820152601c60248201527f696e76616c642076616c756520666f72207472616e61736374696f6e000000006044820152606401610894565b601280548383020190556001600160a01b0383165f90815260086020526040902080548301905560015b8281116117ea57611755600980546001019055565b5f61175f60095490565b5f8181526007602090815260408083209051939450926117899144918a91879143918a9101614095565b60408051601f198184030181529190528051602090910120825468ffffffffffffffffff8716600160901b026001600160d81b0319909116607083901c1717835590506117d68784612733565b5050506117e38160010190565b9050611740565b5050505050565b610f1b33838361274c565b806118068161206c565b6118225760405162461bcd60e51b815260040161089490613426565b8161182c81610f39565b6001600160a01b0316336001600160a01b03161461187e5760405162461bcd60e51b815260206004820152600f60248201526e3737ba103a37b5b2b71037bbb732b960891b6044820152606401610894565b5f908152600760205260409020805460ff60e81b1916600160e81b1790555050565b6006546001600160a01b031633146118ca5760405162461bcd60e51b8152600401610894906132c1565b600c55565b6006546001600160a01b031633146118f95760405162461bcd60e51b8152600401610894906132c1565b60115460ff16156119415760405162461bcd60e51b81526020600482015260126024820152716e6f7420666f6f6c696e6720616e796f6e6560701b6044820152606401610894565b620697808111156119885760405162461bcd60e51b815260206004820152601160248201527037bb32b91036b0bc10323ab930ba34b7b760791b6044820152606401610894565b600f91909155601055565b60605f6119a561deeb606b85876140ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509293506119e792508391506128199050565b949350505050565b6119f93383612133565b611a155760405162461bcd60e51b815260040161089490613454565b611a2184848484612913565b50505050565b600e8054611a34906132f6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a60906132f6565b8015611aab5780601f10611a8257610100808354040283529160200191611aab565b820191905f5260205f20905b815481529060010190602001808311611a8e57829003601f168201915b505050505081565b6006546001600160a01b03163314611add5760405162461bcd60e51b8152600401610894906132c1565b601180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b606081611b118161206c565b611b2d5760405162461bcd60e51b815260040161089490613426565b611b3683612946565b9392505050565b60115461010090046001600160a01b03163314611b935760405162461bcd60e51b81526020600482015260146024820152731cd95b99195c881b9bdd0819195b1959d85d195960621b6044820152606401610894565b6012548181811115611be75760405162461bcd60e51b815260206004820152601860248201527f6e6f7420656e6f7567682066756e647320696e2062616e6b00000000000000006044820152606401610894565b805f03611bf15750805b60138054820190556012805482900390556040515f906001600160a01b0386169083908381818185875af1925050503d805f8114611c4a576040519150601f19603f3d011682016040523d82523d5f602084013e611c4f565b606091505b50509050806117ea575f80fd5b6006546001600160a01b03163314611c865760405162461bcd60e51b8152600401610894906132c1565b600d54610100900460ff1615611cde5760405162461bcd60e51b815260206004820152601760248201527f6d696e74696e6720686173206265656e206c6f636b65640000000000000000006044820152606401610894565b600d805460ff19811660ff90911615179055565b6006546001600160a01b03163314611d1c5760405162461bcd60e51b8152600401610894906132c1565b5f600f556011805460ff19166001179055565b6006546001600160a01b03163314611d595760405162461bcd60e51b8152600401610894906132c1565b600d805461ff001916610100179055565b6006546001600160a01b03163314611d945760405162461bcd60e51b8152600401610894906132c1565b5f611da76006546001600160a01b031690565b600b546001600160a01b0382165f908152600860205260409020549192508391600a9083011115611e0c5760405162461bcd60e51b815260206004820152600f60248201526e6d696e74206c696d6974206f66203560881b6044820152606401610894565b6103e882611e1960095490565b011115611e5d5760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b6044820152606401610894565b818102348114611eaf5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c642076616c756520666f72207472616e61736374696f6e000000006044820152606401610894565b6012805490910190556001600160a01b0383165f90815260086020526040902080548301905560015b8281116117ea57611eed600980546001019055565b5f611ef760095490565b5f818152600760209081526040808320905193945092611f219144918a91879143918a9101614095565b60408051601f198184030181529190528051602090910120825468ffffffffffffffffff8716600160901b026001600160d81b0319909116607083901c171783559050611f6e8784612733565b505050611f7b8160010190565b9050611ed8565b6006546001600160a01b03163314611fac5760405162461bcd60e51b8152600401610894906132c1565b6001600160a01b0381166120115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610894565b61201a816125d8565b50565b5f6001600160e01b031982166380ac58cd60e01b148061204d57506001600160e01b03198216635b5e139f60e01b145b8061092457506301ffc9a760e01b6001600160e01b0319831614610924565b5f908152600260205260409020546001600160a01b0316151590565b5f81815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906120bc82610f39565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f600f545f0361210457505f90565b60115460ff161561211457505f90565b601054600f5442918101908211801561212c57508082105b9250505090565b5f61213d8261206c565b61219e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610894565b5f6121a883610f39565b9050806001600160a01b0316846001600160a01b031614806121e35750836001600160a01b03166121d8846109b9565b6001600160a01b0316145b806119e757506001600160a01b038082165f9081526005602090815260408083209388168352929052205460ff166119e7565b826001600160a01b031661222982610f39565b6001600160a01b03161461228d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610894565b6001600160a01b0382166122ef5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610894565b6122f95f82612088565b6001600160a01b0383165f9081526003602052604081208054600192906123219084906134f7565b90915550506001600160a01b0382165f90815260036020526040812080546001929061234e9084906140f1565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5f81815260076020526040812054606090819071ffffffffffffffffffffffffffffffffffff16836123e1601983614104565b5f036123ef575060026123fd565b6123fa600283614104565b90505b5f80306001600160a01b031663724441dd8560405160200161242191815260200190565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161244c919061303c565b5f60405180830381865afa158015612466573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261248d9190810190614159565b939990985092965091945050505050565b6015546040516344b285db60e01b8152600160048201526060916001600160a01b0316906344b285db906024015b5f60405180830381865afa1580156124e6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b5891908101906141b9565b60145460405163e9dc637560e01b815273bb6eefd83daab02fa1a697eb9d8495eec9f9b384600482015260016024820152606091309163b63a50c9916001600160a01b03169063e9dc6375906044015f60405180830381865afa158015612576573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261259d91908101906141b9565b6040516020016125ad91906141eb565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016124cc919061303c565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6060815f0361264f5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115612678578061266281614206565b91506126719050600a836134e4565b9150612652565b5f8167ffffffffffffffff81111561269257612692613180565b6040519080825280601f01601f1916602001820160405280156126bc576020820181803683370190505b5090505b84156119e7576126d16001836134f7565b91506126de600a86614104565b6126e99060306140f1565b60f81b8183815181106126fe576126fe613fc6565b60200101906001600160f81b03191690815f1a90535061271f600a866134e4565b94506126c0565b6060610924825f806129e0565b610f1b828260405180602001604052805f815250612ac5565b816001600160a01b0316836001600160a01b0316036127ad5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610894565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060815180156113265760038160021c026003821661284e5783820151613d3d18601e81901a1560ff90911615019003612857565b60038216015f19015b60405192508083526020830181810191507ffc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc80605b527804080c1014181c2024282c3034383c4044484c5054585c6064603b526ef8fcf800fcd0d4d8dce0e4e8ecf0f4601a525b600486019550855180601f1a5160061c81601e1a5183161760061c81601d1a5183161760061c81601c1a518316178352506003820191508282106128be575050602081016040525f8152505f60605250919050565b61291e848484612216565b61292a84848484612af7565b611a215760405162461bcd60e51b81526004016108949061421e565b60605f8290506129d0604051806040016040528060098152602001684368656b6f7258202360b81b81525061297a83612629565b6040518060a00160405280606d815260200161466b606d9139600e61299e86612bf4565b6129a787611556565b6040516020016129bc96959493929190614270565b604051602081830303815290604052612726565b60405160200161159f91906143e8565b606083518015612abd576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16515f53603f81600c1c1651600153603f8160061c1651600253603f811651600353505f518252600482019150808210612a5057602001604052613d3d60f01b60038406600204808303919091525f8615159091029182900352900382525b509392505050565b612acf8383612e11565b612adb5f848484612af7565b6108aa5760405162461bcd60e51b81526004016108949061421e565b5f6001600160a01b0384163b15612be957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b3a90339089908890889060040161442c565b6020604051808303815f875af1925050508015612b74575060408051601f3d908101601f19168201909252612b7191810190614468565b60015b612bcf573d808015612ba1576040519150601f19603f3d011682016040523d82523d5f602084013e612ba6565b606091505b5080515f03612bc75760405162461bcd60e51b81526004016108949061421e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119e7565b506001949350505050565b5f81815260076020908152604080832081516080810183529054607081901b6dffffffffffffffffffffffffffff19168252600160901b810468ffffffffffffffffff1693820193909352600160d81b830461ffff1691810191909152600160e81b90910460ff161515606080830191909152918391908080612c76856123ae565b9250925092506060835f03612ca357506040805180820190915260018152600f60fb1b6020820152612ceb565b83600103612ccd5750604080518082019091526005815264636865636b60d81b6020820152612ceb565b50604080518082019091526005815264736d696c6560d81b60208201525b6060856060015115612d1a57506040805180820190915260068152651b1bd8dad95960d21b6020820152612d3b565b506040805180820190915260088152671d5b9b1bd8dad95960c21b60208201525b6060612d456120f5565b15612d87576040518060600160405280602c815260200161463f602c91399050604051806040016040528060068152602001651b1bd8dad95960d21b81525091505b5f612d99886040015161ffff16612629565b90506060612dd3633b9aca008a6020015168ffffffffffffffffff1681612dc257612dc26134d0565b0468ffffffffffffffffff16612629565b604051602001612de39190614483565b60405160208183030381529060405290508487878484888860405160200161130b97969594939291906144d7565b6001600160a01b038216612e675760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610894565b612e708161206c565b15612ebd5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610894565b6001600160a01b0382165f908152600360205260408120805460019290612ee59084906140f1565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8083601f840112612f52575f80fd5b50813567ffffffffffffffff811115612f69575f80fd5b6020830191508360208285010111156114c3575f80fd5b5f8060208385031215612f91575f80fd5b823567ffffffffffffffff811115612fa7575f80fd5b612fb385828601612f42565b90969095509350505050565b6001600160e01b03198116811461201a575f80fd5b5f60208284031215612fe4575f80fd5b8135611b3681612fbf565b5f5b83811015613009578181015183820152602001612ff1565b50505f910152565b5f8151808452613028816020860160208601612fef565b601f01601f19169290920160200192915050565b602081525f611b366020830184613011565b5f6020828403121561305e575f80fd5b5035919050565b80356001600160a01b038116811461307b575f80fd5b919050565b5f8060408385031215613091575f80fd5b61309a83613065565b946020939093013593505050565b5f805f606084860312156130ba575f80fd5b6130c384613065565b92506130d160208501613065565b9150604084013590509250925092565b5f80604083850312156130f2575f80fd5b50508035926020909101359150565b5f60208284031215613111575f80fd5b611b3682613065565b604081525f61312c6040830185613011565b828103602084015261313e8185613011565b95945050505050565b5f8060408385031215613158575f80fd5b61316183613065565b915060208301358015158114613175575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131bd576131bd613180565b604052919050565b5f67ffffffffffffffff8211156131de576131de613180565b50601f01601f191660200190565b5f805f80608085870312156131ff575f80fd5b61320885613065565b935061321660208601613065565b925060408501359150606085013567ffffffffffffffff811115613238575f80fd5b8501601f81018713613248575f80fd5b803561325b613256826131c5565b613194565b81815288602083850101111561326f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156132a1575f80fd5b6132aa83613065565b91506132b860208401613065565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061330a57607f821691505b60208210810361132657634e487b7160e01b5f52602260045260245ffd5b601f8211156108aa57805f5260205f20601f840160051c8101602085101561334d5750805b601f840160051c820191505b818110156117ea575f8155600101613359565b67ffffffffffffffff83111561338457613384613180565b6133988361339283546132f6565b83613328565b5f601f8411600181146133c9575f85156133b25750838201355b5f19600387901b1c1916600186901b1783556117ea565b5f83815260208120601f198716915b828110156133f857868501358255602094850194600190920191016133d8565b5086821015613414575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252601490820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610924576109246134a5565b634e487b7160e01b5f52601260045260245ffd5b5f826134f2576134f26134d0565b500490565b81810381811115610924576109246134a5565b5f815161351b818560208601612fef565b9290920192915050565b7f3c67207472616e73666f726d3d227363616c65283629207472616e736c61746581526e141698991a981016989a1a9814911f60891b60208201525f835161357481602f850160208801612fef565b7f3c67207472616e73666f726d3d227363616c65283329207472616e736c617465602f918401918201526e14169919999810169899181814911f60891b604f82015283516135c981605e840160208801612fef565b01605e01949350505050565b6b1736b7baba343db334b6361d60a11b81525f84516135fb81600c850160208901612fef565b607d60f81b600c918401918201526b173a34b1b598bdb334b6361d60a11b600d8201528451613631816019840160208901612fef565b753b616e696d6174696f6e2d64656c61793a302e35737d60501b60199290910191820152732e7469636b327b66696c6c3a233466633766397d60601b602f820152732e7469636b337b66696c6c3a233531666638327d60601b60438201526b173a34b1b59a3db334b6361d60a11b605782015283516136b7816063840160208801612fef565b016063016136c881607d60f81b9052565b60010195945050505050565b7f3c67207472616e73666f726d3d227363616c65283529207472616e736c61746581526d1416989c1b1c10169c991814911f60911b60208201525f835161372281602e850160208801612fef565b7f3c67207472616e73666f726d3d227363616c65283129207472616e736c617465602e918401918201526d141698981b1c101698991814911f60911b604e820152835161377681605c840160208801612fef565b01605c01949350505050565b6b173a32b2ba343db334b6361d60a11b81525f84516137a881600c850160208901612fef565b607d60f81b600c918401918201526c17333930b6b298bdb334b6361d60991b600d82015284516137df81601a840160208901612fef565b753b616e696d6174696f6e2d64656c61793a302e35737d60501b601a9290910191820152742e6672616d65327b66696c6c3a236666343264357d60581b6030820152742e6672616d65337b66696c6c3a236666306330637d60581b60458201526c17333930b6b29a3db334b6361d60991b605a8201528351613868816067840160208801612fef565b016067016136c881607d60f81b9052565b7f3c67207472616e73666f726d3d227363616c65283129207472616e736c61746581526d14169c181810169898181814911f60911b6020820152731e3ab9b290343932b31e9111a6a7aaaa2411179f60611b602e8201527f3c75736520636c6173733d226672616d653122207472616e73666f726d3d227360428201527f63616c65283120302e3829207472616e736c617465283020353630292220687260628201526c32b31e9111a6a7aaaa2411179f60991b6082820152731e3ab9b290343932b31e9111aa22a2aa2411179f60611b608f8201527f3c75736520636c6173733d227469636b3322207472616e73666f726d3d22747260a38201527f616e736c6174652835203130292220687265663d22235445455448222f3e000060c3820152631e17b39f60e11b60e18201527f3c67207472616e73666f726d3d227363616c6528312e352920726f746174652860e58201527f323029207472616e736c617465282d31303030202d3131323029223e000000006101058201525f6119e7613b9c613b2f613acd613a6b613a65613a1661012189018b61350a565b7f3c67207472616e73666f726d3d227363616c6528322920726f74617465282d3181527f3529207472616e736c617465282d31373638202d38323029223e0000000000006020820152603a0190565b8861350a565b7f3c75736520636c6173733d227469636b3122207472616e73666f726d3d22736381527f616c65283329207472616e736c6174652832323020313330292220687265663d6020820152691111b1b432b1b591179f60b11b6040820152604a0190565b7f3c75736520636c6173733d227469636b3222207472616e73666f726d3d22736381527f616c65283329207472616e736c6174652832323320313332292220687265663d6020820152691111b1b432b1b591179f60b11b6040820152604a0190565b7f3c75736520636c6173733d227469636b3322207472616e73666f726d3d22736381527f616c6528322920726f7461746528323029207472616e736c617465283737382060208201527416989a949110343932b31e9111b1b432b1b591179f60591b604082015260550190565b7f3c75736520636c6173733d227469636b3422207472616e73666f726d3d22736381527f616c6528322920726f7461746528323029207472616e736c6174652837383020602082015274169899949110343932b31e9111b1b432b1b591179f60591b604082015260550190565b7f3c7374796c6520747970653d22746578742f637373223e00000000000000000081526e173137b93232b9103d903334b6361d60891b60178201525f8551613c58816026850160208a01612fef565b7f3b20616e696d6174696f6e3a20626f72646572416e696d6174696f6e20302e316026918401918201527f367320696e66696e69746520616c7465726e6174653b7d00000000000000000060468201528551613cbb81605d840160208a01612fef565b7f406b65796672616d657320626f72646572416e696d6174696f6e207b30252c35605d9290910191820152671812bdb334b6361d60c11b607d820152613d04608582018661350a565b6f1dbe9a98929618981812bdb334b6361d60811b81529050613d29601082018561350a565b623b7d7d60e81b8152671e17b9ba3cb6329f60c11b6003820152600b01979650505050505050565b7f3c737667207374796c653d226261636b67726f756e642d636f6c6f723a23313181526501898989891160d51b60208201527f76696577426f783d2230203020383030203830302220786d6c6e733d2268747460268201527f703a2f2f7777772e77332e6f72672f323030302f737667223e0000000000000060468201527f3c73766720636c6173733d22696e6e6572222077696474683d22313030252220605f8201527f6865696768743d2231303025222076696577426f783d22302030203230303020607f8201526519181818111f60d11b609f820152651e3232b3399f60d11b60a58201525f613e50613e4a60ab84018961350a565b8761350a565b661e17b232b3399f60c91b81527f3c726563742077696474683d223130302522206865696768743d223130302522600782015270103334b6361e9111983198b1193191179f60791b60278201527f3c7265637420783d2234252220793d2234252220636c6173733d22626f72646560388201527f72222077696474683d2239322522206865696768743d22393225222f3e0000006058820152607581017f3c7265637420783d2238252220793d2238252220636c6173733d22000000000081529050613f1f601b82018761350a565b7f222077696474683d2238342522206865696768743d22383425222f3e00000000815290507f3c7265637420783d223130252220793d223130252220636c6173733d22686561601c8201527f64222077696474683d2238302522206865696768743d22383025222f3e000000603c820152613fa5613f9f60598301613e4a565b8561350a565b651e17b9bb339f60d11b8082526006820152600c0198975050505050505050565b634e487b7160e01b5f52603260045260245ffd5b630e4cec4560e31b81525f8451613ff8816004850160208901612fef565b8083019050600b60fa1b806004830152855161401b816005850160208a01612fef565b60059201918201528351614036816006840160208801612fef565b602960f81b6006929091019182015260070195945050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525f825161408881601a850160208701612fef565b91909101601a0192915050565b94855260609390931b6bffffffffffffffffffffffff1916602085015260348401919091526054830152607482015260940190565b5f80858511156140d8575f80fd5b838611156140e4575f80fd5b5050820193919092039150565b80820180821115610924576109246134a5565b5f82614112576141126134d0565b500690565b5f82601f830112614126575f80fd5b8151614134613256826131c5565b818152846020838601011115614148575f80fd5b6119e7826020830160208701612fef565b5f806040838503121561416a575f80fd5b825167ffffffffffffffff80821115614181575f80fd5b61418d86838701614117565b935060208501519150808211156141a2575f80fd5b506141af85828601614117565b9150509250929050565b5f602082840312156141c9575f80fd5b815167ffffffffffffffff8111156141df575f80fd5b6119e784828501614117565b5f82516141fc818460208701612fef565b9190910192915050565b5f60018201614217576142176134a5565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b683d913730b6b2911d1160b91b815286515f9060206142958260098601838d01612fef565b8851918401916142ac816009850160208d01612fef565b701116113232b9b1b934b83a34b7b7111d1160791b6009939091019283015287516142de81601a850160208c01612fef565b61088b60f21b601a93909101928301526f1132bc3a32b93730b62fbab936111d1160811b601c8301528654602c905f90614317816132f6565b6001828116801561432f576001811461434a57614379565b60ff198416602c890152602c83151584028901019450614379565b8c5f5260205f205f5b8481101561436e5781548a8201890152908301908801614353565b5050602c8389010194505b505050506143d86143ca6143c46143ae6143a8856e11161130ba3a3934b13aba32b9911d60891b8152600f0190565b8c61350a565b69161134b6b0b3b2911d1160b11b8152600a0190565b8961350a565b61227d60f01b815260020190565b9c9b505050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f825161441f81601d850160208701612fef565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061445e90830184613011565b9695505050505050565b5f60208284031215614478575f80fd5b8151611b3681612fbf565b7f7d2c7b2274726169745f74797065223a22636861726974794777656929222c228152663b30b63ab2911d60c91b60208201525f82516144ca816027850160208701612fef565b9190910160270192915050565b7f5b7b2274726169745f74797065223a22666c6970222c2276616c7565223a220081525f885161450e81601f850160208d01612fef565b7f227d2c7b2274726169745f74797065223a22636f6c6f757231222c2276616c75601f918401918201526332911d1160e11b603f8201819052895161455a816043850160208e01612fef565b7f227d2c7b2274726169745f74797065223a22636f6c6f757232222c2276616c75604393909101928301526063820152875161459d816067840160208c01612fef565b7f227d2c7b2274726169745f74797065223a22666c697073222c2276616c75652260679290910191820152601d60f91b6087820152614624613f9f613e4a6145f16145eb608886018c61350a565b8a61350a565b7f7d2c7b2274726169745f74797065223a227374617465222c2276616c7565223a8152601160f91b602082015260210190565b62227d5d60e81b81526003019a995050505050505050505056fe227d2c7b2274726169745f74797065223a22495069747479546865466f6f222c2276616c7565223a22796f75416e206f6e2d636861696e206861636b206f662046524553482048454c4c2023312c20414c474f2042524f2062792058434f50592e204e6f7420746f206265207573656420666f72206d616b696e6720696d706f7274616e74206c696665206465636973696f6e732e20434330a26469706673582212205bcda8aa133bdcc8dc00ab313fbfb322ea8618c6231865adc441e3bb6ab6ce9d64736f6c63430008170033

Deployed Bytecode Sourcemap

47168:19522:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65228:98;;;;;;;;;;-1:-1:-1;65228:98:0;;;;;:::i;:::-;;:::i;:::-;;49321:388;;;;;;;;;;-1:-1:-1;49321:388:0;;;;;:::i;:::-;;:::i;:::-;;;1334:14:1;;1327:22;1309:41;;1297:2;1282:18;49321:388:0;;;;;;;;21879:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23438:221::-;;;;;;;;;;-1:-1:-1;23438:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2488:32:1;;;2470:51;;2458:2;2443:18;23438:221:0;2324:203:1;22961:411:0;;;;;;;;;;-1:-1:-1;22961:411:0;;;;;:::i;:::-;;:::i;47639:35::-;;;;;;;;;;;;;;;;;;;3115:25:1;;;3103:2;3088:18;47639:35:0;2969:177:1;64770:93:0;;;;;;;;;;;;;:::i;52956:1056::-;;;;;;:::i;:::-;;:::i;24188:339::-;;;;;;;;;;-1:-1:-1;24188:339:0;;;;;:::i;:::-;;:::i;54738:242::-;;;;;;;;;;-1:-1:-1;54738:242:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3929:32:1;;;3911:51;;3993:2;3978:18;;3971:34;;;;3884:18;54738:242:0;3737:274:1;47679:40:0;;;;;;;;;;;;;;;;47418:42;;;;;;;;;;-1:-1:-1;47418:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;48347:30;;;;;;;;;;-1:-1:-1;48347:30:0;;;;;;;-1:-1:-1;;;;;48347:30:0;;;65782:210;;;;;;;;;;;;;:::i;24598:185::-;;;;;;;;;;-1:-1:-1;24598:185:0;;;;;:::i;:::-;;:::i;48454:26::-;;;;;;;;;;;;;;;;21573:239;;;;;;;;;;-1:-1:-1;21573:239:0;;;;;:::i;:::-;;:::i;57759:4217::-;;;;;;;;;;-1:-1:-1;57759:4217:0;;;;;:::i;:::-;;:::i;21303:208::-;;;;;;;;;;-1:-1:-1;21303:208:0;;;;;:::i;:::-;;:::i;37052:103::-;;;;;;;;;;;;;:::i;56510:613::-;;;;;;;;;;-1:-1:-1;56510:613:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;47982:153::-;;;;;;;;;;;;;:::i;55573:99::-;;;;;;;;;;;;;:::i;36401:87::-;;;;;;;;;;-1:-1:-1;36474:6:0;;-1:-1:-1;;;;;36474:6:0;36401:87;;62082:248;;;;;;;;;;-1:-1:-1;62082:248:0;;;;;:::i;:::-;;:::i;22048:104::-;;;;;;;;;;;;;:::i;50315:1236::-;;;;;;:::i;:::-;;:::i;23731:155::-;;;;;;;;;;-1:-1:-1;23731:155:0;;;;;:::i;:::-;;:::i;48250:20::-;;;;;;;;;;-1:-1:-1;48250:20:0;;;;;;;;54140:206;;;;;;;;;;-1:-1:-1;54140:206:0;;;;;:::i;:::-;;:::i;65400:83::-;;;;;;;;;;-1:-1:-1;65400:83:0;;;;;:::i;:::-;;:::i;54986:226::-;;;;;;;;;;-1:-1:-1;54986:226:0;;;;;:::i;:::-;;:::i;55825:208::-;;;;;;;;;;-1:-1:-1;55825:208:0;;;;;:::i;:::-;;:::i;24854:328::-;;;;;;;;;;-1:-1:-1;24854:328:0;;;;;:::i;:::-;;:::i;47918:59::-;;;;;;;;;;;;;:::i;48569:31::-;;;;;;;;;;;;;;;;65611:106;;;;;;;;;;-1:-1:-1;65611:106:0;;;;;:::i;:::-;;:::i;64958:159::-;;;;;;;;;;-1:-1:-1;64958:159:0;;;;;:::i;:::-;;:::i;66194:492::-;;;;;;;;;;-1:-1:-1;66194:492:0;;;;;:::i;:::-;;:::i;47814:23::-;;;;;;;;;;-1:-1:-1;47814:23:0;;;;;;;;49928:134;;;;;;;;;;;;;:::i;55218:81::-;;;;;;;;;;;;;:::i;47769:40::-;;;;;;;;;;;;47805:4;47769:40;;47842:22;;;;;;;;;;-1:-1:-1;47842:22:0;;;;;;;;;;;49813:69;;;;;;;;;;;;;:::i;23957:164::-;;;;;;;;;;-1:-1:-1;23957:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24078:25:0;;;24054:4;24078:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23957:164;47724:40;;;;;;;;;;;;;;;;51557:1278;;;;;;:::i;:::-;;:::i;37310:201::-;;;;;;;;;;-1:-1:-1;37310:201:0;;;;;:::i;:::-;;:::i;65228:98::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;;;;;;;;;65302:11:::1;:18;65316:4:::0;;65302:11;:18:::1;:::i;:::-;;65228:98:::0;;:::o;49321:388::-;49424:4;-1:-1:-1;;;;;;49453:40:0;;-1:-1:-1;;;49453:40:0;;:101;;-1:-1:-1;;;;;;;49506:48:0;;-1:-1:-1;;;49506:48:0;49453:101;:155;;;-1:-1:-1;;;;;;;49567:41:0;;-1:-1:-1;;;49567:41:0;49453:155;:201;;;-1:-1:-1;;;;;;;49621:33:0;;-1:-1:-1;;;49621:33:0;49453:201;:250;;;;49667:36;49691:11;49667:23;:36::i;:::-;49437:266;49321:388;-1:-1:-1;;49321:388:0:o;21879:100::-;21933:13;21966:5;21959:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21879:100;:::o;23438:221::-;23514:7;23542:16;23550:7;23542;:16::i;:::-;23534:73;;;;-1:-1:-1;;;23534:73:0;;10116:2:1;23534:73:0;;;10098:21:1;10155:2;10135:18;;;10128:30;10194:34;10174:18;;;10167:62;-1:-1:-1;;;10245:18:1;;;10238:42;10297:19;;23534:73:0;9914:408:1;23534:73:0;-1:-1:-1;23627:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23627:24:0;;23438:221::o;22961:411::-;23042:13;23058:23;23073:7;23058:14;:23::i;:::-;23042:39;;23106:5;-1:-1:-1;;;;;23100:11:0;:2;-1:-1:-1;;;;;23100:11:0;;23092:57;;;;-1:-1:-1;;;23092:57:0;;10529:2:1;23092:57:0;;;10511:21:1;10568:2;10548:18;;;10541:30;10607:34;10587:18;;;10580:62;-1:-1:-1;;;10658:18:1;;;10651:31;10699:19;;23092:57:0;10327:397:1;23092:57:0;16605:10;-1:-1:-1;;;;;23184:21:0;;;;:62;;-1:-1:-1;23209:37:0;23226:5;16605:10;23957:164;:::i;23209:37::-;23162:168;;;;-1:-1:-1;;;23162:168:0;;10931:2:1;23162:168:0;;;10913:21:1;10970:2;10950:18;;;10943:30;11009:34;10989:18;;;10982:62;11080:26;11060:18;;;11053:54;11124:19;;23162:168:0;10729:420:1;23162:168:0;23343:21;23352:2;23356:7;23343:8;:21::i;64770:93::-;64816:7;64841:16;:6;34926:14;;34834:114;64841:16;64834:23;;64770:93;:::o;52956:1056::-;53017:8;49167:17;49175:8;49167:7;:17::i;:::-;49159:50;;;;-1:-1:-1;;;49159:50:0;;;;;;;:::i;:::-;53228:10:::1;::::0;53054::::1;::::0;53089:8;;53123:9:::1;::::0;53216:22;::::1;;53208:55;;;::::0;-1:-1:-1;;;53208:55:0;;11705:2:1;53208:55:0::1;::::0;::::1;11687:21:1::0;11744:2;11724:18;;;11717:30;-1:-1:-1;;;11763:18:1;;;11756:50;11823:18;;53208:55:0::1;11503:344:1::0;53208:55:0::1;53291:16;53299:7;53291;:16::i;:::-;-1:-1:-1::0;;;;;53278:29:0::1;:9;-1:-1:-1::0;;;;;53278:29:0::1;;53270:57;;;::::0;-1:-1:-1;;;53270:57:0;;12054:2:1;53270:57:0::1;::::0;::::1;12036:21:1::0;12093:2;12073:18;;;12066:30;-1:-1:-1;;;12112:18:1;;;12105:45;12167:18;;53270:57:0::1;11852:339:1::0;53270:57:0::1;53343:9;:7;:9::i;:::-;53342:10;53334:54;;;::::0;-1:-1:-1;;;53334:54:0;;12398:2:1;53334:54:0::1;::::0;::::1;12380:21:1::0;12437:2;12417:18;;;12410:30;12476:33;12456:18;;;12449:61;12527:18;;53334:54:0::1;12196:355:1::0;53334:54:0::1;53395:23;53421:14:::0;;;:5:::1;:14;::::0;;;;53451:16;;-1:-1:-1;;;53451:16:0;::::1;;;53450:17;53442:51;;;::::0;-1:-1:-1;;;53442:51:0;;12758:2:1;53442:51:0::1;::::0;::::1;12740:21:1::0;12797:2;12777:18;;;12770:30;-1:-1:-1;;;12816:18:1;;;12809:51;12877:18;;53442:51:0::1;12556:345:1::0;53442:51:0::1;53525:275;::::0;;53584:16:::1;53525:275;::::0;::::1;13119:19:1::0;-1:-1:-1;;13176:2:1;13172:15;;;13168:53;13154:12;;;13147:75;;;;53695:12:0::1;13238::1::0;;;13231:28;13275:12;;;13268:28;;;53500:12:0::1;::::0;13312:13:1;;53525:275:0::1;::::0;;-1:-1:-1;;53525:275:0;;::::1;::::0;;;;;;;53515:286;;53525:275:::1;53515:286:::0;;::::1;::::0;53808:30;;53893:37:::1;-1:-1:-1::0;;;53864:20:0::1;-1:-1:-1::0;;;53808:30:0::1;::::0;;::::1;-1:-1:-1::0;;53808:30:0;::::1;::::0;::::1;53864:20:::0;;::::1;::::0;::::1;53808:30:::0;53864:20:::1;::::0;;::::1;;::::0;;;;;;;;::::1;53893:37:::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;;53893:37:0;;::::1;;::::0;;:17:::1;53939:23:::0;;;::::1;::::0;;53515:286;-1:-1:-1;53983:23:0::1;::::0;::::1;::::0;53998:7;3115:25:1;;3103:2;3088:18;;2969:177;53983:23:0::1;;;;;;;;53027:985;;;;;52956:1056:::0;;:::o;24188:339::-;24383:41;16605:10;24416:7;24383:18;:41::i;:::-;24375:103;;;;-1:-1:-1;;;24375:103:0;;;;;;;:::i;:::-;24491:28;24501:4;24507:2;24511:7;24491:9;:28::i;54738:242::-;54875:16;54893:21;54840:8;49167:17;49175:8;49167:7;:17::i;:::-;49159:50;;;;-1:-1:-1;;;49159:50:0;;;;;;;:::i;:::-;36474:6;;-1:-1:-1;;;;;36474:6:0;54970:3:::1;54940:27;47912:1;54940:10:::0;:27:::1;:::i;:::-;:33;;;;:::i;:::-;54923:51;;;;54738:242:::0;;;;;;:::o;65782:210::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;65828:21:::1;65876:11;;65852:21;:35;;;;:::i;:::-;65913:50;::::0;65828:59;;-1:-1:-1;65895:12:0::1;::::0;65921:10:::1;::::0;65828:59;;65895:12;65913:50;65895:12;65913:50;65828:59;65921:10;65913:50:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65894:69;;;65978:7;65970:16;;;::::0;::::1;;65821:171;;65782:210::o:0;24598:185::-;24736:39;24753:4;24759:2;24763:7;24736:39;;;;;;;;;;;;:16;:39::i;21573:239::-;21645:7;21681:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21681:16:0;;21708:73;;;;-1:-1:-1;;;21708:73:0;;14861:2:1;21708:73:0;;;14843:21:1;14900:2;14880:18;;;14873:30;14939:34;14919:18;;;14912:62;-1:-1:-1;;;14990:18:1;;;14983:39;15039:19;;21708:73:0;14659:405:1;57759:4217:0;57857:13;57839:8;49167:17;49175:8;49167:7;:17::i;:::-;49159:50;;;;-1:-1:-1;;;49159:50:0;;;;;;;:::i;:::-;57880:14:::1;57896:21:::0;57919::::1;57944:19;57954:8;57944:9;:19::i;:::-;57879:84;;;;;;57970:19;57996:24:::0;58027:20:::1;58054:24:::0;58085:20:::1;58116:9;:7;:9::i;:::-;58112:42;;;58145:1;58136:10;;58112:42;58164:6;58174:1;58164:11:::0;58160:1633:::1;;58186:15;;;;;;;;;;;;;-1:-1:-1::0;;;58186:15:0::1;;::::0;::::1;;58223:261;;;;;;15752:66:1::0;15740:79;;-1:-1:-1;;;15867:2:1;15858:12;;15851:24;;;15905:66;15900:2;15891:12;;15884:88;15997:2;15988:12;;15981:24;;;16035:66;16030:2;16021:12;;16014:88;16127:3;16118:13;;16111:25;;;16167:66;16161:3;16152:13;;16145:89;16259:3;16250:13;;16243:25;-1:-1:-1;;;16293:3:1;16284:13;;16277:29;16331:3;16322:13;;15145:1196;58223:261:0::1;;;;;;;;;;;;;58210:274;;58594:10;58683;58502:206;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58493:215;;58773:7;58814;58950;58730:246;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58717:259;;58160:1633;;;58999:15;;;;;;;;;;;;;-1:-1:-1::0;;;58999:15:0::1;;::::0;::::1;;59036:253;;;;;;20082:66:1::0;20070:79;;20179:66;20174:2;20165:12;;20158:88;20276:66;20271:2;20262:12;;20255:88;20373:66;20368:2;20359:12;;20352:88;-1:-1:-1;;;20465:3:1;20456:13;;20449:29;20503:3;20494:13;;19515:998;59036:253:0::1;;;;;;;;;;;;;59023:266;;59398:10;59486;59307:204;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59298:213;;59578:7;59620;59759;59535:250;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59522:263;;58160:1633;59803:6;59813:1;59803:11:::0;59799:1027:::1;;60278:10;60378;59834:955;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59825:964;;60807:11;:9;:11::i;:::-;60798:20;;59799:1027;60832:19;60941:7;61022:10;61091:7;61120;60854:320;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60832:342;;61471:12;:10;:12::i;:::-;61504:6;61739:5;61877:6;61902:5;61188:782;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61181:789;;;;;;;;;;;49216:1;57759:4217:::0;;;;:::o;21303:208::-;21375:7;-1:-1:-1;;;;;21403:19:0;;21395:74;;;;-1:-1:-1;;;21395:74:0;;34303:2:1;21395:74:0;;;34285:21:1;34342:2;34322:18;;;34315:30;34381:34;34361:18;;;34354:62;-1:-1:-1;;;34432:18:1;;;34425:40;34482:19;;21395:74:0;34101:406:1;21395:74:0;-1:-1:-1;;;;;;21487:16:0;;;;;:9;:16;;;;;;;21303:208::o;37052:103::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;37117:30:::1;37144:1;37117:18;:30::i;:::-;37052:103::o:0;56510:613::-;56594:13;56609;56696:34;56719:5;;56725:2;56719:9;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;56696:16:0;:34::i;:::-;56754;56777:5;;56783:2;56777:9;;;;;;;:::i;56754:34::-;56812;56835:5;;56841:2;56835:9;;;;;;;:::i;56812:34::-;56639:231;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56942:34;56965:5;;56971:2;56965:9;;;;;;;:::i;56942:34::-;57000;57023:5;;57029:2;57023:9;;;;;;;:::i;57000:34::-;57058;57081:5;;57087:2;57081:9;;;;;;;:::i;57058:34::-;56885:231;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56631:486;;;;56510:613;;;;;;:::o;47982:153::-;;;;;;;;;;;;;;;;;;;:::o;55573:99::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;55626:40:::1;55646:1;55649:16;:6;34926:14:::0;;34834:114;55649:16:::1;55626:40;::::0;;36073:25:1;;;36129:2;36114:18;;36107:34;;;;36046:18;55626:40:0::1;;;;;;;55573:99::o:0;62082:248::-;62160:13;62142:8;49167:17;49175:8;49167:7;:17::i;:::-;49159:50;;;;-1:-1:-1;;;49159:50:0;;;;;;;:::i;:::-;62264:43:::1;62284:21;62296:8;62284:11;:21::i;:::-;62264:13;:43::i;:::-;62189:135;;;;;;;;:::i;:::-;;;;;;;;;;;;;62182:142;;62082:248:::0;;;;:::o;22048:104::-;22104:13;22137:7;22130:14;;;;;:::i;50315:1236::-;50377:11;;;;50369:49;;;;-1:-1:-1;;;50369:49:0;;36807:2:1;50369:49:0;;;36789:21:1;36846:2;36826:18;;;36819:30;36885:27;36865:18;;;36858:55;36930:18;;50369:49:0;36605:349:1;50369:49:0;50509:11;;50445:10;50425:17;50555:18;;;:7;:18;;;;;;50445:10;;50478:6;;47584:1;50555:26;;;50554:40;;50546:68;;;;-1:-1:-1;;;50546:68:0;;37161:2:1;50546:68:0;;;37143:21:1;37200:2;37180:18;;;37173:30;-1:-1:-1;;;37219:18:1;;;37212:45;37274:18;;50546:68:0;36959:339:1;50546:68:0;47805:4;50651:5;50632:16;:6;34926:14;;34834:114;50632:16;:24;50631:39;;50623:70;;;;-1:-1:-1;;;50623:70:0;;37505:2:1;50623:70:0;;;37487:21:1;37544:2;37524:18;;;37517:30;-1:-1:-1;;;37563:18:1;;;37556:48;37621:18;;50623:70:0;37303:342:1;50623:70:0;50731:7;;50723:5;:15;50710:9;:28;50702:69;;;;-1:-1:-1;;;50702:69:0;;37852:2:1;50702:69:0;;;37834:21:1;37891:2;37871:18;;;37864:30;37930;37910:18;;;37903:58;37978:18;;50702:69:0;37650:352:1;50702:69:0;50780:11;:30;;50795:15;;;50780:30;;;-1:-1:-1;;;;;50819:18:0;;50780:11;50819:18;;;:7;:18;;;;;:27;;;;;;-1:-1:-1;50860:686:0;50893:5;50884;:14;50860:686;;50937:18;:6;35045:19;;35063:1;35045:19;;;34956:127;50937:18;50964:15;50982:16;:6;34926:14;;34834:114;50982:16;51007:23;51033:14;;;:5;:14;;;;;;;;51081:335;;50964:34;;-1:-1:-1;51033:14:0;51081:335;;51142:16;;51203:9;;50964:34;;51309:12;;51366:5;;51081:335;;:::i;:::-;;;;-1:-1:-1;;51081:335:0;;;;;;;;;51071:346;;51081:335;51071:346;;;;51426:30;;51465:35;;;-1:-1:-1;;;51465:35:0;-1:-1:-1;;;;;;51465:35:0;;;51426:30;;;;51465:35;;;;51071:346;-1:-1:-1;51509:29:0;51519:9;51530:7;51509:9;:29::i;:::-;50928:618;;;50908:18;50920:5;50180:1;50170:11;;50068:126;50908:18;50900:26;;50860:686;;;;50362:1189;;;50315:1236;:::o;23731:155::-;23826:52;16605:10;23859:8;23869;23826:18;:52::i;54140:206::-;54197:8;49167:17;49175:8;49167:7;:17::i;:::-;49159:50;;;;-1:-1:-1;;;49159:50:0;;;;;;;:::i;:::-;54232:8;54269:16:::1;54232:8:::0;54269:7:::1;:16::i;:::-;-1:-1:-1::0;;;;;54255:30:0::1;:10;-1:-1:-1::0;;;;;54255:30:0::1;;54247:58;;;::::0;-1:-1:-1;;;54247:58:0;;12054:2:1;54247:58:0::1;::::0;::::1;12036:21:1::0;12093:2;12073:18;;;12066:30;-1:-1:-1;;;12112:18:1;;;12105:45;12167:18;;54247:58:0::1;11852:339:1::0;54247:58:0::1;54312:14;::::0;;;:5:::1;:14;::::0;;;;:28;;-1:-1:-1;;;;54312:28:0::1;-1:-1:-1::0;;;54312:28:0::1;::::0;;-1:-1:-1;;54140:206:0:o;65400:83::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;65460:10:::1;:17:::0;65400:83::o;54986:226::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;55071:8:::1;::::0;::::1;;55070:9;55062:40;;;::::0;-1:-1:-1;;;55062:40:0;;38705:2:1;55062:40:0::1;::::0;::::1;38687:21:1::0;38744:2;38724:18;;;38717:30;-1:-1:-1;;;38763:18:1;;;38756:48;38821:18;;55062:40:0::1;38503:342:1::0;55062:40:0::1;55130:6;55117:9;:19;;55109:49;;;::::0;-1:-1:-1;;;55109:49:0;;39052:2:1;55109:49:0::1;::::0;::::1;39034:21:1::0;39091:2;39071:18;;;39064:30;-1:-1:-1;;;39110:18:1;;;39103:47;39167:18;;55109:49:0::1;38850:341:1::0;55109:49:0::1;55165:5;:14:::0;;;;55186:8:::1;:20:::0;54986:226::o;55825:208::-;55914:13;55936:19;55965;55978:5;55974:3;55965:8;;:19;:::i;:::-;55936:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55936:49:0;;-1:-1:-1;56006:20:0;;-1:-1:-1;55936:49:0;;-1:-1:-1;56006:13:0;;-1:-1:-1;56006:20:0:i;:::-;55992:35;55825:208;-1:-1:-1;;;;55825:208:0:o;24854:328::-;25029:41;16605:10;25062:7;25029:18;:41::i;:::-;25021:103;;;;-1:-1:-1;;;25021:103:0;;;;;;;:::i;:::-;25135:39;25149:4;25155:2;25159:7;25168:5;25135:13;:39::i;:::-;24854:328;;;;:::o;47918:59::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65611:106::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;65684:15:::1;:27:::0;;-1:-1:-1;;;;;65684:27:0;;::::1;;;-1:-1:-1::0;;;;;;65684:27:0;;::::1;::::0;;;::::1;::::0;;65611:106::o;64958:159::-;65063:13;65044:8;49167:17;49175:8;49167:7;:17::i;:::-;49159:50;;;;-1:-1:-1;;;49159:50:0;;;;;;;:::i;:::-;65090:21:::1;65102:8;65090:11;:21::i;:::-;65083:28:::0;64958:159;-1:-1:-1;;;64958:159:0:o;66194:492::-;66288:15;;;;;-1:-1:-1;;;;;66288:15:0;66274:10;:29;66266:62;;;;-1:-1:-1;;;66266:62:0;;39734:2:1;66266:62:0;;;39716:21:1;39773:2;39753:18;;;39746:30;-1:-1:-1;;;39792:18:1;;;39785:50;39852:18;;66266:62:0;39532:344:1;66266:62:0;66350:11;;66385:7;66407:14;;;;66399:51;;;;-1:-1:-1;;;66399:51:0;;40083:2:1;66399:51:0;;;40065:21:1;40122:2;40102:18;;;40095:30;40161:26;40141:18;;;40134:54;40205:18;;66399:51:0;39881:348:1;66399:51:0;66461:6;66471:1;66461:11;66457:47;;-1:-1:-1;66492:4:0;66457:47;66529:16;:26;;;;;;66564:11;:21;;;;;;;66617:41;;-1:-1:-1;;;;;;;66617:22:0;;;66529:26;;-1:-1:-1;66617:41:0;-1:-1:-1;66617:41:0;66529:26;66617:22;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66598:60;;;66672:7;66664:16;;;;;49928:134;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;49985:10:::1;::::0;::::1;::::0;::::1;;;49984:11;49976:47;;;::::0;-1:-1:-1;;;49976:47:0;;40436:2:1;49976:47:0::1;::::0;::::1;40418:21:1::0;40475:2;40455:18;;;40448:30;40514:25;40494:18;;;40487:53;40557:18;;49976:47:0::1;40234:347:1::0;49976:47:0::1;50045:11;::::0;;-1:-1:-1;;50030:26:0;::::1;50045:11;::::0;;::::1;50044:12;50030:26;::::0;;49928:134::o;55218:81::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;55270:1:::1;55262:5;:9:::0;55278:8:::1;:15:::0;;-1:-1:-1;;55278:15:0::1;55289:4;55278:15;::::0;;55218:81::o;49813:69::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;49859:10:::1;:17:::0;;-1:-1:-1;;49859:17:0::1;;;::::0;;49813:69::o;51557:1278::-;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;51657:17:::1;51677:7;36474:6:::0;;-1:-1:-1;;;;;36474:6:0;;36401:87;51677:7:::1;51738:11;::::0;-1:-1:-1;;;;;51784:18:0;::::1;51691:13;51784:18:::0;;;:7:::1;:18;::::0;;;;;51657:27;;-1:-1:-1;51707:6:0;;47632:2:::1;51784:26:::0;;::::1;51783:45;;51775:73;;;::::0;-1:-1:-1;;;51775:73:0;;40788:2:1;51775:73:0::1;::::0;::::1;40770:21:1::0;40827:2;40807:18;;;40800:30;-1:-1:-1;;;40846:18:1;;;40839:45;40901:18;;51775:73:0::1;40586:339:1::0;51775:73:0::1;47805:4;51885:5;51866:16;:6;34926:14:::0;;34834:114;51866:16:::1;:24;51865:39;;51857:70;;;::::0;-1:-1:-1;;;51857:70:0;;37505:2:1;51857:70:0::1;::::0;::::1;37487:21:1::0;37544:2;37524:18;;;37517:30;-1:-1:-1;;;37563:18:1;;;37556:48;37621:18;;51857:70:0::1;37303:342:1::0;51857:70:0::1;51962:15:::0;;::::1;51994:9;:28:::0;::::1;51986:69;;;::::0;-1:-1:-1;;;51986:69:0;;37852:2:1;51986:69:0::1;::::0;::::1;37834:21:1::0;37891:2;37871:18;;;37864:30;37930;37910:18;;;37903:58;37978:18;;51986:69:0::1;37650:352:1::0;51986:69:0::1;52064:11;:30:::0;;;;::::1;::::0;;-1:-1:-1;;;;;52103:18:0;::::1;52064:11;52103:18:::0;;;:7:::1;:18;::::0;;;;:27;;;::::1;::::0;;-1:-1:-1;52144:686:0::1;52177:5;52168;:14;52144:686;;52221:18;:6;35045:19:::0;;35063:1;35045:19;;;34956:127;52221:18:::1;52248:15;52266:16;:6;34926:14:::0;;34834:114;52266:16:::1;52291:23;52317:14:::0;;;:5:::1;:14;::::0;;;;;;;52365:335;;52248:34;;-1:-1:-1;52317:14:0;52365:335:::1;::::0;52426:16:::1;::::0;52487:9;;52248:34;;52593:12:::1;::::0;52650:5;;52365:335:::1;;:::i;:::-;;::::0;;-1:-1:-1;;52365:335:0;;::::1;::::0;;;;;;52355:346;;52365:335:::1;52355:346:::0;;::::1;::::0;52710:30;;52749:35:::1;::::0;::::1;-1:-1:-1::0;;;52749:35:0::1;-1:-1:-1::0;;;;;;52749:35:0;;;52710:30:::1;::::0;;::::1;52749:35:::0;::::1;::::0;;52355:346;-1:-1:-1;52793:29:0::1;52803:9:::0;52814:7;52793:9:::1;:29::i;:::-;52212:618;;;52192:18;52204:5;50180:1:::0;50170:11;;50068:126;52192:18:::1;52184:26;;52144:686;;37310:201:::0;36474:6;;-1:-1:-1;;;;;36474:6:0;16605:10;36621:23;36613:68;;;;-1:-1:-1;;;36613:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37399:22:0;::::1;37391:73;;;::::0;-1:-1:-1;;;37391:73:0;;41132:2:1;37391:73:0::1;::::0;::::1;41114:21:1::0;41171:2;41151:18;;;41144:30;41210:34;41190:18;;;41183:62;-1:-1:-1;;;41261:18:1;;;41254:36;41307:19;;37391:73:0::1;40930:402:1::0;37391:73:0::1;37475:28;37494:8;37475:18;:28::i;:::-;37310:201:::0;:::o;20934:305::-;21036:4;-1:-1:-1;;;;;;21073:40:0;;-1:-1:-1;;;21073:40:0;;:105;;-1:-1:-1;;;;;;;21130:48:0;;-1:-1:-1;;;21130:48:0;21073:105;:158;;;-1:-1:-1;;;;;;;;;;19652:40:0;;;21195:36;19543:157;26692:127;26757:4;26781:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26781:16:0;:30;;;26692:127::o;30838:174::-;30913:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30913:29:0;-1:-1:-1;;;;;30913:29:0;;;;;;;;:24;;30967:23;30913:24;30967:14;:23::i;:::-;-1:-1:-1;;;;;30958:46:0;;;;;;;;;;;30838:174;;:::o;55305:262::-;55346:4;55363:5;;55372:1;55363:10;55359:31;;-1:-1:-1;55383:5:0;;55305:262::o;55359:31::-;55400:8;;;;55396:29;;;-1:-1:-1;55418:5:0;;55305:262::o;55396:29::-;55510:8;;55502:5;;55446:15;;55502:16;;;55534:12;;:26;;;;;55557:3;55550:4;:10;55534:26;55526:35;;;;55305:262;:::o;26986:348::-;27079:4;27104:16;27112:7;27104;:16::i;:::-;27096:73;;;;-1:-1:-1;;;27096:73:0;;41539:2:1;27096:73:0;;;41521:21:1;41578:2;41558:18;;;41551:30;41617:34;41597:18;;;41590:62;-1:-1:-1;;;41668:18:1;;;41661:42;41720:19;;27096:73:0;41337:408:1;27096:73:0;27180:13;27196:23;27211:7;27196:14;:23::i;:::-;27180:39;;27249:5;-1:-1:-1;;;;;27238:16:0;:7;-1:-1:-1;;;;;27238:16:0;;:51;;;;27282:7;-1:-1:-1;;;;;27258:31:0;:20;27270:7;27258:11;:20::i;:::-;-1:-1:-1;;;;;27258:31:0;;27238:51;:87;;;-1:-1:-1;;;;;;24078:25:0;;;24054:4;24078:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27293:32;23957:164;30095:625;30254:4;-1:-1:-1;;;;;30227:31:0;:23;30242:7;30227:14;:23::i;:::-;-1:-1:-1;;;;;30227:31:0;;30219:81;;;;-1:-1:-1;;;30219:81:0;;41952:2:1;30219:81:0;;;41934:21:1;41991:2;41971:18;;;41964:30;42030:34;42010:18;;;42003:62;-1:-1:-1;;;42081:18:1;;;42074:35;42126:19;;30219:81:0;41750:401:1;30219:81:0;-1:-1:-1;;;;;30319:16:0;;30311:65;;;;-1:-1:-1;;;30311:65:0;;42358:2:1;30311:65:0;;;42340:21:1;42397:2;42377:18;;;42370:30;42436:34;42416:18;;;42409:62;-1:-1:-1;;;42487:18:1;;;42480:34;42531:19;;30311:65:0;42156:400:1;30311:65:0;30493:29;30510:1;30514:7;30493:8;:29::i;:::-;-1:-1:-1;;;;;30535:15:0;;;;;;:9;:15;;;;;:20;;30554:1;;30535:15;:20;;30554:1;;30535:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30566:13:0;;;;;;:9;:13;;;;;:18;;30583:1;;30566:13;:18;;30583:1;;30566:18;:::i;:::-;;;;-1:-1:-1;;30595:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30595:21:0;-1:-1:-1;;;;;30595:21:0;;;;;;;;;30634:27;;30595:16;;30634:27;;;;;;;65302:18:::1;65228:98:::0;;:::o;57175:450::-;57249:7;57320:15;;;:5;:15;;;;;:20;57258:13;;;;57312:29;;57249:7;57377:15;47540:2;57312:29;57377:15;:::i;:::-;57396:1;57377:20;57373:101;;-1:-1:-1;57419:1:0;57373:101;;;57456:8;57463:1;57456:4;:8;:::i;:::-;57447:17;;57373:101;57483:21;57506;57531:4;-1:-1:-1;;;;;57531:20:0;;57569:4;57552:22;;;;;;42937:19:1;;42981:2;42972:12;;42808:182;57552:22:0;;;;;;;;;;;;;57531:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57531:44:0;;;;;;;;;;;;:::i;:::-;57592:6;;57482:93;;-1:-1:-1;57592:6:0;;-1:-1:-1;57175:450:0;;-1:-1:-1;;;;;57175:450:0:o;56405:99::-;56477:14;;:21;;-1:-1:-1;;;56477:21:0;;:14;:21;;;3115:25:1;56448:13:0;;-1:-1:-1;;;;;56477:14:0;;:18;;3088::1;;56477:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56477:21:0;;;;;;;;;;;;:::i;56121:230::-;56264:15;;:45;;-1:-1:-1;;;56264:45:0;;48829:42;56264:45;;;3911:51:1;56264:15:0;3978:18:1;;;3971:34;56165:13:0;;56194:4;;:18;;-1:-1:-1;;;;;56264:15:0;;:24;;3884:18:1;;56264:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56264:45:0;;;;;;;;;;;;:::i;:::-;56213:131;;;;;;;;:::i;:::-;;;;;;;;;;;;;56194:151;;;;;;;;;;;;;;;:::i;37671:191::-;37764:6;;;-1:-1:-1;;;;;37781:17:0;;;-1:-1:-1;;;;;;37781:17:0;;;;;;;37814:40;;37764:6;;;37781:17;37764:6;;37814:40;;37745:16;;37814:40;37734:128;37671:191;:::o;17019:723::-;17075:13;17296:5;17305:1;17296:10;17292:53;;-1:-1:-1;;17323:10:0;;;;;;;;;;;;-1:-1:-1;;;17323:10:0;;;;;17019:723::o;17292:53::-;17370:5;17355:12;17411:78;17418:9;;17411:78;;17444:8;;;;:::i;:::-;;-1:-1:-1;17467:10:0;;-1:-1:-1;17475:2:0;17467:10;;:::i;:::-;;;17411:78;;;17499:19;17531:6;17521:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17521:17:0;;17499:39;;17549:154;17556:10;;17549:154;;17583:11;17593:1;17583:11;;:::i;:::-;;-1:-1:-1;17652:10:0;17660:2;17652:5;:10;:::i;:::-;17639:24;;:2;:24;:::i;:::-;17626:39;;17609:6;17616;17609:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17609:56:0;;;;;;;;-1:-1:-1;17680:11:0;17689:2;17680:11;;:::i;:::-;;;17549:154;;41296:134;41354:20;41396:26;41403:4;41409:5;41416;41396:6;:26::i;27676:110::-;27752:26;27762:2;27766:7;27752:26;;;;;;;;;;;;:9;:26::i;31154:315::-;31309:8;-1:-1:-1;;;;;31300:17:0;:5;-1:-1:-1;;;;;31300:17:0;;31292:55;;;;-1:-1:-1;;;31292:55:0;;45698:2:1;31292:55:0;;;45680:21:1;45737:2;45717:18;;;45710:30;45776:27;45756:18;;;45749:55;45821:18;;31292:55:0;45496:349:1;31292:55:0;-1:-1:-1;;;;;31358:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31358:46:0;;;;;;;;;;31420:41;;1309::1;;;31420::0;;1282:18:1;31420:41:0;;;;;;;31154:315;;;:::o;42280:2794::-;42339:19;42463:4;42457:11;42487:10;42484:2572;;;42562:1;42549:10;42546:1;42542:18;42538:26;42680:1;42668:10;42664:18;42654:410;;42730:21;;;42724:28;42754:6;42720:41;42954:2;42949:11;;;42942:19;42970:11;;;;42963:19;42938:45;42860:150;;43036:5;;42654:410;43181:1;43165:18;;43142:46;-1:-1:-1;;43142:46:0;42584:650;43268:4;43262:11;43252:21;;43359:13;43351:6;43344:29;43482:4;43474:6;43470:17;43525:13;43520:3;43516:23;43505:34;;43786:66;43883:1;43877:4;43870:15;43916:52;43910:4;43903:66;44000:32;43994:4;43987:46;44053:790;44144:1;44138:4;44134:12;44126:20;;44187:4;44181:11;44637:5;44633:2;44628:15;44622:22;44619:1;44615:30;44572:5;44568:2;44563:15;44557:22;44554:1;44550:30;44513:163;44510:1;44506:171;44467:5;44463:2;44458:15;44452:22;44449:1;44445:30;44412:292;44409:1;44405:300;44370:5;44366:2;44361:15;44355:22;44352:1;44348:30;44319:409;44314:3;44307:422;;44767:1;44762:3;44758:11;44751:18;;44809:3;44804;44801:12;44053:790;44791:33;44057:2;;44883:4;44878:3;44874:14;44868:4;44861:28;44943:1;44938:3;44931:14;;45013:1;45007:4;45000:15;42484:2572;42280:2794;;;:::o;26064:315::-;26221:28;26231:4;26237:2;26241:7;26221:9;:28::i;:::-;26268:48;26291:4;26297:2;26301:7;26310:5;26268:22;:48::i;:::-;26260:111;;;;-1:-1:-1;;;26260:111:0;;;;;;;:::i;62336:790::-;62397:13;62419:15;62437:8;62419:26;;62533:586;62628:9;;;;;;;;;;;;;-1:-1:-1;;;62628:9:0;;;62664:25;62681:7;62664:16;:25::i;:::-;62762:11;;;;;;;;;;;;;;;;;62876;62958:19;62969:7;62958:10;:19::i;:::-;63043:17;63052:7;63043:8;:17::i;:::-;62547:571;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62533:13;:586::i;:::-;62459:661;;;;;;;;:::i;38543:2614::-;38659:20;38789:4;38783:11;38813:10;38810:2329;;;39016:1;39012;39000:10;38996:18;38992:26;38989:1;38985:34;39130:4;39124:11;39114:21;;39509:34;39503:4;39496:48;39637:6;39626:8;39619:16;39615:29;39579:34;39575:70;39569:4;39562:84;39755:4;39747:6;39743:17;39798:13;39793:3;39789:23;39891:636;39944:1;39938:4;39934:12;39926:20;;40007:4;40001:11;40150:4;40142:5;40138:2;40134:14;40130:25;40124:32;40121:1;40113:44;40216:4;40208:5;40204:2;40200:14;40196:25;40190:32;40187:1;40179:44;40281:4;40273:5;40270:1;40266:13;40262:24;40256:31;40253:1;40245:43;40338:4;40331:5;40327:16;40321:23;40318:1;40310:35;;40385:4;40379:11;40374:3;40367:24;40431:1;40426:3;40422:11;40415:18;;40493:3;40488;40485:12;39891:636;40475:33;40567:4;40558:14;40552:4;40545:28;-1:-1:-1;;;40714:1:0;40698:18;;40695:1;40691:26;40827:11;;;40820:37;;;;41008:1;40948:17;;40941:25;40937:33;;;40995:11;;;;40988:22;41081:21;;41066:37;;38810:2329;;38543:2614;;;;;:::o;28013:321::-;28143:18;28149:2;28153:7;28143:5;:18::i;:::-;28194:54;28225:1;28229:2;28233:7;28242:5;28194:22;:54::i;:::-;28172:154;;;;-1:-1:-1;;;28172:154:0;;;;;;;:::i;32034:799::-;32189:4;-1:-1:-1;;;;;32210:13:0;;8956:19;:23;32206:620;;32246:72;;-1:-1:-1;;;32246:72:0;;-1:-1:-1;;;;;32246:36:0;;;;;:72;;16605:10;;32297:4;;32303:7;;32312:5;;32246:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32246:72:0;;;;;;;;-1:-1:-1;;32246:72:0;;;;;;;;;;;;:::i;:::-;;;32242:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32488:6;:13;32505:1;32488:18;32484:272;;32531:60;;-1:-1:-1;;;32531:60:0;;;;;;;:::i;32484:272::-;32706:6;32700:13;32691:6;32687:2;32683:15;32676:38;32242:529;-1:-1:-1;;;;;;32369:51:0;-1:-1:-1;;;32369:51:0;;-1:-1:-1;32362:58:0;;32206:620;-1:-1:-1;32810:4:0;32034:799;;;;;;:::o;63134:1569::-;63216:15;63274:14;;;:5;:14;;;;;;;;63249:39;;;;;;;;;;;;;-1:-1:-1;;63249:39:0;;;-1:-1:-1;;;63249:39:0;;;;;;;;;;;-1:-1:-1;;;63249:39:0;;;;;;;;;;;-1:-1:-1;;;63249:39:0;;;;;;;63194:13;63249:39;;;;;;;63194:13;63274:14;;63249:39;63216:15;;63360:18;63274:14;63360:9;:18::i;:::-;63295:83;;;;;;63385:19;63415:6;63425:1;63415:11;63411:138;;-1:-1:-1;63437:11:0;;;;;;;;;;;;-1:-1:-1;;;63437:11:0;;;;63411:138;;;63466:6;63476:1;63466:11;63462:87;;-1:-1:-1;63488:15:0;;;;;;;;;;;;-1:-1:-1;;;63488:15:0;;;;63462:87;;;-1:-1:-1;63526:15:0;;;;;;;;;;;;-1:-1:-1;;;63526:15:0;;;;63462:87;63555:18;63584:9;:16;;;63580:100;;;-1:-1:-1;63611:15:0;;;;;;;;;;;;-1:-1:-1;;;63611:15:0;;;;63580:100;;;-1:-1:-1;63653:17:0;;;;;;;;;;;;-1:-1:-1;;;63653:17:0;;;;63580:100;63686:21;63718:9;:7;:9::i;:::-;63714:112;;;63738:56;;;;;;;;;;;;;;;;;;;63803:15;;;;;;;;;;;;;-1:-1:-1;;;63803:15:0;;;;;63714:112;63832:19;63854:33;63871:9;:15;;;63854:33;;:16;:33::i;:::-;63832:55;;63894:21;64051:41;64088:3;64068:9;:17;;;:23;;;;;;;:::i;:::-;;64051:41;;:16;:41::i;:::-;63951:164;;;;;;;;:::i;:::-;;;;;;;;;;;;;63941:174;;64228:5;64317:7;64408;64496:5;64524:7;64612:4;64639:7;64136:561;;;;;;;;;;;;;;:::i;28670:439::-;-1:-1:-1;;;;;28750:16:0;;28742:61;;;;-1:-1:-1;;;28742:61:0;;53971:2:1;28742:61:0;;;53953:21:1;;;53990:18;;;53983:30;54049:34;54029:18;;;54022:62;54101:18;;28742:61:0;53769:356:1;28742:61:0;28823:16;28831:7;28823;:16::i;:::-;28822:17;28814:58;;;;-1:-1:-1;;;28814:58:0;;54332:2:1;28814:58:0;;;54314:21:1;54371:2;54351:18;;;54344:30;54410;54390:18;;;54383:58;54458:18;;28814:58:0;54130:352:1;28814:58:0;-1:-1:-1;;;;;28943:13:0;;;;;;:9;:13;;;;;:18;;28960:1;;28943:13;:18;;28960:1;;28943:18;:::i;:::-;;;;-1:-1:-1;;28972:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28972:21:0;-1:-1:-1;;;;;28972:21:0;;;;;;;;29011:33;;28972:16;;;29011:33;;28972:16;;29011:33;65821:171:::1;;65782:210::o:0;14:348:1:-;66:8;76:6;130:3;123:4;115:6;111:17;107:27;97:55;;148:1;145;138:12;97:55;-1:-1:-1;171:20:1;;214:18;203:30;;200:50;;;246:1;243;236:12;200:50;283:4;275:6;271:17;259:29;;335:3;328:4;319:6;311;307:19;303:30;300:39;297:59;;;352:1;349;342:12;367:411;438:6;446;499:2;487:9;478:7;474:23;470:32;467:52;;;515:1;512;505:12;467:52;555:9;542:23;588:18;580:6;577:30;574:50;;;620:1;617;610:12;574:50;659:59;710:7;701:6;690:9;686:22;659:59;:::i;:::-;737:8;;633:85;;-1:-1:-1;367:411:1;-1:-1:-1;;;;367:411:1:o;783:131::-;-1:-1:-1;;;;;;857:32:1;;847:43;;837:71;;904:1;901;894:12;919:245;977:6;1030:2;1018:9;1009:7;1005:23;1001:32;998:52;;;1046:1;1043;1036:12;998:52;1085:9;1072:23;1104:30;1128:5;1104:30;:::i;1361:250::-;1446:1;1456:113;1470:6;1467:1;1464:13;1456:113;;;1546:11;;;1540:18;1527:11;;;1520:39;1492:2;1485:10;1456:113;;;-1:-1:-1;;1603:1:1;1585:16;;1578:27;1361:250::o;1616:282::-;1669:3;1707:5;1701:12;1734:6;1729:3;1722:19;1750:76;1819:6;1812:4;1807:3;1803:14;1796:4;1789:5;1785:16;1750:76;:::i;:::-;1880:2;1859:15;-1:-1:-1;;1855:29:1;1846:39;;;;1887:4;1842:50;;1616:282;-1:-1:-1;;1616:282:1:o;1903:231::-;2052:2;2041:9;2034:21;2015:4;2072:56;2124:2;2113:9;2109:18;2101:6;2072:56;:::i;2139:180::-;2198:6;2251:2;2239:9;2230:7;2226:23;2222:32;2219:52;;;2267:1;2264;2257:12;2219:52;-1:-1:-1;2290:23:1;;2139:180;-1:-1:-1;2139:180:1:o;2532:173::-;2600:20;;-1:-1:-1;;;;;2649:31:1;;2639:42;;2629:70;;2695:1;2692;2685:12;2629:70;2532:173;;;:::o;2710:254::-;2778:6;2786;2839:2;2827:9;2818:7;2814:23;2810:32;2807:52;;;2855:1;2852;2845:12;2807:52;2878:29;2897:9;2878:29;:::i;:::-;2868:39;2954:2;2939:18;;;;2926:32;;-1:-1:-1;;;2710:254:1:o;3151:328::-;3228:6;3236;3244;3297:2;3285:9;3276:7;3272:23;3268:32;3265:52;;;3313:1;3310;3303:12;3265:52;3336:29;3355:9;3336:29;:::i;:::-;3326:39;;3384:38;3418:2;3407:9;3403:18;3384:38;:::i;:::-;3374:48;;3469:2;3458:9;3454:18;3441:32;3431:42;;3151:328;;;;;:::o;3484:248::-;3552:6;3560;3613:2;3601:9;3592:7;3588:23;3584:32;3581:52;;;3629:1;3626;3619:12;3581:52;-1:-1:-1;;3652:23:1;;;3722:2;3707:18;;;3694:32;;-1:-1:-1;3484:248:1:o;4016:186::-;4075:6;4128:2;4116:9;4107:7;4103:23;4099:32;4096:52;;;4144:1;4141;4134:12;4096:52;4167:29;4186:9;4167:29;:::i;4622:405::-;4819:2;4808:9;4801:21;4782:4;4845:56;4897:2;4886:9;4882:18;4874:6;4845:56;:::i;:::-;4949:9;4941:6;4937:22;4932:2;4921:9;4917:18;4910:50;4977:44;5014:6;5006;4977:44;:::i;:::-;4969:52;4622:405;-1:-1:-1;;;;;4622:405:1:o;5032:347::-;5097:6;5105;5158:2;5146:9;5137:7;5133:23;5129:32;5126:52;;;5174:1;5171;5164:12;5126:52;5197:29;5216:9;5197:29;:::i;:::-;5187:39;;5276:2;5265:9;5261:18;5248:32;5323:5;5316:13;5309:21;5302:5;5299:32;5289:60;;5345:1;5342;5335:12;5289:60;5368:5;5358:15;;;5032:347;;;;;:::o;5384:127::-;5445:10;5440:3;5436:20;5433:1;5426:31;5476:4;5473:1;5466:15;5500:4;5497:1;5490:15;5516:275;5587:2;5581:9;5652:2;5633:13;;-1:-1:-1;;5629:27:1;5617:40;;5687:18;5672:34;;5708:22;;;5669:62;5666:88;;;5734:18;;:::i;:::-;5770:2;5763:22;5516:275;;-1:-1:-1;5516:275:1:o;5796:186::-;5844:4;5877:18;5869:6;5866:30;5863:56;;;5899:18;;:::i;:::-;-1:-1:-1;5965:2:1;5944:15;-1:-1:-1;;5940:29:1;5971:4;5936:40;;5796:186::o;5987:888::-;6082:6;6090;6098;6106;6159:3;6147:9;6138:7;6134:23;6130:33;6127:53;;;6176:1;6173;6166:12;6127:53;6199:29;6218:9;6199:29;:::i;:::-;6189:39;;6247:38;6281:2;6270:9;6266:18;6247:38;:::i;:::-;6237:48;;6332:2;6321:9;6317:18;6304:32;6294:42;;6387:2;6376:9;6372:18;6359:32;6414:18;6406:6;6403:30;6400:50;;;6446:1;6443;6436:12;6400:50;6469:22;;6522:4;6514:13;;6510:27;-1:-1:-1;6500:55:1;;6551:1;6548;6541:12;6500:55;6587:2;6574:16;6612:48;6628:31;6656:2;6628:31;:::i;:::-;6612:48;:::i;:::-;6683:2;6676:5;6669:17;6723:7;6718:2;6713;6709;6705:11;6701:20;6698:33;6695:53;;;6744:1;6741;6734:12;6695:53;6799:2;6794;6790;6786:11;6781:2;6774:5;6770:14;6757:45;6843:1;6838:2;6833;6826:5;6822:14;6818:23;6811:34;6864:5;6854:15;;;;;5987:888;;;;;;;:::o;6880:260::-;6948:6;6956;7009:2;6997:9;6988:7;6984:23;6980:32;6977:52;;;7025:1;7022;7015:12;6977:52;7048:29;7067:9;7048:29;:::i;:::-;7038:39;;7096:38;7130:2;7119:9;7115:18;7096:38;:::i;:::-;7086:48;;6880:260;;;;;:::o;7145:356::-;7347:2;7329:21;;;7366:18;;;7359:30;7425:34;7420:2;7405:18;;7398:62;7492:2;7477:18;;7145:356::o;7506:380::-;7585:1;7581:12;;;;7628;;;7649:61;;7703:4;7695:6;7691:17;7681:27;;7649:61;7756:2;7748:6;7745:14;7725:18;7722:38;7719:161;;7802:10;7797:3;7793:20;7790:1;7783:31;7837:4;7834:1;7827:15;7865:4;7862:1;7855:15;8017:518;8119:2;8114:3;8111:11;8108:421;;;8155:5;8152:1;8145:16;8199:4;8196:1;8186:18;8269:2;8257:10;8253:19;8250:1;8246:27;8240:4;8236:38;8305:4;8293:10;8290:20;8287:47;;;-1:-1:-1;8328:4:1;8287:47;8383:2;8378:3;8374:12;8371:1;8367:20;8361:4;8357:31;8347:41;;8438:81;8456:2;8449:5;8446:13;8438:81;;;8515:1;8501:16;;8482:1;8471:13;8438:81;;8711:1198;8835:18;8830:3;8827:27;8824:53;;;8857:18;;:::i;:::-;8886:94;8976:3;8936:38;8968:4;8962:11;8936:38;:::i;:::-;8930:4;8886:94;:::i;:::-;9006:1;9031:2;9026:3;9023:11;9048:1;9043:608;;;;9695:1;9712:3;9709:93;;;-1:-1:-1;9768:19:1;;;9755:33;9709:93;-1:-1:-1;;8668:1:1;8664:11;;;8660:24;8656:29;8646:40;8692:1;8688:11;;;8643:57;9815:78;;9016:887;;9043:608;7964:1;7957:14;;;8001:4;7988:18;;-1:-1:-1;;9079:17:1;;;9194:229;9208:7;9205:1;9202:14;9194:229;;;9297:19;;;9284:33;9269:49;;9404:4;9389:20;;;;9357:1;9345:14;;;;9224:12;9194:229;;;9198:3;9451;9442:7;9439:16;9436:159;;;9575:1;9571:6;9565:3;9559;9556:1;9552:11;9548:21;9544:34;9540:39;9527:9;9522:3;9518:19;9505:33;9501:79;9493:6;9486:95;9436:159;;;9638:1;9632:3;9629:1;9625:11;9621:19;9615:4;9608:33;9016:887;;8711:1198;;;:::o;11154:344::-;11356:2;11338:21;;;11395:2;11375:18;;;11368:30;-1:-1:-1;;;11429:2:1;11414:18;;11407:50;11489:2;11474:18;;11154:344::o;13336:413::-;13538:2;13520:21;;;13577:2;13557:18;;;13550:30;13616:34;13611:2;13596:18;;13589:62;-1:-1:-1;;;13682:2:1;13667:18;;13660:47;13739:3;13724:19;;13336:413::o;13754:127::-;13815:10;13810:3;13806:20;13803:1;13796:31;13846:4;13843:1;13836:15;13870:4;13867:1;13860:15;13886:168;13959:9;;;13990;;14007:15;;;14001:22;;13987:37;13977:71;;14028:18;;:::i;14059:127::-;14120:10;14115:3;14111:20;14108:1;14101:31;14151:4;14148:1;14141:15;14175:4;14172:1;14165:15;14191:120;14231:1;14257;14247:35;;14262:18;;:::i;:::-;-1:-1:-1;14296:9:1;;14191:120::o;14316:128::-;14383:9;;;14404:11;;;14401:37;;;14418:18;;:::i;16346:198::-;16388:3;16426:5;16420:12;16441:65;16499:6;16494:3;16487:4;16480:5;16476:16;16441:65;:::i;:::-;16522:16;;;;;16346:198;-1:-1:-1;;16346:198:1:o;16549:1041::-;16960:66;16955:3;16948:79;17066:32;17061:3;17057:42;17052:2;17047:3;17043:12;17036:64;16930:3;17129:6;17123:13;17145:73;17211:6;17206:2;17201:3;17197:12;17192:2;17184:6;17180:15;17145:73;:::i;:::-;17282:66;17277:2;17237:16;;;17269:11;;;17262:87;-1:-1:-1;;;17373:2:1;17365:11;;17358:63;17446:13;;17468:74;17446:13;17528:2;17520:11;;17515:2;17503:15;;17468:74;:::i;:::-;17562:17;17581:2;17558:26;;16549:1041;-1:-1:-1;;;;16549:1041:1:o;17668:1842::-;-1:-1:-1;;;18646:3:1;18639:27;18621:3;18695:6;18689:13;18711:75;18779:6;18774:2;18769:3;18765:12;18758:4;18750:6;18746:17;18711:75;:::i;:::-;-1:-1:-1;;;18845:2:1;18805:16;;;18837:11;;;18830:24;-1:-1:-1;;;18878:2:1;18870:11;;18863:35;18923:13;;18945:76;18923:13;19007:2;18999:11;;18992:4;18980:17;;18945:76;:::i;:::-;-1:-1:-1;;;19081:2:1;19040:17;;;;19073:11;;;19066:45;-1:-1:-1;;;19135:2:1;19127:11;;19120:43;-1:-1:-1;;;19187:2:1;19179:11;;19172:43;-1:-1:-1;;;19239:2:1;19231:11;;19224:35;19284:13;;19306:76;19284:13;19368:2;19360:11;;19353:4;19341:17;;19306:76;:::i;:::-;19408:17;19427:2;19404:26;19439:36;19404:26;-1:-1:-1;;;17645:16:1;;17595:68;19439:36;19502:1;19491:13;;17668:1842;-1:-1:-1;;;;;17668:1842:1:o;20518:1037::-;20929:66;20924:3;20917:79;21035:30;21030:3;21026:40;21021:2;21016:3;21012:12;21005:62;20899:3;21096:6;21090:13;21112:73;21178:6;21173:2;21168:3;21164:12;21159:2;21151:6;21147:15;21112:73;:::i;:::-;21249:66;21244:2;21204:16;;;21236:11;;;21229:87;-1:-1:-1;;;21340:2:1;21332:11;;21325:61;21411:13;;21433:74;21411:13;21493:2;21485:11;;21480:2;21468:15;;21433:74;:::i;:::-;21527:17;21546:2;21523:26;;20518:1037;-1:-1:-1;;;;20518:1037:1:o;21560:1848::-;-1:-1:-1;;;22538:3:1;22531:27;22513:3;22587:6;22581:13;22603:75;22671:6;22666:2;22661:3;22657:12;22650:4;22642:6;22638:17;22603:75;:::i;:::-;-1:-1:-1;;;22737:2:1;22697:16;;;22729:11;;;22722:24;-1:-1:-1;;;22770:2:1;22762:11;;22755:36;22816:13;;22838:76;22816:13;22900:2;22892:11;;22885:4;22873:17;;22838:76;:::i;:::-;-1:-1:-1;;;22974:2:1;22933:17;;;;22966:11;;;22959:45;-1:-1:-1;;;23028:2:1;23020:11;;23013:44;-1:-1:-1;;;23081:2:1;23073:11;;23066:44;-1:-1:-1;;;23134:2:1;23126:11;;23119:36;23180:13;;23202:77;23180:13;23264:3;23256:12;;23249:4;23237:17;;23202:77;:::i;:::-;23305:17;23324:3;23301:27;23337:36;23301:27;-1:-1:-1;;;17645:16:1;;17595:68;25323:2481;26713:66;26701:79;;-1:-1:-1;;;26805:2:1;26796:12;;26789:62;-1:-1:-1;;;26876:2:1;26867:12;;26860:73;26963:66;26958:2;26949:12;;26942:88;27060:66;27055:2;27046:12;;27039:88;-1:-1:-1;;;27152:3:1;27143:13;;27136:61;-1:-1:-1;;;27222:3:1;27213:13;;27206:74;27311:66;27305:3;27296:13;;27289:89;27409:66;27403:3;27394:13;;27387:89;-1:-1:-1;;;27524:3:1;27515:13;;15119:19;23490:66;27786:3;27777:13;;23478:79;23587:66;23573:12;;;23566:88;26683:3;27545:253;27575:222;27605:191;27635:160;27665:129;27691:102;27721:71;23670:12;;;27739:6;27721:71;:::i;:::-;23770:66;23758:79;;23867:66;23862:2;23853:12;;23846:88;23959:2;23950:12;;23693:275;27691:102;27683:6;27665:129;:::i;:::-;24050:66;24038:79;;24147:66;24142:2;24133:12;;24126:88;-1:-1:-1;;;24239:2:1;24230:12;;24223:54;24302:2;24293:12;;23973:338;27635:160;24393:66;24381:79;;24490:66;24485:2;24476:12;;24469:88;-1:-1:-1;;;24582:2:1;24573:12;;24566:54;24645:2;24636:12;;24316:338;27605:191;24736:66;24724:79;;24833:34;24828:2;24819:12;;24812:56;-1:-1:-1;;;24893:2:1;24884:12;;24877:75;24977:2;24968:12;;24659:327;27575:222;25068:66;25056:79;;25165:34;25160:2;25151:12;;25144:56;-1:-1:-1;;;25225:2:1;25216:12;;25209:75;25309:2;25300:12;;24991:327;28064:1916;29024:66;29019:3;29012:79;-1:-1:-1;;;29116:2:1;29111:3;29107:12;29100:39;28994:3;29168:6;29162:13;29184:75;29252:6;29247:2;29242:3;29238:12;29231:4;29223:6;29219:17;29184:75;:::i;:::-;29323:34;29318:2;29278:16;;;29310:11;;;29303:55;29387:25;29382:2;29374:11;;29367:46;29438:13;;29460:76;29438:13;29522:2;29514:11;;29507:4;29495:17;;29460:76;:::i;:::-;29601:34;29596:2;29555:17;;;;29588:11;;;29581:55;-1:-1:-1;;;29660:3:1;29652:12;;29645:32;29699:39;29733:3;29725:12;;29717:6;29699:39;:::i;:::-;-1:-1:-1;;;27867:31:1;;29686:52;-1:-1:-1;29805:41:1;29842:2;29835:5;29831:14;29823:6;29805:41;:::i;:::-;-1:-1:-1;;;27959:18:1;;-1:-1:-1;;;29941:1:1;29930:13;;28034:23;29971:2;29960:14;;;-1:-1:-1;;;;;;;28064:1916:1:o;31336:2760::-;32837:66;32825:79;;-1:-1:-1;;;32929:2:1;32920:12;;32913:46;32989:66;32984:2;32975:12;;32968:88;33086:66;33081:2;33072:12;;33065:88;33183:66;33178:2;33169:12;;33162:88;33281:66;33275:3;33266:13;;33259:89;-1:-1:-1;;;33373:3:1;33364:13;;33357:47;-1:-1:-1;;;33452:3:1;33443:13;;30035:21;32807:3;33479:67;33505:40;33540:3;33535;33531:13;33523:6;33505:40;:::i;:::-;33497:6;33479:67;:::i;:::-;-1:-1:-1;;;30113:22:1;;30219:66;33684:1;33673:13;;30207:79;-1:-1:-1;;;30302:12:1;;;30295:68;30479:66;30379:12;;;30467:79;30576:66;30562:12;;;30555:88;30659:12;;;30752:66;30740:79;;33600:88;-1:-1:-1;33755:41:1;33792:2;33785:5;33781:14;33773:6;33755:41;:::i;:::-;30900:66;30888:79;;33742:54;-1:-1:-1;31055:66:1;33956:2;33945:14;;31043:79;31152:66;31138:12;;;31131:88;33863:99;33889:72;31235:12;;;33915:45;30978:275;33889:72;33881:6;33863:99;:::i;:::-;-1:-1:-1;;;31308:21:1;;;34057:1;34046:13;;31308:21;34087:2;34076:14;;;-1:-1:-1;;;;;;;;31336:2760:1:o;34512:127::-;34573:10;34568:3;34564:20;34561:1;34554:31;34604:4;34601:1;34594:15;34628:4;34625:1;34618:15;34644:1242;-1:-1:-1;;;35256:3:1;35249:19;35231:3;35297:6;35291:13;35313:74;35380:6;35376:1;35371:3;35367:11;35360:4;35352:6;35348:17;35313:74;:::i;:::-;35415:6;35410:3;35406:16;35396:26;;-1:-1:-1;;;35472:2:1;35468:1;35464:2;35460:10;35453:22;35506:6;35500:13;35522:75;35588:8;35584:1;35580:2;35576:10;35569:4;35561:6;35557:17;35522:75;:::i;:::-;35657:1;35616:17;;35649:10;;;35642:22;35689:13;;35711:75;35689:13;35773:1;35765:10;;35758:4;35746:17;;35711:75;:::i;:::-;-1:-1:-1;;;35846:1:1;35805:17;;;;35838:10;;;35831:23;35878:1;35870:10;;34644:1242;-1:-1:-1;;;;;34644:1242:1:o;36152:448::-;36404:28;36399:3;36392:41;36374:3;36462:6;36456:13;36478:75;36546:6;36541:2;36536:3;36532:12;36525:4;36517:6;36513:17;36478:75;:::i;:::-;36573:16;;;;36591:2;36569:25;;36152:448;-1:-1:-1;;36152:448:1:o;38007:491::-;38248:19;;;38305:2;38301:15;;;;-1:-1:-1;;38297:53:1;38292:2;38283:12;;38276:75;38376:2;38367:12;;38360:28;;;;38413:2;38404:12;;38397:28;38450:3;38441:13;;38434:29;38488:3;38479:13;;38007:491::o;39196:331::-;39301:9;39312;39354:8;39342:10;39339:24;39336:44;;;39376:1;39373;39366:12;39336:44;39405:6;39395:8;39392:20;39389:40;;;39425:1;39422;39415:12;39389:40;-1:-1:-1;;39451:23:1;;;39496:25;;;;;-1:-1:-1;39196:331:1:o;42561:125::-;42626:9;;;42647:10;;;42644:36;;;42660:18;;:::i;42691:112::-;42723:1;42749;42739:35;;42754:18;;:::i;:::-;-1:-1:-1;42788:9:1;;42691:112::o;43229:442::-;43283:5;43336:3;43329:4;43321:6;43317:17;43313:27;43303:55;;43354:1;43351;43344:12;43303:55;43383:6;43377:13;43414:48;43430:31;43458:2;43430:31;:::i;43414:48::-;43487:2;43478:7;43471:19;43533:3;43526:4;43521:2;43513:6;43509:15;43505:26;43502:35;43499:55;;;43550:1;43547;43540:12;43499:55;43563:77;43637:2;43630:4;43621:7;43617:18;43610:4;43602:6;43598:17;43563:77;:::i;43676:562::-;43775:6;43783;43836:2;43824:9;43815:7;43811:23;43807:32;43804:52;;;43852:1;43849;43842:12;43804:52;43885:9;43879:16;43914:18;43955:2;43947:6;43944:14;43941:34;;;43971:1;43968;43961:12;43941:34;43994:61;44047:7;44038:6;44027:9;44023:22;43994:61;:::i;:::-;43984:71;;44101:2;44090:9;44086:18;44080:25;44064:41;;44130:2;44120:8;44117:16;44114:36;;;44146:1;44143;44136:12;44114:36;;44169:63;44224:7;44213:8;44202:9;44198:24;44169:63;:::i;:::-;44159:73;;;43676:562;;;;;:::o;44433:337::-;44513:6;44566:2;44554:9;44545:7;44541:23;44537:32;44534:52;;;44582:1;44579;44572:12;44534:52;44615:9;44609:16;44648:18;44640:6;44637:30;44634:50;;;44680:1;44677;44670:12;44634:50;44703:61;44756:7;44747:6;44736:9;44732:22;44703:61;:::i;45062:289::-;45193:3;45231:6;45225:13;45247:66;45306:6;45301:3;45294:4;45286:6;45282:17;45247:66;:::i;:::-;45329:16;;;;;45062:289;-1:-1:-1;;45062:289:1:o;45356:135::-;45395:3;45416:17;;;45413:43;;45436:18;;:::i;:::-;-1:-1:-1;45483:1:1;45472:13;;45356:135::o;45850:414::-;46052:2;46034:21;;;46091:2;46071:18;;;46064:30;46130:34;46125:2;46110:18;;46103:62;-1:-1:-1;;;46196:2:1;46181:18;;46174:48;46254:3;46239:19;;45850:414::o;46702:2707::-;-1:-1:-1;;;47795:43:1;;47861:13;;47777:3;;47893:4;47906:74;47861:13;47969:1;47960:11;;47941:17;;;47906:74;:::i;:::-;48040:13;;47999:16;;;;48062:75;48040:13;48124:1;48116:10;;48109:4;48097:17;;48062:75;:::i;:::-;-1:-1:-1;;;48197:1:1;48156:17;;;;48189:10;;;48182:66;48273:13;;48295:76;48273:13;48357:2;48349:11;;48342:4;48330:17;;48295:76;:::i;:::-;-1:-1:-1;;;48431:2:1;48390:17;;;;48423:11;;;48416:35;-1:-1:-1;;;48475:2:1;48467:11;;48460:65;48593:13;;48544:2;;-1:-1:-1;;48631:36:1;48593:13;48631:36;:::i;:::-;48686:1;48703:17;;;48729:153;;;;48896:1;48891:351;;;;48696:546;;48729:153;48789:3;48785:8;48774:9;48770:24;48765:2;48761;48757:11;48750:45;48869:2;48855:8;48848:16;48841:24;48831:8;48827:39;48823:2;48819:48;48815:57;48808:64;;48729:153;;48891:351;48922:6;48919:1;48912:17;48970:4;48967:1;48957:18;48997:1;49011:175;49025:8;49022:1;49019:15;49011:175;;;49113:14;;49096:10;;;49092:19;;49085:43;49156:16;;;;49042:10;;49011:175;;;49015:3;;49229:2;49218:8;49214:2;49210:17;49206:26;49199:33;;48696:546;;;;;49258:145;49288:114;49314:87;49344:56;49370:29;49395:3;-1:-1:-1;;;46329:55:1;;46409:2;46400:12;;46269:149;49370:29;49362:6;49344:56;:::i;:::-;-1:-1:-1;;;46488:45:1;;46558:2;46549:12;;46423:144;49314:87;49306:6;49288:114;:::i;:::-;-1:-1:-1;;;46637:27:1;;46689:1;46680:11;;46572:125;49258:145;49251:152;46702:2707;-1:-1:-1;;;;;;;;;;;;46702:2707:1:o;49414:451::-;49666:31;49661:3;49654:44;49636:3;49727:6;49721:13;49743:75;49811:6;49806:2;49801:3;49797:12;49790:4;49782:6;49778:17;49743:75;:::i;:::-;49838:16;;;;49856:2;49834:25;;49414:451;-1:-1:-1;;49414:451:1:o;49870:500::-;-1:-1:-1;;;;;50139:15:1;;;50121:34;;50191:15;;50186:2;50171:18;;50164:43;50238:2;50223:18;;50216:34;;;50286:3;50281:2;50266:18;;50259:31;;;50064:4;;50307:57;;50344:19;;50336:6;50307:57;:::i;:::-;50299:65;49870:500;-1:-1:-1;;;;;;49870:500:1:o;50375:249::-;50444:6;50497:2;50485:9;50476:7;50472:23;50468:32;50465:52;;;50513:1;50510;50503:12;50465:52;50545:9;50539:16;50564:30;50588:5;50564:30;:::i;50629:551::-;50891:66;50886:3;50879:79;50997:16;50992:3;50988:26;50983:2;50978:3;50974:12;50967:48;50861:3;51044:6;51038:13;51060:73;51126:6;51121:2;51116:3;51112:12;51107:2;51099:6;51095:15;51060:73;:::i;:::-;51153:16;;;;51171:2;51149:25;;50629:551;-1:-1:-1;;50629:551:1:o;51510:2254::-;52544:66;52539:3;52532:79;52514:3;52640:6;52634:13;52656:75;52724:6;52719:2;52714:3;52710:12;52703:4;52695:6;52691:17;52656:75;:::i;:::-;52795:66;52790:2;52750:16;;;52782:11;;;52775:87;-1:-1:-1;;;52925:2:1;52917:11;;52910:23;;;52958:13;;52980:76;52958:13;53042:2;53034:11;;53027:4;53015:17;;52980:76;:::i;:::-;53121:66;53116:2;53075:17;;;;53108:11;;;53101:87;53212:2;53204:11;;53197:23;53245:13;;53267:77;53245:13;53329:3;53321:12;;53314:4;53302:17;;53267:77;:::i;:::-;53410:66;53404:3;53363:17;;;;53396:12;;;53389:88;-1:-1:-1;;;53501:3:1;53493:12;;53486:25;53533:151;53559:124;53585:97;53615:66;53641:39;53675:3;53667:12;;53659:6;53641:39;:::i;:::-;53633:6;53615:66;:::i;:::-;51262;51250:79;;-1:-1:-1;;;51354:2:1;51345:12;;51338:34;51397:2;51388:12;;51185:221;53533:151;-1:-1:-1;;;51469:30:1;;53756:1;53745:13;;;-1:-1:-1;;;;;;;;;;51510:2254:1:o

Swarm Source

ipfs://5bcda8aa133bdcc8dc00ab313fbfb322ea8618c6231865adc441e3bb6ab6ce9d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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