ETH Price: $2,942.34 (-5.71%)
Gas: 7 Gwei

Token

ERC_DN404 (ERC_DN404)
 

Overview

Max Total Supply

10,000 ERC_DN404

Holders

30

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xca87711b4061bc5c61f7da6814256304b51275f9
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_DN404

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_DN404 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 = "ERC_DN404";
    string private constant _ticker = "ERC_DN404";

    // 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": "ERC_DN404 #', 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"}]

6101006040526001600b556001600f5f6101000a81548160ff02191690831515021790555034801562000030575f80fd5b5060405180602001604052805f8152506040518060400160405280600981526020017f4552435f444e34303400000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f4552435f444e343034000000000000000000000000000000000000000000000081525060126127106001335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000127575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200011e91906200048f565b60405180910390fd5b62000138816200036e60201b60201c565b506200014a866200042f60201b60201c565b6200015a6200044460201b60201c565b60048190555084600890816200017191906200070e565b5083600990816200018391906200070e565b508260ff1660808160ff1681525050608051600a620001a391906200097b565b60c0818152505060c05181620001ba9190620009cb565b60e0818152505060c05182620001d19190620009cb565b60a081815250506001600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060a05160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60a051604051620002d2919062000a26565b60405180910390a35050505050506040518060400160405280601181526020017f68747470733a2f2f692e6962622e636f2f000000000000000000000000000000815250600c90816200032691906200070e565b50606460026012600a6200033b91906200097b565b6127106200034a9190620009cb565b620003569190620009cb565b62000362919062000a6e565b600e8190555062000aa5565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600390816200044091906200070e565b5050565b5f6001905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000477826200044c565b9050919050565b62000489816200046b565b82525050565b5f602082019050620004a45f8301846200047e565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200052657607f821691505b6020821081036200053c576200053b620004e1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000563565b620005ac868362000563565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005f6620005f0620005ea84620005c4565b620005cd565b620005c4565b9050919050565b5f819050919050565b6200061183620005d6565b620006296200062082620005fd565b8484546200056f565b825550505050565b5f90565b6200063f62000631565b6200064c81848462000606565b505050565b5b818110156200067357620006675f8262000635565b60018101905062000652565b5050565b601f821115620006c2576200068c8162000542565b620006978462000554565b81016020851015620006a7578190505b620006bf620006b68562000554565b83018262000651565b50505b505050565b5f82821c905092915050565b5f620006e45f1984600802620006c7565b1980831691505092915050565b5f620006fe8383620006d3565b9150826002028217905092915050565b6200071982620004aa565b67ffffffffffffffff811115620007355762000734620004b4565b5b6200074182546200050e565b6200074e82828562000677565b5f60209050601f83116001811462000784575f84156200076f578287015190505b6200077b8582620006f1565b865550620007ea565b601f198416620007948662000542565b5f5b82811015620007bd5784890151825560018201915060208501945060208101905062000796565b86831015620007dd5784890151620007d9601f891682620006d3565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200087c57808604811115620008545762000853620007f2565b5b6001851615620008645780820291505b808102905062000874856200081f565b945062000834565b94509492505050565b5f8262000896576001905062000968565b81620008a5575f905062000968565b8160018114620008be5760028114620008c957620008ff565b600191505062000968565b60ff841115620008de57620008dd620007f2565b5b8360020a915084821115620008f857620008f7620007f2565b5b5062000968565b5060208310610133831016604e8410600b8410161715620009395782820a905083811115620009335762000932620007f2565b5b62000968565b6200094884848460016200082b565b92509050818404811115620009625762000961620007f2565b5b81810290505b9392505050565b5f60ff82169050919050565b5f6200098782620005c4565b915062000994836200096f565b9250620009c37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000885565b905092915050565b5f620009d782620005c4565b9150620009e483620005c4565b9250828202620009f481620005c4565b9150828204841483151762000a0e5762000a0d620007f2565b5b5092915050565b62000a2081620005c4565b82525050565b5f60208201905062000a3b5f83018462000a15565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62000a7a82620005c4565b915062000a8783620005c4565b92508262000a9a5762000a9962000a41565b5b828204905092915050565b60805160a05160c05160e051615f4c62000b115f395f8181610e68015281816111c4015281816120f1015281816125f401528181612f9601528181612fcd0152818161311d015261314901525f61123101525f8181610c9701526111f301525f6110060152615f4c5ff3fe608060405234801561000f575f80fd5b5060043610610245575f3560e01c806370a0823111610139578063c5b8f772116100b6578063e985e9c51161007a578063e985e9c51461074d578063f242432a1461077d578063f28ca1dd14610799578063f2fde38b146107b7578063f8b45b05146107d357610245565b8063c5b8f77214610683578063c87b56dd146106b3578063d547cfb7146106e3578063dd62ed3e14610701578063e0df5b6f1461073157610245565b806399a2557a116100fd57806399a2557a146105b95780639b19251a146105e9578063a014e6e214610619578063a22cb46514610637578063a9059cbb1461065357610245565b806370a0823114610513578063715018a6146105435780638462151c1461054d5780638da5cb5b1461057d57806395d89b411461059b57610245565b806323b872dd116101c75780634eabf2c61161018b5780634eabf2c61461049557806353d6fd591461049f5780635afcc2f5146104bb5780635d0044ca146104d95780636d6a6a4d146104f557610245565b806323b872dd146103cb5780632d760d57146103fb5780632eb2c2d61461042b578063313ce567146104475780634e1273f41461046557610245565b8063095ea7b31161020e578063095ea7b3146103135780630a702e8d146103435780630e89341c1461036157806318160ddd1461039157806318d217c3146103af57610245565b8062fdd58e1461024957806301ffc9a71461027957806302fe5305146102a957806306fdde03146102c5578063081812fc146102e3575b5f80fd5b610263600480360381019061025e919061446a565b6107f1565b60405161027091906144b7565b60405180910390f35b610293600480360381019061028e9190614525565b6108be565b6040516102a0919061456a565b60405180910390f35b6102c360048036038101906102be91906146bf565b610a67565b005b6102cd610a7b565b6040516102da9190614780565b60405180910390f35b6102fd60048036038101906102f891906147a0565b610b07565b60405161030a91906147da565b60405180910390f35b61032d6004803603810190610328919061446a565b610b37565b60405161033a919061456a565b60405180910390f35b61034b610c71565b604051610358919061456a565b60405180910390f35b61037b600480360381019061037691906147a0565b610c83565b6040516103889190614780565b60405180910390f35b610399610c95565b6040516103a691906144b7565b60405180910390f35b6103c960048036038101906103c491906146bf565b610cb9565b005b6103e560048036038101906103e091906147f3565b610cd4565b6040516103f2919061456a565b60405180910390f35b61041560048036038101906104109190614843565b610f06565b60405161042291906144b7565b60405180910390f35b610445600480360381019061044091906149f5565b610f6c565b005b61044f611004565b60405161045c9190614adb565b60405180910390f35b61047f600480360381019061047a9190614bb4565b611028565b60405161048c9190614ce1565b60405180910390f35b61049d611130565b005b6104b960048036038101906104b49190614d2b565b611162565b005b6104c36111c2565b6040516104d091906144b7565b60405180910390f35b6104f360048036038101906104ee91906147a0565b6111e6565b005b6104fd61122f565b60405161050a91906144b7565b60405180910390f35b61052d60048036038101906105289190614d69565b611253565b60405161053a91906144b7565b60405180910390f35b61054b611299565b005b61056760048036038101906105629190614d69565b6112ac565b6040516105749190614ce1565b60405180910390f35b61058561132d565b60405161059291906147da565b60405180910390f35b6105a3611354565b6040516105b09190614780565b60405180910390f35b6105d360048036038101906105ce9190614843565b6113e0565b6040516105e09190614ce1565b60405180910390f35b61060360048036038101906105fe9190614d69565b611561565b604051610610919061456a565b60405180910390f35b61062161157e565b60405161062e91906144b7565b60405180910390f35b610651600480360381019061064c9190614d2b565b611584565b005b61066d6004803603810190610668919061446a565b61159a565b60405161067a919061456a565b60405180910390f35b61069d6004803603810190610698919061446a565b6115b7565b6040516106aa919061456a565b60405180910390f35b6106cd60048036038101906106c891906147a0565b61160f565b6040516106da9190614780565b60405180910390f35b6106eb6119b9565b6040516106f89190614780565b60405180910390f35b61071b60048036038101906107169190614d94565b611a45565b60405161072891906144b7565b60405180910390f35b61074b600480360381019061074691906146bf565b611ac7565b005b61076760048036038101906107629190614d94565b611ae2565b604051610774919061456a565b60405180910390f35b61079760048036038101906107929190614dd2565b611b70565b005b6107a1611c10565b6040516107ae9190614780565b60405180910390f35b6107d160048036038101906107cc9190614d69565b611c9c565b005b6107db611d20565b6040516107e891906144b7565b60405180910390f35b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610857576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a68260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b156108b457600190506108b8565b5f90505b92915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f057507fc5b8f772000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a605750610a5f82611d54565b5b9050919050565b610a6f611dbd565b610a7881611e44565b50565b60088054610a8890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab490614e92565b8015610aff5780601f10610ad657610100808354040283529160200191610aff565b820191905f5260205f20905b815481529060010190602001808311610ae257829003601f168201915b505050505081565b6005602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80339050610b44611e57565b83108015610b5157505f83115b15610c5a57610b6081846115b7565b610ba157806040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b9891906147da565b60405180910390fd5b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c4d91906144b7565b60405180910390a3610c66565b610c65818585611e60565b5b600191505092915050565b600f5f9054906101000a900460ff1681565b6060610c8e8261160f565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cc1611dbd565b80600c9081610cd0919061505f565b5050565b5f610cdd611e57565b821015610ee257610d338260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b610d7457836040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d6b91906147da565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610db75750610db58433611ae2565b155b8015610e1f575060055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e6157336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e5891906147da565b60405180910390fd5b610e8d84847f00000000000000000000000000000000000000000000000000000000000000005f611e72565b60055f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610edd848484600160405180602001604052805f8152505f611f64565b610efb565b610eed843384612253565b610efa8484846001611e72565b5b600190509392505050565b5f610f63838484610f17919061515b565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206122e59092919063ffffffff16565b90509392505050565b610f746123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fba5750610fb985610fb46123a3565b611ae2565b5b610ff0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffd85858585856123aa565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60608151835114611065576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835167ffffffffffffffff8111156110815761108061459b565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b5090505f5b8451811015611125576110fb8582815181106110d3576110d261518e565b5b60200260200101518583815181106110ee576110ed61518e565b5b60200260200101516107f1565b82828151811061110e5761110d61518e565b5b6020026020010181815250508060010190506110b4565b508091505092915050565b611138611dbd565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b61116a611dbd565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6111ee611dbd565b6064817f000000000000000000000000000000000000000000000000000000000000000061121c91906151bb565b6112269190615229565b600e8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6112a1611dbd565b6112aa5f612779565b565b60605f6112b761283a565b0361130c575f67ffffffffffffffff8111156112d6576112d561459b565b5b6040519080825280602002602001820160405280156113045781602001602082028036833780820191505090505b509050611328565b6113258261131861285a565b611320611e57565b6113e0565b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009805461136190614e92565b80601f016020809104026020016040519081016040528092919081815260200182805461138d90614e92565b80156113d85780601f106113af576101008083540402835291602001916113d8565b820191905f5260205f20905b8154815290600101906020018083116113bb57829003601f168201915b505050505081565b606081831061141b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142361285a565b8310156114355761143261285a565b92505b5f61143e611e57565b90508083111561144c578092505b5f8385101561146757611460868686610f06565b905061146b565b5f90505b5f8167ffffffffffffffff8111156114865761148561459b565b5b6040519080825280602002602001820160405280156114b45781602001602082028036833780820191505090505b5090505f60015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f80885f915091505b8481146115515761151a8284611d2690919063ffffffff16565b1561154657818482806001019350815181106115395761153861518e565b5b6020026020010181815250505b816001019150611500565b5050819450505050509392505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61159661158f6123a3565b8383612862565b5050565b5f803390506115ac8185856001611e72565b600191505092915050565b5f6116078260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b905092915050565b6060611619611e57565b8210611651576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61165b836129c9565b5111156116725761166b826129c9565b90506119b4565b5f600d805461168090614e92565b905011156116ba57600d61169383612a5b565b6040516020016116a4929190615313565b60405160208183030381529060405290506119b4565b5f826040516020016116cc9190615356565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611611787576040518060400160405280601381526020017f475152685779462f4469616d6f6e642e6a70670000000000000000000000000081525092506040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525091506040518060e0016040528060be8152602001615d9160be91399050611958565b607f8460ff1611611823576040518060400160405280601081526020017f6777644c6633662f476f6c642e6a70670000000000000000000000000000000081525092506040518060400160405280600481526020017f476f6c6400000000000000000000000000000000000000000000000000000000815250915060405180610100016040528060c88152602001615e4f60c891399050611957565b60bf8460ff16116118be576040518060400160405280601281526020017f464a6d6472646d2f53696c7665722e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f53696c766572000000000000000000000000000000000000000000000000000081525091506040518060c00160405280608e8152602001615d03608e91399050611956565b60ff8460ff1611611955576040518060400160405280601281526020017f594c47334a76632f42726f6e7a652e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f42726f6e7a65000000000000000000000000000000000000000000000000000081525091506040518060c0016040528060818152602001615c826081913990505b5b5b5b5f61196287612a5b565b82600c866040516020016119799493929190615474565b6040516020818303038152906040529050808360405160200161199d9291906155d6565b604051602081830303815290604052955050505050505b919050565b600d80546119c690614e92565b80601f01602080910402602001604051908101604052809291908181526020018280546119f290614e92565b8015611a3d5780601f10611a1457610100808354040283529160200191611a3d565b820191905f5260205f20905b815481529060010190602001808311611a2057829003601f168201915b505050505081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611acf611dbd565b80600d9081611ade919061505f565b5050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611b786123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bbe5750611bbd85611bb86123a3565b611ae2565b5b15611bd757611bd285858585856001611f64565b611c09565b6040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600c8054611c1d90614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4990614e92565b8015611c945780601f10611c6b57610100808354040283529160200191611c94565b820191905f5260205f20905b815481529060010190602001808311611c7757829003601f168201915b505050505081565b611ca4611dbd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d14575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d0b91906147da565b60405180910390fd5b611d1d81612779565b50565b600e5481565b5f80600160ff8416855f015f600887901c81526020019081526020015f2054901c1690508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dc56123a3565b73ffffffffffffffffffffffffffffffffffffffff16611de361132d565b73ffffffffffffffffffffffffffffffffffffffff1614611e4257611e066123a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e3991906147da565b60405180910390fd5b565b8060039081611e53919061505f565b5050565b5f600454905090565b611e6d8383836001612bb4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ee2575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ed991906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f52575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f4991906147da565b60405180910390fd5b611f5e84848484612d83565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611fc9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611fd26123a3565b90505f611fde866131ac565b9050611fec8289898461321f565b60018514801561204757506120468660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b1561211b5761209b8660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6120ea8660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b61211688887f00000000000000000000000000000000000000000000000000000000000000005f611e72565b61214d565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff8a1690508682827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a48873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b60405161221e92919061561a565b60405180910390a4612232848b8b86613282565b841561224757612246848b8b8b8b8b6134b6565b5b50505050505050505050565b5f61225e8484611a45565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122df57818110156122d0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122c793929190615641565b60405180910390fd5b6122de84848484035f612bb4565b5b50505050565b5f80600884901c90505f60ff85169050610101818501106123715761231e81875f015f8581526020019081526020015f2054901c6138b2565b92505f6008828601901c8301905060ff8286011694505f91508260010192505b80831461236f57612360875f015f8581526020019081526020015f20546138b2565b8401935082600101925061233e565b505b612396846101000382885f015f8681526020019081526020015f2054901c901b6138b2565b8301925050509392505050565b5f33905090565b81518351146123e5576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361244a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6124536123a3565b90506124618187878761321f565b5f5b84518110156125ea575f8582815181106124805761247f61518e565b5b602002602001015190505f85838151811061249e5761249d61518e565b5b6020026020010151905060018114801561250357506125028260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b156125ab576125578260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6125a68260015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b6125dd565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050806001019050612463565b50612623868686517f000000000000000000000000000000000000000000000000000000000000000061261d91906151bb565b5f611e72565b5f805f600187516126349190615676565b905073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff88169250602087015183837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b8181146126d5578060200288015184847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612696565b508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a60405161274c9291906156a9565b60405180910390a4612760848a8a8a613282565b61276e848a8a8a8a8a6138fb565b505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61284361285a565b61284b611e57565b612855919061515b565b905090565b5f6001905090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79061574e565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129bc919061456a565b60405180910390a3505050565b6060600380546129d890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0490614e92565b8015612a4f5780601f10612a2657610100808354040283529160200191612a4f565b820191905f5260205f20905b815481529060010190602001808311612a3257829003601f168201915b50505050509050919050565b60605f8203612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612baf565b5f8290505f5b5f8214612ad0578080612ab99061576c565b915050600a82612ac99190615229565b9150612aa7565b5f8167ffffffffffffffff811115612aeb57612aea61459b565b5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b5f8514612ba857600182612b35919061515b565b9150600a85612b4491906157b3565b6030612b509190615676565b60f81b818381518110612b6657612b6561518e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ba19190615229565b9450612b21565b8093505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c24575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612c1b91906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c94575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612c8b91906147da565b60405180910390fd5b8160075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612d7d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612d7491906144b7565b60405180910390a35b50505050565b5f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083821015612e4e578582856040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e4593929190615641565b60405180910390fd5b83820360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555083810160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f3391906144b7565b60405180910390a382156131a4575f600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905080613018575f7f00000000000000000000000000000000000000000000000000000000000000008685612fc1919061515b565b612fcb9190615229565b7f000000000000000000000000000000000000000000000000000000000000000085612ff79190615229565b613001919061515b565b90505f811115613016576130158882613abf565b5b505b600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131a2576001600b541480156130755750805b80156130b3575061308461132d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b1561311a576001600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506002600b819055506131a1565b5f7f0000000000000000000000000000000000000000000000000000000000000000836131479190615229565b7f000000000000000000000000000000000000000000000000000000000000000087856131749190615676565b61317e9190615229565b613188919061515b565b90505f81111561319f5761319c8782613eaf565b50505b505b5b505b505050505050565b6060600167ffffffffffffffff8111156131c9576131c861459b565b5b6040519080825280602002602001820160405280156131f75781602001602082028036833780820191505090505b50905081815f8151811061320e5761320d61518e565b5b602002602001018181525050919050565b50505050565b60ff81166001901b19825f015f600884901c81526020019081526020015f205f82825416925050819055505050565b60ff81166001901b825f015f600884901c81526020019081526020015f205f82825417925050819055505050565b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166134a457600e5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115613352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133499061582d565b60405180910390fd5b600f5f9054906101000a900460ff16156134a3574360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc906158bb565b60405180910390fd5b4360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f8273ffffffffffffffffffffffffffffffffffffffff163b14801561346357505f3273ffffffffffffffffffffffffffffffffffffffff163b145b6134a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349990615949565b60405180910390fd5b5b5b6134b08484848461421e565b50505050565b6134d58473ffffffffffffffffffffffffffffffffffffffff16614224565b156138aa578373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77fd9b67a26000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016135339190615976565b602060405180830381865afa15801561354e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357291906159a3565b15613713578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135b8959493929190615a20565b6020604051808303815f875af19250505080156135f357506040513d601f19601f820116820180604052508101906135f09190615a8c565b60015b61368f576135ff615ac3565b806308c379a00361365b5750613613615ae2565b8061361e575061365d565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136529190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461370d576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506138a9565b8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02878786856040518563ffffffff1660e01b81526004016137529493929190615b71565b6020604051808303815f875af192505050801561378d57506040513d601f19601f8201168201806040525081019061378a9190615a8c565b60015b61382957613799615ac3565b806308c379a0036137f557506137ad615ae2565b806137b857506137f7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ec9190614780565b60405180910390fd5b505b6040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146138a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5b505050505050565b5f8019808314600382048460011c1684039350600582048460021c16600583048516019350601182048460041c850116935060ff8204840260f81c8160081b1792505050919050565b61391a8473ffffffffffffffffffffffffffffffffffffffff16614224565b15613ab7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613960959493929190615bbb565b6020604051808303815f875af192505050801561399b57506040513d601f19601f820116820180604052508101906139989190615a8c565b60015b613a37576139a7615ac3565b806308c379a003613a0357506139bb615ae2565b806139c65750613a05565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fa9190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613ab5576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b24576040517fb817eee700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b2d6123a3565b90505f613b38611e57565b90505f8367ffffffffffffffff811115613b5557613b5461459b565b5b604051908082528060200260200182016040528015613b835781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613ba157613ba061459b565b5b604051908082528060200260200182016040528015613bcf5781602001602082028036833780820191505090505b5090505f5b85811015613ccf576001838281518110613bf157613bf061518e565b5b6020026020010181815250505f613c4d8560015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061423590919063ffffffff16565b905080838381518110613c6357613c6261518e565b5b602002602001018181525050613cbe8160015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b809450508080600101915050613bd4565b50613cdc84875f8461321f565b5f80600187613ceb9190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915060208301515f837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b818114613d7357806020028401515f847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613d34565b5060018703613e1a575f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110613df557613df461518e565b5b60200260200101516001604051613e0d929190615c5a565b60405180910390a4613e99565b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8688604051613e909291906156a9565b60405180910390a45b613ea586895f86613282565b5050505050505050565b6060805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613f17576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8303613f50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f596123a3565b90508367ffffffffffffffff811115613f7557613f7461459b565b5b604051908082528060200260200182016040528015613fa35781602001602082028036833780820191505090505b5092508367ffffffffffffffff811115613fc057613fbf61459b565b5b604051908082528060200260200182016040528015613fee5781602001602082028036833780820191505090505b5091505f613ffa611e57565b905080857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03101561402a575f80fd5b5f5b858110156140845780820185828151811061404a5761404961518e565b5b602002602001018181525050600184828151811061406b5761406a61518e565b5b602002602001018181525050808060010191505061402c565b50614091825f888761321f565b6140e2818660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206142ae9092919063ffffffff16565b8460045f8282546140f39190615676565b925050819055505f8086836141089190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146141885780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061414f565b508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516141ff9291906156a9565b60405180910390a4614213845f8a89613282565b505050509250929050565b50505050565b5f80823b90505f8111915050919050565b5f805f801992508360081c9150815f5284602052831960ff1660405f2054811b811c915082158217614283575b600115614282578383019250825f5260405f205491508215821715614262575b5b505f81146142a6576142948161432b565b600883901b1792508383115f03831792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106143115760405f2082821b815417815560015f510182850160081c5f510160ff8487011695505f93505b80821461430a57815f528460405f20556001820191506142ef565b815f525050505b60405f208284610100031c821b8154178155505050505050565b5f816fffffffffffffffffffffffffffffffff1060071b821560081b17905081811c67ffffffffffffffff1060061b8117905081811c63ffffffff1060051b8117905081811c61ffff1060041b8117905081811c60ff1060031b811790507f07060605060205040602030205040301060502050303040105050304000000006f8421084210842108cc6318c6db6d54be83831c1c601f161a81179050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614406826143dd565b9050919050565b614416816143fc565b8114614420575f80fd5b50565b5f813590506144318161440d565b92915050565b5f819050919050565b61444981614437565b8114614453575f80fd5b50565b5f8135905061446481614440565b92915050565b5f80604083850312156144805761447f6143d5565b5b5f61448d85828601614423565b925050602061449e85828601614456565b9150509250929050565b6144b181614437565b82525050565b5f6020820190506144ca5f8301846144a8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614504816144d0565b811461450e575f80fd5b50565b5f8135905061451f816144fb565b92915050565b5f6020828403121561453a576145396143d5565b5b5f61454784828501614511565b91505092915050565b5f8115159050919050565b61456481614550565b82525050565b5f60208201905061457d5f83018461455b565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6145d18261458b565b810181811067ffffffffffffffff821117156145f0576145ef61459b565b5b80604052505050565b5f6146026143cc565b905061460e82826145c8565b919050565b5f67ffffffffffffffff82111561462d5761462c61459b565b5b6146368261458b565b9050602081019050919050565b828183375f83830152505050565b5f61466361465e84614613565b6145f9565b90508281526020810184848401111561467f5761467e614587565b5b61468a848285614643565b509392505050565b5f82601f8301126146a6576146a5614583565b5b81356146b6848260208601614651565b91505092915050565b5f602082840312156146d4576146d36143d5565b5b5f82013567ffffffffffffffff8111156146f1576146f06143d9565b5b6146fd84828501614692565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561473d578082015181840152602081019050614722565b5f8484015250505050565b5f61475282614706565b61475c8185614710565b935061476c818560208601614720565b6147758161458b565b840191505092915050565b5f6020820190508181035f8301526147988184614748565b905092915050565b5f602082840312156147b5576147b46143d5565b5b5f6147c284828501614456565b91505092915050565b6147d4816143fc565b82525050565b5f6020820190506147ed5f8301846147cb565b92915050565b5f805f6060848603121561480a576148096143d5565b5b5f61481786828701614423565b935050602061482886828701614423565b925050604061483986828701614456565b9150509250925092565b5f805f6060848603121561485a576148596143d5565b5b5f61486786828701614423565b935050602061487886828701614456565b925050604061488986828701614456565b9150509250925092565b5f67ffffffffffffffff8211156148ad576148ac61459b565b5b602082029050602081019050919050565b5f80fd5b5f6148d46148cf84614893565b6145f9565b905080838252602082019050602084028301858111156148f7576148f66148be565b5b835b81811015614920578061490c8882614456565b8452602084019350506020810190506148f9565b5050509392505050565b5f82601f83011261493e5761493d614583565b5b813561494e8482602086016148c2565b91505092915050565b5f67ffffffffffffffff8211156149715761497061459b565b5b61497a8261458b565b9050602081019050919050565b5f61499961499484614957565b6145f9565b9050828152602081018484840111156149b5576149b4614587565b5b6149c0848285614643565b509392505050565b5f82601f8301126149dc576149db614583565b5b81356149ec848260208601614987565b91505092915050565b5f805f805f60a08688031215614a0e57614a0d6143d5565b5b5f614a1b88828901614423565b9550506020614a2c88828901614423565b945050604086013567ffffffffffffffff811115614a4d57614a4c6143d9565b5b614a598882890161492a565b935050606086013567ffffffffffffffff811115614a7a57614a796143d9565b5b614a868882890161492a565b925050608086013567ffffffffffffffff811115614aa757614aa66143d9565b5b614ab3888289016149c8565b9150509295509295909350565b5f60ff82169050919050565b614ad581614ac0565b82525050565b5f602082019050614aee5f830184614acc565b92915050565b5f67ffffffffffffffff821115614b0e57614b0d61459b565b5b602082029050602081019050919050565b5f614b31614b2c84614af4565b6145f9565b90508083825260208201905060208402830185811115614b5457614b536148be565b5b835b81811015614b7d5780614b698882614423565b845260208401935050602081019050614b56565b5050509392505050565b5f82601f830112614b9b57614b9a614583565b5b8135614bab848260208601614b1f565b91505092915050565b5f8060408385031215614bca57614bc96143d5565b5b5f83013567ffffffffffffffff811115614be757614be66143d9565b5b614bf385828601614b87565b925050602083013567ffffffffffffffff811115614c1457614c136143d9565b5b614c208582860161492a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c5c81614437565b82525050565b5f614c6d8383614c53565b60208301905092915050565b5f602082019050919050565b5f614c8f82614c2a565b614c998185614c34565b9350614ca483614c44565b805f5b83811015614cd4578151614cbb8882614c62565b9750614cc683614c79565b925050600181019050614ca7565b5085935050505092915050565b5f6020820190508181035f830152614cf98184614c85565b905092915050565b614d0a81614550565b8114614d14575f80fd5b50565b5f81359050614d2581614d01565b92915050565b5f8060408385031215614d4157614d406143d5565b5b5f614d4e85828601614423565b9250506020614d5f85828601614d17565b9150509250929050565b5f60208284031215614d7e57614d7d6143d5565b5b5f614d8b84828501614423565b91505092915050565b5f8060408385031215614daa57614da96143d5565b5b5f614db785828601614423565b9250506020614dc885828601614423565b9150509250929050565b5f805f805f60a08688031215614deb57614dea6143d5565b5b5f614df888828901614423565b9550506020614e0988828901614423565b9450506040614e1a88828901614456565b9350506060614e2b88828901614456565b925050608086013567ffffffffffffffff811115614e4c57614e4b6143d9565b5b614e58888289016149c8565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ea957607f821691505b602082108103614ebc57614ebb614e65565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee3565b614f288683614ee3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f63614f5e614f5984614437565b614f40565b614437565b9050919050565b5f819050919050565b614f7c83614f49565b614f90614f8882614f6a565b848454614eef565b825550505050565b5f90565b614fa4614f98565b614faf818484614f73565b505050565b5b81811015614fd257614fc75f82614f9c565b600181019050614fb5565b5050565b601f82111561501757614fe881614ec2565b614ff184614ed4565b81016020851015615000578190505b61501461500c85614ed4565b830182614fb4565b50505b505050565b5f82821c905092915050565b5f6150375f198460080261501c565b1980831691505092915050565b5f61504f8383615028565b9150826002028217905092915050565b61506882614706565b67ffffffffffffffff8111156150815761508061459b565b5b61508b8254614e92565b615096828285614fd6565b5f60209050601f8311600181146150c7575f84156150b5578287015190505b6150bf8582615044565b865550615126565b601f1984166150d586614ec2565b5f5b828110156150fc578489015182556001820191506020850194506020810190506150d7565b868310156151195784890151615115601f891682615028565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61516582614437565b915061517083614437565b92508282039050818111156151885761518761512e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6151c582614437565b91506151d083614437565b92508282026151de81614437565b915082820484148315176151f5576151f461512e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523382614437565b915061523e83614437565b92508261524e5761524d6151fc565b5b828204905092915050565b5f81905092915050565b5f815461526f81614e92565b6152798186615259565b9450600182165f811461529357600181146152a8576152da565b60ff19831686528115158202860193506152da565b6152b185614ec2565b5f5b838110156152d2578154818901526001820191506020810190506152b3565b838801955050505b50505092915050565b5f6152ed82614706565b6152f78185615259565b9350615307818560208601614720565b80840191505092915050565b5f61531e8285615263565b915061532a82846152e3565b91508190509392505050565b5f819050919050565b61535061534b82614437565b615336565b82525050565b5f615361828461533f565b60208201915081905092915050565b7f7b226e616d65223a20224552435f444e343034202300000000000000000000005f82015250565b5f6153a4601583615259565b91506153af82615370565b601582019050919050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f6153ee601183615259565b91506153f9826153ba565b601182019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f495f77696c6c5f8201527f5f7275672e636f6d222c22696d616765223a2200000000000000000000000000602082015250565b5f61545e603383615259565b915061546982615404565b603382019050919050565b5f61547e82615398565b915061548a82876152e3565b9150615495826153e2565b91506154a182866152e3565b91506154ac82615452565b91506154b88285615263565b91506154c482846152e3565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f615506601b83615259565b9150615511826154d2565b601b82019050919050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a22435f8201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b5f615576602f83615259565b91506155818261551c565b602f82019050919050565b7f227d5d7d000000000000000000000000000000000000000000000000000000005f82015250565b5f6155c0600483615259565b91506155cb8261558c565b600482019050919050565b5f6155e0826154fa565b91506155ec82856152e3565b91506155f78261556a565b915061560382846152e3565b915061560e826155b4565b91508190509392505050565b5f60408201905061562d5f8301856144a8565b61563a60208301846144a8565b9392505050565b5f6060820190506156545f8301866147cb565b61566160208301856144a8565b61566e60408301846144a8565b949350505050565b5f61568082614437565b915061568b83614437565b92508282019050808211156156a3576156a261512e565b5b92915050565b5f6040820190508181035f8301526156c18185614c85565b905081810360208301526156d58184614c85565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c207374617475735f8201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b5f615738602983614710565b9150615743826156de565b604082019050919050565b5f6020820190508181035f8301526157658161572c565b9050919050565b5f61577682614437565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157a8576157a761512e565b5b600182019050919050565b5f6157bd82614437565b91506157c883614437565b9250826157d8576157d76151fc565b5b828206905092915050565b7f5472616e736665722065786365656473206d6178696d756d2077616c6c6574005f82015250565b5f615817601f83614710565b9150615822826157e3565b602082019050919050565b5f6020820190508181035f8301526158448161580b565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f6158a5602483614710565b91506158b08261584b565b604082019050919050565b5f6020820190508181035f8301526158d281615899565b9050919050565b7f436f6e74726163742074726164696e672072657374726963746564206174206c5f8201527f61756e6368000000000000000000000000000000000000000000000000000000602082015250565b5f615933602583614710565b915061593e826158d9565b604082019050919050565b5f6020820190508181035f83015261596081615927565b9050919050565b615970816144d0565b82525050565b5f6020820190506159895f830184615967565b92915050565b5f8151905061599d81614d01565b92915050565b5f602082840312156159b8576159b76143d5565b5b5f6159c58482850161598f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6159f2826159ce565b6159fc81856159d8565b9350615a0c818560208601614720565b615a158161458b565b840191505092915050565b5f60a082019050615a335f8301886147cb565b615a4060208301876147cb565b615a4d60408301866144a8565b615a5a60608301856144a8565b8181036080830152615a6c81846159e8565b90509695505050505050565b5f81519050615a86816144fb565b92915050565b5f60208284031215615aa157615aa06143d5565b5b5f615aae84828501615a78565b91505092915050565b5f8160e01c9050919050565b5f60033d1115615adf5760045f803e615adc5f51615ab7565b90505b90565b5f60443d10615b6e57615af36143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b1b575050615b6e565b808201805167ffffffffffffffff811115615b395750505050615b6e565b80602083010160043d038501811115615b56575050505050615b6e565b615b65826020018501866145c8565b82955050505050505b90565b5f608082019050615b845f8301876147cb565b615b9160208301866147cb565b615b9e60408301856144a8565b8181036060830152615bb081846159e8565b905095945050505050565b5f60a082019050615bce5f8301886147cb565b615bdb60208301876147cb565b8181036040830152615bed8186614c85565b90508181036060830152615c018185614c85565b90508181036080830152615c1581846159e8565b90509695505050505050565b5f819050919050565b5f615c44615c3f615c3a84615c21565b614f40565b614437565b9050919050565b615c5481615c2a565b82525050565b5f604082019050615c6d5f8301856144a8565b615c7a6020830184615c4b565b939250505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792e526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea264697066735822122028acdccd34741fab027d1d1dc41718835fb61a86355f82f5559288443b46ce1764736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610245575f3560e01c806370a0823111610139578063c5b8f772116100b6578063e985e9c51161007a578063e985e9c51461074d578063f242432a1461077d578063f28ca1dd14610799578063f2fde38b146107b7578063f8b45b05146107d357610245565b8063c5b8f77214610683578063c87b56dd146106b3578063d547cfb7146106e3578063dd62ed3e14610701578063e0df5b6f1461073157610245565b806399a2557a116100fd57806399a2557a146105b95780639b19251a146105e9578063a014e6e214610619578063a22cb46514610637578063a9059cbb1461065357610245565b806370a0823114610513578063715018a6146105435780638462151c1461054d5780638da5cb5b1461057d57806395d89b411461059b57610245565b806323b872dd116101c75780634eabf2c61161018b5780634eabf2c61461049557806353d6fd591461049f5780635afcc2f5146104bb5780635d0044ca146104d95780636d6a6a4d146104f557610245565b806323b872dd146103cb5780632d760d57146103fb5780632eb2c2d61461042b578063313ce567146104475780634e1273f41461046557610245565b8063095ea7b31161020e578063095ea7b3146103135780630a702e8d146103435780630e89341c1461036157806318160ddd1461039157806318d217c3146103af57610245565b8062fdd58e1461024957806301ffc9a71461027957806302fe5305146102a957806306fdde03146102c5578063081812fc146102e3575b5f80fd5b610263600480360381019061025e919061446a565b6107f1565b60405161027091906144b7565b60405180910390f35b610293600480360381019061028e9190614525565b6108be565b6040516102a0919061456a565b60405180910390f35b6102c360048036038101906102be91906146bf565b610a67565b005b6102cd610a7b565b6040516102da9190614780565b60405180910390f35b6102fd60048036038101906102f891906147a0565b610b07565b60405161030a91906147da565b60405180910390f35b61032d6004803603810190610328919061446a565b610b37565b60405161033a919061456a565b60405180910390f35b61034b610c71565b604051610358919061456a565b60405180910390f35b61037b600480360381019061037691906147a0565b610c83565b6040516103889190614780565b60405180910390f35b610399610c95565b6040516103a691906144b7565b60405180910390f35b6103c960048036038101906103c491906146bf565b610cb9565b005b6103e560048036038101906103e091906147f3565b610cd4565b6040516103f2919061456a565b60405180910390f35b61041560048036038101906104109190614843565b610f06565b60405161042291906144b7565b60405180910390f35b610445600480360381019061044091906149f5565b610f6c565b005b61044f611004565b60405161045c9190614adb565b60405180910390f35b61047f600480360381019061047a9190614bb4565b611028565b60405161048c9190614ce1565b60405180910390f35b61049d611130565b005b6104b960048036038101906104b49190614d2b565b611162565b005b6104c36111c2565b6040516104d091906144b7565b60405180910390f35b6104f360048036038101906104ee91906147a0565b6111e6565b005b6104fd61122f565b60405161050a91906144b7565b60405180910390f35b61052d60048036038101906105289190614d69565b611253565b60405161053a91906144b7565b60405180910390f35b61054b611299565b005b61056760048036038101906105629190614d69565b6112ac565b6040516105749190614ce1565b60405180910390f35b61058561132d565b60405161059291906147da565b60405180910390f35b6105a3611354565b6040516105b09190614780565b60405180910390f35b6105d360048036038101906105ce9190614843565b6113e0565b6040516105e09190614ce1565b60405180910390f35b61060360048036038101906105fe9190614d69565b611561565b604051610610919061456a565b60405180910390f35b61062161157e565b60405161062e91906144b7565b60405180910390f35b610651600480360381019061064c9190614d2b565b611584565b005b61066d6004803603810190610668919061446a565b61159a565b60405161067a919061456a565b60405180910390f35b61069d6004803603810190610698919061446a565b6115b7565b6040516106aa919061456a565b60405180910390f35b6106cd60048036038101906106c891906147a0565b61160f565b6040516106da9190614780565b60405180910390f35b6106eb6119b9565b6040516106f89190614780565b60405180910390f35b61071b60048036038101906107169190614d94565b611a45565b60405161072891906144b7565b60405180910390f35b61074b600480360381019061074691906146bf565b611ac7565b005b61076760048036038101906107629190614d94565b611ae2565b604051610774919061456a565b60405180910390f35b61079760048036038101906107929190614dd2565b611b70565b005b6107a1611c10565b6040516107ae9190614780565b60405180910390f35b6107d160048036038101906107cc9190614d69565b611c9c565b005b6107db611d20565b6040516107e891906144b7565b60405180910390f35b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610857576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a68260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b156108b457600190506108b8565b5f90505b92915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f057507fc5b8f772000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a605750610a5f82611d54565b5b9050919050565b610a6f611dbd565b610a7881611e44565b50565b60088054610a8890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab490614e92565b8015610aff5780601f10610ad657610100808354040283529160200191610aff565b820191905f5260205f20905b815481529060010190602001808311610ae257829003601f168201915b505050505081565b6005602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80339050610b44611e57565b83108015610b5157505f83115b15610c5a57610b6081846115b7565b610ba157806040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b9891906147da565b60405180910390fd5b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c4d91906144b7565b60405180910390a3610c66565b610c65818585611e60565b5b600191505092915050565b600f5f9054906101000a900460ff1681565b6060610c8e8261160f565b9050919050565b7f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b610cc1611dbd565b80600c9081610cd0919061505f565b5050565b5f610cdd611e57565b821015610ee257610d338260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b610d7457836040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d6b91906147da565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610db75750610db58433611ae2565b155b8015610e1f575060055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e6157336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e5891906147da565b60405180910390fd5b610e8d84847f0000000000000000000000000000000000000000000000000de0b6b3a76400005f611e72565b60055f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610edd848484600160405180602001604052805f8152505f611f64565b610efb565b610eed843384612253565b610efa8484846001611e72565b5b600190509392505050565b5f610f63838484610f17919061515b565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206122e59092919063ffffffff16565b90509392505050565b610f746123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fba5750610fb985610fb46123a3565b611ae2565b5b610ff0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffd85858585856123aa565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000001281565b60608151835114611065576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835167ffffffffffffffff8111156110815761108061459b565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b5090505f5b8451811015611125576110fb8582815181106110d3576110d261518e565b5b60200260200101518583815181106110ee576110ed61518e565b5b60200260200101516107f1565b82828151811061110e5761110d61518e565b5b6020026020010181815250508060010190506110b4565b508091505092915050565b611138611dbd565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b61116a611dbd565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b6111ee611dbd565b6064817f00000000000000000000000000000000000000000000021e19e0c9bab240000061121c91906151bb565b6112269190615229565b600e8190555050565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6112a1611dbd565b6112aa5f612779565b565b60605f6112b761283a565b0361130c575f67ffffffffffffffff8111156112d6576112d561459b565b5b6040519080825280602002602001820160405280156113045781602001602082028036833780820191505090505b509050611328565b6113258261131861285a565b611320611e57565b6113e0565b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009805461136190614e92565b80601f016020809104026020016040519081016040528092919081815260200182805461138d90614e92565b80156113d85780601f106113af576101008083540402835291602001916113d8565b820191905f5260205f20905b8154815290600101906020018083116113bb57829003601f168201915b505050505081565b606081831061141b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142361285a565b8310156114355761143261285a565b92505b5f61143e611e57565b90508083111561144c578092505b5f8385101561146757611460868686610f06565b905061146b565b5f90505b5f8167ffffffffffffffff8111156114865761148561459b565b5b6040519080825280602002602001820160405280156114b45781602001602082028036833780820191505090505b5090505f60015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f80885f915091505b8481146115515761151a8284611d2690919063ffffffff16565b1561154657818482806001019350815181106115395761153861518e565b5b6020026020010181815250505b816001019150611500565b5050819450505050509392505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61159661158f6123a3565b8383612862565b5050565b5f803390506115ac8185856001611e72565b600191505092915050565b5f6116078260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b905092915050565b6060611619611e57565b8210611651576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61165b836129c9565b5111156116725761166b826129c9565b90506119b4565b5f600d805461168090614e92565b905011156116ba57600d61169383612a5b565b6040516020016116a4929190615313565b60405160208183030381529060405290506119b4565b5f826040516020016116cc9190615356565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611611787576040518060400160405280601381526020017f475152685779462f4469616d6f6e642e6a70670000000000000000000000000081525092506040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525091506040518060e0016040528060be8152602001615d9160be91399050611958565b607f8460ff1611611823576040518060400160405280601081526020017f6777644c6633662f476f6c642e6a70670000000000000000000000000000000081525092506040518060400160405280600481526020017f476f6c6400000000000000000000000000000000000000000000000000000000815250915060405180610100016040528060c88152602001615e4f60c891399050611957565b60bf8460ff16116118be576040518060400160405280601281526020017f464a6d6472646d2f53696c7665722e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f53696c766572000000000000000000000000000000000000000000000000000081525091506040518060c00160405280608e8152602001615d03608e91399050611956565b60ff8460ff1611611955576040518060400160405280601281526020017f594c47334a76632f42726f6e7a652e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f42726f6e7a65000000000000000000000000000000000000000000000000000081525091506040518060c0016040528060818152602001615c826081913990505b5b5b5b5f61196287612a5b565b82600c866040516020016119799493929190615474565b6040516020818303038152906040529050808360405160200161199d9291906155d6565b604051602081830303815290604052955050505050505b919050565b600d80546119c690614e92565b80601f01602080910402602001604051908101604052809291908181526020018280546119f290614e92565b8015611a3d5780601f10611a1457610100808354040283529160200191611a3d565b820191905f5260205f20905b815481529060010190602001808311611a2057829003601f168201915b505050505081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611acf611dbd565b80600d9081611ade919061505f565b5050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611b786123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bbe5750611bbd85611bb86123a3565b611ae2565b5b15611bd757611bd285858585856001611f64565b611c09565b6040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600c8054611c1d90614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4990614e92565b8015611c945780601f10611c6b57610100808354040283529160200191611c94565b820191905f5260205f20905b815481529060010190602001808311611c7757829003601f168201915b505050505081565b611ca4611dbd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d14575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d0b91906147da565b60405180910390fd5b611d1d81612779565b50565b600e5481565b5f80600160ff8416855f015f600887901c81526020019081526020015f2054901c1690508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dc56123a3565b73ffffffffffffffffffffffffffffffffffffffff16611de361132d565b73ffffffffffffffffffffffffffffffffffffffff1614611e4257611e066123a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e3991906147da565b60405180910390fd5b565b8060039081611e53919061505f565b5050565b5f600454905090565b611e6d8383836001612bb4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ee2575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ed991906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f52575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f4991906147da565b60405180910390fd5b611f5e84848484612d83565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611fc9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611fd26123a3565b90505f611fde866131ac565b9050611fec8289898461321f565b60018514801561204757506120468660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b1561211b5761209b8660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6120ea8660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b61211688887f0000000000000000000000000000000000000000000000000de0b6b3a76400005f611e72565b61214d565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff8a1690508682827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a48873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b60405161221e92919061561a565b60405180910390a4612232848b8b86613282565b841561224757612246848b8b8b8b8b6134b6565b5b50505050505050505050565b5f61225e8484611a45565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122df57818110156122d0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122c793929190615641565b60405180910390fd5b6122de84848484035f612bb4565b5b50505050565b5f80600884901c90505f60ff85169050610101818501106123715761231e81875f015f8581526020019081526020015f2054901c6138b2565b92505f6008828601901c8301905060ff8286011694505f91508260010192505b80831461236f57612360875f015f8581526020019081526020015f20546138b2565b8401935082600101925061233e565b505b612396846101000382885f015f8681526020019081526020015f2054901c901b6138b2565b8301925050509392505050565b5f33905090565b81518351146123e5576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361244a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6124536123a3565b90506124618187878761321f565b5f5b84518110156125ea575f8582815181106124805761247f61518e565b5b602002602001015190505f85838151811061249e5761249d61518e565b5b6020026020010151905060018114801561250357506125028260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b156125ab576125578260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6125a68260015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b6125dd565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050806001019050612463565b50612623868686517f0000000000000000000000000000000000000000000000000de0b6b3a764000061261d91906151bb565b5f611e72565b5f805f600187516126349190615676565b905073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff88169250602087015183837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b8181146126d5578060200288015184847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612696565b508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a60405161274c9291906156a9565b60405180910390a4612760848a8a8a613282565b61276e848a8a8a8a8a6138fb565b505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61284361285a565b61284b611e57565b612855919061515b565b905090565b5f6001905090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79061574e565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129bc919061456a565b60405180910390a3505050565b6060600380546129d890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0490614e92565b8015612a4f5780601f10612a2657610100808354040283529160200191612a4f565b820191905f5260205f20905b815481529060010190602001808311612a3257829003601f168201915b50505050509050919050565b60605f8203612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612baf565b5f8290505f5b5f8214612ad0578080612ab99061576c565b915050600a82612ac99190615229565b9150612aa7565b5f8167ffffffffffffffff811115612aeb57612aea61459b565b5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b5f8514612ba857600182612b35919061515b565b9150600a85612b4491906157b3565b6030612b509190615676565b60f81b818381518110612b6657612b6561518e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ba19190615229565b9450612b21565b8093505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c24575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612c1b91906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c94575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612c8b91906147da565b60405180910390fd5b8160075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612d7d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612d7491906144b7565b60405180910390a35b50505050565b5f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083821015612e4e578582856040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e4593929190615641565b60405180910390fd5b83820360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555083810160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f3391906144b7565b60405180910390a382156131a4575f600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905080613018575f7f0000000000000000000000000000000000000000000000000de0b6b3a76400008685612fc1919061515b565b612fcb9190615229565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000085612ff79190615229565b613001919061515b565b90505f811115613016576130158882613abf565b5b505b600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131a2576001600b541480156130755750805b80156130b3575061308461132d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b1561311a576001600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506002600b819055506131a1565b5f7f0000000000000000000000000000000000000000000000000de0b6b3a7640000836131479190615229565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000087856131749190615676565b61317e9190615229565b613188919061515b565b90505f81111561319f5761319c8782613eaf565b50505b505b5b505b505050505050565b6060600167ffffffffffffffff8111156131c9576131c861459b565b5b6040519080825280602002602001820160405280156131f75781602001602082028036833780820191505090505b50905081815f8151811061320e5761320d61518e565b5b602002602001018181525050919050565b50505050565b60ff81166001901b19825f015f600884901c81526020019081526020015f205f82825416925050819055505050565b60ff81166001901b825f015f600884901c81526020019081526020015f205f82825417925050819055505050565b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166134a457600e5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115613352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133499061582d565b60405180910390fd5b600f5f9054906101000a900460ff16156134a3574360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc906158bb565b60405180910390fd5b4360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f8273ffffffffffffffffffffffffffffffffffffffff163b14801561346357505f3273ffffffffffffffffffffffffffffffffffffffff163b145b6134a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349990615949565b60405180910390fd5b5b5b6134b08484848461421e565b50505050565b6134d58473ffffffffffffffffffffffffffffffffffffffff16614224565b156138aa578373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77fd9b67a26000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016135339190615976565b602060405180830381865afa15801561354e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357291906159a3565b15613713578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135b8959493929190615a20565b6020604051808303815f875af19250505080156135f357506040513d601f19601f820116820180604052508101906135f09190615a8c565b60015b61368f576135ff615ac3565b806308c379a00361365b5750613613615ae2565b8061361e575061365d565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136529190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461370d576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506138a9565b8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02878786856040518563ffffffff1660e01b81526004016137529493929190615b71565b6020604051808303815f875af192505050801561378d57506040513d601f19601f8201168201806040525081019061378a9190615a8c565b60015b61382957613799615ac3565b806308c379a0036137f557506137ad615ae2565b806137b857506137f7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ec9190614780565b60405180910390fd5b505b6040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146138a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5b505050505050565b5f8019808314600382048460011c1684039350600582048460021c16600583048516019350601182048460041c850116935060ff8204840260f81c8160081b1792505050919050565b61391a8473ffffffffffffffffffffffffffffffffffffffff16614224565b15613ab7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613960959493929190615bbb565b6020604051808303815f875af192505050801561399b57506040513d601f19601f820116820180604052508101906139989190615a8c565b60015b613a37576139a7615ac3565b806308c379a003613a0357506139bb615ae2565b806139c65750613a05565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fa9190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613ab5576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b24576040517fb817eee700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b2d6123a3565b90505f613b38611e57565b90505f8367ffffffffffffffff811115613b5557613b5461459b565b5b604051908082528060200260200182016040528015613b835781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613ba157613ba061459b565b5b604051908082528060200260200182016040528015613bcf5781602001602082028036833780820191505090505b5090505f5b85811015613ccf576001838281518110613bf157613bf061518e565b5b6020026020010181815250505f613c4d8560015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061423590919063ffffffff16565b905080838381518110613c6357613c6261518e565b5b602002602001018181525050613cbe8160015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b809450508080600101915050613bd4565b50613cdc84875f8461321f565b5f80600187613ceb9190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915060208301515f837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b818114613d7357806020028401515f847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613d34565b5060018703613e1a575f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110613df557613df461518e565b5b60200260200101516001604051613e0d929190615c5a565b60405180910390a4613e99565b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8688604051613e909291906156a9565b60405180910390a45b613ea586895f86613282565b5050505050505050565b6060805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613f17576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8303613f50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f596123a3565b90508367ffffffffffffffff811115613f7557613f7461459b565b5b604051908082528060200260200182016040528015613fa35781602001602082028036833780820191505090505b5092508367ffffffffffffffff811115613fc057613fbf61459b565b5b604051908082528060200260200182016040528015613fee5781602001602082028036833780820191505090505b5091505f613ffa611e57565b905080857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03101561402a575f80fd5b5f5b858110156140845780820185828151811061404a5761404961518e565b5b602002602001018181525050600184828151811061406b5761406a61518e565b5b602002602001018181525050808060010191505061402c565b50614091825f888761321f565b6140e2818660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206142ae9092919063ffffffff16565b8460045f8282546140f39190615676565b925050819055505f8086836141089190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146141885780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061414f565b508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516141ff9291906156a9565b60405180910390a4614213845f8a89613282565b505050509250929050565b50505050565b5f80823b90505f8111915050919050565b5f805f801992508360081c9150815f5284602052831960ff1660405f2054811b811c915082158217614283575b600115614282578383019250825f5260405f205491508215821715614262575b5b505f81146142a6576142948161432b565b600883901b1792508383115f03831792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106143115760405f2082821b815417815560015f510182850160081c5f510160ff8487011695505f93505b80821461430a57815f528460405f20556001820191506142ef565b815f525050505b60405f208284610100031c821b8154178155505050505050565b5f816fffffffffffffffffffffffffffffffff1060071b821560081b17905081811c67ffffffffffffffff1060061b8117905081811c63ffffffff1060051b8117905081811c61ffff1060041b8117905081811c60ff1060031b811790507f07060605060205040602030205040301060502050303040105050304000000006f8421084210842108cc6318c6db6d54be83831c1c601f161a81179050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614406826143dd565b9050919050565b614416816143fc565b8114614420575f80fd5b50565b5f813590506144318161440d565b92915050565b5f819050919050565b61444981614437565b8114614453575f80fd5b50565b5f8135905061446481614440565b92915050565b5f80604083850312156144805761447f6143d5565b5b5f61448d85828601614423565b925050602061449e85828601614456565b9150509250929050565b6144b181614437565b82525050565b5f6020820190506144ca5f8301846144a8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614504816144d0565b811461450e575f80fd5b50565b5f8135905061451f816144fb565b92915050565b5f6020828403121561453a576145396143d5565b5b5f61454784828501614511565b91505092915050565b5f8115159050919050565b61456481614550565b82525050565b5f60208201905061457d5f83018461455b565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6145d18261458b565b810181811067ffffffffffffffff821117156145f0576145ef61459b565b5b80604052505050565b5f6146026143cc565b905061460e82826145c8565b919050565b5f67ffffffffffffffff82111561462d5761462c61459b565b5b6146368261458b565b9050602081019050919050565b828183375f83830152505050565b5f61466361465e84614613565b6145f9565b90508281526020810184848401111561467f5761467e614587565b5b61468a848285614643565b509392505050565b5f82601f8301126146a6576146a5614583565b5b81356146b6848260208601614651565b91505092915050565b5f602082840312156146d4576146d36143d5565b5b5f82013567ffffffffffffffff8111156146f1576146f06143d9565b5b6146fd84828501614692565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561473d578082015181840152602081019050614722565b5f8484015250505050565b5f61475282614706565b61475c8185614710565b935061476c818560208601614720565b6147758161458b565b840191505092915050565b5f6020820190508181035f8301526147988184614748565b905092915050565b5f602082840312156147b5576147b46143d5565b5b5f6147c284828501614456565b91505092915050565b6147d4816143fc565b82525050565b5f6020820190506147ed5f8301846147cb565b92915050565b5f805f6060848603121561480a576148096143d5565b5b5f61481786828701614423565b935050602061482886828701614423565b925050604061483986828701614456565b9150509250925092565b5f805f6060848603121561485a576148596143d5565b5b5f61486786828701614423565b935050602061487886828701614456565b925050604061488986828701614456565b9150509250925092565b5f67ffffffffffffffff8211156148ad576148ac61459b565b5b602082029050602081019050919050565b5f80fd5b5f6148d46148cf84614893565b6145f9565b905080838252602082019050602084028301858111156148f7576148f66148be565b5b835b81811015614920578061490c8882614456565b8452602084019350506020810190506148f9565b5050509392505050565b5f82601f83011261493e5761493d614583565b5b813561494e8482602086016148c2565b91505092915050565b5f67ffffffffffffffff8211156149715761497061459b565b5b61497a8261458b565b9050602081019050919050565b5f61499961499484614957565b6145f9565b9050828152602081018484840111156149b5576149b4614587565b5b6149c0848285614643565b509392505050565b5f82601f8301126149dc576149db614583565b5b81356149ec848260208601614987565b91505092915050565b5f805f805f60a08688031215614a0e57614a0d6143d5565b5b5f614a1b88828901614423565b9550506020614a2c88828901614423565b945050604086013567ffffffffffffffff811115614a4d57614a4c6143d9565b5b614a598882890161492a565b935050606086013567ffffffffffffffff811115614a7a57614a796143d9565b5b614a868882890161492a565b925050608086013567ffffffffffffffff811115614aa757614aa66143d9565b5b614ab3888289016149c8565b9150509295509295909350565b5f60ff82169050919050565b614ad581614ac0565b82525050565b5f602082019050614aee5f830184614acc565b92915050565b5f67ffffffffffffffff821115614b0e57614b0d61459b565b5b602082029050602081019050919050565b5f614b31614b2c84614af4565b6145f9565b90508083825260208201905060208402830185811115614b5457614b536148be565b5b835b81811015614b7d5780614b698882614423565b845260208401935050602081019050614b56565b5050509392505050565b5f82601f830112614b9b57614b9a614583565b5b8135614bab848260208601614b1f565b91505092915050565b5f8060408385031215614bca57614bc96143d5565b5b5f83013567ffffffffffffffff811115614be757614be66143d9565b5b614bf385828601614b87565b925050602083013567ffffffffffffffff811115614c1457614c136143d9565b5b614c208582860161492a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c5c81614437565b82525050565b5f614c6d8383614c53565b60208301905092915050565b5f602082019050919050565b5f614c8f82614c2a565b614c998185614c34565b9350614ca483614c44565b805f5b83811015614cd4578151614cbb8882614c62565b9750614cc683614c79565b925050600181019050614ca7565b5085935050505092915050565b5f6020820190508181035f830152614cf98184614c85565b905092915050565b614d0a81614550565b8114614d14575f80fd5b50565b5f81359050614d2581614d01565b92915050565b5f8060408385031215614d4157614d406143d5565b5b5f614d4e85828601614423565b9250506020614d5f85828601614d17565b9150509250929050565b5f60208284031215614d7e57614d7d6143d5565b5b5f614d8b84828501614423565b91505092915050565b5f8060408385031215614daa57614da96143d5565b5b5f614db785828601614423565b9250506020614dc885828601614423565b9150509250929050565b5f805f805f60a08688031215614deb57614dea6143d5565b5b5f614df888828901614423565b9550506020614e0988828901614423565b9450506040614e1a88828901614456565b9350506060614e2b88828901614456565b925050608086013567ffffffffffffffff811115614e4c57614e4b6143d9565b5b614e58888289016149c8565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ea957607f821691505b602082108103614ebc57614ebb614e65565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee3565b614f288683614ee3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f63614f5e614f5984614437565b614f40565b614437565b9050919050565b5f819050919050565b614f7c83614f49565b614f90614f8882614f6a565b848454614eef565b825550505050565b5f90565b614fa4614f98565b614faf818484614f73565b505050565b5b81811015614fd257614fc75f82614f9c565b600181019050614fb5565b5050565b601f82111561501757614fe881614ec2565b614ff184614ed4565b81016020851015615000578190505b61501461500c85614ed4565b830182614fb4565b50505b505050565b5f82821c905092915050565b5f6150375f198460080261501c565b1980831691505092915050565b5f61504f8383615028565b9150826002028217905092915050565b61506882614706565b67ffffffffffffffff8111156150815761508061459b565b5b61508b8254614e92565b615096828285614fd6565b5f60209050601f8311600181146150c7575f84156150b5578287015190505b6150bf8582615044565b865550615126565b601f1984166150d586614ec2565b5f5b828110156150fc578489015182556001820191506020850194506020810190506150d7565b868310156151195784890151615115601f891682615028565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61516582614437565b915061517083614437565b92508282039050818111156151885761518761512e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6151c582614437565b91506151d083614437565b92508282026151de81614437565b915082820484148315176151f5576151f461512e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523382614437565b915061523e83614437565b92508261524e5761524d6151fc565b5b828204905092915050565b5f81905092915050565b5f815461526f81614e92565b6152798186615259565b9450600182165f811461529357600181146152a8576152da565b60ff19831686528115158202860193506152da565b6152b185614ec2565b5f5b838110156152d2578154818901526001820191506020810190506152b3565b838801955050505b50505092915050565b5f6152ed82614706565b6152f78185615259565b9350615307818560208601614720565b80840191505092915050565b5f61531e8285615263565b915061532a82846152e3565b91508190509392505050565b5f819050919050565b61535061534b82614437565b615336565b82525050565b5f615361828461533f565b60208201915081905092915050565b7f7b226e616d65223a20224552435f444e343034202300000000000000000000005f82015250565b5f6153a4601583615259565b91506153af82615370565b601582019050919050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f6153ee601183615259565b91506153f9826153ba565b601182019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f495f77696c6c5f8201527f5f7275672e636f6d222c22696d616765223a2200000000000000000000000000602082015250565b5f61545e603383615259565b915061546982615404565b603382019050919050565b5f61547e82615398565b915061548a82876152e3565b9150615495826153e2565b91506154a182866152e3565b91506154ac82615452565b91506154b88285615263565b91506154c482846152e3565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f615506601b83615259565b9150615511826154d2565b601b82019050919050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a22435f8201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b5f615576602f83615259565b91506155818261551c565b602f82019050919050565b7f227d5d7d000000000000000000000000000000000000000000000000000000005f82015250565b5f6155c0600483615259565b91506155cb8261558c565b600482019050919050565b5f6155e0826154fa565b91506155ec82856152e3565b91506155f78261556a565b915061560382846152e3565b915061560e826155b4565b91508190509392505050565b5f60408201905061562d5f8301856144a8565b61563a60208301846144a8565b9392505050565b5f6060820190506156545f8301866147cb565b61566160208301856144a8565b61566e60408301846144a8565b949350505050565b5f61568082614437565b915061568b83614437565b92508282019050808211156156a3576156a261512e565b5b92915050565b5f6040820190508181035f8301526156c18185614c85565b905081810360208301526156d58184614c85565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c207374617475735f8201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b5f615738602983614710565b9150615743826156de565b604082019050919050565b5f6020820190508181035f8301526157658161572c565b9050919050565b5f61577682614437565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157a8576157a761512e565b5b600182019050919050565b5f6157bd82614437565b91506157c883614437565b9250826157d8576157d76151fc565b5b828206905092915050565b7f5472616e736665722065786365656473206d6178696d756d2077616c6c6574005f82015250565b5f615817601f83614710565b9150615822826157e3565b602082019050919050565b5f6020820190508181035f8301526158448161580b565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f6158a5602483614710565b91506158b08261584b565b604082019050919050565b5f6020820190508181035f8301526158d281615899565b9050919050565b7f436f6e74726163742074726164696e672072657374726963746564206174206c5f8201527f61756e6368000000000000000000000000000000000000000000000000000000602082015250565b5f615933602583614710565b915061593e826158d9565b604082019050919050565b5f6020820190508181035f83015261596081615927565b9050919050565b615970816144d0565b82525050565b5f6020820190506159895f830184615967565b92915050565b5f8151905061599d81614d01565b92915050565b5f602082840312156159b8576159b76143d5565b5b5f6159c58482850161598f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6159f2826159ce565b6159fc81856159d8565b9350615a0c818560208601614720565b615a158161458b565b840191505092915050565b5f60a082019050615a335f8301886147cb565b615a4060208301876147cb565b615a4d60408301866144a8565b615a5a60608301856144a8565b8181036080830152615a6c81846159e8565b90509695505050505050565b5f81519050615a86816144fb565b92915050565b5f60208284031215615aa157615aa06143d5565b5b5f615aae84828501615a78565b91505092915050565b5f8160e01c9050919050565b5f60033d1115615adf5760045f803e615adc5f51615ab7565b90505b90565b5f60443d10615b6e57615af36143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b1b575050615b6e565b808201805167ffffffffffffffff811115615b395750505050615b6e565b80602083010160043d038501811115615b56575050505050615b6e565b615b65826020018501866145c8565b82955050505050505b90565b5f608082019050615b845f8301876147cb565b615b9160208301866147cb565b615b9e60408301856144a8565b8181036060830152615bb081846159e8565b905095945050505050565b5f60a082019050615bce5f8301886147cb565b615bdb60208301876147cb565b8181036040830152615bed8186614c85565b90508181036060830152615c018185614c85565b90508181036080830152615c1581846159e8565b90509695505050505050565b5f819050919050565b5f615c44615c3f615c3a84615c21565b614f40565b614437565b9050919050565b615c5481615c2a565b82525050565b5f604082019050615c6d5f8301856144a8565b615c7a6020830184615c4b565b939250505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792e526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea264697066735822122028acdccd34741fab027d1d1dc41718835fb61a86355f82f5559288443b46ce1764736f6c63430008180033

Deployed Bytecode Sourcemap

74635:4340:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46403:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44611:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76540:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42229:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41958:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67744:483;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75078:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78864:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42401:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76320:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68376:827;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46082:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48444:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42334:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46887:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76097:91;;;:::i;:::-;;43572:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42514:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76196:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42469:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45740:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2883:103;;;:::i;:::-;;74378:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2208:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42277:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72662:1264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42597:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42724:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47490:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67400:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44399:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76639:2217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74729:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67594:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76426:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47717:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47957:410;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74701:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3141:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75047:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46403:318;46489:7;46531:1;46512:21;;:7;:21;;;46509:88;;46557:28;;;;;;;;;;;;;;46509:88;46610:23;46630:2;46610:6;:15;46617:7;46610:15;;;;;;;;;;;;;;;:19;;:23;;;;:::i;:::-;46607:104;;;46657:1;46650:8;;;;46607:104;46698:1;46691:8;;46403:318;;;;;:::o;44611:527::-;44713:4;44765:26;44750:41;;;:11;:41;;;;:110;;;;44823:37;44808:52;;;:11;:52;;;;44750:110;:165;;;;44892:23;44877:38;;;:11;:38;;;;44750:165;:207;;;;44947:10;44932:25;;:11;:25;;;;44750:207;:284;;;;45024:10;45009:25;;:11;:25;;;;44750:284;:380;;;;45094:36;45118:11;45094:23;:36::i;:::-;44750:380;44730:400;;44611:527;;;:::o;76540:91::-;2094:13;:11;:13::i;:::-;76608:15:::1;76616:6;76608:7;:15::i;:::-;76540:91:::0;:::o;42229:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41958:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;67744:483::-;67817:4;67834:13;67850:10;67834:26;;67883:14;:12;:14::i;:::-;67875:5;:22;:35;;;;;67909:1;67901:5;:9;67875:35;67871:327;;;67933:23;67943:5;67950;67933:9;:23::i;:::-;67929:96;;68003:5;67984:25;;;;;;;;;;;:::i;:::-;;;;;;;;67929:96;68062:7;68041:11;:18;68053:5;68041:18;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68107:7;68091:31;;68100:5;68091:31;;;68116:5;68091:31;;;;;;:::i;:::-;;;;;;;;67871:327;;;68155:31;68164:5;68171:7;68180:5;68155:8;:31::i;:::-;67871:327;68215:4;68208:11;;;67744:483;;;;:::o;75078:32::-;;;;;;;;;;;;;:::o;78864:108::-;78919:13;78952:12;78961:2;78952:8;:12::i;:::-;78945:19;;78864:108;;;:::o;42401:36::-;;;:::o;76320:98::-;2094:13;:11;:13::i;:::-;76402:8:::1;76392:7;:18;;;;;;:::i;:::-;;76320:98:::0;:::o;68376:827::-;68463:4;68492:14;:12;:14::i;:::-;68484:5;:22;68480:694;;;68527:23;68544:5;68527:6;:12;68534:4;68527:12;;;;;;;;;;;;;;;:16;;:23;;;;:::i;:::-;68523:96;;68598:4;68578:25;;;;;;;;;;;:::i;:::-;;;;;;;;68523:96;68675:4;68661:18;;:10;:18;;;;:74;;;;;68701:34;68718:4;68724:10;68701:16;:34::i;:::-;68700:35;68661:74;:127;;;;;68770:11;:18;68782:5;68770:18;;;;;;;;;;;;;;;;;;;;;68756:32;;:10;:32;;;;68661:127;68639:238;;;68850:10;68830:31;;;;;;;;;;;:::i;:::-;;;;;;;;68639:238;68893:40;68903:4;68909:2;68913:12;68927:5;68893:9;:40::i;:::-;68957:11;:18;68969:5;68957:18;;;;;;;;;;;;68950:25;;;;;;;;;;;68992:48;69010:4;69016:2;69020:5;69027:1;68992:48;;;;;;;;;;;;69034:5;68992:17;:48::i;:::-;68480:694;;;69075:40;69091:4;69097:10;69109:5;69075:15;:40::i;:::-;69130:32;69140:4;69146:2;69150:5;69157:4;69130:9;:32::i;:::-;68480:694;69191:4;69184:11;;68376:827;;;;;:::o;46082:170::-;46174:7;46201:43;46224:5;46238;46231:4;:12;;;;:::i;:::-;46201:6;:13;46208:5;46201:13;;;;;;;;;;;;;;;:22;;:43;;;;;:::i;:::-;46194:50;;46082:170;;;;;:::o;48444:418::-;48668:12;:10;:12::i;:::-;48660:20;;:4;:20;;;:60;;;;48684:36;48701:4;48707:12;:10;:12::i;:::-;48684:16;:36::i;:::-;48660:60;48655:137;;48745:35;;;;;;;;;;;;;;48655:137;48802:52;48825:4;48831:2;48835:3;48840:7;48849:4;48802:22;:52::i;:::-;48444:418;;;;;:::o;42334:31::-;;;:::o;46887:530::-;47043:16;47099:3;:10;47080:8;:15;:29;47077:90;;47133:22;;;;;;;;;;;;;;47077:90;47179:30;47226:8;:15;47212:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47179:63;;47260:9;47255:122;47279:8;:15;47275:1;:19;47255:122;;;47335:30;47345:8;47354:1;47345:11;;;;;;;;:::i;:::-;;;;;;;;47358:3;47362:1;47358:6;;;;;;;;:::i;:::-;;;;;;;;47335:9;:30::i;:::-;47316:13;47330:1;47316:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;47296:3;;;;;47255:122;;;;47396:13;47389:20;;;46887:530;;;;:::o;76097:91::-;2094:13;:11;:13::i;:::-;76167::::1;;;;;;;;;;;76166:14;76150:13;;:30;;;;;;;;;;;;;;;;;;76097:91::o:0;43572:119::-;2094:13;:11;:13::i;:::-;43678:5:::1;43658:9;:17;43668:6;43658:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;43572:119:::0;;:::o;42514:37::-;;;:::o;76196:116::-;2094:13;:11;:13::i;:::-;76301:3:::1;76291:7;76277:11;:21;;;;:::i;:::-;:27;;;;:::i;:::-;76265:9;:39;;;;76196:116:::0;:::o;42469:38::-;;;:::o;45740:114::-;45803:7;45830:9;:16;45840:5;45830:16;;;;;;;;;;;;;;;;45823:23;;45740:114;;;:::o;2883:103::-;2094:13;:11;:13::i;:::-;2948:30:::1;2975:1;2948:18;:30::i;:::-;2883:103::o:0;74378:250::-;74445:16;74495:1;74477:14;:12;:14::i;:::-;:19;74474:74;;74534:1;74520:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74513:23;;;;74474:74;74565:55;74581:5;74588:15;:13;:15::i;:::-;74605:14;:12;:14::i;:::-;74565:15;:55::i;:::-;74558:62;;74378:250;;;;:::o;2208:87::-;2254:7;2281:6;;;;;;;;;;;2274:13;;2208:87;:::o;42277:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72662:1264::-;72794:16;72861:4;72852:5;:13;72848:45;;72874:19;;;;;;;;;;;;;;72848:45;73007:15;:13;:15::i;:::-;72999:5;:23;72995:87;;;73051:15;:13;:15::i;:::-;73043:23;;72995:87;73161:17;73181:14;:12;:14::i;:::-;73161:34;;73221:9;73214:4;:16;73210:73;;;73258:9;73251:16;;73210:73;73299:22;73347:4;73339:5;:12;73336:157;;;73389:29;73399:5;73406;73413:4;73389:9;:29::i;:::-;73372:46;;73336:157;;;73476:1;73459:18;;73336:157;73521:25;73563:14;73549:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73521:57;;73595:29;73627:6;:13;73634:5;73627:13;;;;;;;;;;;;;;;73595:45;;73675:9;73686:19;73710:5;73717:1;73674:45;;;;73669:209;73736:14;73721:11;:29;73669:209;;73779:11;73788:1;73779:4;:8;;:11;;;;:::i;:::-;73776:87;;;73842:1;73816:8;73825:13;;;;;;73816:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;73776:87;73752:3;;;;;73669:209;;;;;73899:8;73892:15;;;;;;72662:1264;;;;;:::o;42597:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;42724:29::-;;;;:::o;47490:155::-;47585:52;47604:12;:10;:12::i;:::-;47618:8;47628;47585:18;:52::i;:::-;47490:155;;:::o;67400:186::-;67469:4;67486:13;67502:10;67486:26;;67523:33;67533:5;67540:2;67544:5;67551:4;67523:9;:33::i;:::-;67574:4;67567:11;;;67400:186;;;;:::o;44399:140::-;44484:4;44508:23;44528:2;44508:6;:15;44515:7;44508:15;;;;;;;;;;;;;;;:19;;:23;;;;:::i;:::-;44501:30;;44399:140;;;;:::o;76639:2217::-;76690:13;76725:14;:12;:14::i;:::-;76719:2;:20;76716:54;;76748:22;;;;;;;;;;;;;;76716:54;76817:1;76793:13;76803:2;76793:9;:13::i;:::-;76787:27;:31;76783:70;;;76840:13;76850:2;76840:9;:13::i;:::-;76833:20;;;;76783:70;76897:1;76874:12;76868:26;;;;;:::i;:::-;;;:30;76864:1985;;;76944:12;76958:13;:2;:11;:13::i;:::-;76927:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76913:60;;;;76864:1985;77004:10;77057:2;77040:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;77030:31;;;;;;77017:46;;77004:59;;77080:19;77114;77148:25;77202:2;77194:4;:10;;;77190:1276;;77225:29;;;;;;;;;;;;;;;;;;;77273:17;;;;;;;;;;;;;;;;;;;77309:206;;;;;;;;;;;;;;;;;;;77190:1276;;;77549:3;77541:4;:11;;;77537:929;;77573:26;;;;;;;;;;;;;;;;;;;77618:14;;;;;;;;;;;;;;;;;;;77651:216;;;;;;;;;;;;;;;;;;;77537:929;;;77901:3;77893:4;:11;;;77889:577;;77925:28;;;;;;;;;;;;;;;;;;;77972:16;;;;;;;;;;;;;;;;;;;78007:158;;;;;;;;;;;;;;;;;;;77889:577;;;78199:3;78191:4;:11;;;78187:279;;78223:28;;;;;;;;;;;;;;;;;;;78270:16;;;;;;;;;;;;;;;;;;;78305:145;;;;;;;;;;;;;;;;;;;78187:279;77889:577;77537:929;77190:1276;78482:26;78560:13;:2;:11;:13::i;:::-;78596:11;78664:7;78673:5;78518:161;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78482:198;;78757:12;78822:5;78709:127;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78695:142;;;;;;;76639:2217;;;;:::o;74729:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67594:142::-;67674:7;67701:11;:18;67713:5;67701:18;;;;;;;;;;;;;;;:27;67720:7;67701:27;;;;;;;;;;;;;;;;67694:34;;67594:142;;;;:::o;76426:106::-;2094:13;:11;:13::i;:::-;76515:9:::1;76500:12;:24;;;;;;:::i;:::-;;76426:106:::0;:::o;47717:168::-;47816:4;47840:18;:27;47859:7;47840:27;;;;;;;;;;;;;;;:37;47868:8;47840:37;;;;;;;;;;;;;;;;;;;;;;;;;47833:44;;47717:168;;;;:::o;47957:410::-;48154:12;:10;:12::i;:::-;48146:20;;:4;:20;;;:60;;;;48170:36;48187:4;48193:12;:10;:12::i;:::-;48170:16;:36::i;:::-;48146:60;48143:217;;;48222:51;48240:4;48246:2;48250;48254:6;48262:4;48268;48222:17;:51::i;:::-;48143:217;;;48313:35;;;;;;;;;;;;;;48143:217;47957:410;;;;;:::o;74701:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3141:220::-;2094:13;:11;:13::i;:::-;3246:1:::1;3226:22;;:8;:22;;::::0;3222:93:::1;;3300:1;3272:31;;;;;;;;;;;:::i;:::-;;;;;;;;3222:93;3325:28;3344:8;3325:18;:28::i;:::-;3141:220:::0;:::o;75047:24::-;;;;:::o;33606:488::-;33680:10;33929:9;33986:1;33977:4;33969:5;:12;33942:6;:10;;:22;33962:1;33953:5;:10;;33942:22;;;;;;;;;;;;:40;;33941:46;33929:58;;34075:1;34066:10;;34051:36;33606:488;;;;:::o;24167:157::-;24252:4;24291:25;24276:40;;;:11;:40;;;;24269:47;;24167:157;;;:::o;2373:166::-;2444:12;:10;:12::i;:::-;2433:23;;:7;:5;:7::i;:::-;:23;;;2429:103;;2507:12;:10;:12::i;:::-;2480:40;;;;;;;;;;;:::i;:::-;;;;;;;;2429:103;2373:166::o;54926:88::-;55000:6;54993:4;:13;;;;;;:::i;:::-;;54926:88;:::o;44004:95::-;44051:7;44078:13;;44071:20;;44004:95;:::o;71192:130::-;71277:37;71286:5;71293:7;71302:5;71309:4;71277:8;:37::i;:::-;71192:130;;;:::o;69211:325::-;69322:1;69306:18;;:4;:18;;;69302:88;;69375:1;69348:30;;;;;;;;;;;:::i;:::-;;;;;;;;69302:88;69418:1;69404:16;;:2;:16;;;69400:88;;69473:1;69444:32;;;;;;;;;;;:::i;:::-;;;;;;;;69400:88;69498:30;69506:4;69512:2;69516:5;69523:4;69498:7;:30::i;:::-;69211:325;;;;:::o;49361:1590::-;49579:1;49565:16;;:2;:16;;;49562:78;;49605:23;;;;;;;;;;;;;;49562:78;49652:16;49671:12;:10;:12::i;:::-;49652:31;;49694:20;49717:21;49735:2;49717:17;:21::i;:::-;49694:44;;49751:45;49772:8;49782:4;49788:2;49792:3;49751:20;:45::i;:::-;49822:1;49812:6;:11;:35;;;;;49827:20;49844:2;49827:6;:12;49834:4;49827:12;;;;;;;;;;;;;;;:16;;:20;;;;:::i;:::-;49812:35;49809:260;;;49864:22;49883:2;49864:6;:12;49871:4;49864:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;49901:18;49916:2;49901:6;:10;49908:2;49901:10;;;;;;;;;;;;;;;:14;;:18;;;;:::i;:::-;49934:40;49944:4;49950:2;49954:12;49968:5;49934:9;:40::i;:::-;49809:260;;;50014:43;;;;;;;;;;;;;;49809:260;50081:16;50108:18;50275:16;50271:2;50267:25;50255:37;;50330:16;50324:4;50320:27;50306:41;;50673:6;50637:8;50597:10;50539:25;50484:1;50427;50404:304;50767:2;50736:46;;50761:4;50736:46;;50751:8;50736:46;;;50771:2;50775:6;50736:46;;;;;;;:::i;:::-;;;;;;;;50795:44;50815:8;50825:4;50831:2;50835:3;50795:19;:44::i;:::-;50855:5;50852:91;;;50875:68;50906:8;50916:4;50922:2;50926;50930:6;50938:4;50875:30;:68::i;:::-;50852:91;49551:1400;;;;49361:1590;;;;;;:::o;71781:487::-;71881:24;71908:25;71918:5;71925:7;71908:9;:25::i;:::-;71881:52;;71968:17;71948:16;:37;71944:317;;72025:5;72006:16;:24;72002:132;;;72085:7;72094:16;72112:5;72058:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;72002:132;72177:57;72186:5;72193:7;72221:5;72202:16;:24;72228:5;72177:8;:57::i;:::-;71944:317;71870:398;71781:487;;;:::o;38705:786::-;38827:13;38883:14;38909:1;38900:5;:10;;38883:27;;38925:13;38949:4;38941:5;:12;38925:28;;38991:3;38983:5;38974:6;:14;:20;38968:417;;39024:44;39062:5;39040:6;:10;;:18;39051:6;39040:18;;;;;;;;;;;;:27;;39024:15;:44::i;:::-;39016:52;;39087:17;39137:1;39127:5;39118:6;:14;39117:21;;39107:6;:32;39087:52;;39186:4;39177:5;39168:6;:14;39167:23;39158:32;;39217:1;39209:9;;39242:8;;;;;39237:133;39262:9;39252:6;:19;39237:133;;39315:35;39331:6;:10;;:18;39342:6;39331:18;;;;;;;;;;;;39315:15;:35::i;:::-;39306:44;;;;39273:8;;;;;39237:133;;;38997:388;38968:417;39408:64;39464:6;39458:3;:12;39447:5;39425:6;:10;;:18;39436:6;39425:18;;;;;;;;;;;;:27;;39424:47;;39408:15;:64::i;:::-;39399:73;;;;38858:626;;38705:786;;;;;:::o;349:98::-;402:7;429:10;422:17;;349:98;:::o;51309:2773::-;51531:7;:14;51517:3;:10;:28;51514:89;;51569:22;;;;;;;;;;;;;;51514:89;51632:1;51618:16;;:2;:16;;;51615:78;;51658:23;;;;;;;;;;;;;;51615:78;51703:16;51722:12;:10;:12::i;:::-;51703:31;;51747:45;51768:8;51778:4;51784:2;51788:3;51747:20;:45::i;:::-;51810:9;51805:370;51829:3;:10;51825:1;:14;51805:370;;;51861:10;51874:3;51878:1;51874:6;;;;;;;;:::i;:::-;;;;;;;;51861:19;;51895:14;51912:7;51920:1;51912:10;;;;;;;;:::i;:::-;;;;;;;;51895:27;;51952:1;51942:6;:11;:35;;;;;51957:20;51974:2;51957:6;:12;51964:4;51957:12;;;;;;;;;;;;;;;:16;;:20;;;;:::i;:::-;51942:35;51939:225;;;51998:22;52017:2;51998:6;:12;52005:4;51998:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;52039:18;52054:2;52039:6;:10;52046:2;52039:10;;;;;;;;;;;;;;;:14;;:18;;;;:::i;:::-;51939:225;;;52105:43;;;;;;;;;;;;;;51939:225;51846:329;;51841:3;;;;;51805:370;;;;52185:53;52195:4;52201:2;52220:3;:10;52205:12;:25;;;;:::i;:::-;52232:5;52185:9;:53::i;:::-;52251:16;52278:18;52307:11;52334:1;52321:3;:10;:14;;;;:::i;:::-;52307:28;;52824:16;52818:4;52814:27;52800:41;;52875:16;52871:2;52867:25;52855:37;;53233:4;53228:3;53224:14;53218:21;53182:8;53142:10;53084:25;53029:1;52972;52949:319;53556:1;53518:336;53592:3;53583:7;53580:16;53518:336;;53828:7;53822:4;53818:18;53813:3;53809:28;53803:35;53793:8;53781:10;53754:25;53751:1;53748;53743:96;53641:1;53632:7;53628:15;53617:26;;53518:336;;;53522:50;53912:2;53882:47;;53906:4;53882:47;;53896:8;53882:47;;;53916:3;53921:7;53882:47;;;;;;;:::i;:::-;;;;;;;;53942:44;53962:8;53972:4;53978:2;53982:3;53942:19;:44::i;:::-;53999:75;54035:8;54045:4;54051:2;54055:3;54060:7;54069:4;53999:35;:75::i;:::-;51503:2579;;;;51309:2773;;;;;:::o;3521:191::-;3595:16;3614:6;;;;;;;;;;;3595:25;;3640:8;3631:6;;:17;;;;;;;;;;;;;;;;;;3695:8;3664:40;;3685:8;3664:40;;;;;;;;;;;;3584:128;3521:191;:::o;44197:114::-;44244:7;44288:15;:13;:15::i;:::-;44271:14;:12;:14::i;:::-;:32;;;;:::i;:::-;44264:39;;44197:114;:::o;43833:92::-;43889:7;43916:1;43909:8;;43833:92;:::o;62461:331::-;62616:8;62607:17;;:5;:17;;;62599:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62719:8;62681:18;:25;62700:5;62681:25;;;;;;;;;;;;;;;:35;62707:8;62681:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;62765:8;62743:41;;62758:5;62743:41;;;62775:8;62743:41;;;;;;:::i;:::-;;;;;;;;62461:331;;;:::o;45549:105::-;45609:13;45642:4;45635:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45549:105;;;:::o;13244:723::-;13300:13;13530:1;13521:5;:10;13517:53;;13548:10;;;;;;;;;;;;;;;;;;;;;13517:53;13580:12;13595:5;13580:20;;13611:14;13636:78;13651:1;13643:4;:9;13636:78;;13669:8;;;;;:::i;:::-;;;;13700:2;13692:10;;;;;:::i;:::-;;;13636:78;;;13724:19;13756:6;13746:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13724:39;;13774:154;13790:1;13781:5;:10;13774:154;;13818:1;13808:11;;;;;:::i;:::-;;;13885:2;13877:5;:10;;;;:::i;:::-;13864:2;:24;;;;:::i;:::-;13851:39;;13834:6;13841;13834:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;13914:2;13905:11;;;;;:::i;:::-;;;13774:154;;;13952:6;13938:21;;;;;13244:723;;;;:::o;71330:443::-;71460:1;71443:19;;:5;:19;;;71439:91;;71515:1;71486:32;;;;;;;;;;;:::i;:::-;;;;;;;;71439:91;71563:1;71544:21;;:7;:21;;;71540:92;;71617:1;71589:31;;;;;;;;;;;:::i;:::-;;;;;;;;71540:92;71672:5;71642:11;:18;71654:5;71642:18;;;;;;;;;;;;;;;:27;71661:7;71642:27;;;;;;;;;;;;;;;:35;;;;71692:9;71688:78;;;71739:7;71723:31;;71732:5;71723:31;;;71748:5;71723:31;;;;;;:::i;:::-;;;;;;;;71688:78;71330:443;;;;:::o;69544:1640::-;69641:19;69663:9;:15;69673:4;69663:15;;;;;;;;;;;;;;;;69641:37;;69689:17;69709:9;:13;69719:2;69709:13;;;;;;;;;;;;;;;;69689:33;;69751:5;69737:11;:19;69733:109;;;69805:4;69811:11;69824:5;69780:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;69733:109;69987:5;69973:11;:19;69955:9;:15;69965:4;69955:15;;;;;;;;;;;;;;;:37;;;;70151:5;70139:9;:17;70123:9;:13;70133:2;70123:13;;;;;;;;;;;;;;;:33;;;;70200:2;70185:25;;70194:4;70185:25;;;70204:5;70185:25;;;;;;:::i;:::-;;;;;;;;70226:4;70223:954;;;70307:8;70318:9;:15;70328:4;70318:15;;;;;;;;;;;;;;;;;;;;;;;;;70307:26;;70353:3;70348:234;;70377:22;70458:12;70449:5;70435:11;:19;;;;:::i;:::-;70434:36;;;;:::i;:::-;70417:12;70403:11;:26;;;;:::i;:::-;70402:69;;;;:::i;:::-;70377:94;;70510:1;70493:14;:18;70490:76;;;70534:32;70545:4;70551:14;70534:10;:32::i;:::-;70490:76;70358:224;70348:234;70666:9;:13;70676:2;70666:13;;;;;;;;;;;;;;;;;;;;;;;;;70661:505;;70717:1;70703:10;;:15;:22;;;;;70722:3;70703:22;:41;;;;;70737:7;:5;:7::i;:::-;70729:15;;:4;:15;;;70703:41;70700:451;;;70843:4;70827:9;:13;70837:2;70827:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;70883:1;70870:10;:14;;;;70700:451;;;70933:22;71010:12;70998:9;:24;;;;:::i;:::-;70981:12;70972:5;70960:9;:17;;;;:::i;:::-;70959:34;;;;:::i;:::-;70958:65;;;;:::i;:::-;70933:90;;71066:1;71049:14;:18;71046:85;;;71094:37;71112:2;71116:14;71094:17;:37::i;:::-;;;71046:85;70910:241;70700:451;70661:505;70232:945;70223:954;69630:1554;;69544:1640;;;;:::o;67230:162::-;67296:22;67353:1;67339:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67331:24;;67377:7;67366:5;67372:1;67366:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;67230:162;;;:::o;63750:158::-;;;;;:::o;34361:129::-;34476:4;34468:5;:12;34462:1;:19;;34460:22;34434:6;:10;;:22;34454:1;34445:5;:10;;34434:22;;;;;;;;;;;;:48;;;;;;;;;;;34361:129;;:::o;34164:126::-;34276:4;34268:5;:12;34262:1;:19;;34235:6;:10;;:22;34255:1;34246:5;:10;;34235:22;;;;;;;;;;;;:47;;;;;;;;;;;34164:126;;:::o;75373:716::-;75544:9;:13;75554:2;75544:13;;;;;;;;;;;;;;;;;;;;;;;;;75540:461;;75599:9;;75582;:13;75592:2;75582:13;;;;;;;;;;;;;;;;:26;;75574:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;75663:13;;;;;;;;;;;75659:331;;;75729:12;75705:10;:21;75716:9;75705:21;;;;;;;;;;;;;;;;:36;75697:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;75824:12;75800:10;:21;75811:9;75800:21;;;;;;;;;;;;;;;:36;;;;75892:1;75873:2;75865:23;;;:28;:67;;;;;75931:1;75905:9;75897:30;;;:35;75865:67;75857:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;75659:331;75540:461;76031:50;76057:8;76067:4;76073:2;76077:3;76031:25;:50::i;:::-;75373:716;;;;:::o;65028:1389::-;65243:15;:2;:13;;;:15::i;:::-;65239:1171;;;65287:2;65279:29;;;65309:26;65279:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65275:1124;;;65378:2;65361:38;;;65400:8;65410:4;65416:2;65420:6;65428:4;65361:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65357:495;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;65727:6;65720:14;;;;;;;;;;;:::i;:::-;;;;;;;;65357:495;;;65791:41;;;;;;;;;;;;;;65357:495;65499:43;;;65487:55;;;:8;:55;;;;65483:160;;65578:41;;;;;;;;;;;;;;65483:160;65434:228;65275:1124;;;65924:2;65909:35;;;65945:8;65955:4;65961:2;65965:4;65909:61;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65905:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;66260:6;66253:14;;;;;;;;;;;:::i;:::-;;;;;;;;65905:479;;;66324:40;;;;;;;;;;;;;;65905:479;66036:40;;;66024:52;;;:8;:52;;;;66020:156;;66112:40;;;;;;;;;;;;;;66020:156;65971:224;65275:1124;65239:1171;65028:1389;;;;;;:::o;27710:464::-;27762:9;27867:1;27863:6;27902:3;27899:1;27896:10;27956:1;27951:3;27947:11;27943:1;27940;27936:9;27932:27;27929:1;27925:35;27920:40;;28028:1;28023:3;28019:11;28015:1;28012;28008:9;28004:27;27999:1;27994:3;27990:11;27987:1;27983:19;27979:53;27974:58;;28083:2;28078:3;28074:12;28069:1;28066;28062:9;28059:1;28055:17;28051:36;28046:41;;28149:3;28144;28140:13;28137:1;28133:21;28128:3;28124:31;28116:5;28113:1;28109:13;28106:50;28101:55;;27837:330;;27710:464;;;:::o;66425:797::-;66665:15;:2;:13;;;:15::i;:::-;66661:554;;;66718:2;66701:43;;;66745:8;66755:4;66761:3;66766:7;66775:4;66701:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66697:507;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;67091:6;67084:14;;;;;;;;;;;:::i;:::-;;;;;;;;66697:507;;;67147:41;;;;;;;;;;;;;;66697:507;66874:48;;;66862:60;;;:8;:60;;;;66858:157;;66954:41;;;;;;;;;;;;;;66858:157;66781:249;66661:554;66425:797;;;;;;:::o;60580:1735::-;60702:1;60686:18;;:4;:18;;;60683:77;;60727:21;;;;;;;;;;;;;;60683:77;60772:16;60791:12;:10;:12::i;:::-;60772:31;;60816:18;60837:14;:12;:14::i;:::-;60816:35;;60864:24;60905:6;60891:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60864:48;;60923:20;60960:6;60946:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60923:44;;61009:9;61005:258;61028:6;61024:1;:10;61005:258;;;61073:1;61060:7;61068:1;61060:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;61093:10;61106:36;61131:10;61106:6;:12;61113:4;61106:12;;;;;;;;;;;;;;;:24;;:36;;;;:::i;:::-;61093:49;;61170:2;61161:3;61165:1;61161:6;;;;;;;;:::i;:::-;;;;;;;:11;;;;;61191:22;61210:2;61191:6;:12;61198:4;61191:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;61245:2;61232:15;;61041:222;61036:3;;;;;;;61005:258;;;;61348:53;61369:8;61379:4;61393:1;61397:3;61348:20;:53::i;:::-;61414:18;61443:11;61466:1;61457:6;:10;;;;:::i;:::-;61443:24;;61528:16;61522:4;61518:27;61504:41;;61730:4;61725:3;61721:14;61715:21;61695:1;61666:10;61622:25;61602:1;61582;61559:192;61805:1;61767:264;61841:3;61832:7;61829:16;61767:264;;62005:7;61999:4;61995:18;61990:3;61986:28;61980:35;61977:1;61965:10;61938:25;61935:1;61932;61927:89;61890:1;61881:7;61877:15;61866:26;;61767:264;;;61771:50;62067:1;62057:6;:11;62054:176;;62127:1;62088:53;;62113:4;62088:53;;62103:8;62088:53;;;62131:3;62135:1;62131:6;;;;;;;;:::i;:::-;;;;;;;;62139:1;62088:53;;;;;;;:::i;:::-;;;;;;;;62054:176;;;62213:1;62175:55;;62199:4;62175:55;;62189:8;62175:55;;;62217:3;62222:7;62175:55;;;;;;;:::i;:::-;;;;;;;;62054:176;62253:52;62273:8;62283:4;62297:1;62301:3;62253:19;:52::i;:::-;60672:1643;;;;;;60580:1735;;:::o;55949:1661::-;56054:20;56076:24;56132:1;56118:16;;:2;:16;;;56115:74;;56158:19;;;;;;;;;;;;;;56115:74;56212:1;56202:6;:11;56199:68;;56237:18;;;;;;;;;;;;;;56199:68;56279:16;56298:12;:10;:12::i;:::-;56279:31;;56343:6;56329:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56323:27;;56385:6;56371:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56361:31;;56403:20;56426:14;:12;:14::i;:::-;56403:37;;56516:12;56506:6;56486:17;:26;:42;;56478:51;;;;;;56548:9;56544:129;56567:6;56563:1;:10;56544:129;;;56623:1;56608:12;:16;56599:3;56603:1;56599:6;;;;;;;;:::i;:::-;;;;;;;:25;;;;;56656:1;56643:7;56651:1;56643:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;56575:3;;;;;;;56544:129;;;;56704:51;56725:8;56743:1;56747:2;56751:3;56704:20;:51::i;:::-;56768:41;56788:12;56802:6;56768;:10;56775:2;56768:10;;;;;;;;;;;;;;;:19;;:41;;;;;:::i;:::-;56837:6;56820:13;;:23;;;;;;;:::i;:::-;;;;;;;;56856:16;56883:11;56912:6;56897:12;:21;;;;:::i;:::-;56883:35;;56975:16;56971:2;56967:25;56955:37;;57160:12;57133:8;57113:1;57069:25;57049:1;57029;57006:181;57259:1;57245:12;57241:20;57203:253;57296:3;57287:7;57284:16;57203:253;;57433:7;57423:8;57420:1;57393:25;57390:1;57387;57382:59;57345:1;57336:7;57332:15;57321:26;;57203:253;;;57207:69;57520:2;57484:53;;57516:1;57484:53;;57498:8;57484:53;;;57524:3;57529:7;57484:53;;;;;;;:::i;:::-;;;;;;;;57550:50;57570:8;57588:1;57592:2;57596:3;57550:19;:50::i;:::-;56102:1508;;;;55949:1661;;;;;:::o;64863:157::-;;;;;:::o;5685:387::-;5745:4;5953:12;6020:7;6008:20;6000:28;;6063:1;6056:4;:8;6049:15;;;5685:387;;;:::o;39645:1230::-;39755:19;39792:14;39817:18;39933:1;39929:6;39914:21;;39966:6;39963:1;39959:14;39949:24;;40000:6;39994:4;39987:20;40034:11;40028:4;40021:25;40088:6;40084:11;40078:4;40074:22;40201:4;40195;40185:21;40179:28;40171:6;40167:41;40159:6;40155:54;40141:68;;40255:6;40248:14;40236:10;40233:30;40223:356;;40284:280;40291:1;40284:280;;;40341:11;40333:6;40329:24;40319:34;;40409:6;40403:4;40396:20;40474:4;40468;40458:21;40452:28;40438:42;;40527:6;40520:14;40508:10;40505:30;40502:43;40284:280;40502:43;40284:280;40223:356;39899:691;40618:1;40604:10;:15;40600:268;;40666:22;40677:10;40666;:22::i;:::-;40661:1;40651:6;:11;;40650:38;40636:52;;40833:6;40820:11;40817:23;40814:1;40810:31;40797:11;40794:48;40779:63;;40600:268;39781:1094;;39645:1230;;;;:::o;36198:1129::-;36373:1;36369:6;36413:4;36406:5;36402:16;36445:11;36439:4;36432:25;36491:5;36488:1;36484:13;36478:4;36471:27;36545:3;36536:6;36529:5;36525:18;36522:27;36512:646;;36605:4;36599;36589:21;36682:3;36675:5;36671:15;36657:11;36651:18;36648:39;36635:11;36628:60;36737:1;36730:4;36724:11;36720:19;36810:5;36802:6;36798:18;36795:1;36791:26;36784:4;36778:11;36774:44;36870:4;36862:5;36854:6;36850:18;36846:29;36836:39;;36902:1;36893:10;;36921:184;36946:9;36938:6;36935:21;36921:184;;37023:6;37017:4;37010:20;37082:3;37075:4;37069;37059:21;37052:34;36982:1;36974:6;36970:14;36960:24;;36921:184;;;37136:6;37130:4;37123:20;36551:607;;;36512:646;37207:4;37201;37191:21;37302:3;37293:6;37288:3;37284:16;37280:26;37273:5;37269:38;37255:11;37249:18;37246:62;37233:11;37226:83;36343:977;;;36198:1129;;;:::o;25064:688::-;25111:9;25274:1;25238:34;25235:41;25232:1;25228:49;25223:1;25216:9;25213:1;25209:17;25206:72;25201:77;;25340:1;25337;25333:9;25313:18;25310:33;25307:1;25303:41;25300:1;25297:48;25292:53;;25399:1;25396;25392:9;25380:10;25377:25;25374:1;25370:33;25367:1;25364:40;25359:45;;25454:1;25451;25447:9;25439:6;25436:21;25433:1;25429:29;25426:1;25423:36;25418:41;;25507:1;25504;25500:9;25494:4;25491:19;25488:1;25484:27;25481:1;25478:34;25473:39;;25666:66;25611:34;25607:1;25604;25600:9;25596:50;25590:4;25586:61;25581:152;25578:1;25575:159;25570:164;;25064: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://28acdccd34741fab027d1d1dc41718835fb61a86355f82f5559288443b46ce17
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.