ETH Price: $2,394.24 (+0.21%)

Token

WINER (WINER)
 

Overview

Max Total Supply

10,000 WINER

Holders

51

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0x9b9d3a7c636ca432b952c9ec49100e80d19abdd2
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_ND404

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-12
*/
//Deez Nuts is a collection celebrating the new ERC-DN404 cryptographic protocol.

//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_ND404 is ERCX {
    using Strings for uint256;
    string public dataURI;
    string public baseTokenURI;
    
    uint8 private constant _decimals = 18;
    uint256 private constant _totalTokens = 10000;
    uint256 private constant _tokensPerNFT = 1;
    string private constant _name = "WINER";
    string private constant _ticker = "WINER";

    // 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": "WINER #', id.toString(), '","description":"', description, '","external_url":"https://I_will_rug.com","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"}]

6101006040526001600b556001600f5f6101000a81548160ff02191690831515021790555034801562000030575f80fd5b5060405180602001604052805f8152506040518060400160405280600581526020017f57494e45520000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f57494e455200000000000000000000000000000000000000000000000000000081525060126127106001335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000127575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200011e91906200048f565b60405180910390fd5b62000138816200036e60201b60201c565b506200014a866200042f60201b60201c565b6200015a6200044460201b60201c565b60048190555084600890816200017191906200070e565b5083600990816200018391906200070e565b508260ff1660808160ff1681525050608051600a620001a391906200097b565b60c0818152505060c05181620001ba9190620009cb565b60e0818152505060c05182620001d19190620009cb565b60a081815250506001600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060a05160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60a051604051620002d2919062000a26565b60405180910390a35050505050506040518060400160405280601181526020017f68747470733a2f2f692e6962622e636f2f000000000000000000000000000000815250600c90816200032691906200070e565b50606460026012600a6200033b91906200097b565b6127106200034a9190620009cb565b620003569190620009cb565b62000362919062000a6e565b600e8190555062000aa5565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600390816200044091906200070e565b5050565b5f6001905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000477826200044c565b9050919050565b62000489816200046b565b82525050565b5f602082019050620004a45f8301846200047e565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200052657607f821691505b6020821081036200053c576200053b620004e1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000563565b620005ac868362000563565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005f6620005f0620005ea84620005c4565b620005cd565b620005c4565b9050919050565b5f819050919050565b6200061183620005d6565b620006296200062082620005fd565b8484546200056f565b825550505050565b5f90565b6200063f62000631565b6200064c81848462000606565b505050565b5b818110156200067357620006675f8262000635565b60018101905062000652565b5050565b601f821115620006c2576200068c8162000542565b620006978462000554565b81016020851015620006a7578190505b620006bf620006b68562000554565b83018262000651565b50505b505050565b5f82821c905092915050565b5f620006e45f1984600802620006c7565b1980831691505092915050565b5f620006fe8383620006d3565b9150826002028217905092915050565b6200071982620004aa565b67ffffffffffffffff811115620007355762000734620004b4565b5b6200074182546200050e565b6200074e82828562000677565b5f60209050601f83116001811462000784575f84156200076f578287015190505b6200077b8582620006f1565b865550620007ea565b601f198416620007948662000542565b5f5b82811015620007bd5784890151825560018201915060208501945060208101905062000796565b86831015620007dd5784890151620007d9601f891682620006d3565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200087c57808604811115620008545762000853620007f2565b5b6001851615620008645780820291505b808102905062000874856200081f565b945062000834565b94509492505050565b5f8262000896576001905062000968565b81620008a5575f905062000968565b8160018114620008be5760028114620008c957620008ff565b600191505062000968565b60ff841115620008de57620008dd620007f2565b5b8360020a915084821115620008f857620008f7620007f2565b5b5062000968565b5060208310610133831016604e8410600b8410161715620009395782820a905083811115620009335762000932620007f2565b5b62000968565b6200094884848460016200082b565b92509050818404811115620009625762000961620007f2565b5b81810290505b9392505050565b5f60ff82169050919050565b5f6200098782620005c4565b915062000994836200096f565b9250620009c37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000885565b905092915050565b5f620009d782620005c4565b9150620009e483620005c4565b9250828202620009f481620005c4565b9150828204841483151762000a0e5762000a0d620007f2565b5b5092915050565b62000a2081620005c4565b82525050565b5f60208201905062000a3b5f83018462000a15565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62000a7a82620005c4565b915062000a8783620005c4565b92508262000a9a5762000a9962000a41565b5b828204905092915050565b60805160a05160c05160e051615f4c62000b115f395f8181610e68015281816111c4015281816120f1015281816125f401528181612f9601528181612fcd0152818161311d015261314901525f61123101525f8181610c9701526111f301525f6110060152615f4c5ff3fe608060405234801561000f575f80fd5b5060043610610245575f3560e01c806370a0823111610139578063c5b8f772116100b6578063e985e9c51161007a578063e985e9c51461074d578063f242432a1461077d578063f28ca1dd14610799578063f2fde38b146107b7578063f8b45b05146107d357610245565b8063c5b8f77214610683578063c87b56dd146106b3578063d547cfb7146106e3578063dd62ed3e14610701578063e0df5b6f1461073157610245565b806399a2557a116100fd57806399a2557a146105b95780639b19251a146105e9578063a014e6e214610619578063a22cb46514610637578063a9059cbb1461065357610245565b806370a0823114610513578063715018a6146105435780638462151c1461054d5780638da5cb5b1461057d57806395d89b411461059b57610245565b806323b872dd116101c75780634eabf2c61161018b5780634eabf2c61461049557806353d6fd591461049f5780635afcc2f5146104bb5780635d0044ca146104d95780636d6a6a4d146104f557610245565b806323b872dd146103cb5780632d760d57146103fb5780632eb2c2d61461042b578063313ce567146104475780634e1273f41461046557610245565b8063095ea7b31161020e578063095ea7b3146103135780630a702e8d146103435780630e89341c1461036157806318160ddd1461039157806318d217c3146103af57610245565b8062fdd58e1461024957806301ffc9a71461027957806302fe5305146102a957806306fdde03146102c5578063081812fc146102e3575b5f80fd5b610263600480360381019061025e919061446a565b6107f1565b60405161027091906144b7565b60405180910390f35b610293600480360381019061028e9190614525565b6108be565b6040516102a0919061456a565b60405180910390f35b6102c360048036038101906102be91906146bf565b610a67565b005b6102cd610a7b565b6040516102da9190614780565b60405180910390f35b6102fd60048036038101906102f891906147a0565b610b07565b60405161030a91906147da565b60405180910390f35b61032d6004803603810190610328919061446a565b610b37565b60405161033a919061456a565b60405180910390f35b61034b610c71565b604051610358919061456a565b60405180910390f35b61037b600480360381019061037691906147a0565b610c83565b6040516103889190614780565b60405180910390f35b610399610c95565b6040516103a691906144b7565b60405180910390f35b6103c960048036038101906103c491906146bf565b610cb9565b005b6103e560048036038101906103e091906147f3565b610cd4565b6040516103f2919061456a565b60405180910390f35b61041560048036038101906104109190614843565b610f06565b60405161042291906144b7565b60405180910390f35b610445600480360381019061044091906149f5565b610f6c565b005b61044f611004565b60405161045c9190614adb565b60405180910390f35b61047f600480360381019061047a9190614bb4565b611028565b60405161048c9190614ce1565b60405180910390f35b61049d611130565b005b6104b960048036038101906104b49190614d2b565b611162565b005b6104c36111c2565b6040516104d091906144b7565b60405180910390f35b6104f360048036038101906104ee91906147a0565b6111e6565b005b6104fd61122f565b60405161050a91906144b7565b60405180910390f35b61052d60048036038101906105289190614d69565b611253565b60405161053a91906144b7565b60405180910390f35b61054b611299565b005b61056760048036038101906105629190614d69565b6112ac565b6040516105749190614ce1565b60405180910390f35b61058561132d565b60405161059291906147da565b60405180910390f35b6105a3611354565b6040516105b09190614780565b60405180910390f35b6105d360048036038101906105ce9190614843565b6113e0565b6040516105e09190614ce1565b60405180910390f35b61060360048036038101906105fe9190614d69565b611561565b604051610610919061456a565b60405180910390f35b61062161157e565b60405161062e91906144b7565b60405180910390f35b610651600480360381019061064c9190614d2b565b611584565b005b61066d6004803603810190610668919061446a565b61159a565b60405161067a919061456a565b60405180910390f35b61069d6004803603810190610698919061446a565b6115b7565b6040516106aa919061456a565b60405180910390f35b6106cd60048036038101906106c891906147a0565b61160f565b6040516106da9190614780565b60405180910390f35b6106eb6119b9565b6040516106f89190614780565b60405180910390f35b61071b60048036038101906107169190614d94565b611a45565b60405161072891906144b7565b60405180910390f35b61074b600480360381019061074691906146bf565b611ac7565b005b61076760048036038101906107629190614d94565b611ae2565b604051610774919061456a565b60405180910390f35b61079760048036038101906107929190614dd2565b611b70565b005b6107a1611c10565b6040516107ae9190614780565b60405180910390f35b6107d160048036038101906107cc9190614d69565b611c9c565b005b6107db611d20565b6040516107e891906144b7565b60405180910390f35b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610857576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a68260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b156108b457600190506108b8565b5f90505b92915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f057507fc5b8f772000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a605750610a5f82611d54565b5b9050919050565b610a6f611dbd565b610a7881611e44565b50565b60088054610a8890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab490614e92565b8015610aff5780601f10610ad657610100808354040283529160200191610aff565b820191905f5260205f20905b815481529060010190602001808311610ae257829003601f168201915b505050505081565b6005602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80339050610b44611e57565b83108015610b5157505f83115b15610c5a57610b6081846115b7565b610ba157806040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b9891906147da565b60405180910390fd5b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c4d91906144b7565b60405180910390a3610c66565b610c65818585611e60565b5b600191505092915050565b600f5f9054906101000a900460ff1681565b6060610c8e8261160f565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cc1611dbd565b80600c9081610cd0919061505f565b5050565b5f610cdd611e57565b821015610ee257610d338260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b610d7457836040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d6b91906147da565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610db75750610db58433611ae2565b155b8015610e1f575060055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e6157336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e5891906147da565b60405180910390fd5b610e8d84847f00000000000000000000000000000000000000000000000000000000000000005f611e72565b60055f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610edd848484600160405180602001604052805f8152505f611f64565b610efb565b610eed843384612253565b610efa8484846001611e72565b5b600190509392505050565b5f610f63838484610f17919061515b565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206122e59092919063ffffffff16565b90509392505050565b610f746123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fba5750610fb985610fb46123a3565b611ae2565b5b610ff0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffd85858585856123aa565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60608151835114611065576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835167ffffffffffffffff8111156110815761108061459b565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b5090505f5b8451811015611125576110fb8582815181106110d3576110d261518e565b5b60200260200101518583815181106110ee576110ed61518e565b5b60200260200101516107f1565b82828151811061110e5761110d61518e565b5b6020026020010181815250508060010190506110b4565b508091505092915050565b611138611dbd565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b61116a611dbd565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6111ee611dbd565b6064817f000000000000000000000000000000000000000000000000000000000000000061121c91906151bb565b6112269190615229565b600e8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6112a1611dbd565b6112aa5f612779565b565b60605f6112b761283a565b0361130c575f67ffffffffffffffff8111156112d6576112d561459b565b5b6040519080825280602002602001820160405280156113045781602001602082028036833780820191505090505b509050611328565b6113258261131861285a565b611320611e57565b6113e0565b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009805461136190614e92565b80601f016020809104026020016040519081016040528092919081815260200182805461138d90614e92565b80156113d85780601f106113af576101008083540402835291602001916113d8565b820191905f5260205f20905b8154815290600101906020018083116113bb57829003601f168201915b505050505081565b606081831061141b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142361285a565b8310156114355761143261285a565b92505b5f61143e611e57565b90508083111561144c578092505b5f8385101561146757611460868686610f06565b905061146b565b5f90505b5f8167ffffffffffffffff8111156114865761148561459b565b5b6040519080825280602002602001820160405280156114b45781602001602082028036833780820191505090505b5090505f60015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f80885f915091505b8481146115515761151a8284611d2690919063ffffffff16565b1561154657818482806001019350815181106115395761153861518e565b5b6020026020010181815250505b816001019150611500565b5050819450505050509392505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61159661158f6123a3565b8383612862565b5050565b5f803390506115ac8185856001611e72565b600191505092915050565b5f6116078260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b905092915050565b6060611619611e57565b8210611651576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61165b836129c9565b5111156116725761166b826129c9565b90506119b4565b5f600d805461168090614e92565b905011156116ba57600d61169383612a5b565b6040516020016116a4929190615313565b60405160208183030381529060405290506119b4565b5f826040516020016116cc9190615356565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611611787576040518060400160405280601381526020017f475152685779462f4469616d6f6e642e6a70670000000000000000000000000081525092506040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525091506040518060e0016040528060be8152602001615d9160be91399050611958565b607f8460ff1611611823576040518060400160405280601081526020017f6777644c6633662f476f6c642e6a70670000000000000000000000000000000081525092506040518060400160405280600481526020017f476f6c6400000000000000000000000000000000000000000000000000000000815250915060405180610100016040528060c88152602001615e4f60c891399050611957565b60bf8460ff16116118be576040518060400160405280601281526020017f464a6d6472646d2f53696c7665722e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f53696c766572000000000000000000000000000000000000000000000000000081525091506040518060c00160405280608e8152602001615d03608e91399050611956565b60ff8460ff1611611955576040518060400160405280601281526020017f594c47334a76632f42726f6e7a652e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f42726f6e7a65000000000000000000000000000000000000000000000000000081525091506040518060c0016040528060818152602001615c826081913990505b5b5b5b5f61196287612a5b565b82600c866040516020016119799493929190615474565b6040516020818303038152906040529050808360405160200161199d9291906155d6565b604051602081830303815290604052955050505050505b919050565b600d80546119c690614e92565b80601f01602080910402602001604051908101604052809291908181526020018280546119f290614e92565b8015611a3d5780601f10611a1457610100808354040283529160200191611a3d565b820191905f5260205f20905b815481529060010190602001808311611a2057829003601f168201915b505050505081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611acf611dbd565b80600d9081611ade919061505f565b5050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611b786123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bbe5750611bbd85611bb86123a3565b611ae2565b5b15611bd757611bd285858585856001611f64565b611c09565b6040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600c8054611c1d90614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4990614e92565b8015611c945780601f10611c6b57610100808354040283529160200191611c94565b820191905f5260205f20905b815481529060010190602001808311611c7757829003601f168201915b505050505081565b611ca4611dbd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d14575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d0b91906147da565b60405180910390fd5b611d1d81612779565b50565b600e5481565b5f80600160ff8416855f015f600887901c81526020019081526020015f2054901c1690508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dc56123a3565b73ffffffffffffffffffffffffffffffffffffffff16611de361132d565b73ffffffffffffffffffffffffffffffffffffffff1614611e4257611e066123a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e3991906147da565b60405180910390fd5b565b8060039081611e53919061505f565b5050565b5f600454905090565b611e6d8383836001612bb4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ee2575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ed991906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f52575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f4991906147da565b60405180910390fd5b611f5e84848484612d83565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611fc9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611fd26123a3565b90505f611fde866131ac565b9050611fec8289898461321f565b60018514801561204757506120468660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b1561211b5761209b8660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6120ea8660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b61211688887f00000000000000000000000000000000000000000000000000000000000000005f611e72565b61214d565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff8a1690508682827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a48873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b60405161221e92919061561a565b60405180910390a4612232848b8b86613282565b841561224757612246848b8b8b8b8b6134b6565b5b50505050505050505050565b5f61225e8484611a45565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122df57818110156122d0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122c793929190615641565b60405180910390fd5b6122de84848484035f612bb4565b5b50505050565b5f80600884901c90505f60ff85169050610101818501106123715761231e81875f015f8581526020019081526020015f2054901c6138b2565b92505f6008828601901c8301905060ff8286011694505f91508260010192505b80831461236f57612360875f015f8581526020019081526020015f20546138b2565b8401935082600101925061233e565b505b612396846101000382885f015f8681526020019081526020015f2054901c901b6138b2565b8301925050509392505050565b5f33905090565b81518351146123e5576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361244a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6124536123a3565b90506124618187878761321f565b5f5b84518110156125ea575f8582815181106124805761247f61518e565b5b602002602001015190505f85838151811061249e5761249d61518e565b5b6020026020010151905060018114801561250357506125028260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b156125ab576125578260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6125a68260015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b6125dd565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050806001019050612463565b50612623868686517f000000000000000000000000000000000000000000000000000000000000000061261d91906151bb565b5f611e72565b5f805f600187516126349190615676565b905073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff88169250602087015183837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b8181146126d5578060200288015184847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612696565b508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a60405161274c9291906156a9565b60405180910390a4612760848a8a8a613282565b61276e848a8a8a8a8a6138fb565b505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61284361285a565b61284b611e57565b612855919061515b565b905090565b5f6001905090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79061574e565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129bc919061456a565b60405180910390a3505050565b6060600380546129d890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0490614e92565b8015612a4f5780601f10612a2657610100808354040283529160200191612a4f565b820191905f5260205f20905b815481529060010190602001808311612a3257829003601f168201915b50505050509050919050565b60605f8203612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612baf565b5f8290505f5b5f8214612ad0578080612ab99061576c565b915050600a82612ac99190615229565b9150612aa7565b5f8167ffffffffffffffff811115612aeb57612aea61459b565b5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b5f8514612ba857600182612b35919061515b565b9150600a85612b4491906157b3565b6030612b509190615676565b60f81b818381518110612b6657612b6561518e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ba19190615229565b9450612b21565b8093505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c24575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612c1b91906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c94575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612c8b91906147da565b60405180910390fd5b8160075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612d7d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612d7491906144b7565b60405180910390a35b50505050565b5f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083821015612e4e578582856040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e4593929190615641565b60405180910390fd5b83820360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555083810160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f3391906144b7565b60405180910390a382156131a4575f600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905080613018575f7f00000000000000000000000000000000000000000000000000000000000000008685612fc1919061515b565b612fcb9190615229565b7f000000000000000000000000000000000000000000000000000000000000000085612ff79190615229565b613001919061515b565b90505f811115613016576130158882613abf565b5b505b600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131a2576001600b541480156130755750805b80156130b3575061308461132d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b1561311a576001600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506002600b819055506131a1565b5f7f0000000000000000000000000000000000000000000000000000000000000000836131479190615229565b7f000000000000000000000000000000000000000000000000000000000000000087856131749190615676565b61317e9190615229565b613188919061515b565b90505f81111561319f5761319c8782613eaf565b50505b505b5b505b505050505050565b6060600167ffffffffffffffff8111156131c9576131c861459b565b5b6040519080825280602002602001820160405280156131f75781602001602082028036833780820191505090505b50905081815f8151811061320e5761320d61518e565b5b602002602001018181525050919050565b50505050565b60ff81166001901b19825f015f600884901c81526020019081526020015f205f82825416925050819055505050565b60ff81166001901b825f015f600884901c81526020019081526020015f205f82825417925050819055505050565b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166134a457600e5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115613352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133499061582d565b60405180910390fd5b600f5f9054906101000a900460ff16156134a3574360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc906158bb565b60405180910390fd5b4360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f8273ffffffffffffffffffffffffffffffffffffffff163b14801561346357505f3273ffffffffffffffffffffffffffffffffffffffff163b145b6134a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349990615949565b60405180910390fd5b5b5b6134b08484848461421e565b50505050565b6134d58473ffffffffffffffffffffffffffffffffffffffff16614224565b156138aa578373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77fd9b67a26000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016135339190615976565b602060405180830381865afa15801561354e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357291906159a3565b15613713578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135b8959493929190615a20565b6020604051808303815f875af19250505080156135f357506040513d601f19601f820116820180604052508101906135f09190615a8c565b60015b61368f576135ff615ac3565b806308c379a00361365b5750613613615ae2565b8061361e575061365d565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136529190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461370d576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506138a9565b8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02878786856040518563ffffffff1660e01b81526004016137529493929190615b71565b6020604051808303815f875af192505050801561378d57506040513d601f19601f8201168201806040525081019061378a9190615a8c565b60015b61382957613799615ac3565b806308c379a0036137f557506137ad615ae2565b806137b857506137f7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ec9190614780565b60405180910390fd5b505b6040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146138a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5b505050505050565b5f8019808314600382048460011c1684039350600582048460021c16600583048516019350601182048460041c850116935060ff8204840260f81c8160081b1792505050919050565b61391a8473ffffffffffffffffffffffffffffffffffffffff16614224565b15613ab7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613960959493929190615bbb565b6020604051808303815f875af192505050801561399b57506040513d601f19601f820116820180604052508101906139989190615a8c565b60015b613a37576139a7615ac3565b806308c379a003613a0357506139bb615ae2565b806139c65750613a05565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fa9190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613ab5576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b24576040517fb817eee700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b2d6123a3565b90505f613b38611e57565b90505f8367ffffffffffffffff811115613b5557613b5461459b565b5b604051908082528060200260200182016040528015613b835781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613ba157613ba061459b565b5b604051908082528060200260200182016040528015613bcf5781602001602082028036833780820191505090505b5090505f5b85811015613ccf576001838281518110613bf157613bf061518e565b5b6020026020010181815250505f613c4d8560015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061423590919063ffffffff16565b905080838381518110613c6357613c6261518e565b5b602002602001018181525050613cbe8160015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b809450508080600101915050613bd4565b50613cdc84875f8461321f565b5f80600187613ceb9190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915060208301515f837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b818114613d7357806020028401515f847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613d34565b5060018703613e1a575f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110613df557613df461518e565b5b60200260200101516001604051613e0d929190615c5a565b60405180910390a4613e99565b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8688604051613e909291906156a9565b60405180910390a45b613ea586895f86613282565b5050505050505050565b6060805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613f17576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8303613f50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f596123a3565b90508367ffffffffffffffff811115613f7557613f7461459b565b5b604051908082528060200260200182016040528015613fa35781602001602082028036833780820191505090505b5092508367ffffffffffffffff811115613fc057613fbf61459b565b5b604051908082528060200260200182016040528015613fee5781602001602082028036833780820191505090505b5091505f613ffa611e57565b905080857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03101561402a575f80fd5b5f5b858110156140845780820185828151811061404a5761404961518e565b5b602002602001018181525050600184828151811061406b5761406a61518e565b5b602002602001018181525050808060010191505061402c565b50614091825f888761321f565b6140e2818660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206142ae9092919063ffffffff16565b8460045f8282546140f39190615676565b925050819055505f8086836141089190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146141885780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061414f565b508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516141ff9291906156a9565b60405180910390a4614213845f8a89613282565b505050509250929050565b50505050565b5f80823b90505f8111915050919050565b5f805f801992508360081c9150815f5284602052831960ff1660405f2054811b811c915082158217614283575b600115614282578383019250825f5260405f205491508215821715614262575b5b505f81146142a6576142948161432b565b600883901b1792508383115f03831792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106143115760405f2082821b815417815560015f510182850160081c5f510160ff8487011695505f93505b80821461430a57815f528460405f20556001820191506142ef565b815f525050505b60405f208284610100031c821b8154178155505050505050565b5f816fffffffffffffffffffffffffffffffff1060071b821560081b17905081811c67ffffffffffffffff1060061b8117905081811c63ffffffff1060051b8117905081811c61ffff1060041b8117905081811c60ff1060031b811790507f07060605060205040602030205040301060502050303040105050304000000006f8421084210842108cc6318c6db6d54be83831c1c601f161a81179050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614406826143dd565b9050919050565b614416816143fc565b8114614420575f80fd5b50565b5f813590506144318161440d565b92915050565b5f819050919050565b61444981614437565b8114614453575f80fd5b50565b5f8135905061446481614440565b92915050565b5f80604083850312156144805761447f6143d5565b5b5f61448d85828601614423565b925050602061449e85828601614456565b9150509250929050565b6144b181614437565b82525050565b5f6020820190506144ca5f8301846144a8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614504816144d0565b811461450e575f80fd5b50565b5f8135905061451f816144fb565b92915050565b5f6020828403121561453a576145396143d5565b5b5f61454784828501614511565b91505092915050565b5f8115159050919050565b61456481614550565b82525050565b5f60208201905061457d5f83018461455b565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6145d18261458b565b810181811067ffffffffffffffff821117156145f0576145ef61459b565b5b80604052505050565b5f6146026143cc565b905061460e82826145c8565b919050565b5f67ffffffffffffffff82111561462d5761462c61459b565b5b6146368261458b565b9050602081019050919050565b828183375f83830152505050565b5f61466361465e84614613565b6145f9565b90508281526020810184848401111561467f5761467e614587565b5b61468a848285614643565b509392505050565b5f82601f8301126146a6576146a5614583565b5b81356146b6848260208601614651565b91505092915050565b5f602082840312156146d4576146d36143d5565b5b5f82013567ffffffffffffffff8111156146f1576146f06143d9565b5b6146fd84828501614692565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561473d578082015181840152602081019050614722565b5f8484015250505050565b5f61475282614706565b61475c8185614710565b935061476c818560208601614720565b6147758161458b565b840191505092915050565b5f6020820190508181035f8301526147988184614748565b905092915050565b5f602082840312156147b5576147b46143d5565b5b5f6147c284828501614456565b91505092915050565b6147d4816143fc565b82525050565b5f6020820190506147ed5f8301846147cb565b92915050565b5f805f6060848603121561480a576148096143d5565b5b5f61481786828701614423565b935050602061482886828701614423565b925050604061483986828701614456565b9150509250925092565b5f805f6060848603121561485a576148596143d5565b5b5f61486786828701614423565b935050602061487886828701614456565b925050604061488986828701614456565b9150509250925092565b5f67ffffffffffffffff8211156148ad576148ac61459b565b5b602082029050602081019050919050565b5f80fd5b5f6148d46148cf84614893565b6145f9565b905080838252602082019050602084028301858111156148f7576148f66148be565b5b835b81811015614920578061490c8882614456565b8452602084019350506020810190506148f9565b5050509392505050565b5f82601f83011261493e5761493d614583565b5b813561494e8482602086016148c2565b91505092915050565b5f67ffffffffffffffff8211156149715761497061459b565b5b61497a8261458b565b9050602081019050919050565b5f61499961499484614957565b6145f9565b9050828152602081018484840111156149b5576149b4614587565b5b6149c0848285614643565b509392505050565b5f82601f8301126149dc576149db614583565b5b81356149ec848260208601614987565b91505092915050565b5f805f805f60a08688031215614a0e57614a0d6143d5565b5b5f614a1b88828901614423565b9550506020614a2c88828901614423565b945050604086013567ffffffffffffffff811115614a4d57614a4c6143d9565b5b614a598882890161492a565b935050606086013567ffffffffffffffff811115614a7a57614a796143d9565b5b614a868882890161492a565b925050608086013567ffffffffffffffff811115614aa757614aa66143d9565b5b614ab3888289016149c8565b9150509295509295909350565b5f60ff82169050919050565b614ad581614ac0565b82525050565b5f602082019050614aee5f830184614acc565b92915050565b5f67ffffffffffffffff821115614b0e57614b0d61459b565b5b602082029050602081019050919050565b5f614b31614b2c84614af4565b6145f9565b90508083825260208201905060208402830185811115614b5457614b536148be565b5b835b81811015614b7d5780614b698882614423565b845260208401935050602081019050614b56565b5050509392505050565b5f82601f830112614b9b57614b9a614583565b5b8135614bab848260208601614b1f565b91505092915050565b5f8060408385031215614bca57614bc96143d5565b5b5f83013567ffffffffffffffff811115614be757614be66143d9565b5b614bf385828601614b87565b925050602083013567ffffffffffffffff811115614c1457614c136143d9565b5b614c208582860161492a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c5c81614437565b82525050565b5f614c6d8383614c53565b60208301905092915050565b5f602082019050919050565b5f614c8f82614c2a565b614c998185614c34565b9350614ca483614c44565b805f5b83811015614cd4578151614cbb8882614c62565b9750614cc683614c79565b925050600181019050614ca7565b5085935050505092915050565b5f6020820190508181035f830152614cf98184614c85565b905092915050565b614d0a81614550565b8114614d14575f80fd5b50565b5f81359050614d2581614d01565b92915050565b5f8060408385031215614d4157614d406143d5565b5b5f614d4e85828601614423565b9250506020614d5f85828601614d17565b9150509250929050565b5f60208284031215614d7e57614d7d6143d5565b5b5f614d8b84828501614423565b91505092915050565b5f8060408385031215614daa57614da96143d5565b5b5f614db785828601614423565b9250506020614dc885828601614423565b9150509250929050565b5f805f805f60a08688031215614deb57614dea6143d5565b5b5f614df888828901614423565b9550506020614e0988828901614423565b9450506040614e1a88828901614456565b9350506060614e2b88828901614456565b925050608086013567ffffffffffffffff811115614e4c57614e4b6143d9565b5b614e58888289016149c8565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ea957607f821691505b602082108103614ebc57614ebb614e65565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee3565b614f288683614ee3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f63614f5e614f5984614437565b614f40565b614437565b9050919050565b5f819050919050565b614f7c83614f49565b614f90614f8882614f6a565b848454614eef565b825550505050565b5f90565b614fa4614f98565b614faf818484614f73565b505050565b5b81811015614fd257614fc75f82614f9c565b600181019050614fb5565b5050565b601f82111561501757614fe881614ec2565b614ff184614ed4565b81016020851015615000578190505b61501461500c85614ed4565b830182614fb4565b50505b505050565b5f82821c905092915050565b5f6150375f198460080261501c565b1980831691505092915050565b5f61504f8383615028565b9150826002028217905092915050565b61506882614706565b67ffffffffffffffff8111156150815761508061459b565b5b61508b8254614e92565b615096828285614fd6565b5f60209050601f8311600181146150c7575f84156150b5578287015190505b6150bf8582615044565b865550615126565b601f1984166150d586614ec2565b5f5b828110156150fc578489015182556001820191506020850194506020810190506150d7565b868310156151195784890151615115601f891682615028565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61516582614437565b915061517083614437565b92508282039050818111156151885761518761512e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6151c582614437565b91506151d083614437565b92508282026151de81614437565b915082820484148315176151f5576151f461512e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523382614437565b915061523e83614437565b92508261524e5761524d6151fc565b5b828204905092915050565b5f81905092915050565b5f815461526f81614e92565b6152798186615259565b9450600182165f811461529357600181146152a8576152da565b60ff19831686528115158202860193506152da565b6152b185614ec2565b5f5b838110156152d2578154818901526001820191506020810190506152b3565b838801955050505b50505092915050565b5f6152ed82614706565b6152f78185615259565b9350615307818560208601614720565b80840191505092915050565b5f61531e8285615263565b915061532a82846152e3565b91508190509392505050565b5f819050919050565b61535061534b82614437565b615336565b82525050565b5f615361828461533f565b60208201915081905092915050565b7f7b226e616d65223a202257494e455220230000000000000000000000000000005f82015250565b5f6153a4601183615259565b91506153af82615370565b601182019050919050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f6153ee601183615259565b91506153f9826153ba565b601182019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f495f77696c6c5f8201527f5f7275672e636f6d222c22696d616765223a2200000000000000000000000000602082015250565b5f61545e603383615259565b915061546982615404565b603382019050919050565b5f61547e82615398565b915061548a82876152e3565b9150615495826153e2565b91506154a182866152e3565b91506154ac82615452565b91506154b88285615263565b91506154c482846152e3565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f615506601b83615259565b9150615511826154d2565b601b82019050919050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a22435f8201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b5f615576602f83615259565b91506155818261551c565b602f82019050919050565b7f227d5d7d000000000000000000000000000000000000000000000000000000005f82015250565b5f6155c0600483615259565b91506155cb8261558c565b600482019050919050565b5f6155e0826154fa565b91506155ec82856152e3565b91506155f78261556a565b915061560382846152e3565b915061560e826155b4565b91508190509392505050565b5f60408201905061562d5f8301856144a8565b61563a60208301846144a8565b9392505050565b5f6060820190506156545f8301866147cb565b61566160208301856144a8565b61566e60408301846144a8565b949350505050565b5f61568082614437565b915061568b83614437565b92508282019050808211156156a3576156a261512e565b5b92915050565b5f6040820190508181035f8301526156c18185614c85565b905081810360208301526156d58184614c85565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c207374617475735f8201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b5f615738602983614710565b9150615743826156de565b604082019050919050565b5f6020820190508181035f8301526157658161572c565b9050919050565b5f61577682614437565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157a8576157a761512e565b5b600182019050919050565b5f6157bd82614437565b91506157c883614437565b9250826157d8576157d76151fc565b5b828206905092915050565b7f5472616e736665722065786365656473206d6178696d756d2077616c6c6574005f82015250565b5f615817601f83614710565b9150615822826157e3565b602082019050919050565b5f6020820190508181035f8301526158448161580b565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f6158a5602483614710565b91506158b08261584b565b604082019050919050565b5f6020820190508181035f8301526158d281615899565b9050919050565b7f436f6e74726163742074726164696e672072657374726963746564206174206c5f8201527f61756e6368000000000000000000000000000000000000000000000000000000602082015250565b5f615933602583614710565b915061593e826158d9565b604082019050919050565b5f6020820190508181035f83015261596081615927565b9050919050565b615970816144d0565b82525050565b5f6020820190506159895f830184615967565b92915050565b5f8151905061599d81614d01565b92915050565b5f602082840312156159b8576159b76143d5565b5b5f6159c58482850161598f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6159f2826159ce565b6159fc81856159d8565b9350615a0c818560208601614720565b615a158161458b565b840191505092915050565b5f60a082019050615a335f8301886147cb565b615a4060208301876147cb565b615a4d60408301866144a8565b615a5a60608301856144a8565b8181036080830152615a6c81846159e8565b90509695505050505050565b5f81519050615a86816144fb565b92915050565b5f60208284031215615aa157615aa06143d5565b5b5f615aae84828501615a78565b91505092915050565b5f8160e01c9050919050565b5f60033d1115615adf5760045f803e615adc5f51615ab7565b90505b90565b5f60443d10615b6e57615af36143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b1b575050615b6e565b808201805167ffffffffffffffff811115615b395750505050615b6e565b80602083010160043d038501811115615b56575050505050615b6e565b615b65826020018501866145c8565b82955050505050505b90565b5f608082019050615b845f8301876147cb565b615b9160208301866147cb565b615b9e60408301856144a8565b8181036060830152615bb081846159e8565b905095945050505050565b5f60a082019050615bce5f8301886147cb565b615bdb60208301876147cb565b8181036040830152615bed8186614c85565b90508181036060830152615c018185614c85565b90508181036080830152615c1581846159e8565b90509695505050505050565b5f819050919050565b5f615c44615c3f615c3a84615c21565b614f40565b614437565b9050919050565b615c5481615c2a565b82525050565b5f604082019050615c6d5f8301856144a8565b615c7a6020830184615c4b565b939250505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792e526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea264697066735822122062f17ec7cae911e3621ac6c88d148e0bbde38a1376dad499cbfe8f6817d780fa64736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610245575f3560e01c806370a0823111610139578063c5b8f772116100b6578063e985e9c51161007a578063e985e9c51461074d578063f242432a1461077d578063f28ca1dd14610799578063f2fde38b146107b7578063f8b45b05146107d357610245565b8063c5b8f77214610683578063c87b56dd146106b3578063d547cfb7146106e3578063dd62ed3e14610701578063e0df5b6f1461073157610245565b806399a2557a116100fd57806399a2557a146105b95780639b19251a146105e9578063a014e6e214610619578063a22cb46514610637578063a9059cbb1461065357610245565b806370a0823114610513578063715018a6146105435780638462151c1461054d5780638da5cb5b1461057d57806395d89b411461059b57610245565b806323b872dd116101c75780634eabf2c61161018b5780634eabf2c61461049557806353d6fd591461049f5780635afcc2f5146104bb5780635d0044ca146104d95780636d6a6a4d146104f557610245565b806323b872dd146103cb5780632d760d57146103fb5780632eb2c2d61461042b578063313ce567146104475780634e1273f41461046557610245565b8063095ea7b31161020e578063095ea7b3146103135780630a702e8d146103435780630e89341c1461036157806318160ddd1461039157806318d217c3146103af57610245565b8062fdd58e1461024957806301ffc9a71461027957806302fe5305146102a957806306fdde03146102c5578063081812fc146102e3575b5f80fd5b610263600480360381019061025e919061446a565b6107f1565b60405161027091906144b7565b60405180910390f35b610293600480360381019061028e9190614525565b6108be565b6040516102a0919061456a565b60405180910390f35b6102c360048036038101906102be91906146bf565b610a67565b005b6102cd610a7b565b6040516102da9190614780565b60405180910390f35b6102fd60048036038101906102f891906147a0565b610b07565b60405161030a91906147da565b60405180910390f35b61032d6004803603810190610328919061446a565b610b37565b60405161033a919061456a565b60405180910390f35b61034b610c71565b604051610358919061456a565b60405180910390f35b61037b600480360381019061037691906147a0565b610c83565b6040516103889190614780565b60405180910390f35b610399610c95565b6040516103a691906144b7565b60405180910390f35b6103c960048036038101906103c491906146bf565b610cb9565b005b6103e560048036038101906103e091906147f3565b610cd4565b6040516103f2919061456a565b60405180910390f35b61041560048036038101906104109190614843565b610f06565b60405161042291906144b7565b60405180910390f35b610445600480360381019061044091906149f5565b610f6c565b005b61044f611004565b60405161045c9190614adb565b60405180910390f35b61047f600480360381019061047a9190614bb4565b611028565b60405161048c9190614ce1565b60405180910390f35b61049d611130565b005b6104b960048036038101906104b49190614d2b565b611162565b005b6104c36111c2565b6040516104d091906144b7565b60405180910390f35b6104f360048036038101906104ee91906147a0565b6111e6565b005b6104fd61122f565b60405161050a91906144b7565b60405180910390f35b61052d60048036038101906105289190614d69565b611253565b60405161053a91906144b7565b60405180910390f35b61054b611299565b005b61056760048036038101906105629190614d69565b6112ac565b6040516105749190614ce1565b60405180910390f35b61058561132d565b60405161059291906147da565b60405180910390f35b6105a3611354565b6040516105b09190614780565b60405180910390f35b6105d360048036038101906105ce9190614843565b6113e0565b6040516105e09190614ce1565b60405180910390f35b61060360048036038101906105fe9190614d69565b611561565b604051610610919061456a565b60405180910390f35b61062161157e565b60405161062e91906144b7565b60405180910390f35b610651600480360381019061064c9190614d2b565b611584565b005b61066d6004803603810190610668919061446a565b61159a565b60405161067a919061456a565b60405180910390f35b61069d6004803603810190610698919061446a565b6115b7565b6040516106aa919061456a565b60405180910390f35b6106cd60048036038101906106c891906147a0565b61160f565b6040516106da9190614780565b60405180910390f35b6106eb6119b9565b6040516106f89190614780565b60405180910390f35b61071b60048036038101906107169190614d94565b611a45565b60405161072891906144b7565b60405180910390f35b61074b600480360381019061074691906146bf565b611ac7565b005b61076760048036038101906107629190614d94565b611ae2565b604051610774919061456a565b60405180910390f35b61079760048036038101906107929190614dd2565b611b70565b005b6107a1611c10565b6040516107ae9190614780565b60405180910390f35b6107d160048036038101906107cc9190614d69565b611c9c565b005b6107db611d20565b6040516107e891906144b7565b60405180910390f35b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610857576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a68260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b156108b457600190506108b8565b5f90505b92915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f057507fc5b8f772000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a605750610a5f82611d54565b5b9050919050565b610a6f611dbd565b610a7881611e44565b50565b60088054610a8890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab490614e92565b8015610aff5780601f10610ad657610100808354040283529160200191610aff565b820191905f5260205f20905b815481529060010190602001808311610ae257829003601f168201915b505050505081565b6005602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80339050610b44611e57565b83108015610b5157505f83115b15610c5a57610b6081846115b7565b610ba157806040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b9891906147da565b60405180910390fd5b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c4d91906144b7565b60405180910390a3610c66565b610c65818585611e60565b5b600191505092915050565b600f5f9054906101000a900460ff1681565b6060610c8e8261160f565b9050919050565b7f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b610cc1611dbd565b80600c9081610cd0919061505f565b5050565b5f610cdd611e57565b821015610ee257610d338260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b610d7457836040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d6b91906147da565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610db75750610db58433611ae2565b155b8015610e1f575060055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e6157336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e5891906147da565b60405180910390fd5b610e8d84847f0000000000000000000000000000000000000000000000000de0b6b3a76400005f611e72565b60055f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610edd848484600160405180602001604052805f8152505f611f64565b610efb565b610eed843384612253565b610efa8484846001611e72565b5b600190509392505050565b5f610f63838484610f17919061515b565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206122e59092919063ffffffff16565b90509392505050565b610f746123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fba5750610fb985610fb46123a3565b611ae2565b5b610ff0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffd85858585856123aa565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000001281565b60608151835114611065576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835167ffffffffffffffff8111156110815761108061459b565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b5090505f5b8451811015611125576110fb8582815181106110d3576110d261518e565b5b60200260200101518583815181106110ee576110ed61518e565b5b60200260200101516107f1565b82828151811061110e5761110d61518e565b5b6020026020010181815250508060010190506110b4565b508091505092915050565b611138611dbd565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b61116a611dbd565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b6111ee611dbd565b6064817f00000000000000000000000000000000000000000000021e19e0c9bab240000061121c91906151bb565b6112269190615229565b600e8190555050565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6112a1611dbd565b6112aa5f612779565b565b60605f6112b761283a565b0361130c575f67ffffffffffffffff8111156112d6576112d561459b565b5b6040519080825280602002602001820160405280156113045781602001602082028036833780820191505090505b509050611328565b6113258261131861285a565b611320611e57565b6113e0565b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009805461136190614e92565b80601f016020809104026020016040519081016040528092919081815260200182805461138d90614e92565b80156113d85780601f106113af576101008083540402835291602001916113d8565b820191905f5260205f20905b8154815290600101906020018083116113bb57829003601f168201915b505050505081565b606081831061141b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142361285a565b8310156114355761143261285a565b92505b5f61143e611e57565b90508083111561144c578092505b5f8385101561146757611460868686610f06565b905061146b565b5f90505b5f8167ffffffffffffffff8111156114865761148561459b565b5b6040519080825280602002602001820160405280156114b45781602001602082028036833780820191505090505b5090505f60015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f80885f915091505b8481146115515761151a8284611d2690919063ffffffff16565b1561154657818482806001019350815181106115395761153861518e565b5b6020026020010181815250505b816001019150611500565b5050819450505050509392505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61159661158f6123a3565b8383612862565b5050565b5f803390506115ac8185856001611e72565b600191505092915050565b5f6116078260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b905092915050565b6060611619611e57565b8210611651576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61165b836129c9565b5111156116725761166b826129c9565b90506119b4565b5f600d805461168090614e92565b905011156116ba57600d61169383612a5b565b6040516020016116a4929190615313565b60405160208183030381529060405290506119b4565b5f826040516020016116cc9190615356565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611611787576040518060400160405280601381526020017f475152685779462f4469616d6f6e642e6a70670000000000000000000000000081525092506040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525091506040518060e0016040528060be8152602001615d9160be91399050611958565b607f8460ff1611611823576040518060400160405280601081526020017f6777644c6633662f476f6c642e6a70670000000000000000000000000000000081525092506040518060400160405280600481526020017f476f6c6400000000000000000000000000000000000000000000000000000000815250915060405180610100016040528060c88152602001615e4f60c891399050611957565b60bf8460ff16116118be576040518060400160405280601281526020017f464a6d6472646d2f53696c7665722e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f53696c766572000000000000000000000000000000000000000000000000000081525091506040518060c00160405280608e8152602001615d03608e91399050611956565b60ff8460ff1611611955576040518060400160405280601281526020017f594c47334a76632f42726f6e7a652e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f42726f6e7a65000000000000000000000000000000000000000000000000000081525091506040518060c0016040528060818152602001615c826081913990505b5b5b5b5f61196287612a5b565b82600c866040516020016119799493929190615474565b6040516020818303038152906040529050808360405160200161199d9291906155d6565b604051602081830303815290604052955050505050505b919050565b600d80546119c690614e92565b80601f01602080910402602001604051908101604052809291908181526020018280546119f290614e92565b8015611a3d5780601f10611a1457610100808354040283529160200191611a3d565b820191905f5260205f20905b815481529060010190602001808311611a2057829003601f168201915b505050505081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611acf611dbd565b80600d9081611ade919061505f565b5050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611b786123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bbe5750611bbd85611bb86123a3565b611ae2565b5b15611bd757611bd285858585856001611f64565b611c09565b6040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600c8054611c1d90614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4990614e92565b8015611c945780601f10611c6b57610100808354040283529160200191611c94565b820191905f5260205f20905b815481529060010190602001808311611c7757829003601f168201915b505050505081565b611ca4611dbd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d14575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d0b91906147da565b60405180910390fd5b611d1d81612779565b50565b600e5481565b5f80600160ff8416855f015f600887901c81526020019081526020015f2054901c1690508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dc56123a3565b73ffffffffffffffffffffffffffffffffffffffff16611de361132d565b73ffffffffffffffffffffffffffffffffffffffff1614611e4257611e066123a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e3991906147da565b60405180910390fd5b565b8060039081611e53919061505f565b5050565b5f600454905090565b611e6d8383836001612bb4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ee2575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ed991906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f52575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f4991906147da565b60405180910390fd5b611f5e84848484612d83565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611fc9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611fd26123a3565b90505f611fde866131ac565b9050611fec8289898461321f565b60018514801561204757506120468660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b1561211b5761209b8660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6120ea8660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b61211688887f0000000000000000000000000000000000000000000000000de0b6b3a76400005f611e72565b61214d565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff8a1690508682827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a48873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b60405161221e92919061561a565b60405180910390a4612232848b8b86613282565b841561224757612246848b8b8b8b8b6134b6565b5b50505050505050505050565b5f61225e8484611a45565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122df57818110156122d0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122c793929190615641565b60405180910390fd5b6122de84848484035f612bb4565b5b50505050565b5f80600884901c90505f60ff85169050610101818501106123715761231e81875f015f8581526020019081526020015f2054901c6138b2565b92505f6008828601901c8301905060ff8286011694505f91508260010192505b80831461236f57612360875f015f8581526020019081526020015f20546138b2565b8401935082600101925061233e565b505b612396846101000382885f015f8681526020019081526020015f2054901c901b6138b2565b8301925050509392505050565b5f33905090565b81518351146123e5576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361244a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6124536123a3565b90506124618187878761321f565b5f5b84518110156125ea575f8582815181106124805761247f61518e565b5b602002602001015190505f85838151811061249e5761249d61518e565b5b6020026020010151905060018114801561250357506125028260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b156125ab576125578260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6125a68260015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b6125dd565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050806001019050612463565b50612623868686517f0000000000000000000000000000000000000000000000000de0b6b3a764000061261d91906151bb565b5f611e72565b5f805f600187516126349190615676565b905073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff88169250602087015183837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b8181146126d5578060200288015184847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612696565b508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a60405161274c9291906156a9565b60405180910390a4612760848a8a8a613282565b61276e848a8a8a8a8a6138fb565b505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61284361285a565b61284b611e57565b612855919061515b565b905090565b5f6001905090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79061574e565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129bc919061456a565b60405180910390a3505050565b6060600380546129d890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0490614e92565b8015612a4f5780601f10612a2657610100808354040283529160200191612a4f565b820191905f5260205f20905b815481529060010190602001808311612a3257829003601f168201915b50505050509050919050565b60605f8203612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612baf565b5f8290505f5b5f8214612ad0578080612ab99061576c565b915050600a82612ac99190615229565b9150612aa7565b5f8167ffffffffffffffff811115612aeb57612aea61459b565b5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b5f8514612ba857600182612b35919061515b565b9150600a85612b4491906157b3565b6030612b509190615676565b60f81b818381518110612b6657612b6561518e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ba19190615229565b9450612b21565b8093505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c24575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612c1b91906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c94575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612c8b91906147da565b60405180910390fd5b8160075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612d7d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612d7491906144b7565b60405180910390a35b50505050565b5f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083821015612e4e578582856040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e4593929190615641565b60405180910390fd5b83820360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555083810160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f3391906144b7565b60405180910390a382156131a4575f600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905080613018575f7f0000000000000000000000000000000000000000000000000de0b6b3a76400008685612fc1919061515b565b612fcb9190615229565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000085612ff79190615229565b613001919061515b565b90505f811115613016576130158882613abf565b5b505b600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131a2576001600b541480156130755750805b80156130b3575061308461132d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b1561311a576001600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506002600b819055506131a1565b5f7f0000000000000000000000000000000000000000000000000de0b6b3a7640000836131479190615229565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000087856131749190615676565b61317e9190615229565b613188919061515b565b90505f81111561319f5761319c8782613eaf565b50505b505b5b505b505050505050565b6060600167ffffffffffffffff8111156131c9576131c861459b565b5b6040519080825280602002602001820160405280156131f75781602001602082028036833780820191505090505b50905081815f8151811061320e5761320d61518e565b5b602002602001018181525050919050565b50505050565b60ff81166001901b19825f015f600884901c81526020019081526020015f205f82825416925050819055505050565b60ff81166001901b825f015f600884901c81526020019081526020015f205f82825417925050819055505050565b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166134a457600e5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115613352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133499061582d565b60405180910390fd5b600f5f9054906101000a900460ff16156134a3574360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc906158bb565b60405180910390fd5b4360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f8273ffffffffffffffffffffffffffffffffffffffff163b14801561346357505f3273ffffffffffffffffffffffffffffffffffffffff163b145b6134a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349990615949565b60405180910390fd5b5b5b6134b08484848461421e565b50505050565b6134d58473ffffffffffffffffffffffffffffffffffffffff16614224565b156138aa578373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77fd9b67a26000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016135339190615976565b602060405180830381865afa15801561354e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357291906159a3565b15613713578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135b8959493929190615a20565b6020604051808303815f875af19250505080156135f357506040513d601f19601f820116820180604052508101906135f09190615a8c565b60015b61368f576135ff615ac3565b806308c379a00361365b5750613613615ae2565b8061361e575061365d565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136529190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461370d576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506138a9565b8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02878786856040518563ffffffff1660e01b81526004016137529493929190615b71565b6020604051808303815f875af192505050801561378d57506040513d601f19601f8201168201806040525081019061378a9190615a8c565b60015b61382957613799615ac3565b806308c379a0036137f557506137ad615ae2565b806137b857506137f7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ec9190614780565b60405180910390fd5b505b6040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146138a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5b505050505050565b5f8019808314600382048460011c1684039350600582048460021c16600583048516019350601182048460041c850116935060ff8204840260f81c8160081b1792505050919050565b61391a8473ffffffffffffffffffffffffffffffffffffffff16614224565b15613ab7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613960959493929190615bbb565b6020604051808303815f875af192505050801561399b57506040513d601f19601f820116820180604052508101906139989190615a8c565b60015b613a37576139a7615ac3565b806308c379a003613a0357506139bb615ae2565b806139c65750613a05565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fa9190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613ab5576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b24576040517fb817eee700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b2d6123a3565b90505f613b38611e57565b90505f8367ffffffffffffffff811115613b5557613b5461459b565b5b604051908082528060200260200182016040528015613b835781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613ba157613ba061459b565b5b604051908082528060200260200182016040528015613bcf5781602001602082028036833780820191505090505b5090505f5b85811015613ccf576001838281518110613bf157613bf061518e565b5b6020026020010181815250505f613c4d8560015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061423590919063ffffffff16565b905080838381518110613c6357613c6261518e565b5b602002602001018181525050613cbe8160015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b809450508080600101915050613bd4565b50613cdc84875f8461321f565b5f80600187613ceb9190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915060208301515f837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b818114613d7357806020028401515f847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613d34565b5060018703613e1a575f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110613df557613df461518e565b5b60200260200101516001604051613e0d929190615c5a565b60405180910390a4613e99565b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8688604051613e909291906156a9565b60405180910390a45b613ea586895f86613282565b5050505050505050565b6060805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613f17576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8303613f50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f596123a3565b90508367ffffffffffffffff811115613f7557613f7461459b565b5b604051908082528060200260200182016040528015613fa35781602001602082028036833780820191505090505b5092508367ffffffffffffffff811115613fc057613fbf61459b565b5b604051908082528060200260200182016040528015613fee5781602001602082028036833780820191505090505b5091505f613ffa611e57565b905080857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03101561402a575f80fd5b5f5b858110156140845780820185828151811061404a5761404961518e565b5b602002602001018181525050600184828151811061406b5761406a61518e565b5b602002602001018181525050808060010191505061402c565b50614091825f888761321f565b6140e2818660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206142ae9092919063ffffffff16565b8460045f8282546140f39190615676565b925050819055505f8086836141089190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146141885780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061414f565b508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516141ff9291906156a9565b60405180910390a4614213845f8a89613282565b505050509250929050565b50505050565b5f80823b90505f8111915050919050565b5f805f801992508360081c9150815f5284602052831960ff1660405f2054811b811c915082158217614283575b600115614282578383019250825f5260405f205491508215821715614262575b5b505f81146142a6576142948161432b565b600883901b1792508383115f03831792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106143115760405f2082821b815417815560015f510182850160081c5f510160ff8487011695505f93505b80821461430a57815f528460405f20556001820191506142ef565b815f525050505b60405f208284610100031c821b8154178155505050505050565b5f816fffffffffffffffffffffffffffffffff1060071b821560081b17905081811c67ffffffffffffffff1060061b8117905081811c63ffffffff1060051b8117905081811c61ffff1060041b8117905081811c60ff1060031b811790507f07060605060205040602030205040301060502050303040105050304000000006f8421084210842108cc6318c6db6d54be83831c1c601f161a81179050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614406826143dd565b9050919050565b614416816143fc565b8114614420575f80fd5b50565b5f813590506144318161440d565b92915050565b5f819050919050565b61444981614437565b8114614453575f80fd5b50565b5f8135905061446481614440565b92915050565b5f80604083850312156144805761447f6143d5565b5b5f61448d85828601614423565b925050602061449e85828601614456565b9150509250929050565b6144b181614437565b82525050565b5f6020820190506144ca5f8301846144a8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614504816144d0565b811461450e575f80fd5b50565b5f8135905061451f816144fb565b92915050565b5f6020828403121561453a576145396143d5565b5b5f61454784828501614511565b91505092915050565b5f8115159050919050565b61456481614550565b82525050565b5f60208201905061457d5f83018461455b565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6145d18261458b565b810181811067ffffffffffffffff821117156145f0576145ef61459b565b5b80604052505050565b5f6146026143cc565b905061460e82826145c8565b919050565b5f67ffffffffffffffff82111561462d5761462c61459b565b5b6146368261458b565b9050602081019050919050565b828183375f83830152505050565b5f61466361465e84614613565b6145f9565b90508281526020810184848401111561467f5761467e614587565b5b61468a848285614643565b509392505050565b5f82601f8301126146a6576146a5614583565b5b81356146b6848260208601614651565b91505092915050565b5f602082840312156146d4576146d36143d5565b5b5f82013567ffffffffffffffff8111156146f1576146f06143d9565b5b6146fd84828501614692565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561473d578082015181840152602081019050614722565b5f8484015250505050565b5f61475282614706565b61475c8185614710565b935061476c818560208601614720565b6147758161458b565b840191505092915050565b5f6020820190508181035f8301526147988184614748565b905092915050565b5f602082840312156147b5576147b46143d5565b5b5f6147c284828501614456565b91505092915050565b6147d4816143fc565b82525050565b5f6020820190506147ed5f8301846147cb565b92915050565b5f805f6060848603121561480a576148096143d5565b5b5f61481786828701614423565b935050602061482886828701614423565b925050604061483986828701614456565b9150509250925092565b5f805f6060848603121561485a576148596143d5565b5b5f61486786828701614423565b935050602061487886828701614456565b925050604061488986828701614456565b9150509250925092565b5f67ffffffffffffffff8211156148ad576148ac61459b565b5b602082029050602081019050919050565b5f80fd5b5f6148d46148cf84614893565b6145f9565b905080838252602082019050602084028301858111156148f7576148f66148be565b5b835b81811015614920578061490c8882614456565b8452602084019350506020810190506148f9565b5050509392505050565b5f82601f83011261493e5761493d614583565b5b813561494e8482602086016148c2565b91505092915050565b5f67ffffffffffffffff8211156149715761497061459b565b5b61497a8261458b565b9050602081019050919050565b5f61499961499484614957565b6145f9565b9050828152602081018484840111156149b5576149b4614587565b5b6149c0848285614643565b509392505050565b5f82601f8301126149dc576149db614583565b5b81356149ec848260208601614987565b91505092915050565b5f805f805f60a08688031215614a0e57614a0d6143d5565b5b5f614a1b88828901614423565b9550506020614a2c88828901614423565b945050604086013567ffffffffffffffff811115614a4d57614a4c6143d9565b5b614a598882890161492a565b935050606086013567ffffffffffffffff811115614a7a57614a796143d9565b5b614a868882890161492a565b925050608086013567ffffffffffffffff811115614aa757614aa66143d9565b5b614ab3888289016149c8565b9150509295509295909350565b5f60ff82169050919050565b614ad581614ac0565b82525050565b5f602082019050614aee5f830184614acc565b92915050565b5f67ffffffffffffffff821115614b0e57614b0d61459b565b5b602082029050602081019050919050565b5f614b31614b2c84614af4565b6145f9565b90508083825260208201905060208402830185811115614b5457614b536148be565b5b835b81811015614b7d5780614b698882614423565b845260208401935050602081019050614b56565b5050509392505050565b5f82601f830112614b9b57614b9a614583565b5b8135614bab848260208601614b1f565b91505092915050565b5f8060408385031215614bca57614bc96143d5565b5b5f83013567ffffffffffffffff811115614be757614be66143d9565b5b614bf385828601614b87565b925050602083013567ffffffffffffffff811115614c1457614c136143d9565b5b614c208582860161492a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c5c81614437565b82525050565b5f614c6d8383614c53565b60208301905092915050565b5f602082019050919050565b5f614c8f82614c2a565b614c998185614c34565b9350614ca483614c44565b805f5b83811015614cd4578151614cbb8882614c62565b9750614cc683614c79565b925050600181019050614ca7565b5085935050505092915050565b5f6020820190508181035f830152614cf98184614c85565b905092915050565b614d0a81614550565b8114614d14575f80fd5b50565b5f81359050614d2581614d01565b92915050565b5f8060408385031215614d4157614d406143d5565b5b5f614d4e85828601614423565b9250506020614d5f85828601614d17565b9150509250929050565b5f60208284031215614d7e57614d7d6143d5565b5b5f614d8b84828501614423565b91505092915050565b5f8060408385031215614daa57614da96143d5565b5b5f614db785828601614423565b9250506020614dc885828601614423565b9150509250929050565b5f805f805f60a08688031215614deb57614dea6143d5565b5b5f614df888828901614423565b9550506020614e0988828901614423565b9450506040614e1a88828901614456565b9350506060614e2b88828901614456565b925050608086013567ffffffffffffffff811115614e4c57614e4b6143d9565b5b614e58888289016149c8565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ea957607f821691505b602082108103614ebc57614ebb614e65565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee3565b614f288683614ee3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f63614f5e614f5984614437565b614f40565b614437565b9050919050565b5f819050919050565b614f7c83614f49565b614f90614f8882614f6a565b848454614eef565b825550505050565b5f90565b614fa4614f98565b614faf818484614f73565b505050565b5b81811015614fd257614fc75f82614f9c565b600181019050614fb5565b5050565b601f82111561501757614fe881614ec2565b614ff184614ed4565b81016020851015615000578190505b61501461500c85614ed4565b830182614fb4565b50505b505050565b5f82821c905092915050565b5f6150375f198460080261501c565b1980831691505092915050565b5f61504f8383615028565b9150826002028217905092915050565b61506882614706565b67ffffffffffffffff8111156150815761508061459b565b5b61508b8254614e92565b615096828285614fd6565b5f60209050601f8311600181146150c7575f84156150b5578287015190505b6150bf8582615044565b865550615126565b601f1984166150d586614ec2565b5f5b828110156150fc578489015182556001820191506020850194506020810190506150d7565b868310156151195784890151615115601f891682615028565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61516582614437565b915061517083614437565b92508282039050818111156151885761518761512e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6151c582614437565b91506151d083614437565b92508282026151de81614437565b915082820484148315176151f5576151f461512e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523382614437565b915061523e83614437565b92508261524e5761524d6151fc565b5b828204905092915050565b5f81905092915050565b5f815461526f81614e92565b6152798186615259565b9450600182165f811461529357600181146152a8576152da565b60ff19831686528115158202860193506152da565b6152b185614ec2565b5f5b838110156152d2578154818901526001820191506020810190506152b3565b838801955050505b50505092915050565b5f6152ed82614706565b6152f78185615259565b9350615307818560208601614720565b80840191505092915050565b5f61531e8285615263565b915061532a82846152e3565b91508190509392505050565b5f819050919050565b61535061534b82614437565b615336565b82525050565b5f615361828461533f565b60208201915081905092915050565b7f7b226e616d65223a202257494e455220230000000000000000000000000000005f82015250565b5f6153a4601183615259565b91506153af82615370565b601182019050919050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f6153ee601183615259565b91506153f9826153ba565b601182019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f495f77696c6c5f8201527f5f7275672e636f6d222c22696d616765223a2200000000000000000000000000602082015250565b5f61545e603383615259565b915061546982615404565b603382019050919050565b5f61547e82615398565b915061548a82876152e3565b9150615495826153e2565b91506154a182866152e3565b91506154ac82615452565b91506154b88285615263565b91506154c482846152e3565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f615506601b83615259565b9150615511826154d2565b601b82019050919050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a22435f8201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b5f615576602f83615259565b91506155818261551c565b602f82019050919050565b7f227d5d7d000000000000000000000000000000000000000000000000000000005f82015250565b5f6155c0600483615259565b91506155cb8261558c565b600482019050919050565b5f6155e0826154fa565b91506155ec82856152e3565b91506155f78261556a565b915061560382846152e3565b915061560e826155b4565b91508190509392505050565b5f60408201905061562d5f8301856144a8565b61563a60208301846144a8565b9392505050565b5f6060820190506156545f8301866147cb565b61566160208301856144a8565b61566e60408301846144a8565b949350505050565b5f61568082614437565b915061568b83614437565b92508282019050808211156156a3576156a261512e565b5b92915050565b5f6040820190508181035f8301526156c18185614c85565b905081810360208301526156d58184614c85565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c207374617475735f8201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b5f615738602983614710565b9150615743826156de565b604082019050919050565b5f6020820190508181035f8301526157658161572c565b9050919050565b5f61577682614437565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157a8576157a761512e565b5b600182019050919050565b5f6157bd82614437565b91506157c883614437565b9250826157d8576157d76151fc565b5b828206905092915050565b7f5472616e736665722065786365656473206d6178696d756d2077616c6c6574005f82015250565b5f615817601f83614710565b9150615822826157e3565b602082019050919050565b5f6020820190508181035f8301526158448161580b565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f6158a5602483614710565b91506158b08261584b565b604082019050919050565b5f6020820190508181035f8301526158d281615899565b9050919050565b7f436f6e74726163742074726164696e672072657374726963746564206174206c5f8201527f61756e6368000000000000000000000000000000000000000000000000000000602082015250565b5f615933602583614710565b915061593e826158d9565b604082019050919050565b5f6020820190508181035f83015261596081615927565b9050919050565b615970816144d0565b82525050565b5f6020820190506159895f830184615967565b92915050565b5f8151905061599d81614d01565b92915050565b5f602082840312156159b8576159b76143d5565b5b5f6159c58482850161598f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6159f2826159ce565b6159fc81856159d8565b9350615a0c818560208601614720565b615a158161458b565b840191505092915050565b5f60a082019050615a335f8301886147cb565b615a4060208301876147cb565b615a4d60408301866144a8565b615a5a60608301856144a8565b8181036080830152615a6c81846159e8565b90509695505050505050565b5f81519050615a86816144fb565b92915050565b5f60208284031215615aa157615aa06143d5565b5b5f615aae84828501615a78565b91505092915050565b5f8160e01c9050919050565b5f60033d1115615adf5760045f803e615adc5f51615ab7565b90505b90565b5f60443d10615b6e57615af36143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b1b575050615b6e565b808201805167ffffffffffffffff811115615b395750505050615b6e565b80602083010160043d038501811115615b56575050505050615b6e565b615b65826020018501866145c8565b82955050505050505b90565b5f608082019050615b845f8301876147cb565b615b9160208301866147cb565b615b9e60408301856144a8565b8181036060830152615bb081846159e8565b905095945050505050565b5f60a082019050615bce5f8301886147cb565b615bdb60208301876147cb565b8181036040830152615bed8186614c85565b90508181036060830152615c018185614c85565b90508181036080830152615c1581846159e8565b90509695505050505050565b5f819050919050565b5f615c44615c3f615c3a84615c21565b614f40565b614437565b9050919050565b615c5481615c2a565b82525050565b5f604082019050615c6d5f8301856144a8565b615c7a6020830184615c4b565b939250505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792e526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea264697066735822122062f17ec7cae911e3621ac6c88d148e0bbde38a1376dad499cbfe8f6817d780fa64736f6c63430008180033

Deployed Bytecode Sourcemap

74633:4328:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46401:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44609:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76530:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42227:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41956:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67742:483;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75068:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78850:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42399:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76310:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68374:827;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46080:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48442:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42332:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46885:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76087:91;;;:::i;:::-;;43570:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42512:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76186:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42467:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45738:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2881:103;;;:::i;:::-;;74376:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2206:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42275:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72660:1264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42595:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42722:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47488:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67398:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44397:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76629:2213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74727:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67592:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76416:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47715:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47955:410;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74699:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3139:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75037:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46401:318;46487:7;46529:1;46510:21;;:7;:21;;;46507:88;;46555:28;;;;;;;;;;;;;;46507:88;46608:23;46628:2;46608:6;:15;46615:7;46608:15;;;;;;;;;;;;;;;:19;;:23;;;;:::i;:::-;46605:104;;;46655:1;46648:8;;;;46605:104;46696:1;46689:8;;46401:318;;;;;:::o;44609:527::-;44711:4;44763:26;44748:41;;;:11;:41;;;;:110;;;;44821:37;44806:52;;;:11;:52;;;;44748:110;:165;;;;44890:23;44875:38;;;:11;:38;;;;44748:165;:207;;;;44945:10;44930:25;;:11;:25;;;;44748:207;:284;;;;45022:10;45007:25;;:11;:25;;;;44748:284;:380;;;;45092:36;45116:11;45092:23;:36::i;:::-;44748:380;44728:400;;44609:527;;;:::o;76530:91::-;2092:13;:11;:13::i;:::-;76598:15:::1;76606:6;76598:7;:15::i;:::-;76530:91:::0;:::o;42227:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41956:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;67742:483::-;67815:4;67832:13;67848:10;67832:26;;67881:14;:12;:14::i;:::-;67873:5;:22;:35;;;;;67907:1;67899:5;:9;67873:35;67869:327;;;67931:23;67941:5;67948;67931:9;:23::i;:::-;67927:96;;68001:5;67982:25;;;;;;;;;;;:::i;:::-;;;;;;;;67927:96;68060:7;68039:11;:18;68051:5;68039:18;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68105:7;68089:31;;68098:5;68089:31;;;68114:5;68089:31;;;;;;:::i;:::-;;;;;;;;67869:327;;;68153:31;68162:5;68169:7;68178:5;68153:8;:31::i;:::-;67869:327;68213:4;68206:11;;;67742:483;;;;:::o;75068:32::-;;;;;;;;;;;;;:::o;78850:108::-;78905:13;78938:12;78947:2;78938:8;:12::i;:::-;78931:19;;78850:108;;;:::o;42399:36::-;;;:::o;76310:98::-;2092:13;:11;:13::i;:::-;76392:8:::1;76382:7;:18;;;;;;:::i;:::-;;76310:98:::0;:::o;68374:827::-;68461:4;68490:14;:12;:14::i;:::-;68482:5;:22;68478:694;;;68525:23;68542:5;68525:6;:12;68532:4;68525:12;;;;;;;;;;;;;;;:16;;:23;;;;:::i;:::-;68521:96;;68596:4;68576:25;;;;;;;;;;;:::i;:::-;;;;;;;;68521:96;68673:4;68659:18;;:10;:18;;;;:74;;;;;68699:34;68716:4;68722:10;68699:16;:34::i;:::-;68698:35;68659:74;:127;;;;;68768:11;:18;68780:5;68768:18;;;;;;;;;;;;;;;;;;;;;68754:32;;:10;:32;;;;68659:127;68637:238;;;68848:10;68828:31;;;;;;;;;;;:::i;:::-;;;;;;;;68637:238;68891:40;68901:4;68907:2;68911:12;68925:5;68891:9;:40::i;:::-;68955:11;:18;68967:5;68955:18;;;;;;;;;;;;68948:25;;;;;;;;;;;68990:48;69008:4;69014:2;69018:5;69025:1;68990:48;;;;;;;;;;;;69032:5;68990:17;:48::i;:::-;68478:694;;;69073:40;69089:4;69095:10;69107:5;69073:15;:40::i;:::-;69128:32;69138:4;69144:2;69148:5;69155:4;69128:9;:32::i;:::-;68478:694;69189:4;69182:11;;68374:827;;;;;:::o;46080:170::-;46172:7;46199:43;46222:5;46236;46229:4;:12;;;;:::i;:::-;46199:6;:13;46206:5;46199:13;;;;;;;;;;;;;;;:22;;:43;;;;;:::i;:::-;46192:50;;46080:170;;;;;:::o;48442:418::-;48666:12;:10;:12::i;:::-;48658:20;;:4;:20;;;:60;;;;48682:36;48699:4;48705:12;:10;:12::i;:::-;48682:16;:36::i;:::-;48658:60;48653:137;;48743:35;;;;;;;;;;;;;;48653:137;48800:52;48823:4;48829:2;48833:3;48838:7;48847:4;48800:22;:52::i;:::-;48442:418;;;;;:::o;42332:31::-;;;:::o;46885:530::-;47041:16;47097:3;:10;47078:8;:15;:29;47075:90;;47131:22;;;;;;;;;;;;;;47075:90;47177:30;47224:8;:15;47210:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47177:63;;47258:9;47253:122;47277:8;:15;47273:1;:19;47253:122;;;47333:30;47343:8;47352:1;47343:11;;;;;;;;:::i;:::-;;;;;;;;47356:3;47360:1;47356:6;;;;;;;;:::i;:::-;;;;;;;;47333:9;:30::i;:::-;47314:13;47328:1;47314:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;47294:3;;;;;47253:122;;;;47394:13;47387:20;;;46885:530;;;;:::o;76087:91::-;2092:13;:11;:13::i;:::-;76157::::1;;;;;;;;;;;76156:14;76140:13;;:30;;;;;;;;;;;;;;;;;;76087:91::o:0;43570:119::-;2092:13;:11;:13::i;:::-;43676:5:::1;43656:9;:17;43666:6;43656:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;43570:119:::0;;:::o;42512:37::-;;;:::o;76186:116::-;2092:13;:11;:13::i;:::-;76291:3:::1;76281:7;76267:11;:21;;;;:::i;:::-;:27;;;;:::i;:::-;76255:9;:39;;;;76186:116:::0;:::o;42467:38::-;;;:::o;45738:114::-;45801:7;45828:9;:16;45838:5;45828:16;;;;;;;;;;;;;;;;45821:23;;45738:114;;;:::o;2881:103::-;2092:13;:11;:13::i;:::-;2946:30:::1;2973:1;2946:18;:30::i;:::-;2881:103::o:0;74376:250::-;74443:16;74493:1;74475:14;:12;:14::i;:::-;:19;74472:74;;74532:1;74518:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74511:23;;;;74472:74;74563:55;74579:5;74586:15;:13;:15::i;:::-;74603:14;:12;:14::i;:::-;74563:15;:55::i;:::-;74556:62;;74376:250;;;;:::o;2206:87::-;2252:7;2279:6;;;;;;;;;;;2272:13;;2206:87;:::o;42275:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72660:1264::-;72792:16;72859:4;72850:5;:13;72846:45;;72872:19;;;;;;;;;;;;;;72846:45;73005:15;:13;:15::i;:::-;72997:5;:23;72993:87;;;73049:15;:13;:15::i;:::-;73041:23;;72993:87;73159:17;73179:14;:12;:14::i;:::-;73159:34;;73219:9;73212:4;:16;73208:73;;;73256:9;73249:16;;73208:73;73297:22;73345:4;73337:5;:12;73334:157;;;73387:29;73397:5;73404;73411:4;73387:9;:29::i;:::-;73370:46;;73334:157;;;73474:1;73457:18;;73334:157;73519:25;73561:14;73547:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73519:57;;73593:29;73625:6;:13;73632:5;73625:13;;;;;;;;;;;;;;;73593:45;;73673:9;73684:19;73708:5;73715:1;73672:45;;;;73667:209;73734:14;73719:11;:29;73667:209;;73777:11;73786:1;73777:4;:8;;:11;;;;:::i;:::-;73774:87;;;73840:1;73814:8;73823:13;;;;;;73814:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;73774:87;73750:3;;;;;73667:209;;;;;73897:8;73890:15;;;;;;72660:1264;;;;;:::o;42595:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;42722:29::-;;;;:::o;47488:155::-;47583:52;47602:12;:10;:12::i;:::-;47616:8;47626;47583:18;:52::i;:::-;47488:155;;:::o;67398:186::-;67467:4;67484:13;67500:10;67484:26;;67521:33;67531:5;67538:2;67542:5;67549:4;67521:9;:33::i;:::-;67572:4;67565:11;;;67398:186;;;;:::o;44397:140::-;44482:4;44506:23;44526:2;44506:6;:15;44513:7;44506:15;;;;;;;;;;;;;;;:19;;:23;;;;:::i;:::-;44499:30;;44397:140;;;;:::o;76629:2213::-;76680:13;76715:14;:12;:14::i;:::-;76709:2;:20;76706:54;;76738:22;;;;;;;;;;;;;;76706:54;76807:1;76783:13;76793:2;76783:9;:13::i;:::-;76777:27;:31;76773:70;;;76830:13;76840:2;76830:9;:13::i;:::-;76823:20;;;;76773:70;76887:1;76864:12;76858:26;;;;;:::i;:::-;;;:30;76854:1981;;;76934:12;76948:13;:2;:11;:13::i;:::-;76917:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76903:60;;;;76854:1981;76994:10;77047:2;77030:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;77020:31;;;;;;77007:46;;76994:59;;77070:19;77104;77138:25;77192:2;77184:4;:10;;;77180:1276;;77215:29;;;;;;;;;;;;;;;;;;;77263:17;;;;;;;;;;;;;;;;;;;77299:206;;;;;;;;;;;;;;;;;;;77180:1276;;;77539:3;77531:4;:11;;;77527:929;;77563:26;;;;;;;;;;;;;;;;;;;77608:14;;;;;;;;;;;;;;;;;;;77641:216;;;;;;;;;;;;;;;;;;;77527:929;;;77891:3;77883:4;:11;;;77879:577;;77915:28;;;;;;;;;;;;;;;;;;;77962:16;;;;;;;;;;;;;;;;;;;77997:158;;;;;;;;;;;;;;;;;;;77879:577;;;78189:3;78181:4;:11;;;78177:279;;78213:28;;;;;;;;;;;;;;;;;;;78260:16;;;;;;;;;;;;;;;;;;;78295:145;;;;;;;;;;;;;;;;;;;78177:279;77879:577;77527:929;77180:1276;78472:26;78546:13;:2;:11;:13::i;:::-;78582:11;78650:7;78659:5;78508:157;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78472:194;;78743:12;78808:5;78695:127;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78681:142;;;;;;;76629:2213;;;;:::o;74727:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67592:142::-;67672:7;67699:11;:18;67711:5;67699:18;;;;;;;;;;;;;;;:27;67718:7;67699:27;;;;;;;;;;;;;;;;67692:34;;67592:142;;;;:::o;76416:106::-;2092:13;:11;:13::i;:::-;76505:9:::1;76490:12;:24;;;;;;:::i;:::-;;76416:106:::0;:::o;47715:168::-;47814:4;47838:18;:27;47857:7;47838:27;;;;;;;;;;;;;;;:37;47866:8;47838:37;;;;;;;;;;;;;;;;;;;;;;;;;47831:44;;47715:168;;;;:::o;47955:410::-;48152:12;:10;:12::i;:::-;48144:20;;:4;:20;;;:60;;;;48168:36;48185:4;48191:12;:10;:12::i;:::-;48168:16;:36::i;:::-;48144:60;48141:217;;;48220:51;48238:4;48244:2;48248;48252:6;48260:4;48266;48220:17;:51::i;:::-;48141:217;;;48311:35;;;;;;;;;;;;;;48141:217;47955:410;;;;;:::o;74699:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3139:220::-;2092:13;:11;:13::i;:::-;3244:1:::1;3224:22;;:8;:22;;::::0;3220:93:::1;;3298:1;3270:31;;;;;;;;;;;:::i;:::-;;;;;;;;3220:93;3323:28;3342:8;3323:18;:28::i;:::-;3139:220:::0;:::o;75037:24::-;;;;:::o;33604:488::-;33678:10;33927:9;33984:1;33975:4;33967:5;:12;33940:6;:10;;:22;33960:1;33951:5;:10;;33940:22;;;;;;;;;;;;:40;;33939:46;33927:58;;34073:1;34064:10;;34049:36;33604:488;;;;:::o;24165:157::-;24250:4;24289:25;24274:40;;;:11;:40;;;;24267:47;;24165:157;;;:::o;2371:166::-;2442:12;:10;:12::i;:::-;2431:23;;:7;:5;:7::i;:::-;:23;;;2427:103;;2505:12;:10;:12::i;:::-;2478:40;;;;;;;;;;;:::i;:::-;;;;;;;;2427:103;2371:166::o;54924:88::-;54998:6;54991:4;:13;;;;;;:::i;:::-;;54924:88;:::o;44002:95::-;44049:7;44076:13;;44069:20;;44002:95;:::o;71190:130::-;71275:37;71284:5;71291:7;71300:5;71307:4;71275:8;:37::i;:::-;71190:130;;;:::o;69209:325::-;69320:1;69304:18;;:4;:18;;;69300:88;;69373:1;69346:30;;;;;;;;;;;:::i;:::-;;;;;;;;69300:88;69416:1;69402:16;;:2;:16;;;69398:88;;69471:1;69442:32;;;;;;;;;;;:::i;:::-;;;;;;;;69398:88;69496:30;69504:4;69510:2;69514:5;69521:4;69496:7;:30::i;:::-;69209:325;;;;:::o;49359:1590::-;49577:1;49563:16;;:2;:16;;;49560:78;;49603:23;;;;;;;;;;;;;;49560:78;49650:16;49669:12;:10;:12::i;:::-;49650:31;;49692:20;49715:21;49733:2;49715:17;:21::i;:::-;49692:44;;49749:45;49770:8;49780:4;49786:2;49790:3;49749:20;:45::i;:::-;49820:1;49810:6;:11;:35;;;;;49825:20;49842:2;49825:6;:12;49832:4;49825:12;;;;;;;;;;;;;;;:16;;:20;;;;:::i;:::-;49810:35;49807:260;;;49862:22;49881:2;49862:6;:12;49869:4;49862:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;49899:18;49914:2;49899:6;:10;49906:2;49899:10;;;;;;;;;;;;;;;:14;;:18;;;;:::i;:::-;49932:40;49942:4;49948:2;49952:12;49966:5;49932:9;:40::i;:::-;49807:260;;;50012:43;;;;;;;;;;;;;;49807:260;50079:16;50106:18;50273:16;50269:2;50265:25;50253:37;;50328:16;50322:4;50318:27;50304:41;;50671:6;50635:8;50595:10;50537:25;50482:1;50425;50402:304;50765:2;50734:46;;50759:4;50734:46;;50749:8;50734:46;;;50769:2;50773:6;50734:46;;;;;;;:::i;:::-;;;;;;;;50793:44;50813:8;50823:4;50829:2;50833:3;50793:19;:44::i;:::-;50853:5;50850:91;;;50873:68;50904:8;50914:4;50920:2;50924;50928:6;50936:4;50873:30;:68::i;:::-;50850:91;49549:1400;;;;49359:1590;;;;;;:::o;71779:487::-;71879:24;71906:25;71916:5;71923:7;71906:9;:25::i;:::-;71879:52;;71966:17;71946:16;:37;71942:317;;72023:5;72004:16;:24;72000:132;;;72083:7;72092:16;72110:5;72056:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;72000:132;72175:57;72184:5;72191:7;72219:5;72200:16;:24;72226:5;72175:8;:57::i;:::-;71942:317;71868:398;71779:487;;;:::o;38703:786::-;38825:13;38881:14;38907:1;38898:5;:10;;38881:27;;38923:13;38947:4;38939:5;:12;38923:28;;38989:3;38981:5;38972:6;:14;:20;38966:417;;39022:44;39060:5;39038:6;:10;;:18;39049:6;39038:18;;;;;;;;;;;;:27;;39022:15;:44::i;:::-;39014:52;;39085:17;39135:1;39125:5;39116:6;:14;39115:21;;39105:6;:32;39085:52;;39184:4;39175:5;39166:6;:14;39165:23;39156:32;;39215:1;39207:9;;39240:8;;;;;39235:133;39260:9;39250:6;:19;39235:133;;39313:35;39329:6;:10;;:18;39340:6;39329:18;;;;;;;;;;;;39313:15;:35::i;:::-;39304:44;;;;39271:8;;;;;39235:133;;;38995:388;38966:417;39406:64;39462:6;39456:3;:12;39445:5;39423:6;:10;;:18;39434:6;39423:18;;;;;;;;;;;;:27;;39422:47;;39406:15;:64::i;:::-;39397:73;;;;38856:626;;38703:786;;;;;:::o;347:98::-;400:7;427:10;420:17;;347:98;:::o;51307:2773::-;51529:7;:14;51515:3;:10;:28;51512:89;;51567:22;;;;;;;;;;;;;;51512:89;51630:1;51616:16;;:2;:16;;;51613:78;;51656:23;;;;;;;;;;;;;;51613:78;51701:16;51720:12;:10;:12::i;:::-;51701:31;;51745:45;51766:8;51776:4;51782:2;51786:3;51745:20;:45::i;:::-;51808:9;51803:370;51827:3;:10;51823:1;:14;51803:370;;;51859:10;51872:3;51876:1;51872:6;;;;;;;;:::i;:::-;;;;;;;;51859:19;;51893:14;51910:7;51918:1;51910:10;;;;;;;;:::i;:::-;;;;;;;;51893:27;;51950:1;51940:6;:11;:35;;;;;51955:20;51972:2;51955:6;:12;51962:4;51955:12;;;;;;;;;;;;;;;:16;;:20;;;;:::i;:::-;51940:35;51937:225;;;51996:22;52015:2;51996:6;:12;52003:4;51996:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;52037:18;52052:2;52037:6;:10;52044:2;52037:10;;;;;;;;;;;;;;;:14;;:18;;;;:::i;:::-;51937:225;;;52103:43;;;;;;;;;;;;;;51937:225;51844:329;;51839:3;;;;;51803:370;;;;52183:53;52193:4;52199:2;52218:3;:10;52203:12;:25;;;;:::i;:::-;52230:5;52183:9;:53::i;:::-;52249:16;52276:18;52305:11;52332:1;52319:3;:10;:14;;;;:::i;:::-;52305:28;;52822:16;52816:4;52812:27;52798:41;;52873:16;52869:2;52865:25;52853:37;;53231:4;53226:3;53222:14;53216:21;53180:8;53140:10;53082:25;53027:1;52970;52947:319;53554:1;53516:336;53590:3;53581:7;53578:16;53516:336;;53826:7;53820:4;53816:18;53811:3;53807:28;53801:35;53791:8;53779:10;53752:25;53749:1;53746;53741:96;53639:1;53630:7;53626:15;53615:26;;53516:336;;;53520:50;53910:2;53880:47;;53904:4;53880:47;;53894:8;53880:47;;;53914:3;53919:7;53880:47;;;;;;;:::i;:::-;;;;;;;;53940:44;53960:8;53970:4;53976:2;53980:3;53940:19;:44::i;:::-;53997:75;54033:8;54043:4;54049:2;54053:3;54058:7;54067:4;53997:35;:75::i;:::-;51501:2579;;;;51307:2773;;;;;:::o;3519:191::-;3593:16;3612:6;;;;;;;;;;;3593:25;;3638:8;3629:6;;:17;;;;;;;;;;;;;;;;;;3693:8;3662:40;;3683:8;3662:40;;;;;;;;;;;;3582:128;3519:191;:::o;44195:114::-;44242:7;44286:15;:13;:15::i;:::-;44269:14;:12;:14::i;:::-;:32;;;;:::i;:::-;44262:39;;44195:114;:::o;43831:92::-;43887:7;43914:1;43907:8;;43831:92;:::o;62459:331::-;62614:8;62605:17;;:5;:17;;;62597:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62717:8;62679:18;:25;62698:5;62679:25;;;;;;;;;;;;;;;:35;62705:8;62679:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;62763:8;62741:41;;62756:5;62741:41;;;62773:8;62741:41;;;;;;:::i;:::-;;;;;;;;62459:331;;;:::o;45547:105::-;45607:13;45640:4;45633:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45547:105;;;:::o;13242:723::-;13298:13;13528:1;13519:5;:10;13515:53;;13546:10;;;;;;;;;;;;;;;;;;;;;13515:53;13578:12;13593:5;13578:20;;13609:14;13634:78;13649:1;13641:4;:9;13634:78;;13667:8;;;;;:::i;:::-;;;;13698:2;13690:10;;;;;:::i;:::-;;;13634:78;;;13722:19;13754:6;13744:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13722:39;;13772:154;13788:1;13779:5;:10;13772:154;;13816:1;13806:11;;;;;:::i;:::-;;;13883:2;13875:5;:10;;;;:::i;:::-;13862:2;:24;;;;:::i;:::-;13849:39;;13832:6;13839;13832:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;13912:2;13903:11;;;;;:::i;:::-;;;13772:154;;;13950:6;13936:21;;;;;13242:723;;;;:::o;71328:443::-;71458:1;71441:19;;:5;:19;;;71437:91;;71513:1;71484:32;;;;;;;;;;;:::i;:::-;;;;;;;;71437:91;71561:1;71542:21;;:7;:21;;;71538:92;;71615:1;71587:31;;;;;;;;;;;:::i;:::-;;;;;;;;71538:92;71670:5;71640:11;:18;71652:5;71640:18;;;;;;;;;;;;;;;:27;71659:7;71640:27;;;;;;;;;;;;;;;:35;;;;71690:9;71686:78;;;71737:7;71721:31;;71730:5;71721:31;;;71746:5;71721:31;;;;;;:::i;:::-;;;;;;;;71686:78;71328:443;;;;:::o;69542:1640::-;69639:19;69661:9;:15;69671:4;69661:15;;;;;;;;;;;;;;;;69639:37;;69687:17;69707:9;:13;69717:2;69707:13;;;;;;;;;;;;;;;;69687:33;;69749:5;69735:11;:19;69731:109;;;69803:4;69809:11;69822:5;69778:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;69731:109;69985:5;69971:11;:19;69953:9;:15;69963:4;69953:15;;;;;;;;;;;;;;;:37;;;;70149:5;70137:9;:17;70121:9;:13;70131:2;70121:13;;;;;;;;;;;;;;;:33;;;;70198:2;70183:25;;70192:4;70183:25;;;70202:5;70183:25;;;;;;:::i;:::-;;;;;;;;70224:4;70221:954;;;70305:8;70316:9;:15;70326:4;70316:15;;;;;;;;;;;;;;;;;;;;;;;;;70305:26;;70351:3;70346:234;;70375:22;70456:12;70447:5;70433:11;:19;;;;:::i;:::-;70432:36;;;;:::i;:::-;70415:12;70401:11;:26;;;;:::i;:::-;70400:69;;;;:::i;:::-;70375:94;;70508:1;70491:14;:18;70488:76;;;70532:32;70543:4;70549:14;70532:10;:32::i;:::-;70488:76;70356:224;70346:234;70664:9;:13;70674:2;70664:13;;;;;;;;;;;;;;;;;;;;;;;;;70659:505;;70715:1;70701:10;;:15;:22;;;;;70720:3;70701:22;:41;;;;;70735:7;:5;:7::i;:::-;70727:15;;:4;:15;;;70701:41;70698:451;;;70841:4;70825:9;:13;70835:2;70825:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;70881:1;70868:10;:14;;;;70698:451;;;70931:22;71008:12;70996:9;:24;;;;:::i;:::-;70979:12;70970:5;70958:9;:17;;;;:::i;:::-;70957:34;;;;:::i;:::-;70956:65;;;;:::i;:::-;70931:90;;71064:1;71047:14;:18;71044:85;;;71092:37;71110:2;71114:14;71092:17;:37::i;:::-;;;71044:85;70908:241;70698:451;70659:505;70230:945;70221:954;69628:1554;;69542:1640;;;;:::o;67228:162::-;67294:22;67351:1;67337:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67329:24;;67375:7;67364:5;67370:1;67364:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;67228:162;;;:::o;63748:158::-;;;;;:::o;34359:129::-;34474:4;34466:5;:12;34460:1;:19;;34458:22;34432:6;:10;;:22;34452:1;34443:5;:10;;34432:22;;;;;;;;;;;;:48;;;;;;;;;;;34359:129;;:::o;34162:126::-;34274:4;34266:5;:12;34260:1;:19;;34233:6;:10;;:22;34253:1;34244:5;:10;;34233:22;;;;;;;;;;;;:47;;;;;;;;;;;34162:126;;:::o;75363:716::-;75534:9;:13;75544:2;75534:13;;;;;;;;;;;;;;;;;;;;;;;;;75530:461;;75589:9;;75572;:13;75582:2;75572:13;;;;;;;;;;;;;;;;:26;;75564:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;75653:13;;;;;;;;;;;75649:331;;;75719:12;75695:10;:21;75706:9;75695:21;;;;;;;;;;;;;;;;:36;75687:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;75814:12;75790:10;:21;75801:9;75790:21;;;;;;;;;;;;;;;:36;;;;75882:1;75863:2;75855:23;;;:28;:67;;;;;75921:1;75895:9;75887:30;;;:35;75855:67;75847:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;75649:331;75530:461;76021:50;76047:8;76057:4;76063:2;76067:3;76021:25;:50::i;:::-;75363:716;;;;:::o;65026:1389::-;65241:15;:2;:13;;;:15::i;:::-;65237:1171;;;65285:2;65277:29;;;65307:26;65277:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65273:1124;;;65376:2;65359:38;;;65398:8;65408:4;65414:2;65418:6;65426:4;65359:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65355:495;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;65725:6;65718:14;;;;;;;;;;;:::i;:::-;;;;;;;;65355:495;;;65789:41;;;;;;;;;;;;;;65355:495;65497:43;;;65485:55;;;:8;:55;;;;65481:160;;65576:41;;;;;;;;;;;;;;65481:160;65432:228;65273:1124;;;65922:2;65907:35;;;65943:8;65953:4;65959:2;65963:4;65907:61;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65903:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;66258:6;66251:14;;;;;;;;;;;:::i;:::-;;;;;;;;65903:479;;;66322:40;;;;;;;;;;;;;;65903:479;66034:40;;;66022:52;;;:8;:52;;;;66018:156;;66110:40;;;;;;;;;;;;;;66018:156;65969:224;65273:1124;65237:1171;65026:1389;;;;;;:::o;27708:464::-;27760:9;27865:1;27861:6;27900:3;27897:1;27894:10;27954:1;27949:3;27945:11;27941:1;27938;27934:9;27930:27;27927:1;27923:35;27918:40;;28026:1;28021:3;28017:11;28013:1;28010;28006:9;28002:27;27997:1;27992:3;27988:11;27985:1;27981:19;27977:53;27972:58;;28081:2;28076:3;28072:12;28067:1;28064;28060:9;28057:1;28053:17;28049:36;28044:41;;28147:3;28142;28138:13;28135:1;28131:21;28126:3;28122:31;28114:5;28111:1;28107:13;28104:50;28099:55;;27835:330;;27708:464;;;:::o;66423:797::-;66663:15;:2;:13;;;:15::i;:::-;66659:554;;;66716:2;66699:43;;;66743:8;66753:4;66759:3;66764:7;66773:4;66699:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66695:507;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;67089:6;67082:14;;;;;;;;;;;:::i;:::-;;;;;;;;66695:507;;;67145:41;;;;;;;;;;;;;;66695:507;66872:48;;;66860:60;;;:8;:60;;;;66856:157;;66952:41;;;;;;;;;;;;;;66856:157;66779:249;66659:554;66423:797;;;;;;:::o;60578:1735::-;60700:1;60684:18;;:4;:18;;;60681:77;;60725:21;;;;;;;;;;;;;;60681:77;60770:16;60789:12;:10;:12::i;:::-;60770:31;;60814:18;60835:14;:12;:14::i;:::-;60814:35;;60862:24;60903:6;60889:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60862:48;;60921:20;60958:6;60944:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60921:44;;61007:9;61003:258;61026:6;61022:1;:10;61003:258;;;61071:1;61058:7;61066:1;61058:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;61091:10;61104:36;61129:10;61104:6;:12;61111:4;61104:12;;;;;;;;;;;;;;;:24;;:36;;;;:::i;:::-;61091:49;;61168:2;61159:3;61163:1;61159:6;;;;;;;;:::i;:::-;;;;;;;:11;;;;;61189:22;61208:2;61189:6;:12;61196:4;61189:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;61243:2;61230:15;;61039:222;61034:3;;;;;;;61003:258;;;;61346:53;61367:8;61377:4;61391:1;61395:3;61346:20;:53::i;:::-;61412:18;61441:11;61464:1;61455:6;:10;;;;:::i;:::-;61441:24;;61526:16;61520:4;61516:27;61502:41;;61728:4;61723:3;61719:14;61713:21;61693:1;61664:10;61620:25;61600:1;61580;61557:192;61803:1;61765:264;61839:3;61830:7;61827:16;61765:264;;62003:7;61997:4;61993:18;61988:3;61984:28;61978:35;61975:1;61963:10;61936:25;61933:1;61930;61925:89;61888:1;61879:7;61875:15;61864:26;;61765:264;;;61769:50;62065:1;62055:6;:11;62052:176;;62125:1;62086:53;;62111:4;62086:53;;62101:8;62086:53;;;62129:3;62133:1;62129:6;;;;;;;;:::i;:::-;;;;;;;;62137:1;62086:53;;;;;;;:::i;:::-;;;;;;;;62052:176;;;62211:1;62173:55;;62197:4;62173:55;;62187:8;62173:55;;;62215:3;62220:7;62173:55;;;;;;;:::i;:::-;;;;;;;;62052:176;62251:52;62271:8;62281:4;62295:1;62299:3;62251:19;:52::i;:::-;60670:1643;;;;;;60578:1735;;:::o;55947:1661::-;56052:20;56074:24;56130:1;56116:16;;:2;:16;;;56113:74;;56156:19;;;;;;;;;;;;;;56113:74;56210:1;56200:6;:11;56197:68;;56235:18;;;;;;;;;;;;;;56197:68;56277:16;56296:12;:10;:12::i;:::-;56277:31;;56341:6;56327:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56321:27;;56383:6;56369:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56359:31;;56401:20;56424:14;:12;:14::i;:::-;56401:37;;56514:12;56504:6;56484:17;:26;:42;;56476:51;;;;;;56546:9;56542:129;56565:6;56561:1;:10;56542:129;;;56621:1;56606:12;:16;56597:3;56601:1;56597:6;;;;;;;;:::i;:::-;;;;;;;:25;;;;;56654:1;56641:7;56649:1;56641:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;56573:3;;;;;;;56542:129;;;;56702:51;56723:8;56741:1;56745:2;56749:3;56702:20;:51::i;:::-;56766:41;56786:12;56800:6;56766;:10;56773:2;56766:10;;;;;;;;;;;;;;;:19;;:41;;;;;:::i;:::-;56835:6;56818:13;;:23;;;;;;;:::i;:::-;;;;;;;;56854:16;56881:11;56910:6;56895:12;:21;;;;:::i;:::-;56881:35;;56973:16;56969:2;56965:25;56953:37;;57158:12;57131:8;57111:1;57067:25;57047:1;57027;57004:181;57257:1;57243:12;57239:20;57201:253;57294:3;57285:7;57282:16;57201:253;;57431:7;57421:8;57418:1;57391:25;57388:1;57385;57380:59;57343:1;57334:7;57330:15;57319:26;;57201:253;;;57205:69;57518:2;57482:53;;57514:1;57482:53;;57496:8;57482:53;;;57522:3;57527:7;57482:53;;;;;;;:::i;:::-;;;;;;;;57548:50;57568:8;57586:1;57590:2;57594:3;57548:19;:50::i;:::-;56100:1508;;;;55947:1661;;;;;:::o;64861:157::-;;;;;:::o;5683:387::-;5743:4;5951:12;6018:7;6006:20;5998:28;;6061:1;6054:4;:8;6047:15;;;5683:387;;;:::o;39643:1230::-;39753:19;39790:14;39815:18;39931:1;39927:6;39912:21;;39964:6;39961:1;39957:14;39947:24;;39998:6;39992:4;39985:20;40032:11;40026:4;40019:25;40086:6;40082:11;40076:4;40072:22;40199:4;40193;40183:21;40177:28;40169:6;40165:41;40157:6;40153:54;40139:68;;40253:6;40246:14;40234:10;40231:30;40221:356;;40282:280;40289:1;40282:280;;;40339:11;40331:6;40327:24;40317:34;;40407:6;40401:4;40394:20;40472:4;40466;40456:21;40450:28;40436:42;;40525:6;40518:14;40506:10;40503:30;40500:43;40282:280;40500:43;40282:280;40221:356;39897:691;40616:1;40602:10;:15;40598:268;;40664:22;40675:10;40664;:22::i;:::-;40659:1;40649:6;:11;;40648:38;40634:52;;40831:6;40818:11;40815:23;40812:1;40808:31;40795:11;40792:48;40777:63;;40598:268;39779:1094;;39643:1230;;;;:::o;36196:1129::-;36371:1;36367:6;36411:4;36404:5;36400:16;36443:11;36437:4;36430:25;36489:5;36486:1;36482:13;36476:4;36469:27;36543:3;36534:6;36527:5;36523:18;36520:27;36510:646;;36603:4;36597;36587:21;36680:3;36673:5;36669:15;36655:11;36649:18;36646:39;36633:11;36626:60;36735:1;36728:4;36722:11;36718:19;36808:5;36800:6;36796:18;36793:1;36789:26;36782:4;36776:11;36772:44;36868:4;36860:5;36852:6;36848:18;36844:29;36834:39;;36900:1;36891:10;;36919:184;36944:9;36936:6;36933:21;36919:184;;37021:6;37015:4;37008:20;37080:3;37073:4;37067;37057:21;37050:34;36980:1;36972:6;36968:14;36958:24;;36919:184;;;37134:6;37128:4;37121:20;36549:607;;;36510:646;37205:4;37199;37189:21;37300:3;37291:6;37286:3;37282:16;37278:26;37271:5;37267:38;37253:11;37247:18;37244:62;37231:11;37224:83;36341:977;;;36196:1129;;;:::o;25062:688::-;25109:9;25272:1;25236:34;25233:41;25230:1;25226:49;25221:1;25214:9;25211:1;25207:17;25204:72;25199:77;;25338:1;25335;25331:9;25311:18;25308:33;25305:1;25301:41;25298:1;25295:48;25290:53;;25397:1;25394;25390:9;25378:10;25375:25;25372:1;25368:33;25365:1;25362:40;25357:45;;25452:1;25449;25445:9;25437:6;25434:21;25431:1;25427:29;25424:1;25421:36;25416:41;;25505:1;25502;25498:9;25492:4;25489:19;25486:1;25482:27;25479:1;25476:34;25471:39;;25664:66;25609:34;25605:1;25602;25598:9;25594:50;25588:4;25584:61;25579:152;25576:1;25573:159;25568:164;;25062: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://62f17ec7cae911e3621ac6c88d148e0bbde38a1376dad499cbfe8f6817d780fa
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.