ETH Price: $3,063.29 (+2.78%)
Gas: 1 Gwei

Token

Pixel Aliens (Alien)
 

Overview

Max Total Supply

355 Alien

Holders

210

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 Alien
0xb586d612dc53c9c632e3b039b4d8edec028dae70
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:
PixelAliens

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/1_PixelAliens.sol



pragma solidity ^0.8.0;







contract PixelAliens is ERC721Enumerable, Ownable{

    using SafeMath for uint256;

    using Counters for Counters.Counter;

    Counters.Counter private tokenCounter;



    constructor(string memory _value) ERC721("Pixel Aliens", "Alien") {

        setBaseURI(_value);

        mintGiveaway();

    }



    // Hash of images at original index: 159399aeae641247dd6103c9d7fd8916704f7abf495e431e4bb351a7ac470a2e

    string public PROVENANCE = '';

    function setProvenance(string memory _hash) public onlyOwner {

        PROVENANCE = _hash;

    }



    uint256 public offSetIndex;

    uint256 public offSetIndexBlock;



    address public constant Address1 = 0x97EdbB51Da68191a667B7d919C00EF6992Ae30D3; // Artist

    address public constant Address2 = 0x001934f98262Cb8A29eC329BE6c6Ae89dAA860C9; // Community lead

    address public constant Address3 = 0x3251B9F18aad322bF8b2753728CC1a42C8FbdA6D; // Dev

    address public constant Address4 = 0x399e8EE6C140eA41C9D2f818bba6fa3a1D20064D; // Community wallet



    uint256 public constant MAX_MINTED = 3333;



    uint256 public constant PURCHASE_LIMIT = 5;

    uint256 public constant WlistPURSHASE_LIMIT = 3;



    uint256 public constant PRICE = 0.05 ether;

    uint256 public constant wlistPRICE = 0.03 ether;



    // 0 - closed,  1 - whitelist, 2 - public

    uint256 public saleSTATE = 0;

    string public BaseURI;



    uint256 public constant WHITELIST_MAXMEMBERS = 555;

    uint256 public WHITELIST_MEMBERCOUNT = 0;

    mapping (address => whiteListStruct) public WHITELIST;

    struct whiteListStruct{

        uint256 amountPurchased;

        bool exists;

    }



    event SaleStateChanged(uint256 _value);

    event OffSetIndexBlockSet(uint256 _value);

    event offSetIndexSet(uint256 _value);



    function setBaseURI(string memory _value) public onlyOwner{

        BaseURI = _value;

    }



    function _baseURI() internal view virtual override returns (string memory) {

        return BaseURI;

    }



    // tokens minted for a giveaway

    function mintGiveaway() public onlyOwner{

        require(totalSupply() == 0, "Supply higher than 0!");

        for (uint256 i = 1; i <= 10; i++){

            tokenCounter.increment();

            _safeMint(msg.sender, i);

        }

    }



    function addToWhiteList(address[] calldata _addresses) public onlyOwner{

        uint256 arrayLength = _addresses.length;

        require( (WHITELIST_MEMBERCOUNT + arrayLength) <= WHITELIST_MAXMEMBERS);

        for(uint256 i = 0; i < arrayLength; i++){

            require(!WHITELIST[_addresses[i]].exists, "Wallet already whitelisted!");

            WHITELIST_MEMBERCOUNT++;

            WHITELIST[_addresses[i]].exists = true;

        }

    }



    function checkWhiteList(address _address) public view returns(bool){

        require(WHITELIST[_address].exists, "Wallet is not whitelisted!");

        require(WHITELIST[_address].amountPurchased < WlistPURSHASE_LIMIT, "Whitelist purchase limit reached!");

        return true;

    }



    function updateSaleState(uint256 _value) public onlyOwner{

        require(_value < 3, 'Bad value entered!');

        saleSTATE = _value;

        emit SaleStateChanged(saleSTATE);

    }



    function mintToken(uint256 _amount) public payable{

        require( (_amount + totalSupply() ) <= MAX_MINTED, "Amount is beyond available tokens");

        require(saleSTATE > 0, 'Sales currently closed!');



        address wallet = _msgSender();



        if(saleSTATE == 1){

            require(checkWhiteList(wallet), "Sale aborted!");

            require(wlistPRICE.mul(_amount) <= msg.value, "Purchase price too low");

            require( (_amount + WHITELIST[wallet].amountPurchased) <= WlistPURSHASE_LIMIT, 'Purchase amount too high!');

            while(_amount > 0){

                WHITELIST[wallet].amountPurchased++;

                createToken(wallet);

                _amount--;

            }

        }

        else{

            require(PRICE.mul(_amount) <= msg.value, "Purchase price too low");

            require( _amount <= PURCHASE_LIMIT, 'Purchase amount too high!');

            while(_amount > 0){

                createToken(wallet);

                _amount--;

            }

        }

    }



    function createToken(address _wallet) private{

        tokenCounter.increment();

        _safeMint(_wallet, tokenCounter.current());



        if (offSetIndexBlock == 0 && totalSupply() == MAX_MINTED){

            offSetIndexBlock = block.number;

            emit OffSetIndexBlockSet(offSetIndexBlock);

        }

    } 



    function mintUnsoldTokens(uint256 _amount) public onlyOwner{

        require(saleSTATE == 0, 'Sales not closed!');

        require( (_amount + totalSupply()) <= MAX_MINTED, "Amount higher than availiable tokens");

        while (_amount > 0){

            _amount--;

            createToken(msg.sender);

        }

    }





    function generateOffsetIndex() public{

        require(offSetIndexBlock != 0, "offSetIndexBlock has not been set!");

        require(offSetIndex == 0, "offSet has already been set!");



        uint256 _offset = offSetIndexBlock % MAX_MINTED;



        // That apes guy is a hero!

        if (block.number.sub(offSetIndexBlock) > 255 && _offset == 0) {

            _offset = uint256(blockhash(offSetIndexBlock - 1)) % MAX_MINTED;

        }



        require(_offset != 0, "Invalid offset generated!");

        offSetIndex = _offset;

        emit offSetIndexSet(offSetIndex);

    }



    function retryOffsetIndexBlock() public onlyOwner{

        require(offSetIndexBlock == 0, "offSetIndexBlock has already been set!");

        require(saleSTATE == 0, 'Sales not closed!');

        offSetIndexBlock = block.number;

        emit OffSetIndexBlockSet(offSetIndexBlock);

    }



    function withdrawETH() public onlyOwner {

        uint256 balance = address(this).balance;



        uint256 amount = balance.mul(25).div(100);

        payable(Address1).transfer(amount);

        payable(Address2).transfer(amount);

        payable(Address3).transfer(amount);

        payable(Address4).transfer(address(this).balance);

    }



}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_value","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"OffSetIndexBlockSet","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":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"SaleStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"offSetIndexSet","type":"event"},{"inputs":[],"name":"Address1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Address2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Address3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Address4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WHITELIST","outputs":[{"internalType":"uint256","name":"amountPurchased","type":"uint256"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MAXMEMBERS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MEMBERCOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WlistPURSHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"checkWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generateOffsetIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintUnsoldTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offSetIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offSetIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retryOffsetIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleSTATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_value","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenance","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"updateSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlistPRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405260405180602001604052806000815250600c90805190602001906200002b92919062000e5e565b506000600f5560006011553480156200004357600080fd5b5060405162006e6338038062006e63833981810160405281019062000069919062000fd5565b6040518060400160405280600c81526020017f506978656c20416c69656e7300000000000000000000000000000000000000008152506040518060400160405280600581526020017f416c69656e0000000000000000000000000000000000000000000000000000008152508160009080519060200190620000ed92919062000e5e565b5080600190805190602001906200010692919062000e5e565b505050620001296200011d6200015160201b60201c565b6200015960201b60201c565b6200013a816200021f60201b60201c565b6200014a620002ca60201b60201c565b506200177d565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022f6200015160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002556200040060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a59062001271565b60405180910390fd5b8060109080519060200190620002c692919062000e5e565b5050565b620002da6200015160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003006200040060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000359576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003509062001271565b60405180910390fd5b60006200036b6200042a60201b60201c565b14620003ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a5906200122d565b60405180910390fd5b6000600190505b600a8111620003fd57620003d5600b6200043760201b620025e01760201c565b620003e733826200044d60201b60201c565b8080620003f490620014c3565b915050620003b5565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600880549050905090565b6001816000016000828254019250508190555050565b6200046f8282604051806020016040528060008152506200047360201b60201c565b5050565b620004858383620004e160201b60201c565b6200049a6000848484620006db60201b60201c565b620004dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004d390620011c7565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000554576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200054b906200124f565b60405180910390fd5b62000565816200089560201b60201c565b15620005a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200059f90620011e9565b60405180910390fd5b620005bc600083836200090160201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200060e91906200131f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620006d76000838362000a4860201b60201c565b5050565b6000620007098473ffffffffffffffffffffffffffffffffffffffff1662000a4d60201b620025f61760201c565b1562000888578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200073b6200015160201b60201c565b8786866040518563ffffffff1660e01b81526004016200075f949392919062001173565b602060405180830381600087803b1580156200077a57600080fd5b505af1925050508015620007ae57506040513d601f19601f82011682018060405250810190620007ab919062000fa3565b60015b62000837573d8060008114620007e1576040519150601f19603f3d011682016040523d82523d6000602084013e620007e6565b606091505b506000815114156200082f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200082690620011c7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200088d565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200091983838362000a7060201b620026191760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200096657620009608162000a7560201b60201c565b620009ae565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620009ad57620009ac838262000abe60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620009fb57620009f58162000c3b60201b60201c565b62000a43565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000a425762000a41828262000d1760201b60201c565b5b5b505050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000ad88462000da360201b620013a21760201c565b62000ae491906200137c565b905060006007600084815260200190815260200160002054905081811462000bca576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000c5191906200137c565b905060006009600084815260200190815260200160002054905060006008838154811062000c845762000c836200159e565b5b90600052602060002001549050806008838154811062000ca95762000ca86200159e565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000cfb5762000cfa6200156f565b5b6001900381819060005260206000200160009055905550505050565b600062000d2f8362000da360201b620013a21760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e0e906200120b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000e6c9062001457565b90600052602060002090601f01602090048101928262000e90576000855562000edc565b82601f1062000eab57805160ff191683800117855562000edc565b8280016001018555821562000edc579182015b8281111562000edb57825182559160200191906001019062000ebe565b5b50905062000eeb919062000eef565b5090565b5b8082111562000f0a57600081600090555060010162000ef0565b5090565b600062000f2562000f1f84620012bc565b62001293565b90508281526020810184848401111562000f445762000f4362001601565b5b62000f5184828562001421565b509392505050565b60008151905062000f6a8162001763565b92915050565b600082601f83011262000f885762000f87620015fc565b5b815162000f9a84826020860162000f0e565b91505092915050565b60006020828403121562000fbc5762000fbb6200160b565b5b600062000fcc8482850162000f59565b91505092915050565b60006020828403121562000fee5762000fed6200160b565b5b600082015167ffffffffffffffff8111156200100f576200100e62001606565b5b6200101d8482850162000f70565b91505092915050565b6200103181620013b7565b82525050565b60006200104482620012f2565b620010508185620012fd565b93506200106281856020860162001421565b6200106d8162001610565b840191505092915050565b6000620010876032836200130e565b9150620010948262001621565b604082019050919050565b6000620010ae601c836200130e565b9150620010bb8262001670565b602082019050919050565b6000620010d5602a836200130e565b9150620010e28262001699565b604082019050919050565b6000620010fc6015836200130e565b91506200110982620016e8565b602082019050919050565b6000620011236020836200130e565b9150620011308262001711565b602082019050919050565b60006200114a6020836200130e565b915062001157826200173a565b602082019050919050565b6200116d8162001417565b82525050565b60006080820190506200118a600083018762001026565b62001199602083018662001026565b620011a8604083018562001162565b8181036060830152620011bc818462001037565b905095945050505050565b60006020820190508181036000830152620011e28162001078565b9050919050565b6000602082019050818103600083015262001204816200109f565b9050919050565b600060208201905081810360008301526200122681620010c6565b9050919050565b600060208201905081810360008301526200124881620010ed565b9050919050565b600060208201905081810360008301526200126a8162001114565b9050919050565b600060208201905081810360008301526200128c816200113b565b9050919050565b60006200129f620012b2565b9050620012ad82826200148d565b919050565b6000604051905090565b600067ffffffffffffffff821115620012da57620012d9620015cd565b5b620012e58262001610565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200132c8262001417565b9150620013398362001417565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001371576200137062001511565b5b828201905092915050565b6000620013898262001417565b9150620013968362001417565b925082821015620013ac57620013ab62001511565b5b828203905092915050565b6000620013c482620013f7565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200144157808201518184015260208101905062001424565b8381111562001451576000848401525b50505050565b600060028204905060018216806200147057607f821691505b6020821081141562001487576200148662001540565b5b50919050565b620014988262001610565b810181811067ffffffffffffffff82111715620014ba57620014b9620015cd565b5b80604052505050565b6000620014d08262001417565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562001506576200150562001511565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f537570706c7920686967686572207468616e2030210000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200176e81620013cb565b81146200177a57600080fd5b50565b6156d6806200178d6000396000f3fe6080604052600436106102885760003560e01c8063895814741161015a578063c87b56dd116100c1578063e086e5ec1161007a578063e086e5ec146109a4578063e5c15729146109bb578063e985e9c5146109e4578063f2fde38b14610a21578063ffcc43c414610a4a578063ffe630b514610a7557610288565b8063c87b56dd14610890578063c90ca4b8146108cd578063d4039f42146108f8578063d75e611014610923578063dbf8c3f71461094e578063dcfc757e1461097957610288565b80639ff048fc116101135780639ff048fc146107a2578063a22cb465146107b9578063a560ed7b146107e2578063b88d4fde1461080d578063bc1c864c14610836578063c634d0321461087457610288565b806389581474146106a25780638d859f3e146106cd5780638da5cb5b146106f857806395d89b411461072357806397db3cca1461074e5780639cce37c61461076557610288565b806346ff3233116101fe57806366474ff7116101b757806366474ff7146105ba5780636bb6fdb1146105e357806370a08231146105fa578063715018a614610637578063740d73f31461064e57806375c2d8011461067757610288565b806346ff3233146104965780634f6ccce7146104c157806355f804b3146104fe578063609472a2146105275780636352211e146105525780636373a6b11461058f57610288565b80630ae0720a116102505780630ae0720a1461038657806318160ddd146103b157806323b872dd146103dc578063271b52ee146104055780632f745c591461043057806342842e0e1461046d57610288565b806301ffc9a71461028d57806306be68b3146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613d89565b610a9e565b6040516102c1919061445a565b60405180910390f35b3480156102d657600080fd5b506102df610b18565b6040516102ec91906148d7565b60405180910390f35b34801561030157600080fd5b5061030a610b1e565b6040516103179190614475565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613e2c565b610bb0565b60405161035491906143f3565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613cfc565b610c35565b005b34801561039257600080fd5b5061039b610d4d565b6040516103a891906148d7565b60405180910390f35b3480156103bd57600080fd5b506103c6610d53565b6040516103d391906148d7565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613be6565b610d60565b005b34801561041157600080fd5b5061041a610dc0565b60405161042791906148d7565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613cfc565b610dc6565b60405161046491906148d7565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613be6565b610e6b565b005b3480156104a257600080fd5b506104ab610e8b565b6040516104b891906148d7565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613e2c565b610e91565b6040516104f591906148d7565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190613de3565b610f02565b005b34801561053357600080fd5b5061053c610f98565b60405161054991906143f3565b60405180910390f35b34801561055e57600080fd5b5061057960048036038101906105749190613e2c565b610faf565b60405161058691906143f3565b60405180910390f35b34801561059b57600080fd5b506105a4611061565b6040516105b19190614475565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190613e2c565b6110ef565b005b3480156105ef57600080fd5b506105f8611230565b005b34801561060657600080fd5b50610621600480360381019061061c9190613b79565b6113a2565b60405161062e91906148d7565b60405180910390f35b34801561064357600080fd5b5061064c61145a565b005b34801561065a57600080fd5b5061067560048036038101906106709190613d3c565b6114e2565b005b34801561068357600080fd5b5061068c6116f7565b60405161069991906148d7565b60405180910390f35b3480156106ae57600080fd5b506106b7611702565b6040516106c491906143f3565b60405180910390f35b3480156106d957600080fd5b506106e261171a565b6040516106ef91906148d7565b60405180910390f35b34801561070457600080fd5b5061070d611725565b60405161071a91906143f3565b60405180910390f35b34801561072f57600080fd5b5061073861174f565b6040516107459190614475565b60405180910390f35b34801561075a57600080fd5b506107636117e1565b005b34801561077157600080fd5b5061078c60048036038101906107879190613b79565b611929565b604051610799919061445a565b60405180910390f35b3480156107ae57600080fd5b506107b7611a48565b005b3480156107c557600080fd5b506107e060048036038101906107db9190613cbc565b611b47565b005b3480156107ee57600080fd5b506107f7611b5d565b60405161080491906148d7565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f9190613c39565b611b63565b005b34801561084257600080fd5b5061085d60048036038101906108589190613b79565b611bc5565b60405161086b9291906148f2565b60405180910390f35b61088e60048036038101906108899190613e2c565b611bf6565b005b34801561089c57600080fd5b506108b760048036038101906108b29190613e2c565b611f2c565b6040516108c49190614475565b60405180910390f35b3480156108d957600080fd5b506108e2611fd3565b6040516108ef91906148d7565b60405180910390f35b34801561090457600080fd5b5061090d611fd9565b60405161091a91906148d7565b60405180910390f35b34801561092f57600080fd5b50610938611fde565b60405161094591906148d7565b60405180910390f35b34801561095a57600080fd5b50610963611fe3565b60405161097091906143f3565b60405180910390f35b34801561098557600080fd5b5061098e611ffb565b60405161099b91906143f3565b60405180910390f35b3480156109b057600080fd5b506109b9612013565b005b3480156109c757600080fd5b506109e260048036038101906109dd9190613e2c565b61222e565b005b3480156109f057600080fd5b50610a0b6004803603810190610a069190613ba6565b612330565b604051610a18919061445a565b60405180910390f35b348015610a2d57600080fd5b50610a486004803603810190610a439190613b79565b6123c4565b005b348015610a5657600080fd5b50610a5f6124bc565b604051610a6c9190614475565b60405180910390f35b348015610a8157600080fd5b50610a9c6004803603810190610a979190613de3565b61254a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b115750610b108261261e565b5b9050919050565b61022b81565b606060008054610b2d90614bda565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5990614bda565b8015610ba65780601f10610b7b57610100808354040283529160200191610ba6565b820191906000526020600020905b815481529060010190602001808311610b8957829003601f168201915b5050505050905090565b6000610bbb82612700565b610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190614717565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4082610faf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca890614797565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd061276c565b73ffffffffffffffffffffffffffffffffffffffff161480610cff5750610cfe81610cf961276c565b612330565b5b610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d35906145f7565b60405180910390fd5b610d488383612774565b505050565b600f5481565b6000600880549050905090565b610d71610d6b61276c565b8261282d565b610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da7906147d7565b60405180910390fd5b610dbb83838361290b565b505050565b600d5481565b6000610dd1836113a2565b8210610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e09906144d7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e8683838360405180602001604052806000815250611b63565b505050565b600e5481565b6000610e9b610d53565b8210610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed3906147f7565b60405180910390fd5b60088281548110610ef057610eef614d73565b5b90600052602060002001549050919050565b610f0a61276c565b73ffffffffffffffffffffffffffffffffffffffff16610f28611725565b73ffffffffffffffffffffffffffffffffffffffff1614610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7590614737565b60405180910390fd5b8060109080519060200190610f94929190613937565b5050565b721934f98262cb8a29ec329be6c6ae89daa860c981565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90614677565b60405180910390fd5b80915050919050565b600c805461106e90614bda565b80601f016020809104026020016040519081016040528092919081815260200182805461109a90614bda565b80156110e75780601f106110bc576101008083540402835291602001916110e7565b820191906000526020600020905b8154815290600101906020018083116110ca57829003601f168201915b505050505081565b6110f761276c565b73ffffffffffffffffffffffffffffffffffffffff16611115611725565b73ffffffffffffffffffffffffffffffffffffffff161461116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116290614737565b60405180910390fd5b6000600f54146111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a790614897565b60405180910390fd5b610d056111bb610d53565b826111c691906149e5565b1115611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe906146b7565b60405180910390fd5b5b600081111561122d57808061121c90614bb0565b91505061122833612b72565b611208565b50565b6000600e541415611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906148b7565b60405180910390fd5b6000600d54146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614857565b60405180910390fd5b6000610d05600e546112cd9190614c86565b905060ff6112e6600e5443612bf290919063ffffffff16565b1180156112f35750600081145b1561131b57610d056001600e5461130a9190614ac6565b4060001c6113189190614c86565b90505b600081141561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690614697565b60405180910390fd5b80600d819055507fb0d9b50d534bcd160f322d1c7bf134b821e0b2765e0300c874b6462468a92cd7600d5460405161139791906148d7565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90614637565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61146261276c565b73ffffffffffffffffffffffffffffffffffffffff16611480611725565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90614737565b60405180910390fd5b6114e06000612c08565b565b6114ea61276c565b73ffffffffffffffffffffffffffffffffffffffff16611508611725565b73ffffffffffffffffffffffffffffffffffffffff161461155e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155590614737565b60405180910390fd5b600082829050905061022b8160115461157791906149e5565b111561158257600080fd5b60005b818110156116f157601260008585848181106115a4576115a3614d73565b5b90506020020160208101906115b99190613b79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1615611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b906147b7565b60405180910390fd5b6011600081548092919061165790614c3d565b919050555060016012600086868581811061167557611674614d73565b5b905060200201602081019061168a9190613b79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555080806116e990614c3d565b915050611585565b50505050565b666a94d74f43000081565b7397edbb51da68191a667b7d919c00ef6992ae30d381565b66b1a2bc2ec5000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461175e90614bda565b80601f016020809104026020016040519081016040528092919081815260200182805461178a90614bda565b80156117d75780601f106117ac576101008083540402835291602001916117d7565b820191906000526020600020905b8154815290600101906020018083116117ba57829003601f168201915b5050505050905090565b6117e961276c565b73ffffffffffffffffffffffffffffffffffffffff16611807611725565b73ffffffffffffffffffffffffffffffffffffffff161461185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490614737565b60405180910390fd5b6000600e54146118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906145b7565b60405180910390fd5b6000600f54146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90614897565b60405180910390fd5b43600e819055507f72ffcba238e31557cc77f8e45a356cf5a4da615ff70e7a11425121931315f331600e5460405161191f91906148d7565b60405180910390a1565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff166119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190614657565b60405180910390fd5b6003601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614877565b60405180910390fd5b60019050919050565b611a5061276c565b73ffffffffffffffffffffffffffffffffffffffff16611a6e611725565b73ffffffffffffffffffffffffffffffffffffffff1614611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614737565b60405180910390fd5b6000611ace610d53565b14611b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b05906146d7565b60405180910390fd5b6000600190505b600a8111611b4457611b27600b6125e0565b611b313382612cce565b8080611b3c90614c3d565b915050611b15565b50565b611b59611b5261276c565b8383612cec565b5050565b610d0581565b611b74611b6e61276c565b8361282d565b611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906147d7565b60405180910390fd5b611bbf84848484612e59565b50505050565b60126020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b610d05611c01610d53565b82611c0c91906149e5565b1115611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4490614617565b60405180910390fd5b6000600f5411611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990614777565b60405180910390fd5b6000611c9c61276c565b90506001600f541415611e6157611cb281611929565b611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce8906144b7565b60405180910390fd5b34611d0c83666a94d74f430000612eb590919063ffffffff16565b1115611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490614497565b60405180910390fd5b6003601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483611d9d91906149e5565b1115611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd590614817565b60405180910390fd5b5b6000821115611e5c57601260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000815480929190611e3b90614c3d565b9190505550611e4981612b72565b8180611e5490614bb0565b925050611ddf565b611f28565b34611e7c8366b1a2bc2ec50000612eb590919063ffffffff16565b1115611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb490614497565b60405180910390fd5b6005821115611f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef890614817565b60405180910390fd5b5b6000821115611f2757611f1481612b72565b8180611f1f90614bb0565b925050611f02565b5b5050565b6060611f3782612700565b611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d90614757565b60405180910390fd5b6000611f80612ecb565b90506000815111611fa05760405180602001604052806000815250611fcb565b80611faa84612f5d565b604051602001611fbb9291906143cf565b6040516020818303038152906040525b915050919050565b60115481565b600381565b600581565b73399e8ee6c140ea41c9d2f818bba6fa3a1d20064d81565b733251b9f18aad322bf8b2753728cc1a42c8fbda6d81565b61201b61276c565b73ffffffffffffffffffffffffffffffffffffffff16612039611725565b73ffffffffffffffffffffffffffffffffffffffff161461208f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208690614737565b60405180910390fd5b600047905060006120bd60646120af601985612eb590919063ffffffff16565b6130be90919063ffffffff16565b90507397edbb51da68191a667b7d919c00ef6992ae30d373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612119573d6000803e3d6000fd5b50721934f98262cb8a29ec329be6c6ae89daa860c973ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612173573d6000803e3d6000fd5b50733251b9f18aad322bf8b2753728cc1a42c8fbda6d73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156121ce573d6000803e3d6000fd5b5073399e8ee6c140ea41c9d2f818bba6fa3a1d20064d73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612229573d6000803e3d6000fd5b505050565b61223661276c565b73ffffffffffffffffffffffffffffffffffffffff16612254611725565b73ffffffffffffffffffffffffffffffffffffffff16146122aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a190614737565b60405180910390fd5b600381106122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e490614837565b60405180910390fd5b80600f819055507fea44936fc1183d38889d6e14d366ab1616121bb12bdb38ca15bbdf8cf944c830600f5460405161232591906148d7565b60405180910390a150565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123cc61276c565b73ffffffffffffffffffffffffffffffffffffffff166123ea611725565b73ffffffffffffffffffffffffffffffffffffffff1614612440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243790614737565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a790614517565b60405180910390fd5b6124b981612c08565b50565b601080546124c990614bda565b80601f01602080910402602001604051908101604052809291908181526020018280546124f590614bda565b80156125425780601f1061251757610100808354040283529160200191612542565b820191906000526020600020905b81548152906001019060200180831161252557829003601f168201915b505050505081565b61255261276c565b73ffffffffffffffffffffffffffffffffffffffff16612570611725565b73ffffffffffffffffffffffffffffffffffffffff16146125c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bd90614737565b60405180910390fd5b80600c90805190602001906125dc929190613937565b5050565b6001816000016000828254019250508190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126f957506126f8826130d4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127e783610faf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061283882612700565b612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e906145d7565b60405180910390fd5b600061288283610faf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128f157508373ffffffffffffffffffffffffffffffffffffffff166128d984610bb0565b73ffffffffffffffffffffffffffffffffffffffff16145b8061290257506129018185612330565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661292b82610faf565b73ffffffffffffffffffffffffffffffffffffffff1614612981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297890614537565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e890614577565b60405180910390fd5b6129fc83838361313e565b612a07600082612774565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a579190614ac6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aae91906149e5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6d838383613252565b505050565b612b7c600b6125e0565b612b8f81612b8a600b613257565b612cce565b6000600e54148015612ba95750610d05612ba7610d53565b145b15612bef5743600e819055507f72ffcba238e31557cc77f8e45a356cf5a4da615ff70e7a11425121931315f331600e54604051612be691906148d7565b60405180910390a15b50565b60008183612c009190614ac6565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ce8828260405180602001604052806000815250613265565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5290614597565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e4c919061445a565b60405180910390a3505050565b612e6484848461290b565b612e70848484846132c0565b612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea6906144f7565b60405180910390fd5b50505050565b60008183612ec39190614a6c565b905092915050565b606060108054612eda90614bda565b80601f0160208091040260200160405190810160405280929190818152602001828054612f0690614bda565b8015612f535780601f10612f2857610100808354040283529160200191612f53565b820191906000526020600020905b815481529060010190602001808311612f3657829003601f168201915b5050505050905090565b60606000821415612fa5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130b9565b600082905060005b60008214612fd7578080612fc090614c3d565b915050600a82612fd09190614a3b565b9150612fad565b60008167ffffffffffffffff811115612ff357612ff2614da2565b5b6040519080825280601f01601f1916602001820160405280156130255781602001600182028036833780820191505090505b5090505b600085146130b25760018261303e9190614ac6565b9150600a8561304d9190614c86565b603061305991906149e5565b60f81b81838151811061306f5761306e614d73565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130ab9190614a3b565b9450613029565b8093505050505b919050565b600081836130cc9190614a3b565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613149838383612619565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561318c5761318781613457565b6131cb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131ca576131c983826134a0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320e576132098161360d565b61324d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461324c5761324b82826136de565b5b5b505050565b505050565b600081600001549050919050565b61326f838361375d565b61327c60008484846132c0565b6132bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b2906144f7565b60405180910390fd5b505050565b60006132e18473ffffffffffffffffffffffffffffffffffffffff166125f6565b1561344a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261330a61276c565b8786866040518563ffffffff1660e01b815260040161332c949392919061440e565b602060405180830381600087803b15801561334657600080fd5b505af192505050801561337757506040513d601f19601f820116820180604052508101906133749190613db6565b60015b6133fa573d80600081146133a7576040519150601f19603f3d011682016040523d82523d6000602084013e6133ac565b606091505b506000815114156133f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e9906144f7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061344f565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134ad846113a2565b6134b79190614ac6565b905060006007600084815260200190815260200160002054905081811461359c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136219190614ac6565b905060006009600084815260200190815260200160002054905060006008838154811061365157613650614d73565b5b90600052602060002001549050806008838154811061367357613672614d73565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136c2576136c1614d44565b5b6001900381819060005260206000200160009055905550505050565b60006136e9836113a2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c4906146f7565b60405180910390fd5b6137d681612700565b15613816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380d90614557565b60405180910390fd5b6138226000838361313e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461387291906149e5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461393360008383613252565b5050565b82805461394390614bda565b90600052602060002090601f01602090048101928261396557600085556139ac565b82601f1061397e57805160ff19168380011785556139ac565b828001600101855582156139ac579182015b828111156139ab578251825591602001919060010190613990565b5b5090506139b991906139bd565b5090565b5b808211156139d65760008160009055506001016139be565b5090565b60006139ed6139e884614940565b61491b565b905082815260208101848484011115613a0957613a08614de0565b5b613a14848285614b6e565b509392505050565b6000613a2f613a2a84614971565b61491b565b905082815260208101848484011115613a4b57613a4a614de0565b5b613a56848285614b6e565b509392505050565b600081359050613a6d81615644565b92915050565b60008083601f840112613a8957613a88614dd6565b5b8235905067ffffffffffffffff811115613aa657613aa5614dd1565b5b602083019150836020820283011115613ac257613ac1614ddb565b5b9250929050565b600081359050613ad88161565b565b92915050565b600081359050613aed81615672565b92915050565b600081519050613b0281615672565b92915050565b600082601f830112613b1d57613b1c614dd6565b5b8135613b2d8482602086016139da565b91505092915050565b600082601f830112613b4b57613b4a614dd6565b5b8135613b5b848260208601613a1c565b91505092915050565b600081359050613b7381615689565b92915050565b600060208284031215613b8f57613b8e614dea565b5b6000613b9d84828501613a5e565b91505092915050565b60008060408385031215613bbd57613bbc614dea565b5b6000613bcb85828601613a5e565b9250506020613bdc85828601613a5e565b9150509250929050565b600080600060608486031215613bff57613bfe614dea565b5b6000613c0d86828701613a5e565b9350506020613c1e86828701613a5e565b9250506040613c2f86828701613b64565b9150509250925092565b60008060008060808587031215613c5357613c52614dea565b5b6000613c6187828801613a5e565b9450506020613c7287828801613a5e565b9350506040613c8387828801613b64565b925050606085013567ffffffffffffffff811115613ca457613ca3614de5565b5b613cb087828801613b08565b91505092959194509250565b60008060408385031215613cd357613cd2614dea565b5b6000613ce185828601613a5e565b9250506020613cf285828601613ac9565b9150509250929050565b60008060408385031215613d1357613d12614dea565b5b6000613d2185828601613a5e565b9250506020613d3285828601613b64565b9150509250929050565b60008060208385031215613d5357613d52614dea565b5b600083013567ffffffffffffffff811115613d7157613d70614de5565b5b613d7d85828601613a73565b92509250509250929050565b600060208284031215613d9f57613d9e614dea565b5b6000613dad84828501613ade565b91505092915050565b600060208284031215613dcc57613dcb614dea565b5b6000613dda84828501613af3565b91505092915050565b600060208284031215613df957613df8614dea565b5b600082013567ffffffffffffffff811115613e1757613e16614de5565b5b613e2384828501613b36565b91505092915050565b600060208284031215613e4257613e41614dea565b5b6000613e5084828501613b64565b91505092915050565b613e6281614afa565b82525050565b613e7181614b0c565b82525050565b6000613e82826149a2565b613e8c81856149b8565b9350613e9c818560208601614b7d565b613ea581614def565b840191505092915050565b6000613ebb826149ad565b613ec581856149c9565b9350613ed5818560208601614b7d565b613ede81614def565b840191505092915050565b6000613ef4826149ad565b613efe81856149da565b9350613f0e818560208601614b7d565b80840191505092915050565b6000613f276016836149c9565b9150613f3282614e00565b602082019050919050565b6000613f4a600d836149c9565b9150613f5582614e29565b602082019050919050565b6000613f6d602b836149c9565b9150613f7882614e52565b604082019050919050565b6000613f906032836149c9565b9150613f9b82614ea1565b604082019050919050565b6000613fb36026836149c9565b9150613fbe82614ef0565b604082019050919050565b6000613fd66025836149c9565b9150613fe182614f3f565b604082019050919050565b6000613ff9601c836149c9565b915061400482614f8e565b602082019050919050565b600061401c6024836149c9565b915061402782614fb7565b604082019050919050565b600061403f6019836149c9565b915061404a82615006565b602082019050919050565b60006140626026836149c9565b915061406d8261502f565b604082019050919050565b6000614085602c836149c9565b91506140908261507e565b604082019050919050565b60006140a86038836149c9565b91506140b3826150cd565b604082019050919050565b60006140cb6021836149c9565b91506140d68261511c565b604082019050919050565b60006140ee602a836149c9565b91506140f98261516b565b604082019050919050565b6000614111601a836149c9565b915061411c826151ba565b602082019050919050565b60006141346029836149c9565b915061413f826151e3565b604082019050919050565b60006141576019836149c9565b915061416282615232565b602082019050919050565b600061417a6024836149c9565b91506141858261525b565b604082019050919050565b600061419d6015836149c9565b91506141a8826152aa565b602082019050919050565b60006141c06020836149c9565b91506141cb826152d3565b602082019050919050565b60006141e3602c836149c9565b91506141ee826152fc565b604082019050919050565b60006142066020836149c9565b91506142118261534b565b602082019050919050565b6000614229602f836149c9565b915061423482615374565b604082019050919050565b600061424c6017836149c9565b9150614257826153c3565b602082019050919050565b600061426f6021836149c9565b915061427a826153ec565b604082019050919050565b6000614292601b836149c9565b915061429d8261543b565b602082019050919050565b60006142b56031836149c9565b91506142c082615464565b604082019050919050565b60006142d8602c836149c9565b91506142e3826154b3565b604082019050919050565b60006142fb6019836149c9565b915061430682615502565b602082019050919050565b600061431e6012836149c9565b91506143298261552b565b602082019050919050565b6000614341601c836149c9565b915061434c82615554565b602082019050919050565b60006143646021836149c9565b915061436f8261557d565b604082019050919050565b60006143876011836149c9565b9150614392826155cc565b602082019050919050565b60006143aa6022836149c9565b91506143b5826155f5565b604082019050919050565b6143c981614b64565b82525050565b60006143db8285613ee9565b91506143e78284613ee9565b91508190509392505050565b60006020820190506144086000830184613e59565b92915050565b60006080820190506144236000830187613e59565b6144306020830186613e59565b61443d60408301856143c0565b818103606083015261444f8184613e77565b905095945050505050565b600060208201905061446f6000830184613e68565b92915050565b6000602082019050818103600083015261448f8184613eb0565b905092915050565b600060208201905081810360008301526144b081613f1a565b9050919050565b600060208201905081810360008301526144d081613f3d565b9050919050565b600060208201905081810360008301526144f081613f60565b9050919050565b6000602082019050818103600083015261451081613f83565b9050919050565b6000602082019050818103600083015261453081613fa6565b9050919050565b6000602082019050818103600083015261455081613fc9565b9050919050565b6000602082019050818103600083015261457081613fec565b9050919050565b600060208201905081810360008301526145908161400f565b9050919050565b600060208201905081810360008301526145b081614032565b9050919050565b600060208201905081810360008301526145d081614055565b9050919050565b600060208201905081810360008301526145f081614078565b9050919050565b600060208201905081810360008301526146108161409b565b9050919050565b60006020820190508181036000830152614630816140be565b9050919050565b60006020820190508181036000830152614650816140e1565b9050919050565b6000602082019050818103600083015261467081614104565b9050919050565b6000602082019050818103600083015261469081614127565b9050919050565b600060208201905081810360008301526146b08161414a565b9050919050565b600060208201905081810360008301526146d08161416d565b9050919050565b600060208201905081810360008301526146f081614190565b9050919050565b60006020820190508181036000830152614710816141b3565b9050919050565b60006020820190508181036000830152614730816141d6565b9050919050565b60006020820190508181036000830152614750816141f9565b9050919050565b600060208201905081810360008301526147708161421c565b9050919050565b600060208201905081810360008301526147908161423f565b9050919050565b600060208201905081810360008301526147b081614262565b9050919050565b600060208201905081810360008301526147d081614285565b9050919050565b600060208201905081810360008301526147f0816142a8565b9050919050565b60006020820190508181036000830152614810816142cb565b9050919050565b60006020820190508181036000830152614830816142ee565b9050919050565b6000602082019050818103600083015261485081614311565b9050919050565b6000602082019050818103600083015261487081614334565b9050919050565b6000602082019050818103600083015261489081614357565b9050919050565b600060208201905081810360008301526148b08161437a565b9050919050565b600060208201905081810360008301526148d08161439d565b9050919050565b60006020820190506148ec60008301846143c0565b92915050565b600060408201905061490760008301856143c0565b6149146020830184613e68565b9392505050565b6000614925614936565b90506149318282614c0c565b919050565b6000604051905090565b600067ffffffffffffffff82111561495b5761495a614da2565b5b61496482614def565b9050602081019050919050565b600067ffffffffffffffff82111561498c5761498b614da2565b5b61499582614def565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006149f082614b64565b91506149fb83614b64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a3057614a2f614cb7565b5b828201905092915050565b6000614a4682614b64565b9150614a5183614b64565b925082614a6157614a60614ce6565b5b828204905092915050565b6000614a7782614b64565b9150614a8283614b64565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614abb57614aba614cb7565b5b828202905092915050565b6000614ad182614b64565b9150614adc83614b64565b925082821015614aef57614aee614cb7565b5b828203905092915050565b6000614b0582614b44565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b9b578082015181840152602081019050614b80565b83811115614baa576000848401525b50505050565b6000614bbb82614b64565b91506000821415614bcf57614bce614cb7565b5b600182039050919050565b60006002820490506001821680614bf257607f821691505b60208210811415614c0657614c05614d15565b5b50919050565b614c1582614def565b810181811067ffffffffffffffff82111715614c3457614c33614da2565b5b80604052505050565b6000614c4882614b64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7b57614c7a614cb7565b5b600182019050919050565b6000614c9182614b64565b9150614c9c83614b64565b925082614cac57614cab614ce6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f507572636861736520707269636520746f6f206c6f7700000000000000000000600082015250565b7f53616c652061626f727465642100000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6f6666536574496e646578426c6f636b2068617320616c72656164792062656560008201527f6e20736574210000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f416d6f756e74206973206265796f6e6420617661696c61626c6520746f6b656e60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206973206e6f742077686974656c697374656421000000000000600082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206f66667365742067656e6572617465642100000000000000600082015250565b7f416d6f756e7420686967686572207468616e20617661696c6961626c6520746f60008201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b7f537570706c7920686967686572207468616e2030210000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65732063757272656e746c7920636c6f73656421000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c657420616c72656164792077686974656c6973746564210000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f507572636861736520616d6f756e7420746f6f20686967682100000000000000600082015250565b7f4261642076616c756520656e7465726564210000000000000000000000000000600082015250565b7f6f66665365742068617320616c7265616479206265656e207365742100000000600082015250565b7f57686974656c697374207075726368617365206c696d6974207265616368656460008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6573206e6f7420636c6f73656421000000000000000000000000000000600082015250565b7f6f6666536574496e646578426c6f636b20686173206e6f74206265656e20736560008201527f7421000000000000000000000000000000000000000000000000000000000000602082015250565b61564d81614afa565b811461565857600080fd5b50565b61566481614b0c565b811461566f57600080fd5b50565b61567b81614b18565b811461568657600080fd5b50565b61569281614b64565b811461569d57600080fd5b5056fea26469706673582212209b9f374248d14d72cb644902d9a398bf9562e9a9974d5945e4f013e7326ea31664736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d646e5743524344595475384e6f4d51465133366a4e53316f693944547a686f77687a626a623777646a7154352f00000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063895814741161015a578063c87b56dd116100c1578063e086e5ec1161007a578063e086e5ec146109a4578063e5c15729146109bb578063e985e9c5146109e4578063f2fde38b14610a21578063ffcc43c414610a4a578063ffe630b514610a7557610288565b8063c87b56dd14610890578063c90ca4b8146108cd578063d4039f42146108f8578063d75e611014610923578063dbf8c3f71461094e578063dcfc757e1461097957610288565b80639ff048fc116101135780639ff048fc146107a2578063a22cb465146107b9578063a560ed7b146107e2578063b88d4fde1461080d578063bc1c864c14610836578063c634d0321461087457610288565b806389581474146106a25780638d859f3e146106cd5780638da5cb5b146106f857806395d89b411461072357806397db3cca1461074e5780639cce37c61461076557610288565b806346ff3233116101fe57806366474ff7116101b757806366474ff7146105ba5780636bb6fdb1146105e357806370a08231146105fa578063715018a614610637578063740d73f31461064e57806375c2d8011461067757610288565b806346ff3233146104965780634f6ccce7146104c157806355f804b3146104fe578063609472a2146105275780636352211e146105525780636373a6b11461058f57610288565b80630ae0720a116102505780630ae0720a1461038657806318160ddd146103b157806323b872dd146103dc578063271b52ee146104055780632f745c591461043057806342842e0e1461046d57610288565b806301ffc9a71461028d57806306be68b3146102ca57806306fdde03146102f5578063081812fc14610320578063095ea7b31461035d575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613d89565b610a9e565b6040516102c1919061445a565b60405180910390f35b3480156102d657600080fd5b506102df610b18565b6040516102ec91906148d7565b60405180910390f35b34801561030157600080fd5b5061030a610b1e565b6040516103179190614475565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190613e2c565b610bb0565b60405161035491906143f3565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613cfc565b610c35565b005b34801561039257600080fd5b5061039b610d4d565b6040516103a891906148d7565b60405180910390f35b3480156103bd57600080fd5b506103c6610d53565b6040516103d391906148d7565b60405180910390f35b3480156103e857600080fd5b5061040360048036038101906103fe9190613be6565b610d60565b005b34801561041157600080fd5b5061041a610dc0565b60405161042791906148d7565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613cfc565b610dc6565b60405161046491906148d7565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190613be6565b610e6b565b005b3480156104a257600080fd5b506104ab610e8b565b6040516104b891906148d7565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613e2c565b610e91565b6040516104f591906148d7565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190613de3565b610f02565b005b34801561053357600080fd5b5061053c610f98565b60405161054991906143f3565b60405180910390f35b34801561055e57600080fd5b5061057960048036038101906105749190613e2c565b610faf565b60405161058691906143f3565b60405180910390f35b34801561059b57600080fd5b506105a4611061565b6040516105b19190614475565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190613e2c565b6110ef565b005b3480156105ef57600080fd5b506105f8611230565b005b34801561060657600080fd5b50610621600480360381019061061c9190613b79565b6113a2565b60405161062e91906148d7565b60405180910390f35b34801561064357600080fd5b5061064c61145a565b005b34801561065a57600080fd5b5061067560048036038101906106709190613d3c565b6114e2565b005b34801561068357600080fd5b5061068c6116f7565b60405161069991906148d7565b60405180910390f35b3480156106ae57600080fd5b506106b7611702565b6040516106c491906143f3565b60405180910390f35b3480156106d957600080fd5b506106e261171a565b6040516106ef91906148d7565b60405180910390f35b34801561070457600080fd5b5061070d611725565b60405161071a91906143f3565b60405180910390f35b34801561072f57600080fd5b5061073861174f565b6040516107459190614475565b60405180910390f35b34801561075a57600080fd5b506107636117e1565b005b34801561077157600080fd5b5061078c60048036038101906107879190613b79565b611929565b604051610799919061445a565b60405180910390f35b3480156107ae57600080fd5b506107b7611a48565b005b3480156107c557600080fd5b506107e060048036038101906107db9190613cbc565b611b47565b005b3480156107ee57600080fd5b506107f7611b5d565b60405161080491906148d7565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f9190613c39565b611b63565b005b34801561084257600080fd5b5061085d60048036038101906108589190613b79565b611bc5565b60405161086b9291906148f2565b60405180910390f35b61088e60048036038101906108899190613e2c565b611bf6565b005b34801561089c57600080fd5b506108b760048036038101906108b29190613e2c565b611f2c565b6040516108c49190614475565b60405180910390f35b3480156108d957600080fd5b506108e2611fd3565b6040516108ef91906148d7565b60405180910390f35b34801561090457600080fd5b5061090d611fd9565b60405161091a91906148d7565b60405180910390f35b34801561092f57600080fd5b50610938611fde565b60405161094591906148d7565b60405180910390f35b34801561095a57600080fd5b50610963611fe3565b60405161097091906143f3565b60405180910390f35b34801561098557600080fd5b5061098e611ffb565b60405161099b91906143f3565b60405180910390f35b3480156109b057600080fd5b506109b9612013565b005b3480156109c757600080fd5b506109e260048036038101906109dd9190613e2c565b61222e565b005b3480156109f057600080fd5b50610a0b6004803603810190610a069190613ba6565b612330565b604051610a18919061445a565b60405180910390f35b348015610a2d57600080fd5b50610a486004803603810190610a439190613b79565b6123c4565b005b348015610a5657600080fd5b50610a5f6124bc565b604051610a6c9190614475565b60405180910390f35b348015610a8157600080fd5b50610a9c6004803603810190610a979190613de3565b61254a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b115750610b108261261e565b5b9050919050565b61022b81565b606060008054610b2d90614bda565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5990614bda565b8015610ba65780601f10610b7b57610100808354040283529160200191610ba6565b820191906000526020600020905b815481529060010190602001808311610b8957829003601f168201915b5050505050905090565b6000610bbb82612700565b610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf190614717565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4082610faf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca890614797565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd061276c565b73ffffffffffffffffffffffffffffffffffffffff161480610cff5750610cfe81610cf961276c565b612330565b5b610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d35906145f7565b60405180910390fd5b610d488383612774565b505050565b600f5481565b6000600880549050905090565b610d71610d6b61276c565b8261282d565b610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da7906147d7565b60405180910390fd5b610dbb83838361290b565b505050565b600d5481565b6000610dd1836113a2565b8210610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e09906144d7565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e8683838360405180602001604052806000815250611b63565b505050565b600e5481565b6000610e9b610d53565b8210610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed3906147f7565b60405180910390fd5b60088281548110610ef057610eef614d73565b5b90600052602060002001549050919050565b610f0a61276c565b73ffffffffffffffffffffffffffffffffffffffff16610f28611725565b73ffffffffffffffffffffffffffffffffffffffff1614610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7590614737565b60405180910390fd5b8060109080519060200190610f94929190613937565b5050565b721934f98262cb8a29ec329be6c6ae89daa860c981565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90614677565b60405180910390fd5b80915050919050565b600c805461106e90614bda565b80601f016020809104026020016040519081016040528092919081815260200182805461109a90614bda565b80156110e75780601f106110bc576101008083540402835291602001916110e7565b820191906000526020600020905b8154815290600101906020018083116110ca57829003601f168201915b505050505081565b6110f761276c565b73ffffffffffffffffffffffffffffffffffffffff16611115611725565b73ffffffffffffffffffffffffffffffffffffffff161461116b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116290614737565b60405180910390fd5b6000600f54146111b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a790614897565b60405180910390fd5b610d056111bb610d53565b826111c691906149e5565b1115611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe906146b7565b60405180910390fd5b5b600081111561122d57808061121c90614bb0565b91505061122833612b72565b611208565b50565b6000600e541415611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906148b7565b60405180910390fd5b6000600d54146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614857565b60405180910390fd5b6000610d05600e546112cd9190614c86565b905060ff6112e6600e5443612bf290919063ffffffff16565b1180156112f35750600081145b1561131b57610d056001600e5461130a9190614ac6565b4060001c6113189190614c86565b90505b600081141561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690614697565b60405180910390fd5b80600d819055507fb0d9b50d534bcd160f322d1c7bf134b821e0b2765e0300c874b6462468a92cd7600d5460405161139791906148d7565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90614637565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61146261276c565b73ffffffffffffffffffffffffffffffffffffffff16611480611725565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90614737565b60405180910390fd5b6114e06000612c08565b565b6114ea61276c565b73ffffffffffffffffffffffffffffffffffffffff16611508611725565b73ffffffffffffffffffffffffffffffffffffffff161461155e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155590614737565b60405180910390fd5b600082829050905061022b8160115461157791906149e5565b111561158257600080fd5b60005b818110156116f157601260008585848181106115a4576115a3614d73565b5b90506020020160208101906115b99190613b79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff1615611644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163b906147b7565b60405180910390fd5b6011600081548092919061165790614c3d565b919050555060016012600086868581811061167557611674614d73565b5b905060200201602081019061168a9190613b79565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff02191690831515021790555080806116e990614c3d565b915050611585565b50505050565b666a94d74f43000081565b7397edbb51da68191a667b7d919c00ef6992ae30d381565b66b1a2bc2ec5000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461175e90614bda565b80601f016020809104026020016040519081016040528092919081815260200182805461178a90614bda565b80156117d75780601f106117ac576101008083540402835291602001916117d7565b820191906000526020600020905b8154815290600101906020018083116117ba57829003601f168201915b5050505050905090565b6117e961276c565b73ffffffffffffffffffffffffffffffffffffffff16611807611725565b73ffffffffffffffffffffffffffffffffffffffff161461185d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185490614737565b60405180910390fd5b6000600e54146118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906145b7565b60405180910390fd5b6000600f54146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90614897565b60405180910390fd5b43600e819055507f72ffcba238e31557cc77f8e45a356cf5a4da615ff70e7a11425121931315f331600e5460405161191f91906148d7565b60405180910390a1565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff166119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190614657565b60405180910390fd5b6003601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614877565b60405180910390fd5b60019050919050565b611a5061276c565b73ffffffffffffffffffffffffffffffffffffffff16611a6e611725565b73ffffffffffffffffffffffffffffffffffffffff1614611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90614737565b60405180910390fd5b6000611ace610d53565b14611b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b05906146d7565b60405180910390fd5b6000600190505b600a8111611b4457611b27600b6125e0565b611b313382612cce565b8080611b3c90614c3d565b915050611b15565b50565b611b59611b5261276c565b8383612cec565b5050565b610d0581565b611b74611b6e61276c565b8361282d565b611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906147d7565b60405180910390fd5b611bbf84848484612e59565b50505050565b60126020528060005260406000206000915090508060000154908060010160009054906101000a900460ff16905082565b610d05611c01610d53565b82611c0c91906149e5565b1115611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4490614617565b60405180910390fd5b6000600f5411611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8990614777565b60405180910390fd5b6000611c9c61276c565b90506001600f541415611e6157611cb281611929565b611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce8906144b7565b60405180910390fd5b34611d0c83666a94d74f430000612eb590919063ffffffff16565b1115611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490614497565b60405180910390fd5b6003601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015483611d9d91906149e5565b1115611dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd590614817565b60405180910390fd5b5b6000821115611e5c57601260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000815480929190611e3b90614c3d565b9190505550611e4981612b72565b8180611e5490614bb0565b925050611ddf565b611f28565b34611e7c8366b1a2bc2ec50000612eb590919063ffffffff16565b1115611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb490614497565b60405180910390fd5b6005821115611f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef890614817565b60405180910390fd5b5b6000821115611f2757611f1481612b72565b8180611f1f90614bb0565b925050611f02565b5b5050565b6060611f3782612700565b611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d90614757565b60405180910390fd5b6000611f80612ecb565b90506000815111611fa05760405180602001604052806000815250611fcb565b80611faa84612f5d565b604051602001611fbb9291906143cf565b6040516020818303038152906040525b915050919050565b60115481565b600381565b600581565b73399e8ee6c140ea41c9d2f818bba6fa3a1d20064d81565b733251b9f18aad322bf8b2753728cc1a42c8fbda6d81565b61201b61276c565b73ffffffffffffffffffffffffffffffffffffffff16612039611725565b73ffffffffffffffffffffffffffffffffffffffff161461208f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208690614737565b60405180910390fd5b600047905060006120bd60646120af601985612eb590919063ffffffff16565b6130be90919063ffffffff16565b90507397edbb51da68191a667b7d919c00ef6992ae30d373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612119573d6000803e3d6000fd5b50721934f98262cb8a29ec329be6c6ae89daa860c973ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612173573d6000803e3d6000fd5b50733251b9f18aad322bf8b2753728cc1a42c8fbda6d73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156121ce573d6000803e3d6000fd5b5073399e8ee6c140ea41c9d2f818bba6fa3a1d20064d73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612229573d6000803e3d6000fd5b505050565b61223661276c565b73ffffffffffffffffffffffffffffffffffffffff16612254611725565b73ffffffffffffffffffffffffffffffffffffffff16146122aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a190614737565b60405180910390fd5b600381106122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e490614837565b60405180910390fd5b80600f819055507fea44936fc1183d38889d6e14d366ab1616121bb12bdb38ca15bbdf8cf944c830600f5460405161232591906148d7565b60405180910390a150565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123cc61276c565b73ffffffffffffffffffffffffffffffffffffffff166123ea611725565b73ffffffffffffffffffffffffffffffffffffffff1614612440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243790614737565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a790614517565b60405180910390fd5b6124b981612c08565b50565b601080546124c990614bda565b80601f01602080910402602001604051908101604052809291908181526020018280546124f590614bda565b80156125425780601f1061251757610100808354040283529160200191612542565b820191906000526020600020905b81548152906001019060200180831161252557829003601f168201915b505050505081565b61255261276c565b73ffffffffffffffffffffffffffffffffffffffff16612570611725565b73ffffffffffffffffffffffffffffffffffffffff16146125c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bd90614737565b60405180910390fd5b80600c90805190602001906125dc929190613937565b5050565b6001816000016000828254019250508190555050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126f957506126f8826130d4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127e783610faf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061283882612700565b612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e906145d7565b60405180910390fd5b600061288283610faf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128f157508373ffffffffffffffffffffffffffffffffffffffff166128d984610bb0565b73ffffffffffffffffffffffffffffffffffffffff16145b8061290257506129018185612330565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661292b82610faf565b73ffffffffffffffffffffffffffffffffffffffff1614612981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297890614537565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e890614577565b60405180910390fd5b6129fc83838361313e565b612a07600082612774565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a579190614ac6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aae91906149e5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6d838383613252565b505050565b612b7c600b6125e0565b612b8f81612b8a600b613257565b612cce565b6000600e54148015612ba95750610d05612ba7610d53565b145b15612bef5743600e819055507f72ffcba238e31557cc77f8e45a356cf5a4da615ff70e7a11425121931315f331600e54604051612be691906148d7565b60405180910390a15b50565b60008183612c009190614ac6565b905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ce8828260405180602001604052806000815250613265565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5290614597565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e4c919061445a565b60405180910390a3505050565b612e6484848461290b565b612e70848484846132c0565b612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea6906144f7565b60405180910390fd5b50505050565b60008183612ec39190614a6c565b905092915050565b606060108054612eda90614bda565b80601f0160208091040260200160405190810160405280929190818152602001828054612f0690614bda565b8015612f535780601f10612f2857610100808354040283529160200191612f53565b820191906000526020600020905b815481529060010190602001808311612f3657829003601f168201915b5050505050905090565b60606000821415612fa5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130b9565b600082905060005b60008214612fd7578080612fc090614c3d565b915050600a82612fd09190614a3b565b9150612fad565b60008167ffffffffffffffff811115612ff357612ff2614da2565b5b6040519080825280601f01601f1916602001820160405280156130255781602001600182028036833780820191505090505b5090505b600085146130b25760018261303e9190614ac6565b9150600a8561304d9190614c86565b603061305991906149e5565b60f81b81838151811061306f5761306e614d73565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130ab9190614a3b565b9450613029565b8093505050505b919050565b600081836130cc9190614a3b565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613149838383612619565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561318c5761318781613457565b6131cb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131ca576131c983826134a0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561320e576132098161360d565b61324d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461324c5761324b82826136de565b5b5b505050565b505050565b600081600001549050919050565b61326f838361375d565b61327c60008484846132c0565b6132bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b2906144f7565b60405180910390fd5b505050565b60006132e18473ffffffffffffffffffffffffffffffffffffffff166125f6565b1561344a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261330a61276c565b8786866040518563ffffffff1660e01b815260040161332c949392919061440e565b602060405180830381600087803b15801561334657600080fd5b505af192505050801561337757506040513d601f19601f820116820180604052508101906133749190613db6565b60015b6133fa573d80600081146133a7576040519150601f19603f3d011682016040523d82523d6000602084013e6133ac565b606091505b506000815114156133f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e9906144f7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061344f565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134ad846113a2565b6134b79190614ac6565b905060006007600084815260200190815260200160002054905081811461359c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136219190614ac6565b905060006009600084815260200190815260200160002054905060006008838154811061365157613650614d73565b5b90600052602060002001549050806008838154811061367357613672614d73565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136c2576136c1614d44565b5b6001900381819060005260206000200160009055905550505050565b60006136e9836113a2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c4906146f7565b60405180910390fd5b6137d681612700565b15613816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380d90614557565b60405180910390fd5b6138226000838361313e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461387291906149e5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461393360008383613252565b5050565b82805461394390614bda565b90600052602060002090601f01602090048101928261396557600085556139ac565b82601f1061397e57805160ff19168380011785556139ac565b828001600101855582156139ac579182015b828111156139ab578251825591602001919060010190613990565b5b5090506139b991906139bd565b5090565b5b808211156139d65760008160009055506001016139be565b5090565b60006139ed6139e884614940565b61491b565b905082815260208101848484011115613a0957613a08614de0565b5b613a14848285614b6e565b509392505050565b6000613a2f613a2a84614971565b61491b565b905082815260208101848484011115613a4b57613a4a614de0565b5b613a56848285614b6e565b509392505050565b600081359050613a6d81615644565b92915050565b60008083601f840112613a8957613a88614dd6565b5b8235905067ffffffffffffffff811115613aa657613aa5614dd1565b5b602083019150836020820283011115613ac257613ac1614ddb565b5b9250929050565b600081359050613ad88161565b565b92915050565b600081359050613aed81615672565b92915050565b600081519050613b0281615672565b92915050565b600082601f830112613b1d57613b1c614dd6565b5b8135613b2d8482602086016139da565b91505092915050565b600082601f830112613b4b57613b4a614dd6565b5b8135613b5b848260208601613a1c565b91505092915050565b600081359050613b7381615689565b92915050565b600060208284031215613b8f57613b8e614dea565b5b6000613b9d84828501613a5e565b91505092915050565b60008060408385031215613bbd57613bbc614dea565b5b6000613bcb85828601613a5e565b9250506020613bdc85828601613a5e565b9150509250929050565b600080600060608486031215613bff57613bfe614dea565b5b6000613c0d86828701613a5e565b9350506020613c1e86828701613a5e565b9250506040613c2f86828701613b64565b9150509250925092565b60008060008060808587031215613c5357613c52614dea565b5b6000613c6187828801613a5e565b9450506020613c7287828801613a5e565b9350506040613c8387828801613b64565b925050606085013567ffffffffffffffff811115613ca457613ca3614de5565b5b613cb087828801613b08565b91505092959194509250565b60008060408385031215613cd357613cd2614dea565b5b6000613ce185828601613a5e565b9250506020613cf285828601613ac9565b9150509250929050565b60008060408385031215613d1357613d12614dea565b5b6000613d2185828601613a5e565b9250506020613d3285828601613b64565b9150509250929050565b60008060208385031215613d5357613d52614dea565b5b600083013567ffffffffffffffff811115613d7157613d70614de5565b5b613d7d85828601613a73565b92509250509250929050565b600060208284031215613d9f57613d9e614dea565b5b6000613dad84828501613ade565b91505092915050565b600060208284031215613dcc57613dcb614dea565b5b6000613dda84828501613af3565b91505092915050565b600060208284031215613df957613df8614dea565b5b600082013567ffffffffffffffff811115613e1757613e16614de5565b5b613e2384828501613b36565b91505092915050565b600060208284031215613e4257613e41614dea565b5b6000613e5084828501613b64565b91505092915050565b613e6281614afa565b82525050565b613e7181614b0c565b82525050565b6000613e82826149a2565b613e8c81856149b8565b9350613e9c818560208601614b7d565b613ea581614def565b840191505092915050565b6000613ebb826149ad565b613ec581856149c9565b9350613ed5818560208601614b7d565b613ede81614def565b840191505092915050565b6000613ef4826149ad565b613efe81856149da565b9350613f0e818560208601614b7d565b80840191505092915050565b6000613f276016836149c9565b9150613f3282614e00565b602082019050919050565b6000613f4a600d836149c9565b9150613f5582614e29565b602082019050919050565b6000613f6d602b836149c9565b9150613f7882614e52565b604082019050919050565b6000613f906032836149c9565b9150613f9b82614ea1565b604082019050919050565b6000613fb36026836149c9565b9150613fbe82614ef0565b604082019050919050565b6000613fd66025836149c9565b9150613fe182614f3f565b604082019050919050565b6000613ff9601c836149c9565b915061400482614f8e565b602082019050919050565b600061401c6024836149c9565b915061402782614fb7565b604082019050919050565b600061403f6019836149c9565b915061404a82615006565b602082019050919050565b60006140626026836149c9565b915061406d8261502f565b604082019050919050565b6000614085602c836149c9565b91506140908261507e565b604082019050919050565b60006140a86038836149c9565b91506140b3826150cd565b604082019050919050565b60006140cb6021836149c9565b91506140d68261511c565b604082019050919050565b60006140ee602a836149c9565b91506140f98261516b565b604082019050919050565b6000614111601a836149c9565b915061411c826151ba565b602082019050919050565b60006141346029836149c9565b915061413f826151e3565b604082019050919050565b60006141576019836149c9565b915061416282615232565b602082019050919050565b600061417a6024836149c9565b91506141858261525b565b604082019050919050565b600061419d6015836149c9565b91506141a8826152aa565b602082019050919050565b60006141c06020836149c9565b91506141cb826152d3565b602082019050919050565b60006141e3602c836149c9565b91506141ee826152fc565b604082019050919050565b60006142066020836149c9565b91506142118261534b565b602082019050919050565b6000614229602f836149c9565b915061423482615374565b604082019050919050565b600061424c6017836149c9565b9150614257826153c3565b602082019050919050565b600061426f6021836149c9565b915061427a826153ec565b604082019050919050565b6000614292601b836149c9565b915061429d8261543b565b602082019050919050565b60006142b56031836149c9565b91506142c082615464565b604082019050919050565b60006142d8602c836149c9565b91506142e3826154b3565b604082019050919050565b60006142fb6019836149c9565b915061430682615502565b602082019050919050565b600061431e6012836149c9565b91506143298261552b565b602082019050919050565b6000614341601c836149c9565b915061434c82615554565b602082019050919050565b60006143646021836149c9565b915061436f8261557d565b604082019050919050565b60006143876011836149c9565b9150614392826155cc565b602082019050919050565b60006143aa6022836149c9565b91506143b5826155f5565b604082019050919050565b6143c981614b64565b82525050565b60006143db8285613ee9565b91506143e78284613ee9565b91508190509392505050565b60006020820190506144086000830184613e59565b92915050565b60006080820190506144236000830187613e59565b6144306020830186613e59565b61443d60408301856143c0565b818103606083015261444f8184613e77565b905095945050505050565b600060208201905061446f6000830184613e68565b92915050565b6000602082019050818103600083015261448f8184613eb0565b905092915050565b600060208201905081810360008301526144b081613f1a565b9050919050565b600060208201905081810360008301526144d081613f3d565b9050919050565b600060208201905081810360008301526144f081613f60565b9050919050565b6000602082019050818103600083015261451081613f83565b9050919050565b6000602082019050818103600083015261453081613fa6565b9050919050565b6000602082019050818103600083015261455081613fc9565b9050919050565b6000602082019050818103600083015261457081613fec565b9050919050565b600060208201905081810360008301526145908161400f565b9050919050565b600060208201905081810360008301526145b081614032565b9050919050565b600060208201905081810360008301526145d081614055565b9050919050565b600060208201905081810360008301526145f081614078565b9050919050565b600060208201905081810360008301526146108161409b565b9050919050565b60006020820190508181036000830152614630816140be565b9050919050565b60006020820190508181036000830152614650816140e1565b9050919050565b6000602082019050818103600083015261467081614104565b9050919050565b6000602082019050818103600083015261469081614127565b9050919050565b600060208201905081810360008301526146b08161414a565b9050919050565b600060208201905081810360008301526146d08161416d565b9050919050565b600060208201905081810360008301526146f081614190565b9050919050565b60006020820190508181036000830152614710816141b3565b9050919050565b60006020820190508181036000830152614730816141d6565b9050919050565b60006020820190508181036000830152614750816141f9565b9050919050565b600060208201905081810360008301526147708161421c565b9050919050565b600060208201905081810360008301526147908161423f565b9050919050565b600060208201905081810360008301526147b081614262565b9050919050565b600060208201905081810360008301526147d081614285565b9050919050565b600060208201905081810360008301526147f0816142a8565b9050919050565b60006020820190508181036000830152614810816142cb565b9050919050565b60006020820190508181036000830152614830816142ee565b9050919050565b6000602082019050818103600083015261485081614311565b9050919050565b6000602082019050818103600083015261487081614334565b9050919050565b6000602082019050818103600083015261489081614357565b9050919050565b600060208201905081810360008301526148b08161437a565b9050919050565b600060208201905081810360008301526148d08161439d565b9050919050565b60006020820190506148ec60008301846143c0565b92915050565b600060408201905061490760008301856143c0565b6149146020830184613e68565b9392505050565b6000614925614936565b90506149318282614c0c565b919050565b6000604051905090565b600067ffffffffffffffff82111561495b5761495a614da2565b5b61496482614def565b9050602081019050919050565b600067ffffffffffffffff82111561498c5761498b614da2565b5b61499582614def565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006149f082614b64565b91506149fb83614b64565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a3057614a2f614cb7565b5b828201905092915050565b6000614a4682614b64565b9150614a5183614b64565b925082614a6157614a60614ce6565b5b828204905092915050565b6000614a7782614b64565b9150614a8283614b64565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614abb57614aba614cb7565b5b828202905092915050565b6000614ad182614b64565b9150614adc83614b64565b925082821015614aef57614aee614cb7565b5b828203905092915050565b6000614b0582614b44565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614b9b578082015181840152602081019050614b80565b83811115614baa576000848401525b50505050565b6000614bbb82614b64565b91506000821415614bcf57614bce614cb7565b5b600182039050919050565b60006002820490506001821680614bf257607f821691505b60208210811415614c0657614c05614d15565b5b50919050565b614c1582614def565b810181811067ffffffffffffffff82111715614c3457614c33614da2565b5b80604052505050565b6000614c4882614b64565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7b57614c7a614cb7565b5b600182019050919050565b6000614c9182614b64565b9150614c9c83614b64565b925082614cac57614cab614ce6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f507572636861736520707269636520746f6f206c6f7700000000000000000000600082015250565b7f53616c652061626f727465642100000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6f6666536574496e646578426c6f636b2068617320616c72656164792062656560008201527f6e20736574210000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f416d6f756e74206973206265796f6e6420617661696c61626c6520746f6b656e60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206973206e6f742077686974656c697374656421000000000000600082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206f66667365742067656e6572617465642100000000000000600082015250565b7f416d6f756e7420686967686572207468616e20617661696c6961626c6520746f60008201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b7f537570706c7920686967686572207468616e2030210000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65732063757272656e746c7920636c6f73656421000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c657420616c72656164792077686974656c6973746564210000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f507572636861736520616d6f756e7420746f6f20686967682100000000000000600082015250565b7f4261642076616c756520656e7465726564210000000000000000000000000000600082015250565b7f6f66665365742068617320616c7265616479206265656e207365742100000000600082015250565b7f57686974656c697374207075726368617365206c696d6974207265616368656460008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6573206e6f7420636c6f73656421000000000000000000000000000000600082015250565b7f6f6666536574496e646578426c6f636b20686173206e6f74206265656e20736560008201527f7421000000000000000000000000000000000000000000000000000000000000602082015250565b61564d81614afa565b811461565857600080fd5b50565b61566481614b0c565b811461566f57600080fd5b50565b61567b81614b18565b811461568657600080fd5b50565b61569281614b64565b811461569d57600080fd5b5056fea26469706673582212209b9f374248d14d72cb644902d9a398bf9562e9a9974d5945e4f013e7326ea31664736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d646e5743524344595475384e6f4d51465133366a4e53316f693944547a686f77687a626a623777646a7154352f00000000000000000000

-----Decoded View---------------
Arg [0] : _value (string): ipfs://QmdnWCRCDYTu8NoMQFQ36jNS1oi9DTzhowhzbjb7wdjqT5/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d646e5743524344595475384e6f4d51465133366a4e5331
Arg [3] : 6f693944547a686f77687a626a623777646a7154352f00000000000000000000


Deployed Bytecode Sourcemap

54742:6550:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48511:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56214:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35278:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36837:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36360:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56143:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49151:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37587:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55336:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48819:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37997:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55371:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49341:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56634:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55511:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34972:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55184:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59622:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59977:619;;;;;;;;;;;;;:::i;:::-;;34702:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13487:103;;;;;;;;;;;;;:::i;:::-;;57174:467;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56034:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55415:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55983:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12836:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35447:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60608:300;;;;;;;;;;;;;:::i;:::-;;57653:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56906:256;;;;;;;;;;;;;:::i;:::-;;37130:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55818:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38253:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56322:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;58169:1087;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35622:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56273:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55923:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55872:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55708:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55615;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60920:363;;;;;;;;;;;;;:::i;:::-;;57960:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37356:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13745:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56180:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55222:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48511:224;48613:4;48652:35;48637:50;;;:11;:50;;;;:90;;;;48691:36;48715:11;48691:23;:36::i;:::-;48637:90;48630:97;;48511:224;;;:::o;56214:50::-;56261:3;56214:50;:::o;35278:100::-;35332:13;35365:5;35358:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35278:100;:::o;36837:221::-;36913:7;36941:16;36949:7;36941;:16::i;:::-;36933:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37026:15;:24;37042:7;37026:24;;;;;;;;;;;;;;;;;;;;;37019:31;;36837:221;;;:::o;36360:411::-;36441:13;36457:23;36472:7;36457:14;:23::i;:::-;36441:39;;36505:5;36499:11;;:2;:11;;;;36491:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36599:5;36583:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36608:37;36625:5;36632:12;:10;:12::i;:::-;36608:16;:37::i;:::-;36583:62;36561:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36742:21;36751:2;36755:7;36742:8;:21::i;:::-;36430:341;36360:411;;:::o;56143:28::-;;;;:::o;49151:113::-;49212:7;49239:10;:17;;;;49232:24;;49151:113;:::o;37587:339::-;37782:41;37801:12;:10;:12::i;:::-;37815:7;37782:18;:41::i;:::-;37774:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37890:28;37900:4;37906:2;37910:7;37890:9;:28::i;:::-;37587:339;;;:::o;55336:26::-;;;;:::o;48819:256::-;48916:7;48952:23;48969:5;48952:16;:23::i;:::-;48944:5;:31;48936:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49041:12;:19;49054:5;49041:19;;;;;;;;;;;;;;;:26;49061:5;49041:26;;;;;;;;;;;;49034:33;;48819:256;;;;:::o;37997:185::-;38135:39;38152:4;38158:2;38162:7;38135:39;;;;;;;;;;;;:16;:39::i;:::-;37997:185;;;:::o;55371:31::-;;;;:::o;49341:233::-;49416:7;49452:30;:28;:30::i;:::-;49444:5;:38;49436:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49549:10;49560:5;49549:17;;;;;;;;:::i;:::-;;;;;;;;;;49542:24;;49341:233;;;:::o;56634:97::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56715:6:::1;56705:7;:16;;;;;;;;;;;;:::i;:::-;;56634:97:::0;:::o;55511:77::-;55546:42;55511:77;:::o;34972:239::-;35044:7;35064:13;35080:7;:16;35088:7;35080:16;;;;;;;;;;;;;;;;;;;;;35064:32;;35132:1;35115:19;;:5;:19;;;;35107:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35198:5;35191:12;;;34972:239;;;:::o;55184:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59622:339::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59715:1:::1;59702:9;;:14;59694:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;55855:4;59771:13;:11;:13::i;:::-;59761:7;:23;;;;:::i;:::-;59760:39;;59751:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;59853:99;59870:1;59860:7;:11;59853:99;;;59889:9;;;;;:::i;:::-;;;;59915:23;59927:10;59915:11;:23::i;:::-;59853:99;;;59622:339:::0;:::o;59977:619::-;60055:1;60035:16;;:21;;60027:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60131:1;60116:11;;:16;60108:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60182:15;55855:4;60200:16;;:29;;;;:::i;:::-;60182:47;;60326:3;60289:34;60306:16;;60289:12;:16;;:34;;;;:::i;:::-;:40;:56;;;;;60344:1;60333:7;:12;60289:56;60285:156;;;55855:4;60411:1;60392:16;;:20;;;;:::i;:::-;60382:31;60374:40;;:53;;;;:::i;:::-;60364:63;;60285:156;60476:1;60465:7;:12;;60457:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;60534:7;60520:11;:21;;;;60559:27;60574:11;;60559:27;;;;;;:::i;:::-;;;;;;;;60014:582;59977:619::o;34702:208::-;34774:7;34819:1;34802:19;;:5;:19;;;;34794:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34886:9;:16;34896:5;34886:16;;;;;;;;;;;;;;;;34879:23;;34702:208;;;:::o;13487:103::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13552:30:::1;13579:1;13552:18;:30::i;:::-;13487:103::o:0;57174:467::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57258:19:::1;57280:10;;:17;;57258:39;;56261:3;57344:11;57320:21;;:35;;;;:::i;:::-;57319:61;;57310:71;;;::::0;::::1;;57398:9;57394:238;57417:11;57413:1;:15;57394:238;;;57460:9;:24;57470:10;;57481:1;57470:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57460:24;;;;;;;;;;;;;;;:31;;;;;;;;;;;;57459:32;57451:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57540:21;;:23;;;;;;;;;:::i;:::-;;;;;;57614:4;57580:9;:24;57590:10;;57601:1;57590:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;57580:24;;;;;;;;;;;;;;;:31;;;:38;;;;;;;;;;;;;;;;;;57430:3;;;;;:::i;:::-;;;;57394:238;;;;57245:396;57174:467:::0;;:::o;56034:47::-;56071:10;56034:47;:::o;55415:77::-;55450:42;55415:77;:::o;55983:42::-;56015:10;55983:42;:::o;12836:87::-;12882:7;12909:6;;;;;;;;;;;12902:13;;12836:87;:::o;35447:104::-;35503:13;35536:7;35529:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35447:104;:::o;60608:300::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60698:1:::1;60678:16;;:21;60670:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;60776:1;60763:9;;:14;60755:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;60831:12;60812:16;:31;;;;60861:37;60881:16;;60861:37;;;;;;:::i;:::-;;;;;;;;60608:300::o:0;57653:295::-;57715:4;57741:9;:19;57751:8;57741:19;;;;;;;;;;;;;;;:26;;;;;;;;;;;;57733:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55969:1;57819:9;:19;57829:8;57819:19;;;;;;;;;;;;;;;:35;;;:57;57811:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;57934:4;57927:11;;57653:295;;;:::o;56906:256::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56984:1:::1;56967:13;:11;:13::i;:::-;:18;56959:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;57029:9;57041:1;57029:13;;57024:129;57049:2;57044:1;:7;57024:129;;57074:24;:12;:22;:24::i;:::-;57115;57125:10;57137:1;57115:9;:24::i;:::-;57053:3;;;;;:::i;:::-;;;;57024:129;;;;56906:256::o:0;37130:155::-;37225:52;37244:12;:10;:12::i;:::-;37258:8;37268;37225:18;:52::i;:::-;37130:155;;:::o;55818:41::-;55855:4;55818:41;:::o;38253:328::-;38428:41;38447:12;:10;:12::i;:::-;38461:7;38428:18;:41::i;:::-;38420:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38534:39;38548:4;38554:2;38558:7;38567:5;38534:13;:39::i;:::-;38253:328;;;;:::o;56322:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58169:1087::-;55855:4;58252:13;:11;:13::i;:::-;58242:7;:23;;;;:::i;:::-;58241:40;;58232:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;58352:1;58340:9;;:13;58332:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;58398:14;58415:12;:10;:12::i;:::-;58398:29;;58460:1;58447:9;;:14;58444:803;;;58487:22;58502:6;58487:14;:22::i;:::-;58479:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;58579:9;58552:23;58567:7;56071:10;58552:14;;:23;;;;:::i;:::-;:36;;58544:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;55969:1;58652:9;:17;58662:6;58652:17;;;;;;;;;;;;;;;:33;;;58642:7;:43;;;;:::i;:::-;58641:68;;58632:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;58756:162;58772:1;58762:7;:11;58756:162;;;58795:9;:17;58805:6;58795:17;;;;;;;;;;;;;;;:33;;;:35;;;;;;;;;:::i;:::-;;;;;;58851:19;58863:6;58851:11;:19::i;:::-;58891:9;;;;;:::i;:::-;;;;58756:162;;;58444:803;;;58994:9;58972:18;58982:7;56015:10;58972:9;;:18;;;;:::i;:::-;:31;;58964:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55913:1;59056:7;:25;;59047:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59128:106;59144:1;59134:7;:11;59128:106;;;59167:19;59179:6;59167:11;:19::i;:::-;59207:9;;;;;:::i;:::-;;;;59128:106;;;58444:803;58219:1037;58169:1087;:::o;35622:334::-;35695:13;35729:16;35737:7;35729;:16::i;:::-;35721:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35810:21;35834:10;:8;:10::i;:::-;35810:34;;35886:1;35868:7;35862:21;:25;:86;;;;;;;;;;;;;;;;;35914:7;35923:18;:7;:16;:18::i;:::-;35897:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35862:86;35855:93;;;35622:334;;;:::o;56273:40::-;;;;:::o;55923:47::-;55969:1;55923:47;:::o;55872:42::-;55913:1;55872:42;:::o;55708:77::-;55743:42;55708:77;:::o;55615:::-;55650:42;55615:77;:::o;60920:363::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60973:15:::1;60991:21;60973:39;;61029:14;61046:24;61066:3;61046:15;61058:2;61046:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;61029:41;;55450:42;61083:26;;:34;61110:6;61083:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55546:42;61130:26;;:34;61157:6;61130:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55650:42;61177:26;;:34;61204:6;61177:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55743:42;61224:26;;:49;61251:21;61224:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60960:323;;60920:363::o:0;57960:197::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58047:1:::1;58038:6;:10;58030:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;58096:6;58084:9;:18;;;;58120:27;58137:9;;58120:27;;;;;;:::i;:::-;;;;;;;;57960:197:::0;:::o;37356:164::-;37453:4;37477:18;:25;37496:5;37477:25;;;;;;;;;;;;;;;:35;37503:8;37477:35;;;;;;;;;;;;;;;;;;;;;;;;;37470:42;;37356:164;;;;:::o;13745:201::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13854:1:::1;13834:22;;:8;:22;;;;13826:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13910:28;13929:8;13910:18;:28::i;:::-;13745:201:::0;:::o;56180:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55222:102::-;13067:12;:10;:12::i;:::-;13056:23;;:7;:5;:7::i;:::-;:23;;;13048:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55309:5:::1;55296:10;:18;;;;;;;;;;;;:::i;:::-;;55222:102:::0;:::o;1047:127::-;1154:1;1136:7;:14;;;:19;;;;;;;;;;;1047:127;:::o;15575:326::-;15635:4;15892:1;15870:7;:19;;;:23;15863:30;;15575:326;;;:::o;46804:126::-;;;;:::o;34333:305::-;34435:4;34487:25;34472:40;;;:11;:40;;;;:105;;;;34544:33;34529:48;;;:11;:48;;;;34472:105;:158;;;;34594:36;34618:11;34594:23;:36::i;:::-;34472:158;34452:178;;34333:305;;;:::o;40091:127::-;40156:4;40208:1;40180:30;;:7;:16;40188:7;40180:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40173:37;;40091:127;;;:::o;11507:98::-;11560:7;11587:10;11580:17;;11507:98;:::o;44237:174::-;44339:2;44312:15;:24;44328:7;44312:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44395:7;44391:2;44357:46;;44366:23;44381:7;44366:14;:23::i;:::-;44357:46;;;;;;;;;;;;44237:174;;:::o;40385:348::-;40478:4;40503:16;40511:7;40503;:16::i;:::-;40495:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40579:13;40595:23;40610:7;40595:14;:23::i;:::-;40579:39;;40648:5;40637:16;;:7;:16;;;:51;;;;40681:7;40657:31;;:20;40669:7;40657:11;:20::i;:::-;:31;;;40637:51;:87;;;;40692:32;40709:5;40716:7;40692:16;:32::i;:::-;40637:87;40629:96;;;40385:348;;;;:::o;43494:625::-;43653:4;43626:31;;:23;43641:7;43626:14;:23::i;:::-;:31;;;43618:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43732:1;43718:16;;:2;:16;;;;43710:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43788:39;43809:4;43815:2;43819:7;43788:20;:39::i;:::-;43892:29;43909:1;43913:7;43892:8;:29::i;:::-;43953:1;43934:9;:15;43944:4;43934:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43982:1;43965:9;:13;43975:2;43965:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44013:2;43994:7;:16;44002:7;43994:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44052:7;44048:2;44033:27;;44042:4;44033:27;;;;;;;;;;;;44073:38;44093:4;44099:2;44103:7;44073:19;:38::i;:::-;43494:625;;;:::o;59268:341::-;59326:24;:12;:22;:24::i;:::-;59363:42;59373:7;59382:22;:12;:20;:22::i;:::-;59363:9;:42::i;:::-;59446:1;59426:16;;:21;:52;;;;;55855:4;59451:13;:11;:13::i;:::-;:27;59426:52;59422:178;;;59515:12;59496:16;:31;;;;59549:37;59569:16;;59549:37;;;;;;:::i;:::-;;;;;;;;59422:178;59268:341;:::o;4814:98::-;4872:7;4903:1;4899;:5;;;;:::i;:::-;4892:12;;4814:98;;;;:::o;14106:191::-;14180:16;14199:6;;;;;;;;;;;14180:25;;14225:8;14216:6;;:17;;;;;;;;;;;;;;;;;;14280:8;14249:40;;14270:8;14249:40;;;;;;;;;;;;14169:128;14106:191;:::o;41075:110::-;41151:26;41161:2;41165:7;41151:26;;;;;;;;;;;;:9;:26::i;:::-;41075:110;;:::o;44553:315::-;44708:8;44699:17;;:5;:17;;;;44691:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44795:8;44757:18;:25;44776:5;44757:25;;;;;;;;;;;;;;;:35;44783:8;44757:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44841:8;44819:41;;44834:5;44819:41;;;44851:8;44819:41;;;;;;:::i;:::-;;;;;;;;44553:315;;;:::o;39463:::-;39620:28;39630:4;39636:2;39640:7;39620:9;:28::i;:::-;39667:48;39690:4;39696:2;39700:7;39709:5;39667:22;:48::i;:::-;39659:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39463:315;;;;:::o;5171:98::-;5229:7;5260:1;5256;:5;;;;:::i;:::-;5249:12;;5171:98;;;;:::o;56743:112::-;56803:13;56838:7;56831:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56743:112;:::o;9016:723::-;9072:13;9302:1;9293:5;:10;9289:53;;;9320:10;;;;;;;;;;;;;;;;;;;;;9289:53;9352:12;9367:5;9352:20;;9383:14;9408:78;9423:1;9415:4;:9;9408:78;;9441:8;;;;;:::i;:::-;;;;9472:2;9464:10;;;;;:::i;:::-;;;9408:78;;;9496:19;9528:6;9518:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9496:39;;9546:154;9562:1;9553:5;:10;9546:154;;9590:1;9580:11;;;;;:::i;:::-;;;9657:2;9649:5;:10;;;;:::i;:::-;9636:2;:24;;;;:::i;:::-;9623:39;;9606:6;9613;9606:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9686:2;9677:11;;;;;:::i;:::-;;;9546:154;;;9724:6;9710:21;;;;;9016:723;;;;:::o;5570:98::-;5628:7;5659:1;5655;:5;;;;:::i;:::-;5648:12;;5570:98;;;;:::o;25817:157::-;25902:4;25941:25;25926:40;;;:11;:40;;;;25919:47;;25817:157;;;:::o;50187:589::-;50331:45;50358:4;50364:2;50368:7;50331:26;:45::i;:::-;50409:1;50393:18;;:4;:18;;;50389:187;;;50428:40;50460:7;50428:31;:40::i;:::-;50389:187;;;50498:2;50490:10;;:4;:10;;;50486:90;;50517:47;50550:4;50556:7;50517:32;:47::i;:::-;50486:90;50389:187;50604:1;50590:16;;:2;:16;;;50586:183;;;50623:45;50660:7;50623:36;:45::i;:::-;50586:183;;;50696:4;50690:10;;:2;:10;;;50686:83;;50717:40;50745:2;50749:7;50717:27;:40::i;:::-;50686:83;50586:183;50187:589;;;:::o;47315:125::-;;;;:::o;925:114::-;990:7;1017;:14;;;1010:21;;925:114;;;:::o;41412:321::-;41542:18;41548:2;41552:7;41542:5;:18::i;:::-;41593:54;41624:1;41628:2;41632:7;41641:5;41593:22;:54::i;:::-;41571:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41412:321;;;:::o;45433:799::-;45588:4;45609:15;:2;:13;;;:15::i;:::-;45605:620;;;45661:2;45645:36;;;45682:12;:10;:12::i;:::-;45696:4;45702:7;45711:5;45645:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45641:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45904:1;45887:6;:13;:18;45883:272;;;45930:60;;;;;;;;;;:::i;:::-;;;;;;;;45883:272;46105:6;46099:13;46090:6;46086:2;46082:15;46075:38;45641:529;45778:41;;;45768:51;;;:6;:51;;;;45761:58;;;;;45605:620;46209:4;46202:11;;45433:799;;;;;;;:::o;51499:164::-;51603:10;:17;;;;51576:15;:24;51592:7;51576:24;;;;;;;;;;;:44;;;;51631:10;51647:7;51631:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51499:164;:::o;52290:988::-;52556:22;52606:1;52581:22;52598:4;52581:16;:22::i;:::-;:26;;;;:::i;:::-;52556:51;;52618:18;52639:17;:26;52657:7;52639:26;;;;;;;;;;;;52618:47;;52786:14;52772:10;:28;52768:328;;52817:19;52839:12;:18;52852:4;52839:18;;;;;;;;;;;;;;;:34;52858:14;52839:34;;;;;;;;;;;;52817:56;;52923:11;52890:12;:18;52903:4;52890:18;;;;;;;;;;;;;;;:30;52909:10;52890:30;;;;;;;;;;;:44;;;;53040:10;53007:17;:30;53025:11;53007:30;;;;;;;;;;;:43;;;;52802:294;52768:328;53192:17;:26;53210:7;53192:26;;;;;;;;;;;53185:33;;;53236:12;:18;53249:4;53236:18;;;;;;;;;;;;;;;:34;53255:14;53236:34;;;;;;;;;;;53229:41;;;52371:907;;52290:988;;:::o;53573:1079::-;53826:22;53871:1;53851:10;:17;;;;:21;;;;:::i;:::-;53826:46;;53883:18;53904:15;:24;53920:7;53904:24;;;;;;;;;;;;53883:45;;54255:19;54277:10;54288:14;54277:26;;;;;;;;:::i;:::-;;;;;;;;;;54255:48;;54341:11;54316:10;54327;54316:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54452:10;54421:15;:28;54437:11;54421:28;;;;;;;;;;;:41;;;;54593:15;:24;54609:7;54593:24;;;;;;;;;;;54586:31;;;54628:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53644:1008;;;53573:1079;:::o;51077:221::-;51162:14;51179:20;51196:2;51179:16;:20::i;:::-;51162:37;;51237:7;51210:12;:16;51223:2;51210:16;;;;;;;;;;;;;;;:24;51227:6;51210:24;;;;;;;;;;;:34;;;;51284:6;51255:17;:26;51273:7;51255:26;;;;;;;;;;;:35;;;;51151:147;51077:221;;:::o;42069:439::-;42163:1;42149:16;;:2;:16;;;;42141:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42222:16;42230:7;42222;:16::i;:::-;42221:17;42213:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42284:45;42313:1;42317:2;42321:7;42284:20;:45::i;:::-;42359:1;42342:9;:13;42352:2;42342:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42390:2;42371:7;:16;42379:7;42371:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42435:7;42431:2;42410:33;;42427:1;42410:33;;;;;;;;;;;;42456:44;42484:1;42488:2;42492:7;42456:19;:44::i;:::-;42069:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:327::-;6834:6;6883:2;6871:9;6862:7;6858:23;6854:32;6851:119;;;6889:79;;:::i;:::-;6851:119;7009:1;7034:52;7078:7;7069:6;7058:9;7054:22;7034:52;:::i;:::-;7024:62;;6980:116;6776:327;;;;:::o;7109:349::-;7178:6;7227:2;7215:9;7206:7;7202:23;7198:32;7195:119;;;7233:79;;:::i;:::-;7195:119;7353:1;7378:63;7433:7;7424:6;7413:9;7409:22;7378:63;:::i;:::-;7368:73;;7324:127;7109:349;;;;:::o;7464:509::-;7533:6;7582:2;7570:9;7561:7;7557:23;7553:32;7550:119;;;7588:79;;:::i;:::-;7550:119;7736:1;7725:9;7721:17;7708:31;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:63;7948:7;7939:6;7928:9;7924:22;7893:63;:::i;:::-;7883:73;;7679:287;7464:509;;;;:::o;7979:329::-;8038:6;8087:2;8075:9;8066:7;8062:23;8058:32;8055:119;;;8093:79;;:::i;:::-;8055:119;8213:1;8238:53;8283:7;8274:6;8263:9;8259:22;8238:53;:::i;:::-;8228:63;;8184:117;7979:329;;;;:::o;8314:118::-;8401:24;8419:5;8401:24;:::i;:::-;8396:3;8389:37;8314:118;;:::o;8438:109::-;8519:21;8534:5;8519:21;:::i;:::-;8514:3;8507:34;8438:109;;:::o;8553:360::-;8639:3;8667:38;8699:5;8667:38;:::i;:::-;8721:70;8784:6;8779:3;8721:70;:::i;:::-;8714:77;;8800:52;8845:6;8840:3;8833:4;8826:5;8822:16;8800:52;:::i;:::-;8877:29;8899:6;8877:29;:::i;:::-;8872:3;8868:39;8861:46;;8643:270;8553:360;;;;:::o;8919:364::-;9007:3;9035:39;9068:5;9035:39;:::i;:::-;9090:71;9154:6;9149:3;9090:71;:::i;:::-;9083:78;;9170:52;9215:6;9210:3;9203:4;9196:5;9192:16;9170:52;:::i;:::-;9247:29;9269:6;9247:29;:::i;:::-;9242:3;9238:39;9231:46;;9011:272;8919:364;;;;:::o;9289:377::-;9395:3;9423:39;9456:5;9423:39;:::i;:::-;9478:89;9560:6;9555:3;9478:89;:::i;:::-;9471:96;;9576:52;9621:6;9616:3;9609:4;9602:5;9598:16;9576:52;:::i;:::-;9653:6;9648:3;9644:16;9637:23;;9399:267;9289:377;;;;:::o;9672:366::-;9814:3;9835:67;9899:2;9894:3;9835:67;:::i;:::-;9828:74;;9911:93;10000:3;9911:93;:::i;:::-;10029:2;10024:3;10020:12;10013:19;;9672:366;;;:::o;10044:::-;10186:3;10207:67;10271:2;10266:3;10207:67;:::i;:::-;10200:74;;10283:93;10372:3;10283:93;:::i;:::-;10401:2;10396:3;10392:12;10385:19;;10044:366;;;:::o;10416:::-;10558:3;10579:67;10643:2;10638:3;10579:67;:::i;:::-;10572:74;;10655:93;10744:3;10655:93;:::i;:::-;10773:2;10768:3;10764:12;10757:19;;10416:366;;;:::o;10788:::-;10930:3;10951:67;11015:2;11010:3;10951:67;:::i;:::-;10944:74;;11027:93;11116:3;11027:93;:::i;:::-;11145:2;11140:3;11136:12;11129:19;;10788:366;;;:::o;11160:::-;11302:3;11323:67;11387:2;11382:3;11323:67;:::i;:::-;11316:74;;11399:93;11488:3;11399:93;:::i;:::-;11517:2;11512:3;11508:12;11501:19;;11160:366;;;:::o;11532:::-;11674:3;11695:67;11759:2;11754:3;11695:67;:::i;:::-;11688:74;;11771:93;11860:3;11771:93;:::i;:::-;11889:2;11884:3;11880:12;11873:19;;11532:366;;;:::o;11904:::-;12046:3;12067:67;12131:2;12126:3;12067:67;:::i;:::-;12060:74;;12143:93;12232:3;12143:93;:::i;:::-;12261:2;12256:3;12252:12;12245:19;;11904:366;;;:::o;12276:::-;12418:3;12439:67;12503:2;12498:3;12439:67;:::i;:::-;12432:74;;12515:93;12604:3;12515:93;:::i;:::-;12633:2;12628:3;12624:12;12617:19;;12276:366;;;:::o;12648:::-;12790:3;12811:67;12875:2;12870:3;12811:67;:::i;:::-;12804:74;;12887:93;12976:3;12887:93;:::i;:::-;13005:2;13000:3;12996:12;12989:19;;12648:366;;;:::o;13020:::-;13162:3;13183:67;13247:2;13242:3;13183:67;:::i;:::-;13176:74;;13259:93;13348:3;13259:93;:::i;:::-;13377:2;13372:3;13368:12;13361:19;;13020:366;;;:::o;13392:::-;13534:3;13555:67;13619:2;13614:3;13555:67;:::i;:::-;13548:74;;13631:93;13720:3;13631:93;:::i;:::-;13749:2;13744:3;13740:12;13733:19;;13392:366;;;:::o;13764:::-;13906:3;13927:67;13991:2;13986:3;13927:67;:::i;:::-;13920:74;;14003:93;14092:3;14003:93;:::i;:::-;14121:2;14116:3;14112:12;14105:19;;13764:366;;;:::o;14136:::-;14278:3;14299:67;14363:2;14358:3;14299:67;:::i;:::-;14292:74;;14375:93;14464:3;14375:93;:::i;:::-;14493:2;14488:3;14484:12;14477:19;;14136:366;;;:::o;14508:::-;14650:3;14671:67;14735:2;14730:3;14671:67;:::i;:::-;14664:74;;14747:93;14836:3;14747:93;:::i;:::-;14865:2;14860:3;14856:12;14849:19;;14508:366;;;:::o;14880:::-;15022:3;15043:67;15107:2;15102:3;15043:67;:::i;:::-;15036:74;;15119:93;15208:3;15119:93;:::i;:::-;15237:2;15232:3;15228:12;15221:19;;14880:366;;;:::o;15252:::-;15394:3;15415:67;15479:2;15474:3;15415:67;:::i;:::-;15408:74;;15491:93;15580:3;15491:93;:::i;:::-;15609:2;15604:3;15600:12;15593:19;;15252:366;;;:::o;15624:::-;15766:3;15787:67;15851:2;15846:3;15787:67;:::i;:::-;15780:74;;15863:93;15952:3;15863:93;:::i;:::-;15981:2;15976:3;15972:12;15965:19;;15624:366;;;:::o;15996:::-;16138:3;16159:67;16223:2;16218:3;16159:67;:::i;:::-;16152:74;;16235:93;16324:3;16235:93;:::i;:::-;16353:2;16348:3;16344:12;16337:19;;15996:366;;;:::o;16368:::-;16510:3;16531:67;16595:2;16590:3;16531:67;:::i;:::-;16524:74;;16607:93;16696:3;16607:93;:::i;:::-;16725:2;16720:3;16716:12;16709:19;;16368:366;;;:::o;16740:::-;16882:3;16903:67;16967:2;16962:3;16903:67;:::i;:::-;16896:74;;16979:93;17068:3;16979:93;:::i;:::-;17097:2;17092:3;17088:12;17081:19;;16740:366;;;:::o;17112:::-;17254:3;17275:67;17339:2;17334:3;17275:67;:::i;:::-;17268:74;;17351:93;17440:3;17351:93;:::i;:::-;17469:2;17464:3;17460:12;17453:19;;17112:366;;;:::o;17484:::-;17626:3;17647:67;17711:2;17706:3;17647:67;:::i;:::-;17640:74;;17723:93;17812:3;17723:93;:::i;:::-;17841:2;17836:3;17832:12;17825:19;;17484:366;;;:::o;17856:::-;17998:3;18019:67;18083:2;18078:3;18019:67;:::i;:::-;18012:74;;18095:93;18184:3;18095:93;:::i;:::-;18213:2;18208:3;18204:12;18197:19;;17856:366;;;:::o;18228:::-;18370:3;18391:67;18455:2;18450:3;18391:67;:::i;:::-;18384:74;;18467:93;18556:3;18467:93;:::i;:::-;18585:2;18580:3;18576:12;18569:19;;18228:366;;;:::o;18600:::-;18742:3;18763:67;18827:2;18822:3;18763:67;:::i;:::-;18756:74;;18839:93;18928:3;18839:93;:::i;:::-;18957:2;18952:3;18948:12;18941:19;;18600:366;;;:::o;18972:::-;19114:3;19135:67;19199:2;19194:3;19135:67;:::i;:::-;19128:74;;19211:93;19300:3;19211:93;:::i;:::-;19329:2;19324:3;19320:12;19313:19;;18972:366;;;:::o;19344:::-;19486:3;19507:67;19571:2;19566:3;19507:67;:::i;:::-;19500:74;;19583:93;19672:3;19583:93;:::i;:::-;19701:2;19696:3;19692:12;19685:19;;19344:366;;;:::o;19716:::-;19858:3;19879:67;19943:2;19938:3;19879:67;:::i;:::-;19872:74;;19955:93;20044:3;19955:93;:::i;:::-;20073:2;20068:3;20064:12;20057:19;;19716:366;;;:::o;20088:::-;20230:3;20251:67;20315:2;20310:3;20251:67;:::i;:::-;20244:74;;20327:93;20416:3;20327:93;:::i;:::-;20445:2;20440:3;20436:12;20429:19;;20088:366;;;:::o;20460:::-;20602:3;20623:67;20687:2;20682:3;20623:67;:::i;:::-;20616:74;;20699:93;20788:3;20699:93;:::i;:::-;20817:2;20812:3;20808:12;20801:19;;20460:366;;;:::o;20832:::-;20974:3;20995:67;21059:2;21054:3;20995:67;:::i;:::-;20988:74;;21071:93;21160:3;21071:93;:::i;:::-;21189:2;21184:3;21180:12;21173:19;;20832:366;;;:::o;21204:::-;21346:3;21367:67;21431:2;21426:3;21367:67;:::i;:::-;21360:74;;21443:93;21532:3;21443:93;:::i;:::-;21561:2;21556:3;21552:12;21545:19;;21204:366;;;:::o;21576:::-;21718:3;21739:67;21803:2;21798:3;21739:67;:::i;:::-;21732:74;;21815:93;21904:3;21815:93;:::i;:::-;21933:2;21928:3;21924:12;21917:19;;21576:366;;;:::o;21948:::-;22090:3;22111:67;22175:2;22170:3;22111:67;:::i;:::-;22104:74;;22187:93;22276:3;22187:93;:::i;:::-;22305:2;22300:3;22296:12;22289:19;;21948:366;;;:::o;22320:118::-;22407:24;22425:5;22407:24;:::i;:::-;22402:3;22395:37;22320:118;;:::o;22444:435::-;22624:3;22646:95;22737:3;22728:6;22646:95;:::i;:::-;22639:102;;22758:95;22849:3;22840:6;22758:95;:::i;:::-;22751:102;;22870:3;22863:10;;22444:435;;;;;:::o;22885:222::-;22978:4;23016:2;23005:9;23001:18;22993:26;;23029:71;23097:1;23086:9;23082:17;23073:6;23029:71;:::i;:::-;22885:222;;;;:::o;23113:640::-;23308:4;23346:3;23335:9;23331:19;23323:27;;23360:71;23428:1;23417:9;23413:17;23404:6;23360:71;:::i;:::-;23441:72;23509:2;23498:9;23494:18;23485:6;23441:72;:::i;:::-;23523;23591:2;23580:9;23576:18;23567:6;23523:72;:::i;:::-;23642:9;23636:4;23632:20;23627:2;23616:9;23612:18;23605:48;23670:76;23741:4;23732:6;23670:76;:::i;:::-;23662:84;;23113:640;;;;;;;:::o;23759:210::-;23846:4;23884:2;23873:9;23869:18;23861:26;;23897:65;23959:1;23948:9;23944:17;23935:6;23897:65;:::i;:::-;23759:210;;;;:::o;23975:313::-;24088:4;24126:2;24115:9;24111:18;24103:26;;24175:9;24169:4;24165:20;24161:1;24150:9;24146:17;24139:47;24203:78;24276:4;24267:6;24203:78;:::i;:::-;24195:86;;23975:313;;;;:::o;24294:419::-;24460:4;24498:2;24487:9;24483:18;24475:26;;24547:9;24541:4;24537:20;24533:1;24522:9;24518:17;24511:47;24575:131;24701:4;24575:131;:::i;:::-;24567:139;;24294:419;;;:::o;24719:::-;24885:4;24923:2;24912:9;24908:18;24900:26;;24972:9;24966:4;24962:20;24958:1;24947:9;24943:17;24936:47;25000:131;25126:4;25000:131;:::i;:::-;24992:139;;24719:419;;;:::o;25144:::-;25310:4;25348:2;25337:9;25333:18;25325:26;;25397:9;25391:4;25387:20;25383:1;25372:9;25368:17;25361:47;25425:131;25551:4;25425:131;:::i;:::-;25417:139;;25144:419;;;:::o;25569:::-;25735:4;25773:2;25762:9;25758:18;25750:26;;25822:9;25816:4;25812:20;25808:1;25797:9;25793:17;25786:47;25850:131;25976:4;25850:131;:::i;:::-;25842:139;;25569:419;;;:::o;25994:::-;26160:4;26198:2;26187:9;26183:18;26175:26;;26247:9;26241:4;26237:20;26233:1;26222:9;26218:17;26211:47;26275:131;26401:4;26275:131;:::i;:::-;26267:139;;25994:419;;;:::o;26419:::-;26585:4;26623:2;26612:9;26608:18;26600:26;;26672:9;26666:4;26662:20;26658:1;26647:9;26643:17;26636:47;26700:131;26826:4;26700:131;:::i;:::-;26692:139;;26419:419;;;:::o;26844:::-;27010:4;27048:2;27037:9;27033:18;27025:26;;27097:9;27091:4;27087:20;27083:1;27072:9;27068:17;27061:47;27125:131;27251:4;27125:131;:::i;:::-;27117:139;;26844:419;;;:::o;27269:::-;27435:4;27473:2;27462:9;27458:18;27450:26;;27522:9;27516:4;27512:20;27508:1;27497:9;27493:17;27486:47;27550:131;27676:4;27550:131;:::i;:::-;27542:139;;27269:419;;;:::o;27694:::-;27860:4;27898:2;27887:9;27883:18;27875:26;;27947:9;27941:4;27937:20;27933:1;27922:9;27918:17;27911:47;27975:131;28101:4;27975:131;:::i;:::-;27967:139;;27694:419;;;:::o;28119:::-;28285:4;28323:2;28312:9;28308:18;28300:26;;28372:9;28366:4;28362:20;28358:1;28347:9;28343:17;28336:47;28400:131;28526:4;28400:131;:::i;:::-;28392:139;;28119:419;;;:::o;28544:::-;28710:4;28748:2;28737:9;28733:18;28725:26;;28797:9;28791:4;28787:20;28783:1;28772:9;28768:17;28761:47;28825:131;28951:4;28825:131;:::i;:::-;28817:139;;28544:419;;;:::o;28969:::-;29135:4;29173:2;29162:9;29158:18;29150:26;;29222:9;29216:4;29212:20;29208:1;29197:9;29193:17;29186:47;29250:131;29376:4;29250:131;:::i;:::-;29242:139;;28969:419;;;:::o;29394:::-;29560:4;29598:2;29587:9;29583:18;29575:26;;29647:9;29641:4;29637:20;29633:1;29622:9;29618:17;29611:47;29675:131;29801:4;29675:131;:::i;:::-;29667:139;;29394:419;;;:::o;29819:::-;29985:4;30023:2;30012:9;30008:18;30000:26;;30072:9;30066:4;30062:20;30058:1;30047:9;30043:17;30036:47;30100:131;30226:4;30100:131;:::i;:::-;30092:139;;29819:419;;;:::o;30244:::-;30410:4;30448:2;30437:9;30433:18;30425:26;;30497:9;30491:4;30487:20;30483:1;30472:9;30468:17;30461:47;30525:131;30651:4;30525:131;:::i;:::-;30517:139;;30244:419;;;:::o;30669:::-;30835:4;30873:2;30862:9;30858:18;30850:26;;30922:9;30916:4;30912:20;30908:1;30897:9;30893:17;30886:47;30950:131;31076:4;30950:131;:::i;:::-;30942:139;;30669:419;;;:::o;31094:::-;31260:4;31298:2;31287:9;31283:18;31275:26;;31347:9;31341:4;31337:20;31333:1;31322:9;31318:17;31311:47;31375:131;31501:4;31375:131;:::i;:::-;31367:139;;31094:419;;;:::o;31519:::-;31685:4;31723:2;31712:9;31708:18;31700:26;;31772:9;31766:4;31762:20;31758:1;31747:9;31743:17;31736:47;31800:131;31926:4;31800:131;:::i;:::-;31792:139;;31519:419;;;:::o;31944:::-;32110:4;32148:2;32137:9;32133:18;32125:26;;32197:9;32191:4;32187:20;32183:1;32172:9;32168:17;32161:47;32225:131;32351:4;32225:131;:::i;:::-;32217:139;;31944:419;;;:::o;32369:::-;32535:4;32573:2;32562:9;32558:18;32550:26;;32622:9;32616:4;32612:20;32608:1;32597:9;32593:17;32586:47;32650:131;32776:4;32650:131;:::i;:::-;32642:139;;32369:419;;;:::o;32794:::-;32960:4;32998:2;32987:9;32983:18;32975:26;;33047:9;33041:4;33037:20;33033:1;33022:9;33018:17;33011:47;33075:131;33201:4;33075:131;:::i;:::-;33067:139;;32794:419;;;:::o;33219:::-;33385:4;33423:2;33412:9;33408:18;33400:26;;33472:9;33466:4;33462:20;33458:1;33447:9;33443:17;33436:47;33500:131;33626:4;33500:131;:::i;:::-;33492:139;;33219:419;;;:::o;33644:::-;33810:4;33848:2;33837:9;33833:18;33825:26;;33897:9;33891:4;33887:20;33883:1;33872:9;33868:17;33861:47;33925:131;34051:4;33925:131;:::i;:::-;33917:139;;33644:419;;;:::o;34069:::-;34235:4;34273:2;34262:9;34258:18;34250:26;;34322:9;34316:4;34312:20;34308:1;34297:9;34293:17;34286:47;34350:131;34476:4;34350:131;:::i;:::-;34342:139;;34069:419;;;:::o;34494:::-;34660:4;34698:2;34687:9;34683:18;34675:26;;34747:9;34741:4;34737:20;34733:1;34722:9;34718:17;34711:47;34775:131;34901:4;34775:131;:::i;:::-;34767:139;;34494:419;;;:::o;34919:::-;35085:4;35123:2;35112:9;35108:18;35100:26;;35172:9;35166:4;35162:20;35158:1;35147:9;35143:17;35136:47;35200:131;35326:4;35200:131;:::i;:::-;35192:139;;34919:419;;;:::o;35344:::-;35510:4;35548:2;35537:9;35533:18;35525:26;;35597:9;35591:4;35587:20;35583:1;35572:9;35568:17;35561:47;35625:131;35751:4;35625:131;:::i;:::-;35617:139;;35344:419;;;:::o;35769:::-;35935:4;35973:2;35962:9;35958:18;35950:26;;36022:9;36016:4;36012:20;36008:1;35997:9;35993:17;35986:47;36050:131;36176:4;36050:131;:::i;:::-;36042:139;;35769:419;;;:::o;36194:::-;36360:4;36398:2;36387:9;36383:18;36375:26;;36447:9;36441:4;36437:20;36433:1;36422:9;36418:17;36411:47;36475:131;36601:4;36475:131;:::i;:::-;36467:139;;36194:419;;;:::o;36619:::-;36785:4;36823:2;36812:9;36808:18;36800:26;;36872:9;36866:4;36862:20;36858:1;36847:9;36843:17;36836:47;36900:131;37026:4;36900:131;:::i;:::-;36892:139;;36619:419;;;:::o;37044:::-;37210:4;37248:2;37237:9;37233:18;37225:26;;37297:9;37291:4;37287:20;37283:1;37272:9;37268:17;37261:47;37325:131;37451:4;37325:131;:::i;:::-;37317:139;;37044:419;;;:::o;37469:::-;37635:4;37673:2;37662:9;37658:18;37650:26;;37722:9;37716:4;37712:20;37708:1;37697:9;37693:17;37686:47;37750:131;37876:4;37750:131;:::i;:::-;37742:139;;37469:419;;;:::o;37894:::-;38060:4;38098:2;38087:9;38083:18;38075:26;;38147:9;38141:4;38137:20;38133:1;38122:9;38118:17;38111:47;38175:131;38301:4;38175:131;:::i;:::-;38167:139;;37894:419;;;:::o;38319:::-;38485:4;38523:2;38512:9;38508:18;38500:26;;38572:9;38566:4;38562:20;38558:1;38547:9;38543:17;38536:47;38600:131;38726:4;38600:131;:::i;:::-;38592:139;;38319:419;;;:::o;38744:222::-;38837:4;38875:2;38864:9;38860:18;38852:26;;38888:71;38956:1;38945:9;38941:17;38932:6;38888:71;:::i;:::-;38744:222;;;;:::o;38972:320::-;39087:4;39125:2;39114:9;39110:18;39102:26;;39138:71;39206:1;39195:9;39191:17;39182:6;39138:71;:::i;:::-;39219:66;39281:2;39270:9;39266:18;39257:6;39219:66;:::i;:::-;38972:320;;;;;:::o;39298:129::-;39332:6;39359:20;;:::i;:::-;39349:30;;39388:33;39416:4;39408:6;39388:33;:::i;:::-;39298:129;;;:::o;39433:75::-;39466:6;39499:2;39493:9;39483:19;;39433:75;:::o;39514:307::-;39575:4;39665:18;39657:6;39654:30;39651:56;;;39687:18;;:::i;:::-;39651:56;39725:29;39747:6;39725:29;:::i;:::-;39717:37;;39809:4;39803;39799:15;39791:23;;39514:307;;;:::o;39827:308::-;39889:4;39979:18;39971:6;39968:30;39965:56;;;40001:18;;:::i;:::-;39965:56;40039:29;40061:6;40039:29;:::i;:::-;40031:37;;40123:4;40117;40113:15;40105:23;;39827:308;;;:::o;40141:98::-;40192:6;40226:5;40220:12;40210:22;;40141:98;;;:::o;40245:99::-;40297:6;40331:5;40325:12;40315:22;;40245:99;;;:::o;40350:168::-;40433:11;40467:6;40462:3;40455:19;40507:4;40502:3;40498:14;40483:29;;40350:168;;;;:::o;40524:169::-;40608:11;40642:6;40637:3;40630:19;40682:4;40677:3;40673:14;40658:29;;40524:169;;;;:::o;40699:148::-;40801:11;40838:3;40823:18;;40699:148;;;;:::o;40853:305::-;40893:3;40912:20;40930:1;40912:20;:::i;:::-;40907:25;;40946:20;40964:1;40946:20;:::i;:::-;40941:25;;41100:1;41032:66;41028:74;41025:1;41022:81;41019:107;;;41106:18;;:::i;:::-;41019:107;41150:1;41147;41143:9;41136:16;;40853:305;;;;:::o;41164:185::-;41204:1;41221:20;41239:1;41221:20;:::i;:::-;41216:25;;41255:20;41273:1;41255:20;:::i;:::-;41250:25;;41294:1;41284:35;;41299:18;;:::i;:::-;41284:35;41341:1;41338;41334:9;41329:14;;41164:185;;;;:::o;41355:348::-;41395:7;41418:20;41436:1;41418:20;:::i;:::-;41413:25;;41452:20;41470:1;41452:20;:::i;:::-;41447:25;;41640:1;41572:66;41568:74;41565:1;41562:81;41557:1;41550:9;41543:17;41539:105;41536:131;;;41647:18;;:::i;:::-;41536:131;41695:1;41692;41688:9;41677:20;;41355:348;;;;:::o;41709:191::-;41749:4;41769:20;41787:1;41769:20;:::i;:::-;41764:25;;41803:20;41821:1;41803:20;:::i;:::-;41798:25;;41842:1;41839;41836:8;41833:34;;;41847:18;;:::i;:::-;41833:34;41892:1;41889;41885:9;41877:17;;41709:191;;;;:::o;41906:96::-;41943:7;41972:24;41990:5;41972:24;:::i;:::-;41961:35;;41906:96;;;:::o;42008:90::-;42042:7;42085:5;42078:13;42071:21;42060:32;;42008:90;;;:::o;42104:149::-;42140:7;42180:66;42173:5;42169:78;42158:89;;42104:149;;;:::o;42259:126::-;42296:7;42336:42;42329:5;42325:54;42314:65;;42259:126;;;:::o;42391:77::-;42428:7;42457:5;42446:16;;42391:77;;;:::o;42474:154::-;42558:6;42553:3;42548;42535:30;42620:1;42611:6;42606:3;42602:16;42595:27;42474:154;;;:::o;42634:307::-;42702:1;42712:113;42726:6;42723:1;42720:13;42712:113;;;42811:1;42806:3;42802:11;42796:18;42792:1;42787:3;42783:11;42776:39;42748:2;42745:1;42741:10;42736:15;;42712:113;;;42843:6;42840:1;42837:13;42834:101;;;42923:1;42914:6;42909:3;42905:16;42898:27;42834:101;42683:258;42634:307;;;:::o;42947:171::-;42986:3;43009:24;43027:5;43009:24;:::i;:::-;43000:33;;43055:4;43048:5;43045:15;43042:41;;;43063:18;;:::i;:::-;43042:41;43110:1;43103:5;43099:13;43092:20;;42947:171;;;:::o;43124:320::-;43168:6;43205:1;43199:4;43195:12;43185:22;;43252:1;43246:4;43242:12;43273:18;43263:81;;43329:4;43321:6;43317:17;43307:27;;43263:81;43391:2;43383:6;43380:14;43360:18;43357:38;43354:84;;;43410:18;;:::i;:::-;43354:84;43175:269;43124:320;;;:::o;43450:281::-;43533:27;43555:4;43533:27;:::i;:::-;43525:6;43521:40;43663:6;43651:10;43648:22;43627:18;43615:10;43612:34;43609:62;43606:88;;;43674:18;;:::i;:::-;43606:88;43714:10;43710:2;43703:22;43493:238;43450:281;;:::o;43737:233::-;43776:3;43799:24;43817:5;43799:24;:::i;:::-;43790:33;;43845:66;43838:5;43835:77;43832:103;;;43915:18;;:::i;:::-;43832:103;43962:1;43955:5;43951:13;43944:20;;43737:233;;;:::o;43976:176::-;44008:1;44025:20;44043:1;44025:20;:::i;:::-;44020:25;;44059:20;44077:1;44059:20;:::i;:::-;44054:25;;44098:1;44088:35;;44103:18;;:::i;:::-;44088:35;44144:1;44141;44137:9;44132:14;;43976:176;;;;:::o;44158:180::-;44206:77;44203:1;44196:88;44303:4;44300:1;44293:15;44327:4;44324:1;44317:15;44344:180;44392:77;44389:1;44382:88;44489:4;44486:1;44479:15;44513:4;44510:1;44503:15;44530:180;44578:77;44575:1;44568:88;44675:4;44672:1;44665:15;44699:4;44696:1;44689:15;44716:180;44764:77;44761:1;44754:88;44861:4;44858:1;44851:15;44885:4;44882:1;44875:15;44902:180;44950:77;44947:1;44940:88;45047:4;45044:1;45037:15;45071:4;45068:1;45061:15;45088:180;45136:77;45133:1;45126:88;45233:4;45230:1;45223:15;45257:4;45254:1;45247:15;45274:117;45383:1;45380;45373:12;45397:117;45506:1;45503;45496:12;45520:117;45629:1;45626;45619:12;45643:117;45752:1;45749;45742:12;45766:117;45875:1;45872;45865:12;45889:117;45998:1;45995;45988:12;46012:102;46053:6;46104:2;46100:7;46095:2;46088:5;46084:14;46080:28;46070:38;;46012:102;;;:::o;46120:172::-;46260:24;46256:1;46248:6;46244:14;46237:48;46120:172;:::o;46298:163::-;46438:15;46434:1;46426:6;46422:14;46415:39;46298:163;:::o;46467:230::-;46607:34;46603:1;46595:6;46591:14;46584:58;46676:13;46671:2;46663:6;46659:15;46652:38;46467:230;:::o;46703:237::-;46843:34;46839:1;46831:6;46827:14;46820:58;46912:20;46907:2;46899:6;46895:15;46888:45;46703:237;:::o;46946:225::-;47086:34;47082:1;47074:6;47070:14;47063:58;47155:8;47150:2;47142:6;47138:15;47131:33;46946:225;:::o;47177:224::-;47317:34;47313:1;47305:6;47301:14;47294:58;47386:7;47381:2;47373:6;47369:15;47362:32;47177:224;:::o;47407:178::-;47547:30;47543:1;47535:6;47531:14;47524:54;47407:178;:::o;47591:223::-;47731:34;47727:1;47719:6;47715:14;47708:58;47800:6;47795:2;47787:6;47783:15;47776:31;47591:223;:::o;47820:175::-;47960:27;47956:1;47948:6;47944:14;47937:51;47820:175;:::o;48001:225::-;48141:34;48137:1;48129:6;48125:14;48118:58;48210:8;48205:2;48197:6;48193:15;48186:33;48001:225;:::o;48232:231::-;48372:34;48368:1;48360:6;48356:14;48349:58;48441:14;48436:2;48428:6;48424:15;48417:39;48232:231;:::o;48469:243::-;48609:34;48605:1;48597:6;48593:14;48586:58;48678:26;48673:2;48665:6;48661:15;48654:51;48469:243;:::o;48718:220::-;48858:34;48854:1;48846:6;48842:14;48835:58;48927:3;48922:2;48914:6;48910:15;48903:28;48718:220;:::o;48944:229::-;49084:34;49080:1;49072:6;49068:14;49061:58;49153:12;49148:2;49140:6;49136:15;49129:37;48944:229;:::o;49179:176::-;49319:28;49315:1;49307:6;49303:14;49296:52;49179:176;:::o;49361:228::-;49501:34;49497:1;49489:6;49485:14;49478:58;49570:11;49565:2;49557:6;49553:15;49546:36;49361:228;:::o;49595:175::-;49735:27;49731:1;49723:6;49719:14;49712:51;49595:175;:::o;49776:223::-;49916:34;49912:1;49904:6;49900:14;49893:58;49985:6;49980:2;49972:6;49968:15;49961:31;49776:223;:::o;50005:171::-;50145:23;50141:1;50133:6;50129:14;50122:47;50005:171;:::o;50182:182::-;50322:34;50318:1;50310:6;50306:14;50299:58;50182:182;:::o;50370:231::-;50510:34;50506:1;50498:6;50494:14;50487:58;50579:14;50574:2;50566:6;50562:15;50555:39;50370:231;:::o;50607:182::-;50747:34;50743:1;50735:6;50731:14;50724:58;50607:182;:::o;50795:234::-;50935:34;50931:1;50923:6;50919:14;50912:58;51004:17;50999:2;50991:6;50987:15;50980:42;50795:234;:::o;51035:173::-;51175:25;51171:1;51163:6;51159:14;51152:49;51035:173;:::o;51214:220::-;51354:34;51350:1;51342:6;51338:14;51331:58;51423:3;51418:2;51410:6;51406:15;51399:28;51214:220;:::o;51440:177::-;51580:29;51576:1;51568:6;51564:14;51557:53;51440:177;:::o;51623:236::-;51763:34;51759:1;51751:6;51747:14;51740:58;51832:19;51827:2;51819:6;51815:15;51808:44;51623:236;:::o;51865:231::-;52005:34;52001:1;51993:6;51989:14;51982:58;52074:14;52069:2;52061:6;52057:15;52050:39;51865:231;:::o;52102:175::-;52242:27;52238:1;52230:6;52226:14;52219:51;52102:175;:::o;52283:168::-;52423:20;52419:1;52411:6;52407:14;52400:44;52283:168;:::o;52457:178::-;52597:30;52593:1;52585:6;52581:14;52574:54;52457:178;:::o;52641:220::-;52781:34;52777:1;52769:6;52765:14;52758:58;52850:3;52845:2;52837:6;52833:15;52826:28;52641:220;:::o;52867:167::-;53007:19;53003:1;52995:6;52991:14;52984:43;52867:167;:::o;53040:221::-;53180:34;53176:1;53168:6;53164:14;53157:58;53249:4;53244:2;53236:6;53232:15;53225:29;53040:221;:::o;53267:122::-;53340:24;53358:5;53340:24;:::i;:::-;53333:5;53330:35;53320:63;;53379:1;53376;53369:12;53320:63;53267:122;:::o;53395:116::-;53465:21;53480:5;53465:21;:::i;:::-;53458:5;53455:32;53445:60;;53501:1;53498;53491:12;53445:60;53395:116;:::o;53517:120::-;53589:23;53606:5;53589:23;:::i;:::-;53582:5;53579:34;53569:62;;53627:1;53624;53617:12;53569:62;53517:120;:::o;53643:122::-;53716:24;53734:5;53716:24;:::i;:::-;53709:5;53706:35;53696:63;;53755:1;53752;53745:12;53696:63;53643:122;:::o

Swarm Source

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