ETH Price: $3,477.69 (+0.84%)

Token

ERC-X METAL FACE (METAL FACE)
 

Overview

Max Total Supply

100,000 METAL FACE

Holders

23

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
*跟我反买-别墅靠海.eth
0x250F56566389b7b5adF20c7e3C11bBF853a365C2
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:
ERC_X

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-12
*/

/**
 *Submitted for verification at Etherscan.io on 2024-02-11
*/

//Inspired by all the great work out there from ERC20, 404, 721, 721a, 721Psi, 1155, 1155Delta

// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

interface IERC20Errors {
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
    error ERC20InvalidSender(address sender);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidSpender(address spender);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

interface IERCX {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * Cannot burn from the zero address.
     */
    error BurnFromZeroAddress();

    /**
     * Cannot burn from the address that doesn't owne the token.
     */
    error BurnFromNonOnwerAddress();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from` or the `amount` is not 1.
     */
    error TransferFromIncorrectOwnerOrInvalidAmount();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC1155Receiver interface.
     */
    error TransferToNonERC1155ReceiverImplementer();
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The length of input arraies is not matching.
     */
    error InputLengthMistmatch();

    function isOwnerOf(address account, uint256 id) external view returns(bool);
}

/**
 * @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 Interface that must be implemented by smart contracts in order to receive
 * ERC-1155 token transfers.
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


/// @notice Library for bit twiddling and boolean operations.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBit.sol)
/// @author Inspired by (https://graphics.stanford.edu/~seander/bithacks.html)
library LibBit {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  BIT TWIDDLING OPERATIONS                  */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Find last set.
    /// Returns the index of the most significant bit of `x`,
    /// counting from the least significant bit position.
    /// If `x` is zero, returns 256.
    function fls(uint256 x) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            r := or(shl(8, iszero(x)), shl(7, lt(0xffffffffffffffffffffffffffffffff, x)))
            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))
            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))
            r := or(r, shl(4, lt(0xffff, shr(r, x))))
            r := or(r, shl(3, lt(0xff, shr(r, x))))
            // forgefmt: disable-next-item
            r := or(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),
                0x0706060506020504060203020504030106050205030304010505030400000000))
        }
    }

    /// @dev Count leading zeros.
    /// Returns the number of zeros preceding the most significant one bit.
    /// If `x` is zero, returns 256.
    function clz(uint256 x) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))
            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))
            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))
            r := or(r, shl(4, lt(0xffff, shr(r, x))))
            r := or(r, shl(3, lt(0xff, shr(r, x))))
            // forgefmt: disable-next-item
            r := add(xor(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),
                0xf8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff)), iszero(x))
        }
    }

    /// @dev Find first set.
    /// Returns the index of the least significant bit of `x`,
    /// counting from the least significant bit position.
    /// If `x` is zero, returns 256.
    /// Equivalent to `ctz` (count trailing zeros), which gives
    /// the number of zeros following the least significant one bit.
    function ffs(uint256 x) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            // Isolate the least significant bit.
            let b := and(x, add(not(x), 1))

            r := or(shl(8, iszero(x)), shl(7, lt(0xffffffffffffffffffffffffffffffff, b)))
            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, b))))
            r := or(r, shl(5, lt(0xffffffff, shr(r, b))))

            // For the remaining 32 bits, use a De Bruijn lookup.
            // forgefmt: disable-next-item
            r := or(r, byte(and(div(0xd76453e0, shr(r, b)), 0x1f),
                0x001f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405))
        }
    }

    /// @dev Returns the number of set bits in `x`.
    function popCount(uint256 x) internal pure returns (uint256 c) {
        /// @solidity memory-safe-assembly
        assembly {
            let max := not(0)
            let isMax := eq(x, max)
            x := sub(x, and(shr(1, x), div(max, 3)))
            x := add(and(x, div(max, 5)), and(shr(2, x), div(max, 5)))
            x := and(add(x, shr(4, x)), div(max, 17))
            c := or(shl(8, isMax), shr(248, mul(x, div(max, 255))))
        }
    }

    /// @dev Returns whether `x` is a power of 2.
    function isPo2(uint256 x) internal pure returns (bool result) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to `x && !(x & (x - 1))`.
            result := iszero(add(and(x, sub(x, 1)), iszero(x)))
        }
    }

    /// @dev Returns `x` reversed at the bit level.
    function reverseBits(uint256 x) internal pure returns (uint256 r) {
        uint256 m0 = 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f;
        uint256 m1 = m0 ^ (m0 << 2);
        uint256 m2 = m1 ^ (m1 << 1);
        r = reverseBytes(x);
        r = (m2 & (r >> 1)) | ((m2 & r) << 1);
        r = (m1 & (r >> 2)) | ((m1 & r) << 2);
        r = (m0 & (r >> 4)) | ((m0 & r) << 4);
    }

    /// @dev Returns `x` reversed at the byte level.
    function reverseBytes(uint256 x) internal pure returns (uint256 r) {
        unchecked {
            // Computing masks on-the-fly reduces bytecode size by about 200 bytes.
            uint256 m0 = 0x100000000000000000000000000000001 * (~toUint(x == 0) >> 192);
            uint256 m1 = m0 ^ (m0 << 32);
            uint256 m2 = m1 ^ (m1 << 16);
            uint256 m3 = m2 ^ (m2 << 8);
            r = (m3 & (x >> 8)) | ((m3 & x) << 8);
            r = (m2 & (r >> 16)) | ((m2 & r) << 16);
            r = (m1 & (r >> 32)) | ((m1 & r) << 32);
            r = (m0 & (r >> 64)) | ((m0 & r) << 64);
            r = (r >> 128) | (r << 128);
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     BOOLEAN OPERATIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // A Solidity bool on the stack or memory is represented as a 256-bit word.
    // Non-zero values are true, zero is false.
    // A clean bool is either 0 (false) or 1 (true) under the hood.
    // Usually, if not always, the bool result of a regular Solidity expression,
    // or the argument of a public/external function will be a clean bool.
    // You can usually use the raw variants for more performance.
    // If uncertain, test (best with exact compiler settings).
    // Or use the non-raw variants (compiler can sometimes optimize out the double `iszero`s).

    /// @dev Returns `x & y`. Inputs must be clean.
    function rawAnd(bool x, bool y) internal pure returns (bool z) {
        /// @solidity memory-safe-assembly
        assembly {
            z := and(x, y)
        }
    }

    /// @dev Returns `x & y`.
    function and(bool x, bool y) internal pure returns (bool z) {
        /// @solidity memory-safe-assembly
        assembly {
            z := and(iszero(iszero(x)), iszero(iszero(y)))
        }
    }

    /// @dev Returns `x | y`. Inputs must be clean.
    function rawOr(bool x, bool y) internal pure returns (bool z) {
        /// @solidity memory-safe-assembly
        assembly {
            z := or(x, y)
        }
    }

    /// @dev Returns `x | y`.
    function or(bool x, bool y) internal pure returns (bool z) {
        /// @solidity memory-safe-assembly
        assembly {
            z := or(iszero(iszero(x)), iszero(iszero(y)))
        }
    }

    /// @dev Returns 1 if `b` is true, else 0. Input must be clean.
    function rawToUint(bool b) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            z := b
        }
    }

    /// @dev Returns 1 if `b` is true, else 0.
    function toUint(bool b) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            z := iszero(iszero(b))
        }
    }
}

/// @notice Library for storage of packed unsigned booleans.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBitmap.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibBitmap.sol)
/// @author Modified from Solidity-Bits (https://github.com/estarriolvetch/solidity-bits/blob/main/contracts/BitMaps.sol)
library LibBitmap {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The constant returned when a bitmap scan does not find a result.
    uint256 internal constant NOT_FOUND = type(uint256).max;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STRUCTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev A bitmap in storage.
    struct Bitmap {
        mapping(uint256 => uint256) map;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         OPERATIONS                         */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the boolean value of the bit at `index` in `bitmap`.
    function get(Bitmap storage bitmap, uint256 index) internal view returns (bool isSet) {
        // It is better to set `isSet` to either 0 or 1, than zero vs non-zero.
        // Both cost the same amount of gas, but the former allows the returned value
        // to be reused without cleaning the upper bits.
        uint256 b = (bitmap.map[index >> 8] >> (index & 0xff)) & 1;
        /// @solidity memory-safe-assembly
        assembly {
            isSet := b
        }
    }

    /// @dev Updates the bit at `index` in `bitmap` to true.
    function set(Bitmap storage bitmap, uint256 index) internal {
        bitmap.map[index >> 8] |= (1 << (index & 0xff));
    }

    /// @dev Updates the bit at `index` in `bitmap` to false.
    function unset(Bitmap storage bitmap, uint256 index) internal {
        bitmap.map[index >> 8] &= ~(1 << (index & 0xff));
    }

    /// @dev Flips the bit at `index` in `bitmap`.
    /// Returns the boolean result of the flipped bit.
    function toggle(Bitmap storage bitmap, uint256 index) internal returns (bool newIsSet) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, bitmap.slot)
            mstore(0x00, shr(8, index))
            let storageSlot := keccak256(0x00, 0x40)
            let shift := and(index, 0xff)
            let storageValue := xor(sload(storageSlot), shl(shift, 1))
            // It makes sense to return the `newIsSet`,
            // as it allow us to skip an additional warm `sload`,
            // and it costs minimal gas (about 15),
            // which may be optimized away if the returned value is unused.
            newIsSet := and(1, shr(shift, storageValue))
            sstore(storageSlot, storageValue)
        }
    }

    /// @dev Updates the bit at `index` in `bitmap` to `shouldSet`.
    function setTo(Bitmap storage bitmap, uint256 index, bool shouldSet) internal {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, bitmap.slot)
            mstore(0x00, shr(8, index))
            let storageSlot := keccak256(0x00, 0x40)
            let storageValue := sload(storageSlot)
            let shift := and(index, 0xff)
            sstore(
                storageSlot,
                // Unsets the bit at `shift` via `and`, then sets its new value via `or`.
                or(and(storageValue, not(shl(shift, 1))), shl(shift, iszero(iszero(shouldSet))))
            )
        }
    }

    /// @dev Consecutively sets `amount` of bits starting from the bit at `start`.
    function setBatch(Bitmap storage bitmap, uint256 start, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            let max := not(0)
            let shift := and(start, 0xff)
            mstore(0x20, bitmap.slot)
            mstore(0x00, shr(8, start))
            if iszero(lt(add(shift, amount), 257)) {
                let storageSlot := keccak256(0x00, 0x40)
                sstore(storageSlot, or(sload(storageSlot), shl(shift, max)))
                let bucket := add(mload(0x00), 1)
                let bucketEnd := add(mload(0x00), shr(8, add(amount, shift)))
                amount := and(add(amount, shift), 0xff)
                shift := 0
                for {} iszero(eq(bucket, bucketEnd)) { bucket := add(bucket, 1) } {
                    mstore(0x00, bucket)
                    sstore(keccak256(0x00, 0x40), max)
                }
                mstore(0x00, bucket)
            }
            let storageSlot := keccak256(0x00, 0x40)
            sstore(storageSlot, or(sload(storageSlot), shl(shift, shr(sub(256, amount), max))))
        }
    }

    /// @dev Consecutively unsets `amount` of bits starting from the bit at `start`.
    function unsetBatch(Bitmap storage bitmap, uint256 start, uint256 amount) internal {
        /// @solidity memory-safe-assembly
        assembly {
            let shift := and(start, 0xff)
            mstore(0x20, bitmap.slot)
            mstore(0x00, shr(8, start))
            if iszero(lt(add(shift, amount), 257)) {
                let storageSlot := keccak256(0x00, 0x40)
                sstore(storageSlot, and(sload(storageSlot), not(shl(shift, not(0)))))
                let bucket := add(mload(0x00), 1)
                let bucketEnd := add(mload(0x00), shr(8, add(amount, shift)))
                amount := and(add(amount, shift), 0xff)
                shift := 0
                for {} iszero(eq(bucket, bucketEnd)) { bucket := add(bucket, 1) } {
                    mstore(0x00, bucket)
                    sstore(keccak256(0x00, 0x40), 0)
                }
                mstore(0x00, bucket)
            }
            let storageSlot := keccak256(0x00, 0x40)
            sstore(
                storageSlot, and(sload(storageSlot), not(shl(shift, shr(sub(256, amount), not(0)))))
            )
        }
    }

    /// @dev Returns number of set bits within a range by
    /// scanning `amount` of bits starting from the bit at `start`.
    function popCount(Bitmap storage bitmap, uint256 start, uint256 amount)
        internal
        view
        returns (uint256 count)
    {
        unchecked {
            uint256 bucket = start >> 8;
            uint256 shift = start & 0xff;
            if (!(amount + shift < 257)) {
                count = LibBit.popCount(bitmap.map[bucket] >> shift);
                uint256 bucketEnd = bucket + ((amount + shift) >> 8);
                amount = (amount + shift) & 0xff;
                shift = 0;
                for (++bucket; bucket != bucketEnd; ++bucket) {
                    count += LibBit.popCount(bitmap.map[bucket]);
                }
            }
            count += LibBit.popCount((bitmap.map[bucket] >> shift) << (256 - amount));
        }
    }

    /// @dev Returns the index of the most significant set bit before the bit at `before`.
    /// If no set bit is found, returns `NOT_FOUND`.
    function findLastSet(Bitmap storage bitmap, uint256 before)
        internal
        view
        returns (uint256 setBitIndex)
    {
        uint256 bucket;
        uint256 bucketBits;
        /// @solidity memory-safe-assembly
        assembly {
            setBitIndex := not(0)
            bucket := shr(8, before)
            mstore(0x00, bucket)
            mstore(0x20, bitmap.slot)
            let offset := and(0xff, not(before)) // `256 - (255 & before) - 1`.
            bucketBits := shr(offset, shl(offset, sload(keccak256(0x00, 0x40))))
            if iszero(or(bucketBits, iszero(bucket))) {
                for {} 1 {} {
                    bucket := add(bucket, setBitIndex) // `sub(bucket, 1)`.
                    mstore(0x00, bucket)
                    bucketBits := sload(keccak256(0x00, 0x40))
                    if or(bucketBits, iszero(bucket)) { break }
                }
            }
        }
        if (bucketBits != 0) {
            setBitIndex = (bucket << 8) | LibBit.fls(bucketBits);
            /// @solidity memory-safe-assembly
            assembly {
                setBitIndex := or(setBitIndex, sub(0, gt(setBitIndex, before)))
            }
        }
    }
}

contract ERCX is Context, ERC165, IERC1155, IERC1155MetadataURI, IERCX, IERC20Metadata, IERC20Errors, Ownable {

    using Address for address;
    using LibBitmap for LibBitmap.Bitmap;

    error InvalidQueryRange();

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;
    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // Mapping from accout to owned tokens
    mapping(address => LibBitmap.Bitmap) internal _owned;
    
    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // NFT Approval
    mapping(uint256 => address) public getApproved;

    //Token balances
    mapping(address => uint256) internal _balances;

    //Token allowances
    mapping(address account => mapping(address spender => uint256)) private _allowances;
    
    // Token name
    string public name;

    // Token symbol
    string public symbol;

    // Decimals for supply
    uint8 public immutable decimals;

    // Total ERC20 supply
    uint256 public immutable totalSupply;

    // Tokens Per NFT
    uint256 public immutable decimalFactor;
    uint256 public immutable tokensPerNFT;

    // Don't mint for these wallets
    mapping(address => bool) public whitelist;

    // Easy Launch - auto-whitelist first transfer which is probably the LP
    uint256 public easyLaunch = 1;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_, string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalNativeSupply, uint256 _tokensPerNFT) Ownable(msg.sender) {
        _setURI(uri_);
        _currentIndex = _startTokenId();
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        decimalFactor = 10 ** decimals;
        tokensPerNFT = _tokensPerNFT * decimalFactor;
        totalSupply = _totalNativeSupply * decimalFactor;
        whitelist[msg.sender] = true;
        _balances[msg.sender] = totalSupply;
        emit Transfer(address(0), msg.sender, totalSupply);
    }

    /** @notice Initialization function to set pairs / etc
     *  saving gas by avoiding mint / burn on unnecessary targets
     */
    function setWhitelist(address target, bool state) public virtual onlyOwner {
        whitelist[target] = state;
    }

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal pure virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        return _nextTokenId() - _startTokenId();
    }

    /**
     * @dev Returns true if the account owns the `id` token.
     */
    function isOwnerOf(address account, uint256 id) public view virtual override returns(bool) {
        return _owned[account].get(id);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            interfaceId == type(IERCX).interfaceId ||
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f || // ERC165 interface ID for ERC721Metadata.
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev Returns the number of tokens owned by `owner`.
     */
    function balanceOf(address owner) public view virtual returns (uint256) {
        return _balances[owner];
    }

    /**
     * @dev Returns the number of nfts owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function balanceOf(address owner, uint256 start, uint256 stop) public view virtual returns (uint256) {
        return _owned[owner].popCount(start, stop - start);
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        if(account == address(0)) {
            revert BalanceQueryForZeroAddress();
        }
        if(_owned[account].get(id)) {
            return 1;
        } else {
            return 0;
        }   
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        if(accounts.length != ids.length) {
            revert InputLengthMistmatch();
        }

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        if(from == _msgSender() || isApprovedForAll(from, _msgSender())){
            _safeTransferFrom(from, to, id, amount, data, true);
        } else {
            revert TransferCallerNotOwnerNorApproved();
        }
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        if(!(from == _msgSender() || isApprovedForAll(from, _msgSender()))) {
            revert TransferCallerNotOwnerNorApproved();
        }
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `amount` cannot be zero.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data,
        bool check
    ) internal virtual {
        if(to == address(0)) {
            revert TransferToZeroAddress();
        }

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);

        _beforeTokenTransfer(operator, from, to, ids);

        if(amount == 1 && _owned[from].get(id)) {
            _owned[from].unset(id);
            _owned[to].set(id);
            _transfer(from, to, tokensPerNFT, false);
        } else {
            revert TransferFromIncorrectOwnerOrInvalidAmount();
        }

        uint256 toMasked;
        uint256 fromMasked;
        assembly {
            // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
            toMasked := and(to, _BITMASK_ADDRESS)
            fromMasked := and(from, _BITMASK_ADDRESS)
            // Emit the `Transfer` event.
            log4(
                0, // Start of data (0, since no data).
                0, // End of data (0, since no data).
                _TRANSFER_EVENT_SIGNATURE, // Signature.
                fromMasked, // `from`.
                toMasked, // `to`.
                amount // `tokenId`.
            )
        }

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids);

        if(check)
            _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        if(ids.length != amounts.length) {
            revert InputLengthMistmatch();
        }

        if(to == address(0)) {
            revert TransferToZeroAddress();
        }
        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            if(amount == 1 && _owned[from].get(id)) {
                _owned[from].unset(id);
                _owned[to].set(id);
            } else {
                revert TransferFromIncorrectOwnerOrInvalidAmount();
            }
        }
        _transfer(from, to, tokensPerNFT * ids.length, false);

        uint256 toMasked;
        uint256 fromMasked;
        uint256 end = ids.length + 1;

        // Use assembly to loop and emit the `Transfer` event for gas savings.
        // The duplicated `log4` removes an extra check and reduces stack juggling.
        // The assembly, together with the surrounding Solidity code, have been
        // delicately arranged to nudge the compiler into producing optimized opcodes.
        assembly {
            // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
            fromMasked := and(from, _BITMASK_ADDRESS)
            toMasked := and(to, _BITMASK_ADDRESS)
            // Emit the `Transfer` event.
            log4(
                0, // Start of data (0, since no data).
                0, // End of data (0, since no data).
                _TRANSFER_EVENT_SIGNATURE, // Signature.
                fromMasked, // `from`.
                toMasked, // `to`.
                mload(add(ids, 0x20)) // `tokenId`.
            )

            // The `iszero(eq(,))` check ensures that large values of `quantity`
            // that overflows uint256 will make the loop run out of gas.
            // The compiler will optimize the `iszero` away for performance.
            for {
                let arrayId := 2
            } iszero(eq(arrayId, end)) {
                arrayId := add(arrayId, 1)
            } {
                // Emit the `Transfer` event. Similar to above.
                log4(0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, toMasked, mload(add(ids, mul(0x20, arrayId))))
            }
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    function _mint(
        address to,
        uint256 amount
    ) internal virtual {
        _mint(to, amount, "");
    }

    /**
     * @dev Creates `amount` tokens, and assigns them to `to`.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `amount` cannot be zero.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 amount,
        bytes memory data
    ) internal virtual {
       (uint256[] memory ids, uint256[] memory amounts) =  _mintWithoutCheck(to, amount);

        uint256 end = _currentIndex;
        _doSafeBatchTransferAcceptanceCheck(_msgSender(), address(0), to, ids, amounts, data);
        if (_currentIndex != end) revert();
    }

    function _mintWithoutCheck(
        address to,
        uint256 amount
    ) internal virtual returns(uint256[] memory ids, uint256[] memory amounts) {

        if(to == address(0)) {
            revert MintToZeroAddress();
        }
        if(amount == 0) {
            revert MintZeroQuantity();
        }

        address operator = _msgSender();

        ids = new uint256[](amount);
        amounts = new uint256[](amount);
        uint256 startTokenId = _nextTokenId();

        unchecked {
            require(type(uint256).max - amount >= startTokenId);
            for(uint256 i = 0; i < amount; i++) {
                ids[i] = startTokenId + i;
                amounts[i] = 1;
            }
        }
        
        _beforeTokenTransfer(operator, address(0), to, ids);

        _owned[to].setBatch(startTokenId, amount);
        _currentIndex += amount;

        uint256 toMasked;
        uint256 end = startTokenId + amount;

        assembly {
            toMasked := and(to, _BITMASK_ADDRESS)
            log4(
                0,
                0,
                _TRANSFER_EVENT_SIGNATURE,
                0,
                toMasked,
                startTokenId
            )

            for {
                let tokenId := add(startTokenId, 1)
            } iszero(eq(tokenId, end)) {
                tokenId := add(tokenId, 1)
            } {
                log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
            }
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids);

    }

    /**
     * @dev Destroys token of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have the token of token type `id`.
     */
    function _burn(
        address from,
        uint256 id
    ) internal virtual {
        if(from == address(0)){
            revert BurnFromZeroAddress();
        }

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);

        _beforeTokenTransfer(operator, from, address(0), ids);

        if(!_owned[from].get(id)) {
            revert BurnFromNonOnwerAddress();
        }

        _owned[from].unset(id);

        uint256 fromMasked;
        assembly {
            fromMasked := and(from, _BITMASK_ADDRESS)
            log4(
                0,
                0,
                _TRANSFER_EVENT_SIGNATURE,
                fromMasked,
                0,
                id
            )
        }

        emit TransferSingle(operator, from, address(0), id, 1);

        _afterTokenTransfer(operator, from, address(0), ids);
    }

    /**
     * @dev Destroys tokens of token types in `ids` from `from`
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have the token of token types in `ids`.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids
    ) internal virtual {
        if(from == address(0)){
            revert BurnFromZeroAddress();
        }

        address operator = _msgSender();

        uint256[] memory amounts = new uint256[](ids.length);

        _beforeTokenTransfer(operator, from, address(0), ids);

        unchecked {
            for(uint256 i = 0; i < ids.length; i++) {
                amounts[i] = 1;
                uint256 id = ids[i];
                if(!_owned[from].get(id)) {
                    revert BurnFromNonOnwerAddress();
                }
                _owned[from].unset(id);
            }
        }

        uint256 fromMasked;
        uint256 end = ids.length + 1;

        assembly {
            fromMasked := and(from, _BITMASK_ADDRESS)
            log4(
                0,
                0,
                _TRANSFER_EVENT_SIGNATURE,
                fromMasked,
                0,
                mload(add(ids, 0x20))
            )

            for {
                let arrayId := 2
            } iszero(eq(arrayId, end)) {
                arrayId := add(arrayId, 1)
            } {
                log4(0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, 0, mload(add(ids, mul(0x20, arrayId))))
            }
        }
        
        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids);

    }

    function _burnBatch(
        address from,
        uint256 amount
    ) internal virtual {
        if(from == address(0)){
            revert BurnFromZeroAddress();
        }

        address operator = _msgSender();

        uint256 searchFrom = _nextTokenId();

        uint256[] memory amounts = new uint256[](amount);
        uint256[] memory ids = new uint256[](amount);

        unchecked {
            for(uint256 i = 0; i < amount; i++) {
                amounts[i] = 1;
                uint256 id = _owned[from].findLastSet(searchFrom);
                ids[i] = id;
                _owned[from].unset(id);
                searchFrom = id;
            }
        }

        //technically after, but we didn't have the IDs then
        _beforeTokenTransfer(operator, from, address(0), ids);

        uint256 fromMasked;
        uint256 end = amount + 1;

        assembly {
            fromMasked := and(from, _BITMASK_ADDRESS)
            log4(
                0,
                0,
                _TRANSFER_EVENT_SIGNATURE,
                fromMasked,
                0,
                mload(add(ids, 0x20))
            )

            for {
                let arrayId := 2
            } iszero(eq(arrayId, end)) {
                arrayId := add(arrayId, 1)
            } {
                log4(0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, 0, mload(add(ids, mul(0x20, arrayId))))
            }
        }

        if(amount == 1)
            emit TransferSingle(operator, from, address(0), ids[0], 1);
        else
            emit TransferBatch(operator, from, address(0), ids, amounts);
        

        _afterTokenTransfer(operator, from, address(0), ids);

    }


     /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            if (IERC165(to).supportsInterface(type(IERC1155).interfaceId)) {
                try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                    if (response != IERC1155Receiver.onERC1155Received.selector) {
                        revert TransferToNonERC1155ReceiverImplementer();
                    }
                } catch Error(string memory reason) {
                    revert(reason);
                } catch {
                    revert TransferToNonERC1155ReceiverImplementer();
                }
            }
            else {
                try ERC721Receiver(to).onERC721Received(operator, from, id, data) returns (bytes4 response) {
                    if (response != ERC721Receiver.onERC721Received.selector) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } catch Error(string memory reason) {
                    revert(reason);
                } catch {
                    revert TransferToNonERC721ReceiverImplementer();
                }
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert TransferToNonERC1155ReceiverImplementer();
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert TransferToNonERC1155ReceiverImplementer();
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory array) {
        array = new uint256[](1);
        array[0] = element;
    }

    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to, value, true);
        return true;
    }

    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = msg.sender;
        if (value < _nextTokenId() && value > 0) {

            if(!isOwnerOf(owner, value)) {
                revert ERC20InvalidSender(owner);
            }

            getApproved[value] = spender;

            emit Approval(owner, spender, value);
        } else {
            _approve(owner, spender, value);
        }
        return true;
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        if (value < _nextTokenId()) {
            if(!_owned[from].get(value)) {
                revert ERC20InvalidSpender(from);
            }    

            if (
                msg.sender != from &&
                !isApprovedForAll(from, msg.sender) &&
                msg.sender != getApproved[value]
            ) {
                revert ERC20InvalidSpender(msg.sender);
            }

            _transfer(from, to, tokensPerNFT, false);

            delete getApproved[value];

            _safeTransferFrom(from, to, value, 1, "", false);

        } else {
            _spendAllowance(from, msg.sender, value);
            _transfer(from, to, value, true);
        }
        return true;
    }

    function _transfer(address from, address to, uint256 value, bool mint) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value, mint);
    }

    function _update(address from, address to, uint256 value, bool mint) internal virtual {
        uint256 fromBalance = _balances[from];
        uint256 toBalance = _balances[to];
        if (fromBalance < value) {
            revert ERC20InsufficientBalance(from, fromBalance, value);
        }

        unchecked {
            // Overflow not possible: value <= fromBalance <= totalSupply.
            _balances[from] = fromBalance - value;

            // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
            _balances[to] = toBalance + value;
        }

        emit Transfer(from, to, value);

        if(mint) {
            // Skip burn for certain addresses to save gas
            bool wlf = whitelist[from];
            if (!wlf) {
                uint256 tokens_to_burn = (fromBalance / tokensPerNFT) - ((fromBalance - value) / tokensPerNFT);
                if(tokens_to_burn > 0)
                    _burnBatch(from, tokens_to_burn);
            }

            // Skip minting for certain addresses to save gas
            if (!whitelist[to]) {
                if(easyLaunch == 1 && wlf && from == owner()) {
                    //auto-initialize first (assumed) LP
                    whitelist[to] = true;
                    easyLaunch = 2;
                } else {
                    uint256 tokens_to_mint = ((toBalance + value) / tokensPerNFT) - (toBalance / tokensPerNFT);
                    if(tokens_to_mint > 0)
                        _mintWithoutCheck(to, tokens_to_mint);
                }
            }
        }
    }

    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC1155DelataQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) public view virtual returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            
            
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            
            // Set `stop = min(stop, stopLimit)`.
            uint256 stopLimit = _nextTokenId();
            if (stop > stopLimit) {
                stop = stopLimit;
            }

            uint256 tokenIdsLength;
            if(start < stop) {
                tokenIdsLength = balanceOf(owner, start, stop);
            } else {
                tokenIdsLength = 0;
            }
            
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);

            LibBitmap.Bitmap storage bmap = _owned[owner];
            
            for ((uint256 i, uint256 tokenIdsIdx) = (start, 0); tokenIdsIdx != tokenIdsLength; ++i) {
                if(bmap.get(i) ) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC1155DeltaQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) public view virtual returns (uint256[] memory) {
        if(_totalMinted() == 0) {
            return new uint256[](0);
        }
        return tokensOfOwnerIn(owner, _startTokenId(), _nextTokenId());
    }
}

contract ERC_X is ERCX {
    using Strings for uint256;
    string public dataURI;
    string public baseTokenURI;
    
    uint8 private constant _decimals = 18;
    uint256 private constant _totalTokens = 100000;
    uint256 private constant _tokensPerNFT = 1;
    string private constant _name = "ERC-X METAL FACE";
    string private constant _ticker = "METAL FACE";

    // Snipe reduction tools
    uint256 public maxWallet;
    bool public transferDelay = true;
    mapping (address => uint256) private delayTimer;

    constructor() ERCX("", _name, _ticker, _decimals, _totalTokens, _tokensPerNFT) {
        dataURI = "https://i.ibb.co/";
        maxWallet = (_totalTokens * 10 ** _decimals) * 2 / 100;
    }

    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids
    ) internal override {
        if(!whitelist[to]) {
            require(_balances[to] <= maxWallet, "Transfer exceeds maximum wallet");
            if (transferDelay) {
                require(delayTimer[tx.origin] < block.number,"Only one transfer per block allowed.");
                delayTimer[tx.origin] = block.number;

                require(address(to).code.length == 0 && address(tx.origin).code.length == 0, "Contract trading restricted at launch");
            }
        }
        
        
        super._afterTokenTransfer(operator, from, to, ids);
    }

    function toggleDelay() external onlyOwner {
        transferDelay = !transferDelay;
    }

    function setMaxWallet(uint256 percent) external onlyOwner {
        maxWallet = totalSupply * percent / 100;
    }

    function setDataURI(string memory _dataURI) public onlyOwner {
        dataURI = _dataURI;
    }

    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function setURI(string memory newuri) external onlyOwner {
        _setURI(newuri);
    }

    function tokenURI(uint256 id) public view returns (string memory) {
        if(id >= _nextTokenId()) revert InputLengthMistmatch();

        if (bytes(super.uri(id)).length > 0)
            return super.uri(id);
        if (bytes(baseTokenURI).length > 0)
            return string(abi.encodePacked(baseTokenURI, id.toString()));
        else {
            uint8 seed = uint8(bytes1(keccak256(abi.encodePacked(id))));

            string memory image;
            string memory color;
            string memory description;

            if (seed <= 63) {
                image = "GQRhWyF/Diamond.jpg";
                color = "Diamond";
                description = "Legendary NFTs powered by ERC1155. The Diamond NFTs are meticulously mined by industry elites and crafted with unparalleled precision, representing the zenith of luxury and digital artistry.";
            } else if (seed <= 127) {
                image = "gwdLf3f/Gold.jpg";
                color = "Gold";
                description = "Prestigious NFTs powered by ERC1155. The gold NFTs are carefully mined by expert collectors and meticulously crafted with golden excellence, symbolizing the pinnacle of digital rarity and exclusivity.";
            } else if (seed <= 191) {
                image = "FJmdrdm/Silver.jpg";
                color = "Silver";
                description = "Refined NFTs powered by ERC1155. The silver NFTs are mined by seasoned enthusiasts, adding an extra layer of sophistication to your portfolio.";
            } else if (seed <= 255) {
                image = "YLG3Jvc/Bronze.jpg";
                color = "Bronze";
                description = "Entry level NFTs powered by ERC1155. The silver NFTs are mined by aspiring collectors and meticulously crafted for accessibility.";
            }

            string memory jsonPreImage = string(abi.encodePacked('{"name": "METALFACE #', id.toString(), '","description":"', description, '","external_url":"https://miner.build","image":"', dataURI, image));
            return string(abi.encodePacked("data:application/json;utf8,", jsonPreImage, '","attributes":[{"trait_type":"Color","value":"', color, '"}]}'));
        }
    }

    function uri(uint256 id) public view override returns (string memory) {
        return tokenURI(id);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BurnFromNonOnwerAddress","type":"error"},{"inputs":[],"name":"BurnFromZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InputLengthMistmatch","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwnerOrInvalidAmount","type":"error"},{"inputs":[],"name":"TransferToNonERC1155ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"easyLaunch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","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":"toggleDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6101006040526001600b556001600f5f6101000a81548160ff02191690831515021790555034801562000030575f80fd5b5060405180602001604052805f8152506040518060400160405280601081526020017f4552432d58204d4554414c2046414345000000000000000000000000000000008152506040518060400160405280600a81526020017f4d4554414c2046414345000000000000000000000000000000000000000000008152506012620186a06001335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000128575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200011f919062000491565b60405180910390fd5b62000139816200037060201b60201c565b506200014b866200043160201b60201c565b6200015b6200044660201b60201c565b600481905550846008908162000172919062000710565b50836009908162000184919062000710565b508260ff1660808160ff1681525050608051600a620001a491906200097d565b60c0818152505060c05181620001bb9190620009cd565b60e0818152505060c05182620001d29190620009cd565b60a081815250506001600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060a05160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60a051604051620002d3919062000a28565b60405180910390a35050505050506040518060400160405280601181526020017f68747470733a2f2f692e6962622e636f2f000000000000000000000000000000815250600c908162000327919062000710565b50606460026012600a6200033c91906200097d565b620186a06200034c9190620009cd565b620003589190620009cd565b62000364919062000a70565b600e8190555062000aa7565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806003908162000442919062000710565b5050565b5f6001905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000479826200044e565b9050919050565b6200048b816200046d565b82525050565b5f602082019050620004a65f83018462000480565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200052857607f821691505b6020821081036200053e576200053d620004e3565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000565565b620005ae868362000565565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005f8620005f2620005ec84620005c6565b620005cf565b620005c6565b9050919050565b5f819050919050565b6200061383620005d8565b6200062b6200062282620005ff565b84845462000571565b825550505050565b5f90565b6200064162000633565b6200064e81848462000608565b505050565b5b818110156200067557620006695f8262000637565b60018101905062000654565b5050565b601f821115620006c4576200068e8162000544565b620006998462000556565b81016020851015620006a9578190505b620006c1620006b88562000556565b83018262000653565b50505b505050565b5f82821c905092915050565b5f620006e65f1984600802620006c9565b1980831691505092915050565b5f620007008383620006d5565b9150826002028217905092915050565b6200071b82620004ac565b67ffffffffffffffff811115620007375762000736620004b6565b5b62000743825462000510565b6200075082828562000679565b5f60209050601f83116001811462000786575f841562000771578287015190505b6200077d8582620006f3565b865550620007ec565b601f198416620007968662000544565b5f5b82811015620007bf5784890151825560018201915060208501945060208101905062000798565b86831015620007df5784890151620007db601f891682620006d5565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200087e57808604811115620008565762000855620007f4565b5b6001851615620008665780820291505b8081029050620008768562000821565b945062000836565b94509492505050565b5f826200089857600190506200096a565b81620008a7575f90506200096a565b8160018114620008c05760028114620008cb5762000901565b60019150506200096a565b60ff841115620008e057620008df620007f4565b5b8360020a915084821115620008fa57620008f9620007f4565b5b506200096a565b5060208310610133831016604e8410600b84101617156200093b5782820a905083811115620009355762000934620007f4565b5b6200096a565b6200094a84848460016200082d565b92509050818404811115620009645762000963620007f4565b5b81810290505b9392505050565b5f60ff82169050919050565b5f6200098982620005c6565b9150620009968362000971565b9250620009c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000887565b905092915050565b5f620009d982620005c6565b9150620009e683620005c6565b9250828202620009f681620005c6565b9150828204841483151762000a105762000a0f620007f4565b5b5092915050565b62000a2281620005c6565b82525050565b5f60208201905062000a3d5f83018462000a17565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62000a7c82620005c6565b915062000a8983620005c6565b92508262000a9c5762000a9b62000a43565b5b828204905092915050565b60805160a05160c05160e051615f4c62000b135f395f8181610e68015281816111c4015281816120f1015281816125f401528181612f9601528181612fcd0152818161311d015261314901525f61123101525f8181610c9701526111f301525f6110060152615f4c5ff3fe608060405234801561000f575f80fd5b5060043610610245575f3560e01c806370a0823111610139578063c5b8f772116100b6578063e985e9c51161007a578063e985e9c51461074d578063f242432a1461077d578063f28ca1dd14610799578063f2fde38b146107b7578063f8b45b05146107d357610245565b8063c5b8f77214610683578063c87b56dd146106b3578063d547cfb7146106e3578063dd62ed3e14610701578063e0df5b6f1461073157610245565b806399a2557a116100fd57806399a2557a146105b95780639b19251a146105e9578063a014e6e214610619578063a22cb46514610637578063a9059cbb1461065357610245565b806370a0823114610513578063715018a6146105435780638462151c1461054d5780638da5cb5b1461057d57806395d89b411461059b57610245565b806323b872dd116101c75780634eabf2c61161018b5780634eabf2c61461049557806353d6fd591461049f5780635afcc2f5146104bb5780635d0044ca146104d95780636d6a6a4d146104f557610245565b806323b872dd146103cb5780632d760d57146103fb5780632eb2c2d61461042b578063313ce567146104475780634e1273f41461046557610245565b8063095ea7b31161020e578063095ea7b3146103135780630a702e8d146103435780630e89341c1461036157806318160ddd1461039157806318d217c3146103af57610245565b8062fdd58e1461024957806301ffc9a71461027957806302fe5305146102a957806306fdde03146102c5578063081812fc146102e3575b5f80fd5b610263600480360381019061025e919061446a565b6107f1565b60405161027091906144b7565b60405180910390f35b610293600480360381019061028e9190614525565b6108be565b6040516102a0919061456a565b60405180910390f35b6102c360048036038101906102be91906146bf565b610a67565b005b6102cd610a7b565b6040516102da9190614780565b60405180910390f35b6102fd60048036038101906102f891906147a0565b610b07565b60405161030a91906147da565b60405180910390f35b61032d6004803603810190610328919061446a565b610b37565b60405161033a919061456a565b60405180910390f35b61034b610c71565b604051610358919061456a565b60405180910390f35b61037b600480360381019061037691906147a0565b610c83565b6040516103889190614780565b60405180910390f35b610399610c95565b6040516103a691906144b7565b60405180910390f35b6103c960048036038101906103c491906146bf565b610cb9565b005b6103e560048036038101906103e091906147f3565b610cd4565b6040516103f2919061456a565b60405180910390f35b61041560048036038101906104109190614843565b610f06565b60405161042291906144b7565b60405180910390f35b610445600480360381019061044091906149f5565b610f6c565b005b61044f611004565b60405161045c9190614adb565b60405180910390f35b61047f600480360381019061047a9190614bb4565b611028565b60405161048c9190614ce1565b60405180910390f35b61049d611130565b005b6104b960048036038101906104b49190614d2b565b611162565b005b6104c36111c2565b6040516104d091906144b7565b60405180910390f35b6104f360048036038101906104ee91906147a0565b6111e6565b005b6104fd61122f565b60405161050a91906144b7565b60405180910390f35b61052d60048036038101906105289190614d69565b611253565b60405161053a91906144b7565b60405180910390f35b61054b611299565b005b61056760048036038101906105629190614d69565b6112ac565b6040516105749190614ce1565b60405180910390f35b61058561132d565b60405161059291906147da565b60405180910390f35b6105a3611354565b6040516105b09190614780565b60405180910390f35b6105d360048036038101906105ce9190614843565b6113e0565b6040516105e09190614ce1565b60405180910390f35b61060360048036038101906105fe9190614d69565b611561565b604051610610919061456a565b60405180910390f35b61062161157e565b60405161062e91906144b7565b60405180910390f35b610651600480360381019061064c9190614d2b565b611584565b005b61066d6004803603810190610668919061446a565b61159a565b60405161067a919061456a565b60405180910390f35b61069d6004803603810190610698919061446a565b6115b7565b6040516106aa919061456a565b60405180910390f35b6106cd60048036038101906106c891906147a0565b61160f565b6040516106da9190614780565b60405180910390f35b6106eb6119b9565b6040516106f89190614780565b60405180910390f35b61071b60048036038101906107169190614d94565b611a45565b60405161072891906144b7565b60405180910390f35b61074b600480360381019061074691906146bf565b611ac7565b005b61076760048036038101906107629190614d94565b611ae2565b604051610774919061456a565b60405180910390f35b61079760048036038101906107929190614dd2565b611b70565b005b6107a1611c10565b6040516107ae9190614780565b60405180910390f35b6107d160048036038101906107cc9190614d69565b611c9c565b005b6107db611d20565b6040516107e891906144b7565b60405180910390f35b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610857576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a68260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b156108b457600190506108b8565b5f90505b92915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f057507fc5b8f772000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a605750610a5f82611d54565b5b9050919050565b610a6f611dbd565b610a7881611e44565b50565b60088054610a8890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab490614e92565b8015610aff5780601f10610ad657610100808354040283529160200191610aff565b820191905f5260205f20905b815481529060010190602001808311610ae257829003601f168201915b505050505081565b6005602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80339050610b44611e57565b83108015610b5157505f83115b15610c5a57610b6081846115b7565b610ba157806040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b9891906147da565b60405180910390fd5b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c4d91906144b7565b60405180910390a3610c66565b610c65818585611e60565b5b600191505092915050565b600f5f9054906101000a900460ff1681565b6060610c8e8261160f565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cc1611dbd565b80600c9081610cd0919061505f565b5050565b5f610cdd611e57565b821015610ee257610d338260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b610d7457836040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d6b91906147da565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610db75750610db58433611ae2565b155b8015610e1f575060055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e6157336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e5891906147da565b60405180910390fd5b610e8d84847f00000000000000000000000000000000000000000000000000000000000000005f611e72565b60055f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610edd848484600160405180602001604052805f8152505f611f64565b610efb565b610eed843384612253565b610efa8484846001611e72565b5b600190509392505050565b5f610f63838484610f17919061515b565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206122e59092919063ffffffff16565b90509392505050565b610f746123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fba5750610fb985610fb46123a3565b611ae2565b5b610ff0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffd85858585856123aa565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60608151835114611065576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835167ffffffffffffffff8111156110815761108061459b565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b5090505f5b8451811015611125576110fb8582815181106110d3576110d261518e565b5b60200260200101518583815181106110ee576110ed61518e565b5b60200260200101516107f1565b82828151811061110e5761110d61518e565b5b6020026020010181815250508060010190506110b4565b508091505092915050565b611138611dbd565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b61116a611dbd565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6111ee611dbd565b6064817f000000000000000000000000000000000000000000000000000000000000000061121c91906151bb565b6112269190615229565b600e8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6112a1611dbd565b6112aa5f612779565b565b60605f6112b761283a565b0361130c575f67ffffffffffffffff8111156112d6576112d561459b565b5b6040519080825280602002602001820160405280156113045781602001602082028036833780820191505090505b509050611328565b6113258261131861285a565b611320611e57565b6113e0565b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009805461136190614e92565b80601f016020809104026020016040519081016040528092919081815260200182805461138d90614e92565b80156113d85780601f106113af576101008083540402835291602001916113d8565b820191905f5260205f20905b8154815290600101906020018083116113bb57829003601f168201915b505050505081565b606081831061141b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142361285a565b8310156114355761143261285a565b92505b5f61143e611e57565b90508083111561144c578092505b5f8385101561146757611460868686610f06565b905061146b565b5f90505b5f8167ffffffffffffffff8111156114865761148561459b565b5b6040519080825280602002602001820160405280156114b45781602001602082028036833780820191505090505b5090505f60015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f80885f915091505b8481146115515761151a8284611d2690919063ffffffff16565b1561154657818482806001019350815181106115395761153861518e565b5b6020026020010181815250505b816001019150611500565b5050819450505050509392505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61159661158f6123a3565b8383612862565b5050565b5f803390506115ac8185856001611e72565b600191505092915050565b5f6116078260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b905092915050565b6060611619611e57565b8210611651576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61165b836129c9565b5111156116725761166b826129c9565b90506119b4565b5f600d805461168090614e92565b905011156116ba57600d61169383612a5b565b6040516020016116a4929190615313565b60405160208183030381529060405290506119b4565b5f826040516020016116cc9190615356565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611611787576040518060400160405280601381526020017f475152685779462f4469616d6f6e642e6a70670000000000000000000000000081525092506040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525091506040518060e0016040528060be8152602001615d9160be91399050611958565b607f8460ff1611611823576040518060400160405280601081526020017f6777644c6633662f476f6c642e6a70670000000000000000000000000000000081525092506040518060400160405280600481526020017f476f6c6400000000000000000000000000000000000000000000000000000000815250915060405180610100016040528060c88152602001615e4f60c891399050611957565b60bf8460ff16116118be576040518060400160405280601281526020017f464a6d6472646d2f53696c7665722e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f53696c766572000000000000000000000000000000000000000000000000000081525091506040518060c00160405280608e8152602001615d03608e91399050611956565b60ff8460ff1611611955576040518060400160405280601281526020017f594c47334a76632f42726f6e7a652e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f42726f6e7a65000000000000000000000000000000000000000000000000000081525091506040518060c0016040528060818152602001615c826081913990505b5b5b5b5f61196287612a5b565b82600c866040516020016119799493929190615474565b6040516020818303038152906040529050808360405160200161199d9291906155d6565b604051602081830303815290604052955050505050505b919050565b600d80546119c690614e92565b80601f01602080910402602001604051908101604052809291908181526020018280546119f290614e92565b8015611a3d5780601f10611a1457610100808354040283529160200191611a3d565b820191905f5260205f20905b815481529060010190602001808311611a2057829003601f168201915b505050505081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611acf611dbd565b80600d9081611ade919061505f565b5050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611b786123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bbe5750611bbd85611bb86123a3565b611ae2565b5b15611bd757611bd285858585856001611f64565b611c09565b6040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600c8054611c1d90614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4990614e92565b8015611c945780601f10611c6b57610100808354040283529160200191611c94565b820191905f5260205f20905b815481529060010190602001808311611c7757829003601f168201915b505050505081565b611ca4611dbd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d14575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d0b91906147da565b60405180910390fd5b611d1d81612779565b50565b600e5481565b5f80600160ff8416855f015f600887901c81526020019081526020015f2054901c1690508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dc56123a3565b73ffffffffffffffffffffffffffffffffffffffff16611de361132d565b73ffffffffffffffffffffffffffffffffffffffff1614611e4257611e066123a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e3991906147da565b60405180910390fd5b565b8060039081611e53919061505f565b5050565b5f600454905090565b611e6d8383836001612bb4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ee2575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ed991906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f52575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f4991906147da565b60405180910390fd5b611f5e84848484612d83565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611fc9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611fd26123a3565b90505f611fde866131ac565b9050611fec8289898461321f565b60018514801561204757506120468660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b1561211b5761209b8660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6120ea8660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b61211688887f00000000000000000000000000000000000000000000000000000000000000005f611e72565b61214d565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff8a1690508682827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a48873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b60405161221e92919061561a565b60405180910390a4612232848b8b86613282565b841561224757612246848b8b8b8b8b6134b6565b5b50505050505050505050565b5f61225e8484611a45565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122df57818110156122d0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122c793929190615641565b60405180910390fd5b6122de84848484035f612bb4565b5b50505050565b5f80600884901c90505f60ff85169050610101818501106123715761231e81875f015f8581526020019081526020015f2054901c6138b2565b92505f6008828601901c8301905060ff8286011694505f91508260010192505b80831461236f57612360875f015f8581526020019081526020015f20546138b2565b8401935082600101925061233e565b505b612396846101000382885f015f8681526020019081526020015f2054901c901b6138b2565b8301925050509392505050565b5f33905090565b81518351146123e5576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361244a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6124536123a3565b90506124618187878761321f565b5f5b84518110156125ea575f8582815181106124805761247f61518e565b5b602002602001015190505f85838151811061249e5761249d61518e565b5b6020026020010151905060018114801561250357506125028260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b156125ab576125578260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6125a68260015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b6125dd565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050806001019050612463565b50612623868686517f000000000000000000000000000000000000000000000000000000000000000061261d91906151bb565b5f611e72565b5f805f600187516126349190615676565b905073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff88169250602087015183837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b8181146126d5578060200288015184847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612696565b508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a60405161274c9291906156a9565b60405180910390a4612760848a8a8a613282565b61276e848a8a8a8a8a6138fb565b505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61284361285a565b61284b611e57565b612855919061515b565b905090565b5f6001905090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79061574e565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129bc919061456a565b60405180910390a3505050565b6060600380546129d890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0490614e92565b8015612a4f5780601f10612a2657610100808354040283529160200191612a4f565b820191905f5260205f20905b815481529060010190602001808311612a3257829003601f168201915b50505050509050919050565b60605f8203612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612baf565b5f8290505f5b5f8214612ad0578080612ab99061576c565b915050600a82612ac99190615229565b9150612aa7565b5f8167ffffffffffffffff811115612aeb57612aea61459b565b5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b5f8514612ba857600182612b35919061515b565b9150600a85612b4491906157b3565b6030612b509190615676565b60f81b818381518110612b6657612b6561518e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ba19190615229565b9450612b21565b8093505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c24575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612c1b91906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c94575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612c8b91906147da565b60405180910390fd5b8160075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612d7d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612d7491906144b7565b60405180910390a35b50505050565b5f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083821015612e4e578582856040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e4593929190615641565b60405180910390fd5b83820360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555083810160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f3391906144b7565b60405180910390a382156131a4575f600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905080613018575f7f00000000000000000000000000000000000000000000000000000000000000008685612fc1919061515b565b612fcb9190615229565b7f000000000000000000000000000000000000000000000000000000000000000085612ff79190615229565b613001919061515b565b90505f811115613016576130158882613abf565b5b505b600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131a2576001600b541480156130755750805b80156130b3575061308461132d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b1561311a576001600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506002600b819055506131a1565b5f7f0000000000000000000000000000000000000000000000000000000000000000836131479190615229565b7f000000000000000000000000000000000000000000000000000000000000000087856131749190615676565b61317e9190615229565b613188919061515b565b90505f81111561319f5761319c8782613eaf565b50505b505b5b505b505050505050565b6060600167ffffffffffffffff8111156131c9576131c861459b565b5b6040519080825280602002602001820160405280156131f75781602001602082028036833780820191505090505b50905081815f8151811061320e5761320d61518e565b5b602002602001018181525050919050565b50505050565b60ff81166001901b19825f015f600884901c81526020019081526020015f205f82825416925050819055505050565b60ff81166001901b825f015f600884901c81526020019081526020015f205f82825417925050819055505050565b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166134a457600e5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115613352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133499061582d565b60405180910390fd5b600f5f9054906101000a900460ff16156134a3574360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc906158bb565b60405180910390fd5b4360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f8273ffffffffffffffffffffffffffffffffffffffff163b14801561346357505f3273ffffffffffffffffffffffffffffffffffffffff163b145b6134a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349990615949565b60405180910390fd5b5b5b6134b08484848461421e565b50505050565b6134d58473ffffffffffffffffffffffffffffffffffffffff16614224565b156138aa578373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77fd9b67a26000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016135339190615976565b602060405180830381865afa15801561354e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357291906159a3565b15613713578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135b8959493929190615a20565b6020604051808303815f875af19250505080156135f357506040513d601f19601f820116820180604052508101906135f09190615a8c565b60015b61368f576135ff615ac3565b806308c379a00361365b5750613613615ae2565b8061361e575061365d565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136529190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461370d576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506138a9565b8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02878786856040518563ffffffff1660e01b81526004016137529493929190615b71565b6020604051808303815f875af192505050801561378d57506040513d601f19601f8201168201806040525081019061378a9190615a8c565b60015b61382957613799615ac3565b806308c379a0036137f557506137ad615ae2565b806137b857506137f7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ec9190614780565b60405180910390fd5b505b6040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146138a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5b505050505050565b5f8019808314600382048460011c1684039350600582048460021c16600583048516019350601182048460041c850116935060ff8204840260f81c8160081b1792505050919050565b61391a8473ffffffffffffffffffffffffffffffffffffffff16614224565b15613ab7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613960959493929190615bbb565b6020604051808303815f875af192505050801561399b57506040513d601f19601f820116820180604052508101906139989190615a8c565b60015b613a37576139a7615ac3565b806308c379a003613a0357506139bb615ae2565b806139c65750613a05565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fa9190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613ab5576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b24576040517fb817eee700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b2d6123a3565b90505f613b38611e57565b90505f8367ffffffffffffffff811115613b5557613b5461459b565b5b604051908082528060200260200182016040528015613b835781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613ba157613ba061459b565b5b604051908082528060200260200182016040528015613bcf5781602001602082028036833780820191505090505b5090505f5b85811015613ccf576001838281518110613bf157613bf061518e565b5b6020026020010181815250505f613c4d8560015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061423590919063ffffffff16565b905080838381518110613c6357613c6261518e565b5b602002602001018181525050613cbe8160015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b809450508080600101915050613bd4565b50613cdc84875f8461321f565b5f80600187613ceb9190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915060208301515f837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b818114613d7357806020028401515f847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613d34565b5060018703613e1a575f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110613df557613df461518e565b5b60200260200101516001604051613e0d929190615c5a565b60405180910390a4613e99565b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8688604051613e909291906156a9565b60405180910390a45b613ea586895f86613282565b5050505050505050565b6060805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613f17576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8303613f50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f596123a3565b90508367ffffffffffffffff811115613f7557613f7461459b565b5b604051908082528060200260200182016040528015613fa35781602001602082028036833780820191505090505b5092508367ffffffffffffffff811115613fc057613fbf61459b565b5b604051908082528060200260200182016040528015613fee5781602001602082028036833780820191505090505b5091505f613ffa611e57565b905080857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03101561402a575f80fd5b5f5b858110156140845780820185828151811061404a5761404961518e565b5b602002602001018181525050600184828151811061406b5761406a61518e565b5b602002602001018181525050808060010191505061402c565b50614091825f888761321f565b6140e2818660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206142ae9092919063ffffffff16565b8460045f8282546140f39190615676565b925050819055505f8086836141089190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146141885780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061414f565b508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516141ff9291906156a9565b60405180910390a4614213845f8a89613282565b505050509250929050565b50505050565b5f80823b90505f8111915050919050565b5f805f801992508360081c9150815f5284602052831960ff1660405f2054811b811c915082158217614283575b600115614282578383019250825f5260405f205491508215821715614262575b5b505f81146142a6576142948161432b565b600883901b1792508383115f03831792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106143115760405f2082821b815417815560015f510182850160081c5f510160ff8487011695505f93505b80821461430a57815f528460405f20556001820191506142ef565b815f525050505b60405f208284610100031c821b8154178155505050505050565b5f816fffffffffffffffffffffffffffffffff1060071b821560081b17905081811c67ffffffffffffffff1060061b8117905081811c63ffffffff1060051b8117905081811c61ffff1060041b8117905081811c60ff1060031b811790507f07060605060205040602030205040301060502050303040105050304000000006f8421084210842108cc6318c6db6d54be83831c1c601f161a81179050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614406826143dd565b9050919050565b614416816143fc565b8114614420575f80fd5b50565b5f813590506144318161440d565b92915050565b5f819050919050565b61444981614437565b8114614453575f80fd5b50565b5f8135905061446481614440565b92915050565b5f80604083850312156144805761447f6143d5565b5b5f61448d85828601614423565b925050602061449e85828601614456565b9150509250929050565b6144b181614437565b82525050565b5f6020820190506144ca5f8301846144a8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614504816144d0565b811461450e575f80fd5b50565b5f8135905061451f816144fb565b92915050565b5f6020828403121561453a576145396143d5565b5b5f61454784828501614511565b91505092915050565b5f8115159050919050565b61456481614550565b82525050565b5f60208201905061457d5f83018461455b565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6145d18261458b565b810181811067ffffffffffffffff821117156145f0576145ef61459b565b5b80604052505050565b5f6146026143cc565b905061460e82826145c8565b919050565b5f67ffffffffffffffff82111561462d5761462c61459b565b5b6146368261458b565b9050602081019050919050565b828183375f83830152505050565b5f61466361465e84614613565b6145f9565b90508281526020810184848401111561467f5761467e614587565b5b61468a848285614643565b509392505050565b5f82601f8301126146a6576146a5614583565b5b81356146b6848260208601614651565b91505092915050565b5f602082840312156146d4576146d36143d5565b5b5f82013567ffffffffffffffff8111156146f1576146f06143d9565b5b6146fd84828501614692565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561473d578082015181840152602081019050614722565b5f8484015250505050565b5f61475282614706565b61475c8185614710565b935061476c818560208601614720565b6147758161458b565b840191505092915050565b5f6020820190508181035f8301526147988184614748565b905092915050565b5f602082840312156147b5576147b46143d5565b5b5f6147c284828501614456565b91505092915050565b6147d4816143fc565b82525050565b5f6020820190506147ed5f8301846147cb565b92915050565b5f805f6060848603121561480a576148096143d5565b5b5f61481786828701614423565b935050602061482886828701614423565b925050604061483986828701614456565b9150509250925092565b5f805f6060848603121561485a576148596143d5565b5b5f61486786828701614423565b935050602061487886828701614456565b925050604061488986828701614456565b9150509250925092565b5f67ffffffffffffffff8211156148ad576148ac61459b565b5b602082029050602081019050919050565b5f80fd5b5f6148d46148cf84614893565b6145f9565b905080838252602082019050602084028301858111156148f7576148f66148be565b5b835b81811015614920578061490c8882614456565b8452602084019350506020810190506148f9565b5050509392505050565b5f82601f83011261493e5761493d614583565b5b813561494e8482602086016148c2565b91505092915050565b5f67ffffffffffffffff8211156149715761497061459b565b5b61497a8261458b565b9050602081019050919050565b5f61499961499484614957565b6145f9565b9050828152602081018484840111156149b5576149b4614587565b5b6149c0848285614643565b509392505050565b5f82601f8301126149dc576149db614583565b5b81356149ec848260208601614987565b91505092915050565b5f805f805f60a08688031215614a0e57614a0d6143d5565b5b5f614a1b88828901614423565b9550506020614a2c88828901614423565b945050604086013567ffffffffffffffff811115614a4d57614a4c6143d9565b5b614a598882890161492a565b935050606086013567ffffffffffffffff811115614a7a57614a796143d9565b5b614a868882890161492a565b925050608086013567ffffffffffffffff811115614aa757614aa66143d9565b5b614ab3888289016149c8565b9150509295509295909350565b5f60ff82169050919050565b614ad581614ac0565b82525050565b5f602082019050614aee5f830184614acc565b92915050565b5f67ffffffffffffffff821115614b0e57614b0d61459b565b5b602082029050602081019050919050565b5f614b31614b2c84614af4565b6145f9565b90508083825260208201905060208402830185811115614b5457614b536148be565b5b835b81811015614b7d5780614b698882614423565b845260208401935050602081019050614b56565b5050509392505050565b5f82601f830112614b9b57614b9a614583565b5b8135614bab848260208601614b1f565b91505092915050565b5f8060408385031215614bca57614bc96143d5565b5b5f83013567ffffffffffffffff811115614be757614be66143d9565b5b614bf385828601614b87565b925050602083013567ffffffffffffffff811115614c1457614c136143d9565b5b614c208582860161492a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c5c81614437565b82525050565b5f614c6d8383614c53565b60208301905092915050565b5f602082019050919050565b5f614c8f82614c2a565b614c998185614c34565b9350614ca483614c44565b805f5b83811015614cd4578151614cbb8882614c62565b9750614cc683614c79565b925050600181019050614ca7565b5085935050505092915050565b5f6020820190508181035f830152614cf98184614c85565b905092915050565b614d0a81614550565b8114614d14575f80fd5b50565b5f81359050614d2581614d01565b92915050565b5f8060408385031215614d4157614d406143d5565b5b5f614d4e85828601614423565b9250506020614d5f85828601614d17565b9150509250929050565b5f60208284031215614d7e57614d7d6143d5565b5b5f614d8b84828501614423565b91505092915050565b5f8060408385031215614daa57614da96143d5565b5b5f614db785828601614423565b9250506020614dc885828601614423565b9150509250929050565b5f805f805f60a08688031215614deb57614dea6143d5565b5b5f614df888828901614423565b9550506020614e0988828901614423565b9450506040614e1a88828901614456565b9350506060614e2b88828901614456565b925050608086013567ffffffffffffffff811115614e4c57614e4b6143d9565b5b614e58888289016149c8565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ea957607f821691505b602082108103614ebc57614ebb614e65565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee3565b614f288683614ee3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f63614f5e614f5984614437565b614f40565b614437565b9050919050565b5f819050919050565b614f7c83614f49565b614f90614f8882614f6a565b848454614eef565b825550505050565b5f90565b614fa4614f98565b614faf818484614f73565b505050565b5b81811015614fd257614fc75f82614f9c565b600181019050614fb5565b5050565b601f82111561501757614fe881614ec2565b614ff184614ed4565b81016020851015615000578190505b61501461500c85614ed4565b830182614fb4565b50505b505050565b5f82821c905092915050565b5f6150375f198460080261501c565b1980831691505092915050565b5f61504f8383615028565b9150826002028217905092915050565b61506882614706565b67ffffffffffffffff8111156150815761508061459b565b5b61508b8254614e92565b615096828285614fd6565b5f60209050601f8311600181146150c7575f84156150b5578287015190505b6150bf8582615044565b865550615126565b601f1984166150d586614ec2565b5f5b828110156150fc578489015182556001820191506020850194506020810190506150d7565b868310156151195784890151615115601f891682615028565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61516582614437565b915061517083614437565b92508282039050818111156151885761518761512e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6151c582614437565b91506151d083614437565b92508282026151de81614437565b915082820484148315176151f5576151f461512e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523382614437565b915061523e83614437565b92508261524e5761524d6151fc565b5b828204905092915050565b5f81905092915050565b5f815461526f81614e92565b6152798186615259565b9450600182165f811461529357600181146152a8576152da565b60ff19831686528115158202860193506152da565b6152b185614ec2565b5f5b838110156152d2578154818901526001820191506020810190506152b3565b838801955050505b50505092915050565b5f6152ed82614706565b6152f78185615259565b9350615307818560208601614720565b80840191505092915050565b5f61531e8285615263565b915061532a82846152e3565b91508190509392505050565b5f819050919050565b61535061534b82614437565b615336565b82525050565b5f615361828461533f565b60208201915081905092915050565b7f7b226e616d65223a20224d4554414c46414345202300000000000000000000005f82015250565b5f6153a4601583615259565b91506153af82615370565b601582019050919050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f6153ee601183615259565b91506153f9826153ba565b601182019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f6d696e65722e5f8201527f6275696c64222c22696d616765223a2200000000000000000000000000000000602082015250565b5f61545e603083615259565b915061546982615404565b603082019050919050565b5f61547e82615398565b915061548a82876152e3565b9150615495826153e2565b91506154a182866152e3565b91506154ac82615452565b91506154b88285615263565b91506154c482846152e3565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f615506601b83615259565b9150615511826154d2565b601b82019050919050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a22435f8201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b5f615576602f83615259565b91506155818261551c565b602f82019050919050565b7f227d5d7d000000000000000000000000000000000000000000000000000000005f82015250565b5f6155c0600483615259565b91506155cb8261558c565b600482019050919050565b5f6155e0826154fa565b91506155ec82856152e3565b91506155f78261556a565b915061560382846152e3565b915061560e826155b4565b91508190509392505050565b5f60408201905061562d5f8301856144a8565b61563a60208301846144a8565b9392505050565b5f6060820190506156545f8301866147cb565b61566160208301856144a8565b61566e60408301846144a8565b949350505050565b5f61568082614437565b915061568b83614437565b92508282019050808211156156a3576156a261512e565b5b92915050565b5f6040820190508181035f8301526156c18185614c85565b905081810360208301526156d58184614c85565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c207374617475735f8201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b5f615738602983614710565b9150615743826156de565b604082019050919050565b5f6020820190508181035f8301526157658161572c565b9050919050565b5f61577682614437565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157a8576157a761512e565b5b600182019050919050565b5f6157bd82614437565b91506157c883614437565b9250826157d8576157d76151fc565b5b828206905092915050565b7f5472616e736665722065786365656473206d6178696d756d2077616c6c6574005f82015250565b5f615817601f83614710565b9150615822826157e3565b602082019050919050565b5f6020820190508181035f8301526158448161580b565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f6158a5602483614710565b91506158b08261584b565b604082019050919050565b5f6020820190508181035f8301526158d281615899565b9050919050565b7f436f6e74726163742074726164696e672072657374726963746564206174206c5f8201527f61756e6368000000000000000000000000000000000000000000000000000000602082015250565b5f615933602583614710565b915061593e826158d9565b604082019050919050565b5f6020820190508181035f83015261596081615927565b9050919050565b615970816144d0565b82525050565b5f6020820190506159895f830184615967565b92915050565b5f8151905061599d81614d01565b92915050565b5f602082840312156159b8576159b76143d5565b5b5f6159c58482850161598f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6159f2826159ce565b6159fc81856159d8565b9350615a0c818560208601614720565b615a158161458b565b840191505092915050565b5f60a082019050615a335f8301886147cb565b615a4060208301876147cb565b615a4d60408301866144a8565b615a5a60608301856144a8565b8181036080830152615a6c81846159e8565b90509695505050505050565b5f81519050615a86816144fb565b92915050565b5f60208284031215615aa157615aa06143d5565b5b5f615aae84828501615a78565b91505092915050565b5f8160e01c9050919050565b5f60033d1115615adf5760045f803e615adc5f51615ab7565b90505b90565b5f60443d10615b6e57615af36143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b1b575050615b6e565b808201805167ffffffffffffffff811115615b395750505050615b6e565b80602083010160043d038501811115615b56575050505050615b6e565b615b65826020018501866145c8565b82955050505050505b90565b5f608082019050615b845f8301876147cb565b615b9160208301866147cb565b615b9e60408301856144a8565b8181036060830152615bb081846159e8565b905095945050505050565b5f60a082019050615bce5f8301886147cb565b615bdb60208301876147cb565b8181036040830152615bed8186614c85565b90508181036060830152615c018185614c85565b90508181036080830152615c1581846159e8565b90509695505050505050565b5f819050919050565b5f615c44615c3f615c3a84615c21565b614f40565b614437565b9050919050565b615c5481615c2a565b82525050565b5f604082019050615c6d5f8301856144a8565b615c7a6020830184615c4b565b939250505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792e526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea26469706673582212207d9b9a993c3a079ebaafe82c953aa82c9a4d93349a91c6d1d20b888c65680d4d64736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610245575f3560e01c806370a0823111610139578063c5b8f772116100b6578063e985e9c51161007a578063e985e9c51461074d578063f242432a1461077d578063f28ca1dd14610799578063f2fde38b146107b7578063f8b45b05146107d357610245565b8063c5b8f77214610683578063c87b56dd146106b3578063d547cfb7146106e3578063dd62ed3e14610701578063e0df5b6f1461073157610245565b806399a2557a116100fd57806399a2557a146105b95780639b19251a146105e9578063a014e6e214610619578063a22cb46514610637578063a9059cbb1461065357610245565b806370a0823114610513578063715018a6146105435780638462151c1461054d5780638da5cb5b1461057d57806395d89b411461059b57610245565b806323b872dd116101c75780634eabf2c61161018b5780634eabf2c61461049557806353d6fd591461049f5780635afcc2f5146104bb5780635d0044ca146104d95780636d6a6a4d146104f557610245565b806323b872dd146103cb5780632d760d57146103fb5780632eb2c2d61461042b578063313ce567146104475780634e1273f41461046557610245565b8063095ea7b31161020e578063095ea7b3146103135780630a702e8d146103435780630e89341c1461036157806318160ddd1461039157806318d217c3146103af57610245565b8062fdd58e1461024957806301ffc9a71461027957806302fe5305146102a957806306fdde03146102c5578063081812fc146102e3575b5f80fd5b610263600480360381019061025e919061446a565b6107f1565b60405161027091906144b7565b60405180910390f35b610293600480360381019061028e9190614525565b6108be565b6040516102a0919061456a565b60405180910390f35b6102c360048036038101906102be91906146bf565b610a67565b005b6102cd610a7b565b6040516102da9190614780565b60405180910390f35b6102fd60048036038101906102f891906147a0565b610b07565b60405161030a91906147da565b60405180910390f35b61032d6004803603810190610328919061446a565b610b37565b60405161033a919061456a565b60405180910390f35b61034b610c71565b604051610358919061456a565b60405180910390f35b61037b600480360381019061037691906147a0565b610c83565b6040516103889190614780565b60405180910390f35b610399610c95565b6040516103a691906144b7565b60405180910390f35b6103c960048036038101906103c491906146bf565b610cb9565b005b6103e560048036038101906103e091906147f3565b610cd4565b6040516103f2919061456a565b60405180910390f35b61041560048036038101906104109190614843565b610f06565b60405161042291906144b7565b60405180910390f35b610445600480360381019061044091906149f5565b610f6c565b005b61044f611004565b60405161045c9190614adb565b60405180910390f35b61047f600480360381019061047a9190614bb4565b611028565b60405161048c9190614ce1565b60405180910390f35b61049d611130565b005b6104b960048036038101906104b49190614d2b565b611162565b005b6104c36111c2565b6040516104d091906144b7565b60405180910390f35b6104f360048036038101906104ee91906147a0565b6111e6565b005b6104fd61122f565b60405161050a91906144b7565b60405180910390f35b61052d60048036038101906105289190614d69565b611253565b60405161053a91906144b7565b60405180910390f35b61054b611299565b005b61056760048036038101906105629190614d69565b6112ac565b6040516105749190614ce1565b60405180910390f35b61058561132d565b60405161059291906147da565b60405180910390f35b6105a3611354565b6040516105b09190614780565b60405180910390f35b6105d360048036038101906105ce9190614843565b6113e0565b6040516105e09190614ce1565b60405180910390f35b61060360048036038101906105fe9190614d69565b611561565b604051610610919061456a565b60405180910390f35b61062161157e565b60405161062e91906144b7565b60405180910390f35b610651600480360381019061064c9190614d2b565b611584565b005b61066d6004803603810190610668919061446a565b61159a565b60405161067a919061456a565b60405180910390f35b61069d6004803603810190610698919061446a565b6115b7565b6040516106aa919061456a565b60405180910390f35b6106cd60048036038101906106c891906147a0565b61160f565b6040516106da9190614780565b60405180910390f35b6106eb6119b9565b6040516106f89190614780565b60405180910390f35b61071b60048036038101906107169190614d94565b611a45565b60405161072891906144b7565b60405180910390f35b61074b600480360381019061074691906146bf565b611ac7565b005b61076760048036038101906107629190614d94565b611ae2565b604051610774919061456a565b60405180910390f35b61079760048036038101906107929190614dd2565b611b70565b005b6107a1611c10565b6040516107ae9190614780565b60405180910390f35b6107d160048036038101906107cc9190614d69565b611c9c565b005b6107db611d20565b6040516107e891906144b7565b60405180910390f35b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610857576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a68260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b156108b457600190506108b8565b5f90505b92915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f057507fc5b8f772000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a605750610a5f82611d54565b5b9050919050565b610a6f611dbd565b610a7881611e44565b50565b60088054610a8890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab490614e92565b8015610aff5780601f10610ad657610100808354040283529160200191610aff565b820191905f5260205f20905b815481529060010190602001808311610ae257829003601f168201915b505050505081565b6005602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80339050610b44611e57565b83108015610b5157505f83115b15610c5a57610b6081846115b7565b610ba157806040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b9891906147da565b60405180910390fd5b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c4d91906144b7565b60405180910390a3610c66565b610c65818585611e60565b5b600191505092915050565b600f5f9054906101000a900460ff1681565b6060610c8e8261160f565b9050919050565b7f00000000000000000000000000000000000000000000152d02c7e14af680000081565b610cc1611dbd565b80600c9081610cd0919061505f565b5050565b5f610cdd611e57565b821015610ee257610d338260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b610d7457836040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d6b91906147da565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610db75750610db58433611ae2565b155b8015610e1f575060055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e6157336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e5891906147da565b60405180910390fd5b610e8d84847f0000000000000000000000000000000000000000000000000de0b6b3a76400005f611e72565b60055f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610edd848484600160405180602001604052805f8152505f611f64565b610efb565b610eed843384612253565b610efa8484846001611e72565b5b600190509392505050565b5f610f63838484610f17919061515b565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206122e59092919063ffffffff16565b90509392505050565b610f746123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fba5750610fb985610fb46123a3565b611ae2565b5b610ff0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffd85858585856123aa565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000001281565b60608151835114611065576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835167ffffffffffffffff8111156110815761108061459b565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b5090505f5b8451811015611125576110fb8582815181106110d3576110d261518e565b5b60200260200101518583815181106110ee576110ed61518e565b5b60200260200101516107f1565b82828151811061110e5761110d61518e565b5b6020026020010181815250508060010190506110b4565b508091505092915050565b611138611dbd565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b61116a611dbd565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b6111ee611dbd565b6064817f00000000000000000000000000000000000000000000152d02c7e14af680000061121c91906151bb565b6112269190615229565b600e8190555050565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6112a1611dbd565b6112aa5f612779565b565b60605f6112b761283a565b0361130c575f67ffffffffffffffff8111156112d6576112d561459b565b5b6040519080825280602002602001820160405280156113045781602001602082028036833780820191505090505b509050611328565b6113258261131861285a565b611320611e57565b6113e0565b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009805461136190614e92565b80601f016020809104026020016040519081016040528092919081815260200182805461138d90614e92565b80156113d85780601f106113af576101008083540402835291602001916113d8565b820191905f5260205f20905b8154815290600101906020018083116113bb57829003601f168201915b505050505081565b606081831061141b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142361285a565b8310156114355761143261285a565b92505b5f61143e611e57565b90508083111561144c578092505b5f8385101561146757611460868686610f06565b905061146b565b5f90505b5f8167ffffffffffffffff8111156114865761148561459b565b5b6040519080825280602002602001820160405280156114b45781602001602082028036833780820191505090505b5090505f60015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f80885f915091505b8481146115515761151a8284611d2690919063ffffffff16565b1561154657818482806001019350815181106115395761153861518e565b5b6020026020010181815250505b816001019150611500565b5050819450505050509392505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61159661158f6123a3565b8383612862565b5050565b5f803390506115ac8185856001611e72565b600191505092915050565b5f6116078260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b905092915050565b6060611619611e57565b8210611651576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61165b836129c9565b5111156116725761166b826129c9565b90506119b4565b5f600d805461168090614e92565b905011156116ba57600d61169383612a5b565b6040516020016116a4929190615313565b60405160208183030381529060405290506119b4565b5f826040516020016116cc9190615356565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611611787576040518060400160405280601381526020017f475152685779462f4469616d6f6e642e6a70670000000000000000000000000081525092506040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525091506040518060e0016040528060be8152602001615d9160be91399050611958565b607f8460ff1611611823576040518060400160405280601081526020017f6777644c6633662f476f6c642e6a70670000000000000000000000000000000081525092506040518060400160405280600481526020017f476f6c6400000000000000000000000000000000000000000000000000000000815250915060405180610100016040528060c88152602001615e4f60c891399050611957565b60bf8460ff16116118be576040518060400160405280601281526020017f464a6d6472646d2f53696c7665722e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f53696c766572000000000000000000000000000000000000000000000000000081525091506040518060c00160405280608e8152602001615d03608e91399050611956565b60ff8460ff1611611955576040518060400160405280601281526020017f594c47334a76632f42726f6e7a652e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f42726f6e7a65000000000000000000000000000000000000000000000000000081525091506040518060c0016040528060818152602001615c826081913990505b5b5b5b5f61196287612a5b565b82600c866040516020016119799493929190615474565b6040516020818303038152906040529050808360405160200161199d9291906155d6565b604051602081830303815290604052955050505050505b919050565b600d80546119c690614e92565b80601f01602080910402602001604051908101604052809291908181526020018280546119f290614e92565b8015611a3d5780601f10611a1457610100808354040283529160200191611a3d565b820191905f5260205f20905b815481529060010190602001808311611a2057829003601f168201915b505050505081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611acf611dbd565b80600d9081611ade919061505f565b5050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611b786123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bbe5750611bbd85611bb86123a3565b611ae2565b5b15611bd757611bd285858585856001611f64565b611c09565b6040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600c8054611c1d90614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4990614e92565b8015611c945780601f10611c6b57610100808354040283529160200191611c94565b820191905f5260205f20905b815481529060010190602001808311611c7757829003601f168201915b505050505081565b611ca4611dbd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d14575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d0b91906147da565b60405180910390fd5b611d1d81612779565b50565b600e5481565b5f80600160ff8416855f015f600887901c81526020019081526020015f2054901c1690508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dc56123a3565b73ffffffffffffffffffffffffffffffffffffffff16611de361132d565b73ffffffffffffffffffffffffffffffffffffffff1614611e4257611e066123a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e3991906147da565b60405180910390fd5b565b8060039081611e53919061505f565b5050565b5f600454905090565b611e6d8383836001612bb4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ee2575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ed991906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f52575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f4991906147da565b60405180910390fd5b611f5e84848484612d83565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611fc9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611fd26123a3565b90505f611fde866131ac565b9050611fec8289898461321f565b60018514801561204757506120468660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b1561211b5761209b8660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6120ea8660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b61211688887f0000000000000000000000000000000000000000000000000de0b6b3a76400005f611e72565b61214d565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff8a1690508682827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a48873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b60405161221e92919061561a565b60405180910390a4612232848b8b86613282565b841561224757612246848b8b8b8b8b6134b6565b5b50505050505050505050565b5f61225e8484611a45565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122df57818110156122d0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122c793929190615641565b60405180910390fd5b6122de84848484035f612bb4565b5b50505050565b5f80600884901c90505f60ff85169050610101818501106123715761231e81875f015f8581526020019081526020015f2054901c6138b2565b92505f6008828601901c8301905060ff8286011694505f91508260010192505b80831461236f57612360875f015f8581526020019081526020015f20546138b2565b8401935082600101925061233e565b505b612396846101000382885f015f8681526020019081526020015f2054901c901b6138b2565b8301925050509392505050565b5f33905090565b81518351146123e5576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361244a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6124536123a3565b90506124618187878761321f565b5f5b84518110156125ea575f8582815181106124805761247f61518e565b5b602002602001015190505f85838151811061249e5761249d61518e565b5b6020026020010151905060018114801561250357506125028260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b156125ab576125578260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6125a68260015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b6125dd565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050806001019050612463565b50612623868686517f0000000000000000000000000000000000000000000000000de0b6b3a764000061261d91906151bb565b5f611e72565b5f805f600187516126349190615676565b905073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff88169250602087015183837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b8181146126d5578060200288015184847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612696565b508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a60405161274c9291906156a9565b60405180910390a4612760848a8a8a613282565b61276e848a8a8a8a8a6138fb565b505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61284361285a565b61284b611e57565b612855919061515b565b905090565b5f6001905090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79061574e565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129bc919061456a565b60405180910390a3505050565b6060600380546129d890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0490614e92565b8015612a4f5780601f10612a2657610100808354040283529160200191612a4f565b820191905f5260205f20905b815481529060010190602001808311612a3257829003601f168201915b50505050509050919050565b60605f8203612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612baf565b5f8290505f5b5f8214612ad0578080612ab99061576c565b915050600a82612ac99190615229565b9150612aa7565b5f8167ffffffffffffffff811115612aeb57612aea61459b565b5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b5f8514612ba857600182612b35919061515b565b9150600a85612b4491906157b3565b6030612b509190615676565b60f81b818381518110612b6657612b6561518e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ba19190615229565b9450612b21565b8093505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c24575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612c1b91906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c94575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612c8b91906147da565b60405180910390fd5b8160075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612d7d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612d7491906144b7565b60405180910390a35b50505050565b5f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083821015612e4e578582856040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e4593929190615641565b60405180910390fd5b83820360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555083810160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f3391906144b7565b60405180910390a382156131a4575f600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905080613018575f7f0000000000000000000000000000000000000000000000000de0b6b3a76400008685612fc1919061515b565b612fcb9190615229565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000085612ff79190615229565b613001919061515b565b90505f811115613016576130158882613abf565b5b505b600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131a2576001600b541480156130755750805b80156130b3575061308461132d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b1561311a576001600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506002600b819055506131a1565b5f7f0000000000000000000000000000000000000000000000000de0b6b3a7640000836131479190615229565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000087856131749190615676565b61317e9190615229565b613188919061515b565b90505f81111561319f5761319c8782613eaf565b50505b505b5b505b505050505050565b6060600167ffffffffffffffff8111156131c9576131c861459b565b5b6040519080825280602002602001820160405280156131f75781602001602082028036833780820191505090505b50905081815f8151811061320e5761320d61518e565b5b602002602001018181525050919050565b50505050565b60ff81166001901b19825f015f600884901c81526020019081526020015f205f82825416925050819055505050565b60ff81166001901b825f015f600884901c81526020019081526020015f205f82825417925050819055505050565b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166134a457600e5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115613352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133499061582d565b60405180910390fd5b600f5f9054906101000a900460ff16156134a3574360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc906158bb565b60405180910390fd5b4360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f8273ffffffffffffffffffffffffffffffffffffffff163b14801561346357505f3273ffffffffffffffffffffffffffffffffffffffff163b145b6134a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349990615949565b60405180910390fd5b5b5b6134b08484848461421e565b50505050565b6134d58473ffffffffffffffffffffffffffffffffffffffff16614224565b156138aa578373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77fd9b67a26000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016135339190615976565b602060405180830381865afa15801561354e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357291906159a3565b15613713578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135b8959493929190615a20565b6020604051808303815f875af19250505080156135f357506040513d601f19601f820116820180604052508101906135f09190615a8c565b60015b61368f576135ff615ac3565b806308c379a00361365b5750613613615ae2565b8061361e575061365d565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136529190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461370d576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506138a9565b8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02878786856040518563ffffffff1660e01b81526004016137529493929190615b71565b6020604051808303815f875af192505050801561378d57506040513d601f19601f8201168201806040525081019061378a9190615a8c565b60015b61382957613799615ac3565b806308c379a0036137f557506137ad615ae2565b806137b857506137f7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ec9190614780565b60405180910390fd5b505b6040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146138a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5b505050505050565b5f8019808314600382048460011c1684039350600582048460021c16600583048516019350601182048460041c850116935060ff8204840260f81c8160081b1792505050919050565b61391a8473ffffffffffffffffffffffffffffffffffffffff16614224565b15613ab7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613960959493929190615bbb565b6020604051808303815f875af192505050801561399b57506040513d601f19601f820116820180604052508101906139989190615a8c565b60015b613a37576139a7615ac3565b806308c379a003613a0357506139bb615ae2565b806139c65750613a05565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fa9190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613ab5576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b24576040517fb817eee700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b2d6123a3565b90505f613b38611e57565b90505f8367ffffffffffffffff811115613b5557613b5461459b565b5b604051908082528060200260200182016040528015613b835781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613ba157613ba061459b565b5b604051908082528060200260200182016040528015613bcf5781602001602082028036833780820191505090505b5090505f5b85811015613ccf576001838281518110613bf157613bf061518e565b5b6020026020010181815250505f613c4d8560015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061423590919063ffffffff16565b905080838381518110613c6357613c6261518e565b5b602002602001018181525050613cbe8160015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b809450508080600101915050613bd4565b50613cdc84875f8461321f565b5f80600187613ceb9190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915060208301515f837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b818114613d7357806020028401515f847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613d34565b5060018703613e1a575f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110613df557613df461518e565b5b60200260200101516001604051613e0d929190615c5a565b60405180910390a4613e99565b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8688604051613e909291906156a9565b60405180910390a45b613ea586895f86613282565b5050505050505050565b6060805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613f17576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8303613f50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f596123a3565b90508367ffffffffffffffff811115613f7557613f7461459b565b5b604051908082528060200260200182016040528015613fa35781602001602082028036833780820191505090505b5092508367ffffffffffffffff811115613fc057613fbf61459b565b5b604051908082528060200260200182016040528015613fee5781602001602082028036833780820191505090505b5091505f613ffa611e57565b905080857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03101561402a575f80fd5b5f5b858110156140845780820185828151811061404a5761404961518e565b5b602002602001018181525050600184828151811061406b5761406a61518e565b5b602002602001018181525050808060010191505061402c565b50614091825f888761321f565b6140e2818660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206142ae9092919063ffffffff16565b8460045f8282546140f39190615676565b925050819055505f8086836141089190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146141885780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061414f565b508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516141ff9291906156a9565b60405180910390a4614213845f8a89613282565b505050509250929050565b50505050565b5f80823b90505f8111915050919050565b5f805f801992508360081c9150815f5284602052831960ff1660405f2054811b811c915082158217614283575b600115614282578383019250825f5260405f205491508215821715614262575b5b505f81146142a6576142948161432b565b600883901b1792508383115f03831792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106143115760405f2082821b815417815560015f510182850160081c5f510160ff8487011695505f93505b80821461430a57815f528460405f20556001820191506142ef565b815f525050505b60405f208284610100031c821b8154178155505050505050565b5f816fffffffffffffffffffffffffffffffff1060071b821560081b17905081811c67ffffffffffffffff1060061b8117905081811c63ffffffff1060051b8117905081811c61ffff1060041b8117905081811c60ff1060031b811790507f07060605060205040602030205040301060502050303040105050304000000006f8421084210842108cc6318c6db6d54be83831c1c601f161a81179050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614406826143dd565b9050919050565b614416816143fc565b8114614420575f80fd5b50565b5f813590506144318161440d565b92915050565b5f819050919050565b61444981614437565b8114614453575f80fd5b50565b5f8135905061446481614440565b92915050565b5f80604083850312156144805761447f6143d5565b5b5f61448d85828601614423565b925050602061449e85828601614456565b9150509250929050565b6144b181614437565b82525050565b5f6020820190506144ca5f8301846144a8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614504816144d0565b811461450e575f80fd5b50565b5f8135905061451f816144fb565b92915050565b5f6020828403121561453a576145396143d5565b5b5f61454784828501614511565b91505092915050565b5f8115159050919050565b61456481614550565b82525050565b5f60208201905061457d5f83018461455b565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6145d18261458b565b810181811067ffffffffffffffff821117156145f0576145ef61459b565b5b80604052505050565b5f6146026143cc565b905061460e82826145c8565b919050565b5f67ffffffffffffffff82111561462d5761462c61459b565b5b6146368261458b565b9050602081019050919050565b828183375f83830152505050565b5f61466361465e84614613565b6145f9565b90508281526020810184848401111561467f5761467e614587565b5b61468a848285614643565b509392505050565b5f82601f8301126146a6576146a5614583565b5b81356146b6848260208601614651565b91505092915050565b5f602082840312156146d4576146d36143d5565b5b5f82013567ffffffffffffffff8111156146f1576146f06143d9565b5b6146fd84828501614692565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561473d578082015181840152602081019050614722565b5f8484015250505050565b5f61475282614706565b61475c8185614710565b935061476c818560208601614720565b6147758161458b565b840191505092915050565b5f6020820190508181035f8301526147988184614748565b905092915050565b5f602082840312156147b5576147b46143d5565b5b5f6147c284828501614456565b91505092915050565b6147d4816143fc565b82525050565b5f6020820190506147ed5f8301846147cb565b92915050565b5f805f6060848603121561480a576148096143d5565b5b5f61481786828701614423565b935050602061482886828701614423565b925050604061483986828701614456565b9150509250925092565b5f805f6060848603121561485a576148596143d5565b5b5f61486786828701614423565b935050602061487886828701614456565b925050604061488986828701614456565b9150509250925092565b5f67ffffffffffffffff8211156148ad576148ac61459b565b5b602082029050602081019050919050565b5f80fd5b5f6148d46148cf84614893565b6145f9565b905080838252602082019050602084028301858111156148f7576148f66148be565b5b835b81811015614920578061490c8882614456565b8452602084019350506020810190506148f9565b5050509392505050565b5f82601f83011261493e5761493d614583565b5b813561494e8482602086016148c2565b91505092915050565b5f67ffffffffffffffff8211156149715761497061459b565b5b61497a8261458b565b9050602081019050919050565b5f61499961499484614957565b6145f9565b9050828152602081018484840111156149b5576149b4614587565b5b6149c0848285614643565b509392505050565b5f82601f8301126149dc576149db614583565b5b81356149ec848260208601614987565b91505092915050565b5f805f805f60a08688031215614a0e57614a0d6143d5565b5b5f614a1b88828901614423565b9550506020614a2c88828901614423565b945050604086013567ffffffffffffffff811115614a4d57614a4c6143d9565b5b614a598882890161492a565b935050606086013567ffffffffffffffff811115614a7a57614a796143d9565b5b614a868882890161492a565b925050608086013567ffffffffffffffff811115614aa757614aa66143d9565b5b614ab3888289016149c8565b9150509295509295909350565b5f60ff82169050919050565b614ad581614ac0565b82525050565b5f602082019050614aee5f830184614acc565b92915050565b5f67ffffffffffffffff821115614b0e57614b0d61459b565b5b602082029050602081019050919050565b5f614b31614b2c84614af4565b6145f9565b90508083825260208201905060208402830185811115614b5457614b536148be565b5b835b81811015614b7d5780614b698882614423565b845260208401935050602081019050614b56565b5050509392505050565b5f82601f830112614b9b57614b9a614583565b5b8135614bab848260208601614b1f565b91505092915050565b5f8060408385031215614bca57614bc96143d5565b5b5f83013567ffffffffffffffff811115614be757614be66143d9565b5b614bf385828601614b87565b925050602083013567ffffffffffffffff811115614c1457614c136143d9565b5b614c208582860161492a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c5c81614437565b82525050565b5f614c6d8383614c53565b60208301905092915050565b5f602082019050919050565b5f614c8f82614c2a565b614c998185614c34565b9350614ca483614c44565b805f5b83811015614cd4578151614cbb8882614c62565b9750614cc683614c79565b925050600181019050614ca7565b5085935050505092915050565b5f6020820190508181035f830152614cf98184614c85565b905092915050565b614d0a81614550565b8114614d14575f80fd5b50565b5f81359050614d2581614d01565b92915050565b5f8060408385031215614d4157614d406143d5565b5b5f614d4e85828601614423565b9250506020614d5f85828601614d17565b9150509250929050565b5f60208284031215614d7e57614d7d6143d5565b5b5f614d8b84828501614423565b91505092915050565b5f8060408385031215614daa57614da96143d5565b5b5f614db785828601614423565b9250506020614dc885828601614423565b9150509250929050565b5f805f805f60a08688031215614deb57614dea6143d5565b5b5f614df888828901614423565b9550506020614e0988828901614423565b9450506040614e1a88828901614456565b9350506060614e2b88828901614456565b925050608086013567ffffffffffffffff811115614e4c57614e4b6143d9565b5b614e58888289016149c8565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ea957607f821691505b602082108103614ebc57614ebb614e65565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee3565b614f288683614ee3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f63614f5e614f5984614437565b614f40565b614437565b9050919050565b5f819050919050565b614f7c83614f49565b614f90614f8882614f6a565b848454614eef565b825550505050565b5f90565b614fa4614f98565b614faf818484614f73565b505050565b5b81811015614fd257614fc75f82614f9c565b600181019050614fb5565b5050565b601f82111561501757614fe881614ec2565b614ff184614ed4565b81016020851015615000578190505b61501461500c85614ed4565b830182614fb4565b50505b505050565b5f82821c905092915050565b5f6150375f198460080261501c565b1980831691505092915050565b5f61504f8383615028565b9150826002028217905092915050565b61506882614706565b67ffffffffffffffff8111156150815761508061459b565b5b61508b8254614e92565b615096828285614fd6565b5f60209050601f8311600181146150c7575f84156150b5578287015190505b6150bf8582615044565b865550615126565b601f1984166150d586614ec2565b5f5b828110156150fc578489015182556001820191506020850194506020810190506150d7565b868310156151195784890151615115601f891682615028565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61516582614437565b915061517083614437565b92508282039050818111156151885761518761512e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6151c582614437565b91506151d083614437565b92508282026151de81614437565b915082820484148315176151f5576151f461512e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523382614437565b915061523e83614437565b92508261524e5761524d6151fc565b5b828204905092915050565b5f81905092915050565b5f815461526f81614e92565b6152798186615259565b9450600182165f811461529357600181146152a8576152da565b60ff19831686528115158202860193506152da565b6152b185614ec2565b5f5b838110156152d2578154818901526001820191506020810190506152b3565b838801955050505b50505092915050565b5f6152ed82614706565b6152f78185615259565b9350615307818560208601614720565b80840191505092915050565b5f61531e8285615263565b915061532a82846152e3565b91508190509392505050565b5f819050919050565b61535061534b82614437565b615336565b82525050565b5f615361828461533f565b60208201915081905092915050565b7f7b226e616d65223a20224d4554414c46414345202300000000000000000000005f82015250565b5f6153a4601583615259565b91506153af82615370565b601582019050919050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f6153ee601183615259565b91506153f9826153ba565b601182019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f6d696e65722e5f8201527f6275696c64222c22696d616765223a2200000000000000000000000000000000602082015250565b5f61545e603083615259565b915061546982615404565b603082019050919050565b5f61547e82615398565b915061548a82876152e3565b9150615495826153e2565b91506154a182866152e3565b91506154ac82615452565b91506154b88285615263565b91506154c482846152e3565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f615506601b83615259565b9150615511826154d2565b601b82019050919050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a22435f8201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b5f615576602f83615259565b91506155818261551c565b602f82019050919050565b7f227d5d7d000000000000000000000000000000000000000000000000000000005f82015250565b5f6155c0600483615259565b91506155cb8261558c565b600482019050919050565b5f6155e0826154fa565b91506155ec82856152e3565b91506155f78261556a565b915061560382846152e3565b915061560e826155b4565b91508190509392505050565b5f60408201905061562d5f8301856144a8565b61563a60208301846144a8565b9392505050565b5f6060820190506156545f8301866147cb565b61566160208301856144a8565b61566e60408301846144a8565b949350505050565b5f61568082614437565b915061568b83614437565b92508282019050808211156156a3576156a261512e565b5b92915050565b5f6040820190508181035f8301526156c18185614c85565b905081810360208301526156d58184614c85565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c207374617475735f8201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b5f615738602983614710565b9150615743826156de565b604082019050919050565b5f6020820190508181035f8301526157658161572c565b9050919050565b5f61577682614437565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157a8576157a761512e565b5b600182019050919050565b5f6157bd82614437565b91506157c883614437565b9250826157d8576157d76151fc565b5b828206905092915050565b7f5472616e736665722065786365656473206d6178696d756d2077616c6c6574005f82015250565b5f615817601f83614710565b9150615822826157e3565b602082019050919050565b5f6020820190508181035f8301526158448161580b565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f6158a5602483614710565b91506158b08261584b565b604082019050919050565b5f6020820190508181035f8301526158d281615899565b9050919050565b7f436f6e74726163742074726164696e672072657374726963746564206174206c5f8201527f61756e6368000000000000000000000000000000000000000000000000000000602082015250565b5f615933602583614710565b915061593e826158d9565b604082019050919050565b5f6020820190508181035f83015261596081615927565b9050919050565b615970816144d0565b82525050565b5f6020820190506159895f830184615967565b92915050565b5f8151905061599d81614d01565b92915050565b5f602082840312156159b8576159b76143d5565b5b5f6159c58482850161598f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6159f2826159ce565b6159fc81856159d8565b9350615a0c818560208601614720565b615a158161458b565b840191505092915050565b5f60a082019050615a335f8301886147cb565b615a4060208301876147cb565b615a4d60408301866144a8565b615a5a60608301856144a8565b8181036080830152615a6c81846159e8565b90509695505050505050565b5f81519050615a86816144fb565b92915050565b5f60208284031215615aa157615aa06143d5565b5b5f615aae84828501615a78565b91505092915050565b5f8160e01c9050919050565b5f60033d1115615adf5760045f803e615adc5f51615ab7565b90505b90565b5f60443d10615b6e57615af36143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b1b575050615b6e565b808201805167ffffffffffffffff811115615b395750505050615b6e565b80602083010160043d038501811115615b56575050505050615b6e565b615b65826020018501866145c8565b82955050505050505b90565b5f608082019050615b845f8301876147cb565b615b9160208301866147cb565b615b9e60408301856144a8565b8181036060830152615bb081846159e8565b905095945050505050565b5f60a082019050615bce5f8301886147cb565b615bdb60208301876147cb565b8181036040830152615bed8186614c85565b90508181036060830152615c018185614c85565b90508181036080830152615c1581846159e8565b90509695505050505050565b5f819050919050565b5f615c44615c3f615c3a84615c21565b614f40565b614437565b9050919050565b615c5481615c2a565b82525050565b5f604082019050615c6d5f8301856144a8565b615c7a6020830184615c4b565b939250505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792e526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea26469706673582212207d9b9a993c3a079ebaafe82c953aa82c9a4d93349a91c6d1d20b888c65680d4d64736f6c63430008180033

Deployed Bytecode Sourcemap

74550:4342:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46318:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44526:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76460:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42144:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41873:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67659:483;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74998:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78781:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42316:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76240:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68291:827;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45997:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48359:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42249:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46802:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76017:91;;;:::i;:::-;;43487:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42429:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76116:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42384:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45655:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2798:103;;;:::i;:::-;;74293:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2123:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42192:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72577:1264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42512:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42639:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47405:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67315:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44314:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76559:2214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74640:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67509:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76346:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47632:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47872:410;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74612:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3056:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74967:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46318:318;46404:7;46446:1;46427:21;;:7;:21;;;46424:88;;46472:28;;;;;;;;;;;;;;46424:88;46525:23;46545:2;46525:6;:15;46532:7;46525:15;;;;;;;;;;;;;;;:19;;:23;;;;:::i;:::-;46522:104;;;46572:1;46565:8;;;;46522:104;46613:1;46606:8;;46318:318;;;;;:::o;44526:527::-;44628:4;44680:26;44665:41;;;:11;:41;;;;:110;;;;44738:37;44723:52;;;:11;:52;;;;44665:110;:165;;;;44807:23;44792:38;;;:11;:38;;;;44665:165;:207;;;;44862:10;44847:25;;:11;:25;;;;44665:207;:284;;;;44939:10;44924:25;;:11;:25;;;;44665:284;:380;;;;45009:36;45033:11;45009:23;:36::i;:::-;44665:380;44645:400;;44526:527;;;:::o;76460:91::-;2009:13;:11;:13::i;:::-;76528:15:::1;76536:6;76528:7;:15::i;:::-;76460:91:::0;:::o;42144:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41873:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;67659:483::-;67732:4;67749:13;67765:10;67749:26;;67798:14;:12;:14::i;:::-;67790:5;:22;:35;;;;;67824:1;67816:5;:9;67790:35;67786:327;;;67848:23;67858:5;67865;67848:9;:23::i;:::-;67844:96;;67918:5;67899:25;;;;;;;;;;;:::i;:::-;;;;;;;;67844:96;67977:7;67956:11;:18;67968:5;67956:18;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68022:7;68006:31;;68015:5;68006:31;;;68031:5;68006:31;;;;;;:::i;:::-;;;;;;;;67786:327;;;68070:31;68079:5;68086:7;68095:5;68070:8;:31::i;:::-;67786:327;68130:4;68123:11;;;67659:483;;;;:::o;74998:32::-;;;;;;;;;;;;;:::o;78781:108::-;78836:13;78869:12;78878:2;78869:8;:12::i;:::-;78862:19;;78781:108;;;:::o;42316:36::-;;;:::o;76240:98::-;2009:13;:11;:13::i;:::-;76322:8:::1;76312:7;:18;;;;;;:::i;:::-;;76240:98:::0;:::o;68291:827::-;68378:4;68407:14;:12;:14::i;:::-;68399:5;:22;68395:694;;;68442:23;68459:5;68442:6;:12;68449:4;68442:12;;;;;;;;;;;;;;;:16;;:23;;;;:::i;:::-;68438:96;;68513:4;68493:25;;;;;;;;;;;:::i;:::-;;;;;;;;68438:96;68590:4;68576:18;;:10;:18;;;;:74;;;;;68616:34;68633:4;68639:10;68616:16;:34::i;:::-;68615:35;68576:74;:127;;;;;68685:11;:18;68697:5;68685:18;;;;;;;;;;;;;;;;;;;;;68671:32;;:10;:32;;;;68576:127;68554:238;;;68765:10;68745:31;;;;;;;;;;;:::i;:::-;;;;;;;;68554:238;68808:40;68818:4;68824:2;68828:12;68842:5;68808:9;:40::i;:::-;68872:11;:18;68884:5;68872:18;;;;;;;;;;;;68865:25;;;;;;;;;;;68907:48;68925:4;68931:2;68935:5;68942:1;68907:48;;;;;;;;;;;;68949:5;68907:17;:48::i;:::-;68395:694;;;68990:40;69006:4;69012:10;69024:5;68990:15;:40::i;:::-;69045:32;69055:4;69061:2;69065:5;69072:4;69045:9;:32::i;:::-;68395:694;69106:4;69099:11;;68291:827;;;;;:::o;45997:170::-;46089:7;46116:43;46139:5;46153;46146:4;:12;;;;:::i;:::-;46116:6;:13;46123:5;46116:13;;;;;;;;;;;;;;;:22;;:43;;;;;:::i;:::-;46109:50;;45997:170;;;;;:::o;48359:418::-;48583:12;:10;:12::i;:::-;48575:20;;:4;:20;;;:60;;;;48599:36;48616:4;48622:12;:10;:12::i;:::-;48599:16;:36::i;:::-;48575:60;48570:137;;48660:35;;;;;;;;;;;;;;48570:137;48717:52;48740:4;48746:2;48750:3;48755:7;48764:4;48717:22;:52::i;:::-;48359:418;;;;;:::o;42249:31::-;;;:::o;46802:530::-;46958:16;47014:3;:10;46995:8;:15;:29;46992:90;;47048:22;;;;;;;;;;;;;;46992:90;47094:30;47141:8;:15;47127:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47094:63;;47175:9;47170:122;47194:8;:15;47190:1;:19;47170:122;;;47250:30;47260:8;47269:1;47260:11;;;;;;;;:::i;:::-;;;;;;;;47273:3;47277:1;47273:6;;;;;;;;:::i;:::-;;;;;;;;47250:9;:30::i;:::-;47231:13;47245:1;47231:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;47211:3;;;;;47170:122;;;;47311:13;47304:20;;;46802:530;;;;:::o;76017:91::-;2009:13;:11;:13::i;:::-;76087::::1;;;;;;;;;;;76086:14;76070:13;;:30;;;;;;;;;;;;;;;;;;76017:91::o:0;43487:119::-;2009:13;:11;:13::i;:::-;43593:5:::1;43573:9;:17;43583:6;43573:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;43487:119:::0;;:::o;42429:37::-;;;:::o;76116:116::-;2009:13;:11;:13::i;:::-;76221:3:::1;76211:7;76197:11;:21;;;;:::i;:::-;:27;;;;:::i;:::-;76185:9;:39;;;;76116:116:::0;:::o;42384:38::-;;;:::o;45655:114::-;45718:7;45745:9;:16;45755:5;45745:16;;;;;;;;;;;;;;;;45738:23;;45655:114;;;:::o;2798:103::-;2009:13;:11;:13::i;:::-;2863:30:::1;2890:1;2863:18;:30::i;:::-;2798:103::o:0;74293:250::-;74360:16;74410:1;74392:14;:12;:14::i;:::-;:19;74389:74;;74449:1;74435:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74428:23;;;;74389:74;74480:55;74496:5;74503:15;:13;:15::i;:::-;74520:14;:12;:14::i;:::-;74480:15;:55::i;:::-;74473:62;;74293:250;;;;:::o;2123:87::-;2169:7;2196:6;;;;;;;;;;;2189:13;;2123:87;:::o;42192:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72577:1264::-;72709:16;72776:4;72767:5;:13;72763:45;;72789:19;;;;;;;;;;;;;;72763:45;72922:15;:13;:15::i;:::-;72914:5;:23;72910:87;;;72966:15;:13;:15::i;:::-;72958:23;;72910:87;73076:17;73096:14;:12;:14::i;:::-;73076:34;;73136:9;73129:4;:16;73125:73;;;73173:9;73166:16;;73125:73;73214:22;73262:4;73254:5;:12;73251:157;;;73304:29;73314:5;73321;73328:4;73304:9;:29::i;:::-;73287:46;;73251:157;;;73391:1;73374:18;;73251:157;73436:25;73478:14;73464:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73436:57;;73510:29;73542:6;:13;73549:5;73542:13;;;;;;;;;;;;;;;73510:45;;73590:9;73601:19;73625:5;73632:1;73589:45;;;;73584:209;73651:14;73636:11;:29;73584:209;;73694:11;73703:1;73694:4;:8;;:11;;;;:::i;:::-;73691:87;;;73757:1;73731:8;73740:13;;;;;;73731:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;73691:87;73667:3;;;;;73584:209;;;;;73814:8;73807:15;;;;;;72577:1264;;;;;:::o;42512:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;42639:29::-;;;;:::o;47405:155::-;47500:52;47519:12;:10;:12::i;:::-;47533:8;47543;47500:18;:52::i;:::-;47405:155;;:::o;67315:186::-;67384:4;67401:13;67417:10;67401:26;;67438:33;67448:5;67455:2;67459:5;67466:4;67438:9;:33::i;:::-;67489:4;67482:11;;;67315:186;;;;:::o;44314:140::-;44399:4;44423:23;44443:2;44423:6;:15;44430:7;44423:15;;;;;;;;;;;;;;;:19;;:23;;;;:::i;:::-;44416:30;;44314:140;;;;:::o;76559:2214::-;76610:13;76645:14;:12;:14::i;:::-;76639:2;:20;76636:54;;76668:22;;;;;;;;;;;;;;76636:54;76737:1;76713:13;76723:2;76713:9;:13::i;:::-;76707:27;:31;76703:70;;;76760:13;76770:2;76760:9;:13::i;:::-;76753:20;;;;76703:70;76817:1;76794:12;76788:26;;;;;:::i;:::-;;;:30;76784:1982;;;76864:12;76878:13;:2;:11;:13::i;:::-;76847:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76833:60;;;;76784:1982;76924:10;76977:2;76960:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;76950:31;;;;;;76937:46;;76924:59;;77000:19;77034;77068:25;77122:2;77114:4;:10;;;77110:1276;;77145:29;;;;;;;;;;;;;;;;;;;77193:17;;;;;;;;;;;;;;;;;;;77229:206;;;;;;;;;;;;;;;;;;;77110:1276;;;77469:3;77461:4;:11;;;77457:929;;77493:26;;;;;;;;;;;;;;;;;;;77538:14;;;;;;;;;;;;;;;;;;;77571:216;;;;;;;;;;;;;;;;;;;77457:929;;;77821:3;77813:4;:11;;;77809:577;;77845:28;;;;;;;;;;;;;;;;;;;77892:16;;;;;;;;;;;;;;;;;;;77927:158;;;;;;;;;;;;;;;;;;;77809:577;;;78119:3;78111:4;:11;;;78107:279;;78143:28;;;;;;;;;;;;;;;;;;;78190:16;;;;;;;;;;;;;;;;;;;78225:145;;;;;;;;;;;;;;;;;;;78107:279;77809:577;77457:929;77110:1276;78402:26;78480:13;:2;:11;:13::i;:::-;78516:11;78581:7;78590:5;78438:158;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78402:195;;78674:12;78739:5;78626:127;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78612:142;;;;;;;76559:2214;;;;:::o;74640:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67509:142::-;67589:7;67616:11;:18;67628:5;67616:18;;;;;;;;;;;;;;;:27;67635:7;67616:27;;;;;;;;;;;;;;;;67609:34;;67509:142;;;;:::o;76346:106::-;2009:13;:11;:13::i;:::-;76435:9:::1;76420:12;:24;;;;;;:::i;:::-;;76346:106:::0;:::o;47632:168::-;47731:4;47755:18;:27;47774:7;47755:27;;;;;;;;;;;;;;;:37;47783:8;47755:37;;;;;;;;;;;;;;;;;;;;;;;;;47748:44;;47632:168;;;;:::o;47872:410::-;48069:12;:10;:12::i;:::-;48061:20;;:4;:20;;;:60;;;;48085:36;48102:4;48108:12;:10;:12::i;:::-;48085:16;:36::i;:::-;48061:60;48058:217;;;48137:51;48155:4;48161:2;48165;48169:6;48177:4;48183;48137:17;:51::i;:::-;48058:217;;;48228:35;;;;;;;;;;;;;;48058:217;47872:410;;;;;:::o;74612:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3056:220::-;2009:13;:11;:13::i;:::-;3161:1:::1;3141:22;;:8;:22;;::::0;3137:93:::1;;3215:1;3187:31;;;;;;;;;;;:::i;:::-;;;;;;;;3137:93;3240:28;3259:8;3240:18;:28::i;:::-;3056:220:::0;:::o;74967:24::-;;;;:::o;33521:488::-;33595:10;33844:9;33901:1;33892:4;33884:5;:12;33857:6;:10;;:22;33877:1;33868:5;:10;;33857:22;;;;;;;;;;;;:40;;33856:46;33844:58;;33990:1;33981:10;;33966:36;33521:488;;;;:::o;24082:157::-;24167:4;24206:25;24191:40;;;:11;:40;;;;24184:47;;24082:157;;;:::o;2288:166::-;2359:12;:10;:12::i;:::-;2348:23;;:7;:5;:7::i;:::-;:23;;;2344:103;;2422:12;:10;:12::i;:::-;2395:40;;;;;;;;;;;:::i;:::-;;;;;;;;2344:103;2288:166::o;54841:88::-;54915:6;54908:4;:13;;;;;;:::i;:::-;;54841:88;:::o;43919:95::-;43966:7;43993:13;;43986:20;;43919:95;:::o;71107:130::-;71192:37;71201:5;71208:7;71217:5;71224:4;71192:8;:37::i;:::-;71107:130;;;:::o;69126:325::-;69237:1;69221:18;;:4;:18;;;69217:88;;69290:1;69263:30;;;;;;;;;;;:::i;:::-;;;;;;;;69217:88;69333:1;69319:16;;:2;:16;;;69315:88;;69388:1;69359:32;;;;;;;;;;;:::i;:::-;;;;;;;;69315:88;69413:30;69421:4;69427:2;69431:5;69438:4;69413:7;:30::i;:::-;69126:325;;;;:::o;49276:1590::-;49494:1;49480:16;;:2;:16;;;49477:78;;49520:23;;;;;;;;;;;;;;49477:78;49567:16;49586:12;:10;:12::i;:::-;49567:31;;49609:20;49632:21;49650:2;49632:17;:21::i;:::-;49609:44;;49666:45;49687:8;49697:4;49703:2;49707:3;49666:20;:45::i;:::-;49737:1;49727:6;:11;:35;;;;;49742:20;49759:2;49742:6;:12;49749:4;49742:12;;;;;;;;;;;;;;;:16;;:20;;;;:::i;:::-;49727:35;49724:260;;;49779:22;49798:2;49779:6;:12;49786:4;49779:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;49816:18;49831:2;49816:6;:10;49823:2;49816:10;;;;;;;;;;;;;;;:14;;:18;;;;:::i;:::-;49849:40;49859:4;49865:2;49869:12;49883:5;49849:9;:40::i;:::-;49724:260;;;49929:43;;;;;;;;;;;;;;49724:260;49996:16;50023:18;50190:16;50186:2;50182:25;50170:37;;50245:16;50239:4;50235:27;50221:41;;50588:6;50552:8;50512:10;50454:25;50399:1;50342;50319:304;50682:2;50651:46;;50676:4;50651:46;;50666:8;50651:46;;;50686:2;50690:6;50651:46;;;;;;;:::i;:::-;;;;;;;;50710:44;50730:8;50740:4;50746:2;50750:3;50710:19;:44::i;:::-;50770:5;50767:91;;;50790:68;50821:8;50831:4;50837:2;50841;50845:6;50853:4;50790:30;:68::i;:::-;50767:91;49466:1400;;;;49276:1590;;;;;;:::o;71696:487::-;71796:24;71823:25;71833:5;71840:7;71823:9;:25::i;:::-;71796:52;;71883:17;71863:16;:37;71859:317;;71940:5;71921:16;:24;71917:132;;;72000:7;72009:16;72027:5;71973:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;71917:132;72092:57;72101:5;72108:7;72136:5;72117:16;:24;72143:5;72092:8;:57::i;:::-;71859:317;71785:398;71696:487;;;:::o;38620:786::-;38742:13;38798:14;38824:1;38815:5;:10;;38798:27;;38840:13;38864:4;38856:5;:12;38840:28;;38906:3;38898:5;38889:6;:14;:20;38883:417;;38939:44;38977:5;38955:6;:10;;:18;38966:6;38955:18;;;;;;;;;;;;:27;;38939:15;:44::i;:::-;38931:52;;39002:17;39052:1;39042:5;39033:6;:14;39032:21;;39022:6;:32;39002:52;;39101:4;39092:5;39083:6;:14;39082:23;39073:32;;39132:1;39124:9;;39157:8;;;;;39152:133;39177:9;39167:6;:19;39152:133;;39230:35;39246:6;:10;;:18;39257:6;39246:18;;;;;;;;;;;;39230:15;:35::i;:::-;39221:44;;;;39188:8;;;;;39152:133;;;38912:388;38883:417;39323:64;39379:6;39373:3;:12;39362:5;39340:6;:10;;:18;39351:6;39340:18;;;;;;;;;;;;:27;;39339:47;;39323:15;:64::i;:::-;39314:73;;;;38773:626;;38620:786;;;;;:::o;264:98::-;317:7;344:10;337:17;;264:98;:::o;51224:2773::-;51446:7;:14;51432:3;:10;:28;51429:89;;51484:22;;;;;;;;;;;;;;51429:89;51547:1;51533:16;;:2;:16;;;51530:78;;51573:23;;;;;;;;;;;;;;51530:78;51618:16;51637:12;:10;:12::i;:::-;51618:31;;51662:45;51683:8;51693:4;51699:2;51703:3;51662:20;:45::i;:::-;51725:9;51720:370;51744:3;:10;51740:1;:14;51720:370;;;51776:10;51789:3;51793:1;51789:6;;;;;;;;:::i;:::-;;;;;;;;51776:19;;51810:14;51827:7;51835:1;51827:10;;;;;;;;:::i;:::-;;;;;;;;51810:27;;51867:1;51857:6;:11;:35;;;;;51872:20;51889:2;51872:6;:12;51879:4;51872:12;;;;;;;;;;;;;;;:16;;:20;;;;:::i;:::-;51857:35;51854:225;;;51913:22;51932:2;51913:6;:12;51920:4;51913:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;51954:18;51969:2;51954:6;:10;51961:2;51954:10;;;;;;;;;;;;;;;:14;;:18;;;;:::i;:::-;51854:225;;;52020:43;;;;;;;;;;;;;;51854:225;51761:329;;51756:3;;;;;51720:370;;;;52100:53;52110:4;52116:2;52135:3;:10;52120:12;:25;;;;:::i;:::-;52147:5;52100:9;:53::i;:::-;52166:16;52193:18;52222:11;52249:1;52236:3;:10;:14;;;;:::i;:::-;52222:28;;52739:16;52733:4;52729:27;52715:41;;52790:16;52786:2;52782:25;52770:37;;53148:4;53143:3;53139:14;53133:21;53097:8;53057:10;52999:25;52944:1;52887;52864:319;53471:1;53433:336;53507:3;53498:7;53495:16;53433:336;;53743:7;53737:4;53733:18;53728:3;53724:28;53718:35;53708:8;53696:10;53669:25;53666:1;53663;53658:96;53556:1;53547:7;53543:15;53532:26;;53433:336;;;53437:50;53827:2;53797:47;;53821:4;53797:47;;53811:8;53797:47;;;53831:3;53836:7;53797:47;;;;;;;:::i;:::-;;;;;;;;53857:44;53877:8;53887:4;53893:2;53897:3;53857:19;:44::i;:::-;53914:75;53950:8;53960:4;53966:2;53970:3;53975:7;53984:4;53914:35;:75::i;:::-;51418:2579;;;;51224:2773;;;;;:::o;3436:191::-;3510:16;3529:6;;;;;;;;;;;3510:25;;3555:8;3546:6;;:17;;;;;;;;;;;;;;;;;;3610:8;3579:40;;3600:8;3579:40;;;;;;;;;;;;3499:128;3436:191;:::o;44112:114::-;44159:7;44203:15;:13;:15::i;:::-;44186:14;:12;:14::i;:::-;:32;;;;:::i;:::-;44179:39;;44112:114;:::o;43748:92::-;43804:7;43831:1;43824:8;;43748:92;:::o;62376:331::-;62531:8;62522:17;;:5;:17;;;62514:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62634:8;62596:18;:25;62615:5;62596:25;;;;;;;;;;;;;;;:35;62622:8;62596:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;62680:8;62658:41;;62673:5;62658:41;;;62690:8;62658:41;;;;;;:::i;:::-;;;;;;;;62376:331;;;:::o;45464:105::-;45524:13;45557:4;45550:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45464:105;;;:::o;13159:723::-;13215:13;13445:1;13436:5;:10;13432:53;;13463:10;;;;;;;;;;;;;;;;;;;;;13432:53;13495:12;13510:5;13495:20;;13526:14;13551:78;13566:1;13558:4;:9;13551:78;;13584:8;;;;;:::i;:::-;;;;13615:2;13607:10;;;;;:::i;:::-;;;13551:78;;;13639:19;13671:6;13661:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13639:39;;13689:154;13705:1;13696:5;:10;13689:154;;13733:1;13723:11;;;;;:::i;:::-;;;13800:2;13792:5;:10;;;;:::i;:::-;13779:2;:24;;;;:::i;:::-;13766:39;;13749:6;13756;13749:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;13829:2;13820:11;;;;;:::i;:::-;;;13689:154;;;13867:6;13853:21;;;;;13159:723;;;;:::o;71245:443::-;71375:1;71358:19;;:5;:19;;;71354:91;;71430:1;71401:32;;;;;;;;;;;:::i;:::-;;;;;;;;71354:91;71478:1;71459:21;;:7;:21;;;71455:92;;71532:1;71504:31;;;;;;;;;;;:::i;:::-;;;;;;;;71455:92;71587:5;71557:11;:18;71569:5;71557:18;;;;;;;;;;;;;;;:27;71576:7;71557:27;;;;;;;;;;;;;;;:35;;;;71607:9;71603:78;;;71654:7;71638:31;;71647:5;71638:31;;;71663:5;71638:31;;;;;;:::i;:::-;;;;;;;;71603:78;71245:443;;;;:::o;69459:1640::-;69556:19;69578:9;:15;69588:4;69578:15;;;;;;;;;;;;;;;;69556:37;;69604:17;69624:9;:13;69634:2;69624:13;;;;;;;;;;;;;;;;69604:33;;69666:5;69652:11;:19;69648:109;;;69720:4;69726:11;69739:5;69695:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;69648:109;69902:5;69888:11;:19;69870:9;:15;69880:4;69870:15;;;;;;;;;;;;;;;:37;;;;70066:5;70054:9;:17;70038:9;:13;70048:2;70038:13;;;;;;;;;;;;;;;:33;;;;70115:2;70100:25;;70109:4;70100:25;;;70119:5;70100:25;;;;;;:::i;:::-;;;;;;;;70141:4;70138:954;;;70222:8;70233:9;:15;70243:4;70233:15;;;;;;;;;;;;;;;;;;;;;;;;;70222:26;;70268:3;70263:234;;70292:22;70373:12;70364:5;70350:11;:19;;;;:::i;:::-;70349:36;;;;:::i;:::-;70332:12;70318:11;:26;;;;:::i;:::-;70317:69;;;;:::i;:::-;70292:94;;70425:1;70408:14;:18;70405:76;;;70449:32;70460:4;70466:14;70449:10;:32::i;:::-;70405:76;70273:224;70263:234;70581:9;:13;70591:2;70581:13;;;;;;;;;;;;;;;;;;;;;;;;;70576:505;;70632:1;70618:10;;:15;:22;;;;;70637:3;70618:22;:41;;;;;70652:7;:5;:7::i;:::-;70644:15;;:4;:15;;;70618:41;70615:451;;;70758:4;70742:9;:13;70752:2;70742:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;70798:1;70785:10;:14;;;;70615:451;;;70848:22;70925:12;70913:9;:24;;;;:::i;:::-;70896:12;70887:5;70875:9;:17;;;;:::i;:::-;70874:34;;;;:::i;:::-;70873:65;;;;:::i;:::-;70848:90;;70981:1;70964:14;:18;70961:85;;;71009:37;71027:2;71031:14;71009:17;:37::i;:::-;;;70961:85;70825:241;70615:451;70576:505;70147:945;70138:954;69545:1554;;69459:1640;;;;:::o;67145:162::-;67211:22;67268:1;67254:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67246:24;;67292:7;67281:5;67287:1;67281:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;67145:162;;;:::o;63665:158::-;;;;;:::o;34276:129::-;34391:4;34383:5;:12;34377:1;:19;;34375:22;34349:6;:10;;:22;34369:1;34360:5;:10;;34349:22;;;;;;;;;;;;:48;;;;;;;;;;;34276:129;;:::o;34079:126::-;34191:4;34183:5;:12;34177:1;:19;;34150:6;:10;;:22;34170:1;34161:5;:10;;34150:22;;;;;;;;;;;;:47;;;;;;;;;;;34079:126;;:::o;75293:716::-;75464:9;:13;75474:2;75464:13;;;;;;;;;;;;;;;;;;;;;;;;;75460:461;;75519:9;;75502;:13;75512:2;75502:13;;;;;;;;;;;;;;;;:26;;75494:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;75583:13;;;;;;;;;;;75579:331;;;75649:12;75625:10;:21;75636:9;75625:21;;;;;;;;;;;;;;;;:36;75617:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;75744:12;75720:10;:21;75731:9;75720:21;;;;;;;;;;;;;;;:36;;;;75812:1;75793:2;75785:23;;;:28;:67;;;;;75851:1;75825:9;75817:30;;;:35;75785:67;75777:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;75579:331;75460:461;75951:50;75977:8;75987:4;75993:2;75997:3;75951:25;:50::i;:::-;75293:716;;;;:::o;64943:1389::-;65158:15;:2;:13;;;:15::i;:::-;65154:1171;;;65202:2;65194:29;;;65224:26;65194:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65190:1124;;;65293:2;65276:38;;;65315:8;65325:4;65331:2;65335:6;65343:4;65276:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65272:495;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;65642:6;65635:14;;;;;;;;;;;:::i;:::-;;;;;;;;65272:495;;;65706:41;;;;;;;;;;;;;;65272:495;65414:43;;;65402:55;;;:8;:55;;;;65398:160;;65493:41;;;;;;;;;;;;;;65398:160;65349:228;65190:1124;;;65839:2;65824:35;;;65860:8;65870:4;65876:2;65880:4;65824:61;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65820:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;66175:6;66168:14;;;;;;;;;;;:::i;:::-;;;;;;;;65820:479;;;66239:40;;;;;;;;;;;;;;65820:479;65951:40;;;65939:52;;;:8;:52;;;;65935:156;;66027:40;;;;;;;;;;;;;;65935:156;65886:224;65190:1124;65154:1171;64943:1389;;;;;;:::o;27625:464::-;27677:9;27782:1;27778:6;27817:3;27814:1;27811:10;27871:1;27866:3;27862:11;27858:1;27855;27851:9;27847:27;27844:1;27840:35;27835:40;;27943:1;27938:3;27934:11;27930:1;27927;27923:9;27919:27;27914:1;27909:3;27905:11;27902:1;27898:19;27894:53;27889:58;;27998:2;27993:3;27989:12;27984:1;27981;27977:9;27974:1;27970:17;27966:36;27961:41;;28064:3;28059;28055:13;28052:1;28048:21;28043:3;28039:31;28031:5;28028:1;28024:13;28021:50;28016:55;;27752:330;;27625:464;;;:::o;66340:797::-;66580:15;:2;:13;;;:15::i;:::-;66576:554;;;66633:2;66616:43;;;66660:8;66670:4;66676:3;66681:7;66690:4;66616:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66612:507;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;67006:6;66999:14;;;;;;;;;;;:::i;:::-;;;;;;;;66612:507;;;67062:41;;;;;;;;;;;;;;66612:507;66789:48;;;66777:60;;;:8;:60;;;;66773:157;;66869:41;;;;;;;;;;;;;;66773:157;66696:249;66576:554;66340:797;;;;;;:::o;60495:1735::-;60617:1;60601:18;;:4;:18;;;60598:77;;60642:21;;;;;;;;;;;;;;60598:77;60687:16;60706:12;:10;:12::i;:::-;60687:31;;60731:18;60752:14;:12;:14::i;:::-;60731:35;;60779:24;60820:6;60806:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60779:48;;60838:20;60875:6;60861:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60838:44;;60924:9;60920:258;60943:6;60939:1;:10;60920:258;;;60988:1;60975:7;60983:1;60975:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;61008:10;61021:36;61046:10;61021:6;:12;61028:4;61021:12;;;;;;;;;;;;;;;:24;;:36;;;;:::i;:::-;61008:49;;61085:2;61076:3;61080:1;61076:6;;;;;;;;:::i;:::-;;;;;;;:11;;;;;61106:22;61125:2;61106:6;:12;61113:4;61106:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;61160:2;61147:15;;60956:222;60951:3;;;;;;;60920:258;;;;61263:53;61284:8;61294:4;61308:1;61312:3;61263:20;:53::i;:::-;61329:18;61358:11;61381:1;61372:6;:10;;;;:::i;:::-;61358:24;;61443:16;61437:4;61433:27;61419:41;;61645:4;61640:3;61636:14;61630:21;61610:1;61581:10;61537:25;61517:1;61497;61474:192;61720:1;61682:264;61756:3;61747:7;61744:16;61682:264;;61920:7;61914:4;61910:18;61905:3;61901:28;61895:35;61892:1;61880:10;61853:25;61850:1;61847;61842:89;61805:1;61796:7;61792:15;61781:26;;61682:264;;;61686:50;61982:1;61972:6;:11;61969:176;;62042:1;62003:53;;62028:4;62003:53;;62018:8;62003:53;;;62046:3;62050:1;62046:6;;;;;;;;:::i;:::-;;;;;;;;62054:1;62003:53;;;;;;;:::i;:::-;;;;;;;;61969:176;;;62128:1;62090:55;;62114:4;62090:55;;62104:8;62090:55;;;62132:3;62137:7;62090:55;;;;;;;:::i;:::-;;;;;;;;61969:176;62168:52;62188:8;62198:4;62212:1;62216:3;62168:19;:52::i;:::-;60587:1643;;;;;;60495:1735;;:::o;55864:1661::-;55969:20;55991:24;56047:1;56033:16;;:2;:16;;;56030:74;;56073:19;;;;;;;;;;;;;;56030:74;56127:1;56117:6;:11;56114:68;;56152:18;;;;;;;;;;;;;;56114:68;56194:16;56213:12;:10;:12::i;:::-;56194:31;;56258:6;56244:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56238:27;;56300:6;56286:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56276:31;;56318:20;56341:14;:12;:14::i;:::-;56318:37;;56431:12;56421:6;56401:17;:26;:42;;56393:51;;;;;;56463:9;56459:129;56482:6;56478:1;:10;56459:129;;;56538:1;56523:12;:16;56514:3;56518:1;56514:6;;;;;;;;:::i;:::-;;;;;;;:25;;;;;56571:1;56558:7;56566:1;56558:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;56490:3;;;;;;;56459:129;;;;56619:51;56640:8;56658:1;56662:2;56666:3;56619:20;:51::i;:::-;56683:41;56703:12;56717:6;56683;:10;56690:2;56683:10;;;;;;;;;;;;;;;:19;;:41;;;;;:::i;:::-;56752:6;56735:13;;:23;;;;;;;:::i;:::-;;;;;;;;56771:16;56798:11;56827:6;56812:12;:21;;;;:::i;:::-;56798:35;;56890:16;56886:2;56882:25;56870:37;;57075:12;57048:8;57028:1;56984:25;56964:1;56944;56921:181;57174:1;57160:12;57156:20;57118:253;57211:3;57202:7;57199:16;57118:253;;57348:7;57338:8;57335:1;57308:25;57305:1;57302;57297:59;57260:1;57251:7;57247:15;57236:26;;57118:253;;;57122:69;57435:2;57399:53;;57431:1;57399:53;;57413:8;57399:53;;;57439:3;57444:7;57399:53;;;;;;;:::i;:::-;;;;;;;;57465:50;57485:8;57503:1;57507:2;57511:3;57465:19;:50::i;:::-;56017:1508;;;;55864:1661;;;;;:::o;64778:157::-;;;;;:::o;5600:387::-;5660:4;5868:12;5935:7;5923:20;5915:28;;5978:1;5971:4;:8;5964:15;;;5600:387;;;:::o;39560:1230::-;39670:19;39707:14;39732:18;39848:1;39844:6;39829:21;;39881:6;39878:1;39874:14;39864:24;;39915:6;39909:4;39902:20;39949:11;39943:4;39936:25;40003:6;39999:11;39993:4;39989:22;40116:4;40110;40100:21;40094:28;40086:6;40082:41;40074:6;40070:54;40056:68;;40170:6;40163:14;40151:10;40148:30;40138:356;;40199:280;40206:1;40199:280;;;40256:11;40248:6;40244:24;40234:34;;40324:6;40318:4;40311:20;40389:4;40383;40373:21;40367:28;40353:42;;40442:6;40435:14;40423:10;40420:30;40417:43;40199:280;40417:43;40199:280;40138:356;39814:691;40533:1;40519:10;:15;40515:268;;40581:22;40592:10;40581;:22::i;:::-;40576:1;40566:6;:11;;40565:38;40551:52;;40748:6;40735:11;40732:23;40729:1;40725:31;40712:11;40709:48;40694:63;;40515:268;39696:1094;;39560:1230;;;;:::o;36113:1129::-;36288:1;36284:6;36328:4;36321:5;36317:16;36360:11;36354:4;36347:25;36406:5;36403:1;36399:13;36393:4;36386:27;36460:3;36451:6;36444:5;36440:18;36437:27;36427:646;;36520:4;36514;36504:21;36597:3;36590:5;36586:15;36572:11;36566:18;36563:39;36550:11;36543:60;36652:1;36645:4;36639:11;36635:19;36725:5;36717:6;36713:18;36710:1;36706:26;36699:4;36693:11;36689:44;36785:4;36777:5;36769:6;36765:18;36761:29;36751:39;;36817:1;36808:10;;36836:184;36861:9;36853:6;36850:21;36836:184;;36938:6;36932:4;36925:20;36997:3;36990:4;36984;36974:21;36967:34;36897:1;36889:6;36885:14;36875:24;;36836:184;;;37051:6;37045:4;37038:20;36466:607;;;36427:646;37122:4;37116;37106:21;37217:3;37208:6;37203:3;37199:16;37195:26;37188:5;37184:38;37170:11;37164:18;37161:62;37148:11;37141:83;36258:977;;;36113:1129;;;:::o;24979:688::-;25026:9;25189:1;25153:34;25150:41;25147:1;25143:49;25138:1;25131:9;25128:1;25124:17;25121:72;25116:77;;25255:1;25252;25248:9;25228:18;25225:33;25222:1;25218:41;25215:1;25212:48;25207:53;;25314:1;25311;25307:9;25295:10;25292:25;25289:1;25285:33;25282:1;25279:40;25274:45;;25369:1;25366;25362:9;25354:6;25351:21;25348:1;25344:29;25341:1;25338:36;25333:41;;25422:1;25419;25415:9;25409:4;25406:19;25403:1;25399:27;25396:1;25393:34;25388:39;;25581:66;25526:34;25522:1;25519;25515:9;25511:50;25505:4;25501:61;25496:152;25493:1;25490:159;25485:164;;24979:688;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:146::-;4586:6;4581:3;4576;4563:30;4627:1;4618:6;4613:3;4609:16;4602:27;4489:146;;;:::o;4641:425::-;4719:5;4744:66;4760:49;4802:6;4760:49;:::i;:::-;4744:66;:::i;:::-;4735:75;;4833:6;4826:5;4819:21;4871:4;4864:5;4860:16;4909:3;4900:6;4895:3;4891:16;4888:25;4885:112;;;4916:79;;:::i;:::-;4885:112;5006:54;5053:6;5048:3;5043;5006:54;:::i;:::-;4725:341;4641:425;;;;;:::o;5086:340::-;5142:5;5191:3;5184:4;5176:6;5172:17;5168:27;5158:122;;5199:79;;:::i;:::-;5158:122;5316:6;5303:20;5341:79;5416:3;5408:6;5401:4;5393:6;5389:17;5341:79;:::i;:::-;5332:88;;5148:278;5086:340;;;;:::o;5432:509::-;5501:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:119;;;5556:79;;:::i;:::-;5518:119;5704:1;5693:9;5689:17;5676:31;5734:18;5726:6;5723:30;5720:117;;;5756:79;;:::i;:::-;5720:117;5861:63;5916:7;5907:6;5896:9;5892:22;5861:63;:::i;:::-;5851:73;;5647:287;5432:509;;;;:::o;5947:99::-;5999:6;6033:5;6027:12;6017:22;;5947:99;;;:::o;6052:169::-;6136:11;6170:6;6165:3;6158:19;6210:4;6205:3;6201:14;6186:29;;6052:169;;;;:::o;6227:246::-;6308:1;6318:113;6332:6;6329:1;6326:13;6318:113;;;6417:1;6412:3;6408:11;6402:18;6398:1;6393:3;6389:11;6382:39;6354:2;6351:1;6347:10;6342:15;;6318:113;;;6465:1;6456:6;6451:3;6447:16;6440:27;6289:184;6227:246;;;:::o;6479:377::-;6567:3;6595:39;6628:5;6595:39;:::i;:::-;6650:71;6714:6;6709:3;6650:71;:::i;:::-;6643:78;;6730:65;6788:6;6783:3;6776:4;6769:5;6765:16;6730:65;:::i;:::-;6820:29;6842:6;6820:29;:::i;:::-;6815:3;6811:39;6804:46;;6571:285;6479:377;;;;:::o;6862:313::-;6975:4;7013:2;7002:9;6998:18;6990:26;;7062:9;7056:4;7052:20;7048:1;7037:9;7033:17;7026:47;7090:78;7163:4;7154:6;7090:78;:::i;:::-;7082:86;;6862:313;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:::-;8570:6;8578;8586;8635:2;8623:9;8614:7;8610:23;8606:32;8603:119;;;8641:79;;:::i;:::-;8603:119;8761:1;8786:53;8831:7;8822:6;8811:9;8807:22;8786:53;:::i;:::-;8776:63;;8732:117;8888:2;8914:53;8959:7;8950:6;8939:9;8935:22;8914:53;:::i;:::-;8904:63;;8859:118;9016:2;9042:53;9087:7;9078:6;9067:9;9063:22;9042:53;:::i;:::-;9032:63;;8987:118;8493:619;;;;;:::o;9118:311::-;9195:4;9285:18;9277:6;9274:30;9271:56;;;9307:18;;:::i;:::-;9271:56;9357:4;9349:6;9345:17;9337:25;;9417:4;9411;9407:15;9399:23;;9118:311;;;:::o;9435:117::-;9544:1;9541;9534:12;9575:710;9671:5;9696:81;9712:64;9769:6;9712:64;:::i;:::-;9696:81;:::i;:::-;9687:90;;9797:5;9826:6;9819:5;9812:21;9860:4;9853:5;9849:16;9842:23;;9913:4;9905:6;9901:17;9893:6;9889:30;9942:3;9934:6;9931:15;9928:122;;;9961:79;;:::i;:::-;9928:122;10076:6;10059:220;10093:6;10088:3;10085:15;10059:220;;;10168:3;10197:37;10230:3;10218:10;10197:37;:::i;:::-;10192:3;10185:50;10264:4;10259:3;10255:14;10248:21;;10135:144;10119:4;10114:3;10110:14;10103:21;;10059:220;;;10063:21;9677:608;;9575:710;;;;;:::o;10308:370::-;10379:5;10428:3;10421:4;10413:6;10409:17;10405:27;10395:122;;10436:79;;:::i;:::-;10395:122;10553:6;10540:20;10578:94;10668:3;10660:6;10653:4;10645:6;10641:17;10578:94;:::i;:::-;10569:103;;10385:293;10308:370;;;;:::o;10684:307::-;10745:4;10835:18;10827:6;10824:30;10821:56;;;10857:18;;:::i;:::-;10821:56;10895:29;10917:6;10895:29;:::i;:::-;10887:37;;10979:4;10973;10969:15;10961:23;;10684:307;;;:::o;10997:423::-;11074:5;11099:65;11115:48;11156:6;11115:48;:::i;:::-;11099:65;:::i;:::-;11090:74;;11187:6;11180:5;11173:21;11225:4;11218:5;11214:16;11263:3;11254:6;11249:3;11245:16;11242:25;11239:112;;;11270:79;;:::i;:::-;11239:112;11360:54;11407:6;11402:3;11397;11360:54;:::i;:::-;11080:340;10997:423;;;;;:::o;11439:338::-;11494:5;11543:3;11536:4;11528:6;11524:17;11520:27;11510:122;;11551:79;;:::i;:::-;11510:122;11668:6;11655:20;11693:78;11767:3;11759:6;11752:4;11744:6;11740:17;11693:78;:::i;:::-;11684:87;;11500:277;11439:338;;;;:::o;11783:1509::-;11937:6;11945;11953;11961;11969;12018:3;12006:9;11997:7;11993:23;11989:33;11986:120;;;12025:79;;:::i;:::-;11986:120;12145:1;12170:53;12215:7;12206:6;12195:9;12191:22;12170:53;:::i;:::-;12160:63;;12116:117;12272:2;12298:53;12343:7;12334:6;12323:9;12319:22;12298:53;:::i;:::-;12288:63;;12243:118;12428:2;12417:9;12413:18;12400:32;12459:18;12451:6;12448:30;12445:117;;;12481:79;;:::i;:::-;12445:117;12586:78;12656:7;12647:6;12636:9;12632:22;12586:78;:::i;:::-;12576:88;;12371:303;12741:2;12730:9;12726:18;12713:32;12772:18;12764:6;12761:30;12758:117;;;12794:79;;:::i;:::-;12758:117;12899:78;12969:7;12960:6;12949:9;12945:22;12899:78;:::i;:::-;12889:88;;12684:303;13054:3;13043:9;13039:19;13026:33;13086:18;13078:6;13075:30;13072:117;;;13108:79;;:::i;:::-;13072:117;13213:62;13267:7;13258:6;13247:9;13243:22;13213:62;:::i;:::-;13203:72;;12997:288;11783:1509;;;;;;;;:::o;13298:86::-;13333:7;13373:4;13366:5;13362:16;13351:27;;13298:86;;;:::o;13390:112::-;13473:22;13489:5;13473:22;:::i;:::-;13468:3;13461:35;13390:112;;:::o;13508:214::-;13597:4;13635:2;13624:9;13620:18;13612:26;;13648:67;13712:1;13701:9;13697:17;13688:6;13648:67;:::i;:::-;13508:214;;;;:::o;13728:311::-;13805:4;13895:18;13887:6;13884:30;13881:56;;;13917:18;;:::i;:::-;13881:56;13967:4;13959:6;13955:17;13947:25;;14027:4;14021;14017:15;14009:23;;13728:311;;;:::o;14062:710::-;14158:5;14183:81;14199:64;14256:6;14199:64;:::i;:::-;14183:81;:::i;:::-;14174:90;;14284:5;14313:6;14306:5;14299:21;14347:4;14340:5;14336:16;14329:23;;14400:4;14392:6;14388:17;14380:6;14376:30;14429:3;14421:6;14418:15;14415:122;;;14448:79;;:::i;:::-;14415:122;14563:6;14546:220;14580:6;14575:3;14572:15;14546:220;;;14655:3;14684:37;14717:3;14705:10;14684:37;:::i;:::-;14679:3;14672:50;14751:4;14746:3;14742:14;14735:21;;14622:144;14606:4;14601:3;14597:14;14590:21;;14546:220;;;14550:21;14164:608;;14062:710;;;;;:::o;14795:370::-;14866:5;14915:3;14908:4;14900:6;14896:17;14892:27;14882:122;;14923:79;;:::i;:::-;14882:122;15040:6;15027:20;15065:94;15155:3;15147:6;15140:4;15132:6;15128:17;15065:94;:::i;:::-;15056:103;;14872:293;14795:370;;;;:::o;15171:894::-;15289:6;15297;15346:2;15334:9;15325:7;15321:23;15317:32;15314:119;;;15352:79;;:::i;:::-;15314:119;15500:1;15489:9;15485:17;15472:31;15530:18;15522:6;15519:30;15516:117;;;15552:79;;:::i;:::-;15516:117;15657:78;15727:7;15718:6;15707:9;15703:22;15657:78;:::i;:::-;15647:88;;15443:302;15812:2;15801:9;15797:18;15784:32;15843:18;15835:6;15832:30;15829:117;;;15865:79;;:::i;:::-;15829:117;15970:78;16040:7;16031:6;16020:9;16016:22;15970:78;:::i;:::-;15960:88;;15755:303;15171:894;;;;;:::o;16071:114::-;16138:6;16172:5;16166:12;16156:22;;16071:114;;;:::o;16191:184::-;16290:11;16324:6;16319:3;16312:19;16364:4;16359:3;16355:14;16340:29;;16191:184;;;;:::o;16381:132::-;16448:4;16471:3;16463:11;;16501:4;16496:3;16492:14;16484:22;;16381:132;;;:::o;16519:108::-;16596:24;16614:5;16596:24;:::i;:::-;16591:3;16584:37;16519:108;;:::o;16633:179::-;16702:10;16723:46;16765:3;16757:6;16723:46;:::i;:::-;16801:4;16796:3;16792:14;16778:28;;16633:179;;;;:::o;16818:113::-;16888:4;16920;16915:3;16911:14;16903:22;;16818:113;;;:::o;16967:732::-;17086:3;17115:54;17163:5;17115:54;:::i;:::-;17185:86;17264:6;17259:3;17185:86;:::i;:::-;17178:93;;17295:56;17345:5;17295:56;:::i;:::-;17374:7;17405:1;17390:284;17415:6;17412:1;17409:13;17390:284;;;17491:6;17485:13;17518:63;17577:3;17562:13;17518:63;:::i;:::-;17511:70;;17604:60;17657:6;17604:60;:::i;:::-;17594:70;;17450:224;17437:1;17434;17430:9;17425:14;;17390:284;;;17394:14;17690:3;17683:10;;17091:608;;;16967:732;;;;:::o;17705:373::-;17848:4;17886:2;17875:9;17871:18;17863:26;;17935:9;17929:4;17925:20;17921:1;17910:9;17906:17;17899:47;17963:108;18066:4;18057:6;17963:108;:::i;:::-;17955:116;;17705:373;;;;:::o;18084:116::-;18154:21;18169:5;18154:21;:::i;:::-;18147:5;18144:32;18134:60;;18190:1;18187;18180:12;18134:60;18084:116;:::o;18206:133::-;18249:5;18287:6;18274:20;18265:29;;18303:30;18327:5;18303:30;:::i;:::-;18206:133;;;;:::o;18345:468::-;18410:6;18418;18467:2;18455:9;18446:7;18442:23;18438:32;18435:119;;;18473:79;;:::i;:::-;18435:119;18593:1;18618:53;18663:7;18654:6;18643:9;18639:22;18618:53;:::i;:::-;18608:63;;18564:117;18720:2;18746:50;18788:7;18779:6;18768:9;18764:22;18746:50;:::i;:::-;18736:60;;18691:115;18345:468;;;;;:::o;18819:329::-;18878:6;18927:2;18915:9;18906:7;18902:23;18898:32;18895:119;;;18933:79;;:::i;:::-;18895:119;19053:1;19078:53;19123:7;19114:6;19103:9;19099:22;19078:53;:::i;:::-;19068:63;;19024:117;18819:329;;;;:::o;19154:474::-;19222:6;19230;19279:2;19267:9;19258:7;19254:23;19250:32;19247:119;;;19285:79;;:::i;:::-;19247:119;19405:1;19430:53;19475:7;19466:6;19455:9;19451:22;19430:53;:::i;:::-;19420:63;;19376:117;19532:2;19558:53;19603:7;19594:6;19583:9;19579:22;19558:53;:::i;:::-;19548:63;;19503:118;19154:474;;;;;:::o;19634:1089::-;19738:6;19746;19754;19762;19770;19819:3;19807:9;19798:7;19794:23;19790:33;19787:120;;;19826:79;;:::i;:::-;19787:120;19946:1;19971:53;20016:7;20007:6;19996:9;19992:22;19971:53;:::i;:::-;19961:63;;19917:117;20073:2;20099:53;20144:7;20135:6;20124:9;20120:22;20099:53;:::i;:::-;20089:63;;20044:118;20201:2;20227:53;20272:7;20263:6;20252:9;20248:22;20227:53;:::i;:::-;20217:63;;20172:118;20329:2;20355:53;20400:7;20391:6;20380:9;20376:22;20355:53;:::i;:::-;20345:63;;20300:118;20485:3;20474:9;20470:19;20457:33;20517:18;20509:6;20506:30;20503:117;;;20539:79;;:::i;:::-;20503:117;20644:62;20698:7;20689:6;20678:9;20674:22;20644:62;:::i;:::-;20634:72;;20428:288;19634:1089;;;;;;;;:::o;20729:180::-;20777:77;20774:1;20767:88;20874:4;20871:1;20864:15;20898:4;20895:1;20888:15;20915:320;20959:6;20996:1;20990:4;20986:12;20976:22;;21043:1;21037:4;21033:12;21064:18;21054:81;;21120:4;21112:6;21108:17;21098:27;;21054:81;21182:2;21174:6;21171:14;21151:18;21148:38;21145:84;;21201:18;;:::i;:::-;21145:84;20966:269;20915:320;;;:::o;21241:141::-;21290:4;21313:3;21305:11;;21336:3;21333:1;21326:14;21370:4;21367:1;21357:18;21349:26;;21241:141;;;:::o;21388:93::-;21425:6;21472:2;21467;21460:5;21456:14;21452:23;21442:33;;21388:93;;;:::o;21487:107::-;21531:8;21581:5;21575:4;21571:16;21550:37;;21487:107;;;;:::o;21600:393::-;21669:6;21719:1;21707:10;21703:18;21742:97;21772:66;21761:9;21742:97;:::i;:::-;21860:39;21890:8;21879:9;21860:39;:::i;:::-;21848:51;;21932:4;21928:9;21921:5;21917:21;21908:30;;21981:4;21971:8;21967:19;21960:5;21957:30;21947:40;;21676:317;;21600:393;;;;;:::o;21999:60::-;22027:3;22048:5;22041:12;;21999:60;;;:::o;22065:142::-;22115:9;22148:53;22166:34;22175:24;22193:5;22175:24;:::i;:::-;22166:34;:::i;:::-;22148:53;:::i;:::-;22135:66;;22065:142;;;:::o;22213:75::-;22256:3;22277:5;22270:12;;22213:75;;;:::o;22294:269::-;22404:39;22435:7;22404:39;:::i;:::-;22465:91;22514:41;22538:16;22514:41;:::i;:::-;22506:6;22499:4;22493:11;22465:91;:::i;:::-;22459:4;22452:105;22370:193;22294:269;;;:::o;22569:73::-;22614:3;22569:73;:::o;22648:189::-;22725:32;;:::i;:::-;22766:65;22824:6;22816;22810:4;22766:65;:::i;:::-;22701:136;22648:189;;:::o;22843:186::-;22903:120;22920:3;22913:5;22910:14;22903:120;;;22974:39;23011:1;23004:5;22974:39;:::i;:::-;22947:1;22940:5;22936:13;22927:22;;22903:120;;;22843:186;;:::o;23035:543::-;23136:2;23131:3;23128:11;23125:446;;;23170:38;23202:5;23170:38;:::i;:::-;23254:29;23272:10;23254:29;:::i;:::-;23244:8;23240:44;23437:2;23425:10;23422:18;23419:49;;;23458:8;23443:23;;23419:49;23481:80;23537:22;23555:3;23537:22;:::i;:::-;23527:8;23523:37;23510:11;23481:80;:::i;:::-;23140:431;;23125:446;23035:543;;;:::o;23584:117::-;23638:8;23688:5;23682:4;23678:16;23657:37;;23584:117;;;;:::o;23707:169::-;23751:6;23784:51;23832:1;23828:6;23820:5;23817:1;23813:13;23784:51;:::i;:::-;23780:56;23865:4;23859;23855:15;23845:25;;23758:118;23707:169;;;;:::o;23881:295::-;23957:4;24103:29;24128:3;24122:4;24103:29;:::i;:::-;24095:37;;24165:3;24162:1;24158:11;24152:4;24149:21;24141:29;;23881:295;;;;:::o;24181:1395::-;24298:37;24331:3;24298:37;:::i;:::-;24400:18;24392:6;24389:30;24386:56;;;24422:18;;:::i;:::-;24386:56;24466:38;24498:4;24492:11;24466:38;:::i;:::-;24551:67;24611:6;24603;24597:4;24551:67;:::i;:::-;24645:1;24669:4;24656:17;;24701:2;24693:6;24690:14;24718:1;24713:618;;;;25375:1;25392:6;25389:77;;;25441:9;25436:3;25432:19;25426:26;25417:35;;25389:77;25492:67;25552:6;25545:5;25492:67;:::i;:::-;25486:4;25479:81;25348:222;24683:887;;24713:618;24765:4;24761:9;24753:6;24749:22;24799:37;24831:4;24799:37;:::i;:::-;24858:1;24872:208;24886:7;24883:1;24880:14;24872:208;;;24965:9;24960:3;24956:19;24950:26;24942:6;24935:42;25016:1;25008:6;25004:14;24994:24;;25063:2;25052:9;25048:18;25035:31;;24909:4;24906:1;24902:12;24897:17;;24872:208;;;25108:6;25099:7;25096:19;25093:179;;;25166:9;25161:3;25157:19;25151:26;25209:48;25251:4;25243:6;25239:17;25228:9;25209:48;:::i;:::-;25201:6;25194:64;25116:156;25093:179;25318:1;25314;25306:6;25302:14;25298:22;25292:4;25285:36;24720:611;;;24683:887;;24273:1303;;;24181:1395;;:::o;25582:180::-;25630:77;25627:1;25620:88;25727:4;25724:1;25717:15;25751:4;25748:1;25741:15;25768:194;25808:4;25828:20;25846:1;25828:20;:::i;:::-;25823:25;;25862:20;25880:1;25862:20;:::i;:::-;25857:25;;25906:1;25903;25899:9;25891:17;;25930:1;25924:4;25921:11;25918:37;;;25935:18;;:::i;:::-;25918:37;25768:194;;;;:::o;25968:180::-;26016:77;26013:1;26006:88;26113:4;26110:1;26103:15;26137:4;26134:1;26127:15;26154:410;26194:7;26217:20;26235:1;26217:20;:::i;:::-;26212:25;;26251:20;26269:1;26251:20;:::i;:::-;26246:25;;26306:1;26303;26299:9;26328:30;26346:11;26328:30;:::i;:::-;26317:41;;26507:1;26498:7;26494:15;26491:1;26488:22;26468:1;26461:9;26441:83;26418:139;;26537:18;;:::i;:::-;26418:139;26202:362;26154:410;;;;:::o;26570:180::-;26618:77;26615:1;26608:88;26715:4;26712:1;26705:15;26739:4;26736:1;26729:15;26756:185;26796:1;26813:20;26831:1;26813:20;:::i;:::-;26808:25;;26847:20;26865:1;26847:20;:::i;:::-;26842:25;;26886:1;26876:35;;26891:18;;:::i;:::-;26876:35;26933:1;26930;26926:9;26921:14;;26756:185;;;;:::o;26947:148::-;27049:11;27086:3;27071:18;;26947:148;;;;:::o;27125:874::-;27228:3;27265:5;27259:12;27294:36;27320:9;27294:36;:::i;:::-;27346:89;27428:6;27423:3;27346:89;:::i;:::-;27339:96;;27466:1;27455:9;27451:17;27482:1;27477:166;;;;27657:1;27652:341;;;;27444:549;;27477:166;27561:4;27557:9;27546;27542:25;27537:3;27530:38;27623:6;27616:14;27609:22;27601:6;27597:35;27592:3;27588:45;27581:52;;27477:166;;27652:341;27719:38;27751:5;27719:38;:::i;:::-;27779:1;27793:154;27807:6;27804:1;27801:13;27793:154;;;27881:7;27875:14;27871:1;27866:3;27862:11;27855:35;27931:1;27922:7;27918:15;27907:26;;27829:4;27826:1;27822:12;27817:17;;27793:154;;;27976:6;27971:3;27967:16;27960:23;;27659:334;;27444:549;;27232:767;;27125:874;;;;:::o;28005:390::-;28111:3;28139:39;28172:5;28139:39;:::i;:::-;28194:89;28276:6;28271:3;28194:89;:::i;:::-;28187:96;;28292:65;28350:6;28345:3;28338:4;28331:5;28327:16;28292:65;:::i;:::-;28382:6;28377:3;28373:16;28366:23;;28115:280;28005:390;;;;:::o;28401:429::-;28578:3;28600:92;28688:3;28679:6;28600:92;:::i;:::-;28593:99;;28709:95;28800:3;28791:6;28709:95;:::i;:::-;28702:102;;28821:3;28814:10;;28401:429;;;;;:::o;28836:79::-;28875:7;28904:5;28893:16;;28836:79;;;:::o;28921:157::-;29026:45;29046:24;29064:5;29046:24;:::i;:::-;29026:45;:::i;:::-;29021:3;29014:58;28921:157;;:::o;29084:256::-;29196:3;29211:75;29282:3;29273:6;29211:75;:::i;:::-;29311:2;29306:3;29302:12;29295:19;;29331:3;29324:10;;29084:256;;;;:::o;29346:214::-;29486:66;29482:1;29474:6;29470:14;29463:90;29346:214;:::o;29566:402::-;29726:3;29747:85;29829:2;29824:3;29747:85;:::i;:::-;29740:92;;29841:93;29930:3;29841:93;:::i;:::-;29959:2;29954:3;29950:12;29943:19;;29566:402;;;:::o;29974:214::-;30114:66;30110:1;30102:6;30098:14;30091:90;29974:214;:::o;30194:402::-;30354:3;30375:85;30457:2;30452:3;30375:85;:::i;:::-;30368:92;;30469:93;30558:3;30469:93;:::i;:::-;30587:2;30582:3;30578:12;30571:19;;30194:402;;;:::o;30602:315::-;30742:66;30738:1;30730:6;30726:14;30719:90;30843:66;30838:2;30830:6;30826:15;30819:91;30602:315;:::o;30923:402::-;31083:3;31104:85;31186:2;31181:3;31104:85;:::i;:::-;31097:92;;31198:93;31287:3;31198:93;:::i;:::-;31316:2;31311:3;31307:12;31300:19;;30923:402;;;:::o;31331:1547::-;31907:3;31929:148;32073:3;31929:148;:::i;:::-;31922:155;;32094:95;32185:3;32176:6;32094:95;:::i;:::-;32087:102;;32206:148;32350:3;32206:148;:::i;:::-;32199:155;;32371:95;32462:3;32453:6;32371:95;:::i;:::-;32364:102;;32483:148;32627:3;32483:148;:::i;:::-;32476:155;;32648:92;32736:3;32727:6;32648:92;:::i;:::-;32641:99;;32757:95;32848:3;32839:6;32757:95;:::i;:::-;32750:102;;32869:3;32862:10;;31331:1547;;;;;;;:::o;32884:177::-;33024:29;33020:1;33012:6;33008:14;33001:53;32884:177;:::o;33067:402::-;33227:3;33248:85;33330:2;33325:3;33248:85;:::i;:::-;33241:92;;33342:93;33431:3;33342:93;:::i;:::-;33460:2;33455:3;33451:12;33444:19;;33067:402;;;:::o;33475:315::-;33615:66;33611:1;33603:6;33599:14;33592:90;33716:66;33711:2;33703:6;33699:15;33692:91;33475:315;:::o;33796:402::-;33956:3;33977:85;34059:2;34054:3;33977:85;:::i;:::-;33970:92;;34071:93;34160:3;34071:93;:::i;:::-;34189:2;34184:3;34180:12;34173:19;;33796:402;;;:::o;34204:214::-;34344:66;34340:1;34332:6;34328:14;34321:90;34204:214;:::o;34424:400::-;34584:3;34605:84;34687:1;34682:3;34605:84;:::i;:::-;34598:91;;34698:93;34787:3;34698:93;:::i;:::-;34816:1;34811:3;34807:11;34800:18;;34424:400;;;:::o;34830:1233::-;35313:3;35335:148;35479:3;35335:148;:::i;:::-;35328:155;;35500:95;35591:3;35582:6;35500:95;:::i;:::-;35493:102;;35612:148;35756:3;35612:148;:::i;:::-;35605:155;;35777:95;35868:3;35859:6;35777:95;:::i;:::-;35770:102;;35889:148;36033:3;35889:148;:::i;:::-;35882:155;;36054:3;36047:10;;34830:1233;;;;;:::o;36069:332::-;36190:4;36228:2;36217:9;36213:18;36205:26;;36241:71;36309:1;36298:9;36294:17;36285:6;36241:71;:::i;:::-;36322:72;36390:2;36379:9;36375:18;36366:6;36322:72;:::i;:::-;36069:332;;;;;:::o;36407:442::-;36556:4;36594:2;36583:9;36579:18;36571:26;;36607:71;36675:1;36664:9;36660:17;36651:6;36607:71;:::i;:::-;36688:72;36756:2;36745:9;36741:18;36732:6;36688:72;:::i;:::-;36770;36838:2;36827:9;36823:18;36814:6;36770:72;:::i;:::-;36407:442;;;;;;:::o;36855:191::-;36895:3;36914:20;36932:1;36914:20;:::i;:::-;36909:25;;36948:20;36966:1;36948:20;:::i;:::-;36943:25;;36991:1;36988;36984:9;36977:16;;37012:3;37009:1;37006:10;37003:36;;;37019:18;;:::i;:::-;37003:36;36855:191;;;;:::o;37052:634::-;37273:4;37311:2;37300:9;37296:18;37288:26;;37360:9;37354:4;37350:20;37346:1;37335:9;37331:17;37324:47;37388:108;37491:4;37482:6;37388:108;:::i;:::-;37380:116;;37543:9;37537:4;37533:20;37528:2;37517:9;37513:18;37506:48;37571:108;37674:4;37665:6;37571:108;:::i;:::-;37563:116;;37052:634;;;;;:::o;37692:228::-;37832:34;37828:1;37820:6;37816:14;37809:58;37901:11;37896:2;37888:6;37884:15;37877:36;37692:228;:::o;37926:366::-;38068:3;38089:67;38153:2;38148:3;38089:67;:::i;:::-;38082:74;;38165:93;38254:3;38165:93;:::i;:::-;38283:2;38278:3;38274:12;38267:19;;37926:366;;;:::o;38298:419::-;38464:4;38502:2;38491:9;38487:18;38479:26;;38551:9;38545:4;38541:20;38537:1;38526:9;38522:17;38515:47;38579:131;38705:4;38579:131;:::i;:::-;38571:139;;38298:419;;;:::o;38723:233::-;38762:3;38785:24;38803:5;38785:24;:::i;:::-;38776:33;;38831:66;38824:5;38821:77;38818:103;;38901:18;;:::i;:::-;38818:103;38948:1;38941:5;38937:13;38930:20;;38723:233;;;:::o;38962:176::-;38994:1;39011:20;39029:1;39011:20;:::i;:::-;39006:25;;39045:20;39063:1;39045:20;:::i;:::-;39040:25;;39084:1;39074:35;;39089:18;;:::i;:::-;39074:35;39130:1;39127;39123:9;39118:14;;38962:176;;;;:::o;39144:181::-;39284:33;39280:1;39272:6;39268:14;39261:57;39144:181;:::o;39331:366::-;39473:3;39494:67;39558:2;39553:3;39494:67;:::i;:::-;39487:74;;39570:93;39659:3;39570:93;:::i;:::-;39688:2;39683:3;39679:12;39672:19;;39331:366;;;:::o;39703:419::-;39869:4;39907:2;39896:9;39892:18;39884:26;;39956:9;39950:4;39946:20;39942:1;39931:9;39927:17;39920:47;39984:131;40110:4;39984:131;:::i;:::-;39976:139;;39703:419;;;:::o;40128:223::-;40268:34;40264:1;40256:6;40252:14;40245:58;40337:6;40332:2;40324:6;40320:15;40313:31;40128:223;:::o;40357:366::-;40499:3;40520:67;40584:2;40579:3;40520:67;:::i;:::-;40513:74;;40596:93;40685:3;40596:93;:::i;:::-;40714:2;40709:3;40705:12;40698:19;;40357:366;;;:::o;40729:419::-;40895:4;40933:2;40922:9;40918:18;40910:26;;40982:9;40976:4;40972:20;40968:1;40957:9;40953:17;40946:47;41010:131;41136:4;41010:131;:::i;:::-;41002:139;;40729:419;;;:::o;41154:224::-;41294:34;41290:1;41282:6;41278:14;41271:58;41363:7;41358:2;41350:6;41346:15;41339:32;41154:224;:::o;41384:366::-;41526:3;41547:67;41611:2;41606:3;41547:67;:::i;:::-;41540:74;;41623:93;41712:3;41623:93;:::i;:::-;41741:2;41736:3;41732:12;41725:19;;41384:366;;;:::o;41756:419::-;41922:4;41960:2;41949:9;41945:18;41937:26;;42009:9;42003:4;41999:20;41995:1;41984:9;41980:17;41973:47;42037:131;42163:4;42037:131;:::i;:::-;42029:139;;41756:419;;;:::o;42181:115::-;42266:23;42283:5;42266:23;:::i;:::-;42261:3;42254:36;42181:115;;:::o;42302:218::-;42393:4;42431:2;42420:9;42416:18;42408:26;;42444:69;42510:1;42499:9;42495:17;42486:6;42444:69;:::i;:::-;42302:218;;;;:::o;42526:137::-;42580:5;42611:6;42605:13;42596:22;;42627:30;42651:5;42627:30;:::i;:::-;42526:137;;;;:::o;42669:345::-;42736:6;42785:2;42773:9;42764:7;42760:23;42756:32;42753:119;;;42791:79;;:::i;:::-;42753:119;42911:1;42936:61;42989:7;42980:6;42969:9;42965:22;42936:61;:::i;:::-;42926:71;;42882:125;42669:345;;;;:::o;43020:98::-;43071:6;43105:5;43099:12;43089:22;;43020:98;;;:::o;43124:168::-;43207:11;43241:6;43236:3;43229:19;43281:4;43276:3;43272:14;43257:29;;43124:168;;;;:::o;43298:373::-;43384:3;43412:38;43444:5;43412:38;:::i;:::-;43466:70;43529:6;43524:3;43466:70;:::i;:::-;43459:77;;43545:65;43603:6;43598:3;43591:4;43584:5;43580:16;43545:65;:::i;:::-;43635:29;43657:6;43635:29;:::i;:::-;43630:3;43626:39;43619:46;;43388:283;43298:373;;;;:::o;43677:751::-;43900:4;43938:3;43927:9;43923:19;43915:27;;43952:71;44020:1;44009:9;44005:17;43996:6;43952:71;:::i;:::-;44033:72;44101:2;44090:9;44086:18;44077:6;44033:72;:::i;:::-;44115;44183:2;44172:9;44168:18;44159:6;44115:72;:::i;:::-;44197;44265:2;44254:9;44250:18;44241:6;44197:72;:::i;:::-;44317:9;44311:4;44307:20;44301:3;44290:9;44286:19;44279:49;44345:76;44416:4;44407:6;44345:76;:::i;:::-;44337:84;;43677:751;;;;;;;;:::o;44434:141::-;44490:5;44521:6;44515:13;44506:22;;44537:32;44563:5;44537:32;:::i;:::-;44434:141;;;;:::o;44581:349::-;44650:6;44699:2;44687:9;44678:7;44674:23;44670:32;44667:119;;;44705:79;;:::i;:::-;44667:119;44825:1;44850:63;44905:7;44896:6;44885:9;44881:22;44850:63;:::i;:::-;44840:73;;44796:127;44581:349;;;;:::o;44936:106::-;44980:8;45029:5;45024:3;45020:15;44999:36;;44936:106;;;:::o;45048:183::-;45083:3;45121:1;45103:16;45100:23;45097:128;;;45159:1;45156;45153;45138:23;45181:34;45212:1;45206:8;45181:34;:::i;:::-;45174:41;;45097:128;45048:183;:::o;45237:711::-;45276:3;45314:4;45296:16;45293:26;45322:5;45290:39;45351:20;;:::i;:::-;45426:1;45408:16;45404:24;45401:1;45395:4;45380:49;45459:4;45453:11;45558:16;45551:4;45543:6;45539:17;45536:39;45503:18;45495:6;45492:30;45476:113;45473:146;;;45604:5;;;;45473:146;45650:6;45644:4;45640:17;45686:3;45680:10;45713:18;45705:6;45702:30;45699:43;;;45735:5;;;;;;45699:43;45783:6;45776:4;45771:3;45767:14;45763:27;45842:1;45824:16;45820:24;45814:4;45810:35;45805:3;45802:44;45799:57;;;45849:5;;;;;;;45799:57;45866;45914:6;45908:4;45904:17;45896:6;45892:30;45886:4;45866:57;:::i;:::-;45939:3;45932:10;;45280:668;;;;;45237:711;;:::o;45954:640::-;46149:4;46187:3;46176:9;46172:19;46164:27;;46201:71;46269:1;46258:9;46254:17;46245:6;46201:71;:::i;:::-;46282:72;46350:2;46339:9;46335:18;46326:6;46282:72;:::i;:::-;46364;46432:2;46421:9;46417:18;46408:6;46364:72;:::i;:::-;46483:9;46477:4;46473:20;46468:2;46457:9;46453:18;46446:48;46511:76;46582:4;46573:6;46511:76;:::i;:::-;46503:84;;45954:640;;;;;;;:::o;46600:1053::-;46923:4;46961:3;46950:9;46946:19;46938:27;;46975:71;47043:1;47032:9;47028:17;47019:6;46975:71;:::i;:::-;47056:72;47124:2;47113:9;47109:18;47100:6;47056:72;:::i;:::-;47175:9;47169:4;47165:20;47160:2;47149:9;47145:18;47138:48;47203:108;47306:4;47297:6;47203:108;:::i;:::-;47195:116;;47358:9;47352:4;47348:20;47343:2;47332:9;47328:18;47321:48;47386:108;47489:4;47480:6;47386:108;:::i;:::-;47378:116;;47542:9;47536:4;47532:20;47526:3;47515:9;47511:19;47504:49;47570:76;47641:4;47632:6;47570:76;:::i;:::-;47562:84;;46600:1053;;;;;;;;:::o;47659:85::-;47704:7;47733:5;47722:16;;47659:85;;;:::o;47750:158::-;47808:9;47841:61;47859:42;47868:32;47894:5;47868:32;:::i;:::-;47859:42;:::i;:::-;47841:61;:::i;:::-;47828:74;;47750:158;;;:::o;47914:147::-;48009:45;48048:5;48009:45;:::i;:::-;48004:3;47997:58;47914:147;;:::o;48067:348::-;48196:4;48234:2;48223:9;48219:18;48211:26;;48247:71;48315:1;48304:9;48300:17;48291:6;48247:71;:::i;:::-;48328:80;48404:2;48393:9;48389:18;48380:6;48328:80;:::i;:::-;48067:348;;;;;:::o

Swarm Source

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