ETH Price: $3,246.67 (+3.35%)
Gas: 6 Gwei

Token

Radioactive Punks (RPUNK)
 

Overview

Max Total Supply

1,614 RPUNK

Holders

503

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 RPUNK
0xD638E44Ef808e20bd05C10634089d38E514200a4
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

THE CRYPTOPOCALYPSE HAS DAWNED... MINT OPEN 12EST DEC 14th TO 12EST DEC 15TH ☢️ [MINT](https://radioactivepunks.xyz) ☢️ [LORE](https://discord.gg/sdYHTbqxyP) ☢️ [RARITY](https://rarity.tools/radioactive-punks) ☢️[AESTHETIC RANKINGS](https://poprank.io/radioactive-punks)☢...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RADIOACTIVEPUNKS

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-28
*/

/*

SPDX-License-Identifier: MIT

..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
.........................,oxddxddddddddddddddddddddddddddddd:.............................
.......................''ck0OkxxxxxxxxxxxxxxxxxxxxxxxxxxkOOOl,'...........................
.....................'oxxkO0Oc..........................;k0Okkxd;.........................
..................',,:xO0kddo;..........................,lddkO0kc,,'......................
..................lkkOO0Ol. .:kOOOOOOOOOOOOOOOOOOOOOOOOOl. .:O0OOkkd,.....................
..................oO0koll:,',o0KKKKKKKKKKKKKKKKKK0000K00d;'';llok00d,.....................
..................o00o.  ,k0000KKKKKKKKKKKKKKKK000000KK0000O:  .lO0d,.....................
..................oO0o.  ,kKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKK0:  .cO0d,.....................
..................oO0o.  ,kKKKKKKKKKKKKKKKKKKKKKKKKK0KK0KKK0:  .cO0d,.....................
..............,cclxO0d.  'kKKKKKKKKKK0000KKK00KKKKKK0KKKKKK0:  .cO0d,.....................
..............cO0000Oo.  'kK0KK000000KKKKKKKKKKKKKKK00000KK0:  .cO0d,.....................
..........'cllxO0kl;,.   'kKK0KKOl;,ckKKKKKK00KKKKKKkc,;lOK0:  .cO0d,.....................
..........;k00OOOx,      ,kKKK0Kk'  .dKKKKKK000KKKKKd.  'kK0:  .cO0d,.....................
..........;kOOl,',coooooox00KKKKk'  .dKKKKKKKKKK0KKKd.  'kKO:  .cO0d,.....................
..........;k0O:  .l0KKK0000KK0KKk;  'xKK00KKKKKKKKKKx'  ;kK0:  .cO0d,.....................
..........;kOO:  .l0K00O000KKKKK0kddx0KKK00KKK00KKKKOxddk0K0:  .cO0d,.....................
..........:k0Oc...ckkxxxxk0KKK0KKKKK00KKK00000000KKKKKKKKKK0:  .cO0d,.....................
..........;k0Okxxo,......;OK000KKKKKKK000000000K0KK00KKKKKK0:  .cO0d,.....................
..........,oxxk00k:...   ,kK00KKK00KKK0000K0kxddddddxOKK0KK0:  .cO0d,.....................
.............'lO0OOkkl.  'kKKKKKKKK00KK0KKK0c..     'xK00KK0:  .cO0d,.....................
..............;oodkO0o.  'kKKKKKKKK0KKK00KK0o,,''''':kK00KK0:  .cO0d,.....................
.................'oO0o.  'kKKKKKKKKKKKK00KK00000000000KK0KK0:  .cO0d,.....................
.................'oO0o.  ,kKKKKKKK000KKKK00000KKKKK0KK00KKK0:  .cO0d,.....................
..................oO0o.  ,kKKKKKKKKKKKKKK00000KKKKKKK00K0KK0:  .cO0d,.....................
..................oO0o.  ,kKKKKK0KKKKKKKK0K0dc::::::lkKKKKK0:  .cO0d,.....................
..................oO0o.  ,kKKKK00KKKKKK0KKK0:.      .dK0KKK0:  .cO0d,.....................
..................oO0o.  ,kKKKK0KK0KK0KKKKK0xllcccccoOKKKKK0:  .cO0d,.....................
..................oO0o.  ,kKKKK0KK000KK0KKKKKKKKKKKKKKKK000O:  .lO0d,.....................
..................oO0o.  ,kKKKK0KK0KK0KKKKKKKKKKKKKKKKK0d;'';llokOOd,.....................
..................oO0o.  ,kKKKKKKKKK0OOOOOOOOOOOOOOOOOOOl. .:O0OOkko,.....................
..................oO0o.  ,kKKKK0K0KKx;..................,lddkO0kc,,'......................
..................oO0o.  ,kKKKKK00KKd.   ...............;k0Okxxd;.........................
..................oO0o.  ,kKKKKK00KKd.  .oxxxxxxxxxxxxxxkO0Ol'''..........................
..................oO0o.  ,kKKKKK00KKd.  ,xOOkxxddddddddddddd:.............................
..................oO0o.  ,kKKKKK00KKd.  'x0Ol''...........................................
..................oO0o.  ,kKKKKK000Kd.  ,x0Oc.............................................

THE CRYPTOPOCALYPSE DAWNS
Will your punk survive?

@art:   pixantle
        @pixantle

@tech:  white lights
        @iamwhitelights

@title  RADIOACTIVEPUNKS

@dev    Extends ERC721 Non-Fungible Token Standard to allow pausing, burning,
        enumerability, and royalties via the Rarible V1 Protocol and ERC2981 NFT
        Royalty Standard. The metadata and images are stored on Arweave,
        creating a completely on-chain generative collectible series. If any
        NFTs were to survive nuclear winter, these would be the ones. Tokens
        are only mintable by a signed EIP-718 transaction to ward off contract
        attacks and minting via Etherscan. Any singular wallet can mint only ten
        in the first 10 mins of sales and only 100 lifetime.
*/


// File: @openzeppelin/contracts/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: @openzeppelin/contracts/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/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: @openzeppelin/contracts/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: @openzeppelin/contracts/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: @openzeppelin/contracts/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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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: @openzeppelin/contracts/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: @openzeppelin/contracts/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: @openzeppelin/contracts/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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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);
    }

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

    /**
     * @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 of token that is not own");
        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);
    }

    /**
     * @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 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(to).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 {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

// File: @openzeppelin/contracts/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: @openzeppelin/contracts/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: @openzeppelin/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/HasSecondarySaleFees.sol

pragma solidity ^0.8.4;


/**
 * Implements Rarible Royalties V1 Schema
 * @dev https://docs.rarible.com/asset/creating-an-asset/royalties-schema
 */
abstract contract HasSecondarySaleFees is ERC165 {

  event SecondarySaleFees(uint256 tokenId, address[] recipients, uint[] bps);

  /*
   * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f
   * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb
   *
   * => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584
   */
  bytes4 private constant _INTERFACE_ID_FEES = 0xb7799584;

  function getFeeRecipients(uint256 id) public view virtual returns (address payable[] memory);
  function getFeeBps(uint256 id) public view virtual returns (uint[] memory);

  function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    return interfaceId == _INTERFACE_ID_FEES
      || super.supportsInterface(interfaceId);
  }
}

// File: contracts/ERC2981.sol

pragma solidity ^0.8.4;


/*
 * Implements Rarible Royalties V1 Schema
 * @dev https://eips.ethereum.org/EIPS/eip-2981
 */
abstract contract ERC2981 is ERC165 {
  /*
   * bytes4(keccak256('royaltyInfo(uint256, uint256, bytes)')) == 0xc155531d
   */
  bytes4 private constant _INTERFACE_ID_ERC2981 = 0xc155531d;

  // @notice Called with the sale price to determine how much royalty
  //         is owed and to whom.
  // @param _tokenId - the NFT asset queried for royalty information
  // @param _value - the sale price of the NFT asset specified by _tokenId
  // @param _data - information used by extensions of this ERC.
  //                Must not to be used by implementers of EIP-2981
  //                alone.
  // @return _receiver - address of who should be sent the royalty payment
  // @return _royaltyAmount - the royalty payment amount for _value sale price
  // @return _royaltyPaymentData - information used by extensions of this ERC.
  //                               Must not to be used by implementers of
  //                               EIP-2981 alone.
  function royaltyInfo(uint256 _tokenId, uint256 _value, bytes calldata _data) external virtual returns (address _receiver, uint256 _royaltyAmount, bytes memory _royaltyPaymentData);

  function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    return interfaceId == _INTERFACE_ID_ERC2981
      || super.supportsInterface(interfaceId);
  }
}

pragma solidity ^0.8.4;

contract RADIOACTIVEPUNKS is ERC721Burnable, ERC721Pausable, ERC721Enumerable, HasSecondarySaleFees, ERC2981, Ownable {

  event Frozen();

  struct Unit {
      string logIn;
  }

  uint256 public activationTime = 1633536000; // THE CRYPTOPOCALYPSE
  address payable public PAYMENT_SPLITTER = payable(0xFc9961d08Ef8e04DB145b9fb3d48cf8DbA96116D ); // PaymentSplitter
  string public API_BASE_URL = '';
  string public METADATA_PROVENANCE_HASH = '';
  uint256 public constant punkPrice = 25000000000000000; // 0.025 ETH
  uint private constant maxPunksAtOnce = 5;
  uint256 private MAX_PUNKS = 3000;
  uint256 public PUNKS_LEFT = 2999;
  uint256 private PRIME = 197;
  uint256 private COPRIME = 474569;
  bool public frozen = false;

  string private constant EIP712_DOMAIN  = "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)";
  string private constant UNIT_TYPE = "Unit(string logIn)";
  bytes32 private constant EIP712_DOMAIN_TYPEHASH = keccak256(abi.encodePacked(EIP712_DOMAIN));
  bytes32 private constant UNIT_TYPEHASH = keccak256(abi.encodePacked(UNIT_TYPE));

  bytes32 private DOMAIN_SEPARATOR = keccak256(abi.encode(
    EIP712_DOMAIN_TYPEHASH,
    keccak256("RADIOACTIVEPUNKS"),
    keccak256("1"), // version
    1,
    0xFc9961d08Ef8e04DB145b9fb3d48cf8DbA96116D // PaymentSplitter
  ));

  constructor() ERC721("Radioactive Punks", "RPUNK") {}

  function withdraw() public onlyOwner {
    uint256 balance = address(this).balance;
    PAYMENT_SPLITTER.transfer(balance);
  }

  function setPaymentSplitter(address payable newAddress) external onlyOwner {
    PAYMENT_SPLITTER = newAddress;
  }

  function activated() public view returns (bool) {
    return block.timestamp >= activationTime;
  }

  function setActivationTime(uint256 timestampInSeconds) external onlyOwner {
    activationTime = timestampInSeconds;
  }

  /*
   * @dev Used in pseudorandom tokenId
   */
  function setCoprimes(uint256 primeNumber, uint256 coprimeNumber) external onlyOwner {
    PRIME = primeNumber;
    COPRIME = coprimeNumber;
  }

  /*
   * Once executed, metadata for NFTs can never be changed.
   */
  function freezeMetadata() external onlyOwner {
    frozen = true;
    emit Frozen();
  }

  function setAPIBaseURL(string memory URI) external onlyOwner {
    require(frozen == false, "Frozen");
    API_BASE_URL = URI;
  }

  function _baseURI() internal view override returns (string memory) {
    return API_BASE_URL;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "Token DNE");

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

  /*
   * Allows the owner to mint X tokens as a way
   * of reserving them for our core supporters.
   */
  function reservePunks(uint256 numberOfTokens) public onlyOwner {
    require(numberOfTokens <= PUNKS_LEFT, "Exceeds max supply");

    // for every tokent they want
    for(uint i = 0; i < numberOfTokens; i++) {
      // reduce the total pop after minting
      if (PUNKS_LEFT >= 0) {
        uint randomUnusedInt = ((PRIME * PUNKS_LEFT) + COPRIME) % MAX_PUNKS;
        _safeMint(msg.sender, randomUnusedInt);
        PUNKS_LEFT--;
      }
    }
  }

  /*
   * For minting up to five punks at once - tokenIds pseudorandomly generated.
   */
  function mintPunks(uint256 numberOfTokens, uint8 sigV, bytes32 sigR, bytes32 sigS) public payable {
    require(activated(), 'You are too early');
    require(numberOfTokens <= maxPunksAtOnce, "Exceeds max mint rate");
    require(numberOfTokens <= PUNKS_LEFT, "Exceeds max supply");
    require(punkPrice * numberOfTokens == msg.value, "Ether value incorrect");
    require(balanceOf(msg.sender) < 100, "Owns max amount");
    require(verify(msg.sender, sigV, sigR, sigS) == true, "No cheaters!");

    if (block.timestamp <= activationTime + 600) {
      require(balanceOf(msg.sender) + numberOfTokens <= 10, "Only 10 for first 10m");
    }

    // for every token they want
    for(uint i = 0; i < numberOfTokens; i++) {
      // reduce the total pop after minting
      if (PUNKS_LEFT >= 0) {
        uint randomUnusedInt = ((PRIME * PUNKS_LEFT) + COPRIME) % MAX_PUNKS;
        _safeMint(msg.sender, randomUnusedInt);
        PUNKS_LEFT--;
      }
    }
  }

  /*
   * @dev Leads to a big file on IPFS containing a list of all
   *      tokenIDs and their corresponding metadata etc.
   */
  function setProvenanceHash(string memory hash) external onlyOwner {
    METADATA_PROVENANCE_HASH = hash;
  }

  /*
   * @dev For returning ERC20s we dont know what to do with
   *      if people have issues they can contact owner/devs
   *      and we can send back their tokens.
   */
  function forwardERC20s(IERC20 _token, uint256 _amount) external onlyOwner {
    _token.transfer(address(this), _amount);
  }

  function pause() external onlyOwner {
    _pause();
  }

  function unpause() external onlyOwner{
    _unpause();
  }

  /*
   * @dev Required for ERC721Pausable
   */
  function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Pausable, ERC721Enumerable) {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  /*
   * Rarible/Foundation Royalties Protocol
   */
  function getFeeRecipients(uint256 id) public view override returns (address payable[] memory) {
    require(_exists(id), "DNE");
    address payable[] memory result = new address payable[](1);
    result[0] = PAYMENT_SPLITTER;
    return result;
  }

  /*
   * Rarible/Foundation Royalties Protocol
   */
  function getFeeBps(uint256 id) public view override returns (uint[] memory) {
    require(_exists(id), "DNE");
    uint[] memory result = new uint[](1);
    result[0] = 1000; // 10%
    return result;
  }

  /*
   * ERC2981 Royalties Standard
   */
  function royaltyInfo(uint256 _tokenId, uint256 _value, bytes calldata _data) external view override returns (address _receiver, uint256 _royaltyAmount, bytes memory _royaltyPaymentData) {
    return (PAYMENT_SPLITTER, _value / 10, _data); // 10%
  }

  function supportsInterface(bytes4 interfaceId) public view override(ERC721, HasSecondarySaleFees, ERC721Enumerable, ERC2981) returns (bool) {
    return super.supportsInterface(interfaceId);
  }

  function uint2str(uint256 _i) internal pure returns (string memory str) {
    if (_i == 0)
    {
      return "0";
    }
    uint256 j = _i;
    uint256 length;
    while (j != 0)
    {
      length++;
      j /= 10;
    }
    bytes memory bstr = new bytes(length);
    uint256 k = length;
    j = _i;
    while (j != 0)
    {
      bstr[--k] = bytes1(uint8(48 + j % 10));
      j /= 10;
    }
    str = string(bstr);
  }

  /*
   * Generates the hash representation of the struct Unit for EIP-718 usage
   */
  function hashUnit(Unit memory unitobj) private view returns (bytes32) {
    return keccak256(abi.encodePacked(
        "\x19\x01",
        DOMAIN_SEPARATOR,
        keccak256(abi.encode(
            UNIT_TYPEHASH,
            keccak256(bytes(unitobj.logIn))
        ))
    ));
  }

  /*
   * EIP-718 signature check
   */
  function verify(address signer, uint8 sigV, bytes32 sigR, bytes32 sigS) private view returns (bool) {
    Unit memory msgObj = Unit({
       logIn: 'Log In To Radioactive Punks!'
    });
    return signer == ecrecover(hashUnit(msgObj), sigV, sigR, sigS);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[],"name":"Frozen","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"name":"SecondarySaleFees","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"API_BASE_URL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYMENT_SPLITTER","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUNKS_LEFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"forwardERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","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":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint8","name":"sigV","type":"uint8"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"}],"name":"mintPunks","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reservePunks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_royaltyAmount","type":"uint256"},{"internalType":"bytes","name":"_royaltyPaymentData","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setAPIBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestampInSeconds","type":"uint256"}],"name":"setActivationTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"primeNumber","type":"uint256"},{"internalType":"uint256","name":"coprimeNumber","type":"uint256"}],"name":"setCoprimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"setPaymentSplitter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hash","type":"string"}],"name":"setProvenanceHash","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405263615dc800600c5573fc9961d08ef8e04db145b9fb3d48cf8dba96116d600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180602001604052806000815250600e9080519060200190620000889291906200036b565b5060405180602001604052806000815250600f9080519060200190620000b09291906200036b565b50610bb8601055610bb760115560c560125562073dc96013556000601460006101000a81548160ff0219169083151502179055506040518060800160405280605281526020016200632b6052913960405160200162000110919062000485565b604051602081830303815290604052805190602001207f4cfe16f5552a98914ae71bd42ac1a6ae1a3edda5e0440e92fd04f37cd591c2c87fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6600173fc9961d08ef8e04db145b9fb3d48cf8dba96116d604051602001620001959594939291906200049e565b60405160208183030381529060405280519060200120601555348015620001bb57600080fd5b506040518060400160405280601181526020017f526164696f6163746976652050756e6b730000000000000000000000000000008152506040518060400160405280600581526020017f5250554e4b0000000000000000000000000000000000000000000000000000008152508160009080519060200190620002409291906200036b565b508060019080519060200190620002599291906200036b565b5050506000600660006101000a81548160ff021916908315150217905550620002976200028b6200029d60201b60201c565b620002a560201b60201c565b6200060b565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200037990620005a6565b90600052602060002090601f0160209004810192826200039d5760008555620003e9565b82601f10620003b857805160ff1916838001178555620003e9565b82800160010185558215620003e9579182015b82811115620003e8578251825591602001919060010190620003cb565b5b509050620003f89190620003fc565b5090565b5b8082111562000417576000816000905550600101620003fd565b5090565b620004268162000511565b82525050565b620004378162000525565b82525050565b62000448816200055c565b82525050565b60006200045b82620004fb565b62000467818562000506565b93506200047981856020860162000570565b80840191505092915050565b60006200049382846200044e565b915081905092915050565b600060a082019050620004b560008301886200042c565b620004c460208301876200042c565b620004d360408301866200042c565b620004e260608301856200043d565b620004f160808301846200041b565b9695505050505050565b600081519050919050565b600081905092915050565b60006200051e826200052f565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060ff82169050919050565b600062000569826200054f565b9050919050565b60005b838110156200059057808201518184015260208101905062000573565b83811115620005a0576000848401525b50505050565b60006002820490506001821680620005bf57607f821691505b60208210811415620005d657620005d5620005dc565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615d10806200061b6000396000f3fe6080604052600436106102675760003560e01c806370a0823111610144578063b88d4fde116100b6578063d111515d1161007a578063d111515d1461090d578063da4493f614610924578063e985e9c51461094f578063ebb310801461098c578063f0c9dc60146109b5578063f2fde38b146109e057610267565b8063b88d4fde14610800578063b9c4d9fb14610829578063c155531d14610866578063c5602f8c146108a5578063c87b56dd146108d057610267565b806395d89b411161010857806395d89b41146107045780639727151a1461072f578063a22cb46514610758578063a5f0292b14610781578063b3a9a258146107ac578063b49c2b49146107d757610267565b806370a0823114610645578063715018a6146106825780637c5486a2146106995780638456cb59146106c25780638da5cb5b146106d957610267565b80632f745c59116101dd5780634f6ccce7116101a15780634f6ccce7146105305780635c975abb1461056d57806363335bf9146105985780636352211e146105c35780636b29b79f146106005780636d9ad37a1461062957610267565b80632f745c59146104735780633ccfd60b146104b05780633f4ba83a146104c757806342842e0e146104de57806342966c681461050757610267565b80630ebd4c7f1161022f5780630ebd4c7f1461036557806310969523146103a257806313476b71146103cb57806318160ddd146103f4578063186601ca1461041f57806323b872dd1461044a57610267565b806301ffc9a71461026c578063054f7d9c146102a957806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061408b565b610a09565b6040516102a09190614ad9565b60405180910390f35b3480156102b557600080fd5b506102be610a1b565b6040516102cb9190614ad9565b60405180910390f35b3480156102e057600080fd5b506102e9610a2e565b6040516102f69190614b62565b60405180910390f35b34801561030b57600080fd5b506103266004803603810190610321919061415a565b610ac0565b60405161033391906149ac565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e9190614026565b610b45565b005b34801561037157600080fd5b5061038c6004803603810190610387919061415a565b610c5d565b6040516103999190614ab7565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190614119565b610d6d565b005b3480156103d757600080fd5b506103f260048036038101906103ed919061415a565b610e03565b005b34801561040057600080fd5b50610409610f42565b6040516104169190614f64565b60405180910390f35b34801561042b57600080fd5b50610434610f4f565b6040516104419190614ad9565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c9190613f20565b610f5c565b005b34801561047f57600080fd5b5061049a60048036038101906104959190614026565b610fbc565b6040516104a79190614f64565b60405180910390f35b3480156104bc57600080fd5b506104c5611061565b005b3480156104d357600080fd5b506104dc61114e565b005b3480156104ea57600080fd5b5061050560048036038101906105009190613f20565b6111d4565b005b34801561051357600080fd5b5061052e6004803603810190610529919061415a565b6111f4565b005b34801561053c57600080fd5b506105576004803603810190610552919061415a565b611250565b6040516105649190614f64565b60405180910390f35b34801561057957600080fd5b506105826112e7565b60405161058f9190614ad9565b60405180910390f35b3480156105a457600080fd5b506105ad6112fe565b6040516105ba9190614b62565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e5919061415a565b61138c565b6040516105f791906149ac565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190613ebb565b61143e565b005b610643600480360381019061063e919061422b565b6114fe565b005b34801561065157600080fd5b5061066c60048036038101906106679190613e92565b6117ae565b6040516106799190614f64565b60405180910390f35b34801561068e57600080fd5b50610697611866565b005b3480156106a557600080fd5b506106c060048036038101906106bb919061415a565b6118ee565b005b3480156106ce57600080fd5b506106d7611974565b005b3480156106e557600080fd5b506106ee6119fa565b6040516106fb91906149ac565b60405180910390f35b34801561071057600080fd5b50610719611a24565b6040516107269190614b62565b60405180910390f35b34801561073b57600080fd5b50610756600480360381019061075191906140dd565b611ab6565b005b34801561076457600080fd5b5061077f600480360381019061077a9190613fea565b611bc4565b005b34801561078d57600080fd5b50610796611d45565b6040516107a391906149c7565b60405180910390f35b3480156107b857600080fd5b506107c1611d6b565b6040516107ce9190614f64565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190614119565b611d76565b005b34801561080c57600080fd5b5061082760048036038101906108229190613f6f565b611e62565b005b34801561083557600080fd5b50610850600480360381019061084b919061415a565b611ec4565b60405161085d9190614a95565b60405180910390f35b34801561087257600080fd5b5061088d600480360381019061088891906141bf565b612022565b60405161089c93929190614a57565b60405180910390f35b3480156108b157600080fd5b506108ba6120b2565b6040516108c79190614f64565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f2919061415a565b6120b8565b6040516109049190614b62565b60405180910390f35b34801561091957600080fd5b5061092261215f565b005b34801561093057600080fd5b50610939612224565b6040516109469190614f64565b60405180910390f35b34801561095b57600080fd5b5061097660048036038101906109719190613ee4565b61222a565b6040516109839190614ad9565b60405180910390f35b34801561099857600080fd5b506109b360048036038101906109ae9190614183565b6122be565b005b3480156109c157600080fd5b506109ca61234c565b6040516109d79190614b62565b60405180910390f35b3480156109ec57600080fd5b50610a076004803603810190610a029190613e92565b6123da565b005b6000610a14826124d2565b9050919050565b601460009054906101000a900460ff1681565b606060008054610a3d906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a69906152eb565b8015610ab65780601f10610a8b57610100808354040283529160200191610ab6565b820191906000526020600020905b815481529060010190602001808311610a9957829003601f168201915b5050505050905090565b6000610acb82612533565b610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190614de4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b508261138c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb890614e64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be061259f565b73ffffffffffffffffffffffffffffffffffffffff161480610c0f5750610c0e81610c0961259f565b61222a565b5b610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590614d24565b60405180910390fd5b610c5883836125a7565b505050565b6060610c6882612533565b610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614f04565b60405180910390fd5b6000600167ffffffffffffffff811115610cea577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610d185781602001602082028036833780820191505090505b5090506103e881600081518110610d58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b610d7561259f565b73ffffffffffffffffffffffffffffffffffffffff16610d936119fa565b73ffffffffffffffffffffffffffffffffffffffff1614610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614e04565b60405180910390fd5b80600f9080519060200190610dff929190613c03565b5050565b610e0b61259f565b73ffffffffffffffffffffffffffffffffffffffff16610e296119fa565b73ffffffffffffffffffffffffffffffffffffffff1614610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614e04565b60405180910390fd5b601154811115610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90614da4565b60405180910390fd5b60005b81811015610f3e57600060115410610f2b576000601054601354601154601254610ef19190615142565b610efb91906150bb565b610f0591906153a1565b9050610f113382612660565b60116000815480929190610f24906152c1565b9190505550505b8080610f369061534e565b915050610ec7565b5050565b6000600980549050905090565b6000600c54421015905090565b610f6d610f6761259f565b8261267e565b610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390614ea4565b60405180910390fd5b610fb783838361275c565b505050565b6000610fc7836117ae565b8210611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90614bc4565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61106961259f565b73ffffffffffffffffffffffffffffffffffffffff166110876119fa565b73ffffffffffffffffffffffffffffffffffffffff16146110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d490614e04565b60405180910390fd5b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561114a573d6000803e3d6000fd5b5050565b61115661259f565b73ffffffffffffffffffffffffffffffffffffffff166111746119fa565b73ffffffffffffffffffffffffffffffffffffffff16146111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190614e04565b60405180910390fd5b6111d26129b8565b565b6111ef83838360405180602001604052806000815250611e62565b505050565b6112056111ff61259f565b8261267e565b611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90614ee4565b60405180910390fd5b61124d81612a5a565b50565b600061125a610f42565b821061129b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129290614ec4565b60405180910390fd5b600982815481106112d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600660009054906101000a900460ff16905090565b600e805461130b906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611337906152eb565b80156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c90614d84565b60405180910390fd5b80915050919050565b61144661259f565b73ffffffffffffffffffffffffffffffffffffffff166114646119fa565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190614e04565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611506610f4f565b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614d44565b60405180910390fd5b6005841115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090614d04565b60405180910390fd5b6011548411156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614da4565b60405180910390fd5b34846658d15e176280006115e29190615142565b14611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614f44565b60405180910390fd5b606461162d336117ae565b1061166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490614ca4565b60405180910390fd5b6001151561167d33858585612b6b565b1515146116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690614f24565b60405180910390fd5b610258600c546116cf91906150bb565b421161172d57600a846116e1336117ae565b6116eb91906150bb565b111561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390614e44565b60405180910390fd5b5b60005b848110156117a75760006011541061179457600060105460135460115460125461175a9190615142565b61176491906150bb565b61176e91906153a1565b905061177a3382612660565b6011600081548092919061178d906152c1565b9190505550505b808061179f9061534e565b915050611730565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614d64565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61186e61259f565b73ffffffffffffffffffffffffffffffffffffffff1661188c6119fa565b73ffffffffffffffffffffffffffffffffffffffff16146118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d990614e04565b60405180910390fd5b6118ec6000612c44565b565b6118f661259f565b73ffffffffffffffffffffffffffffffffffffffff166119146119fa565b73ffffffffffffffffffffffffffffffffffffffff161461196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190614e04565b60405180910390fd5b80600c8190555050565b61197c61259f565b73ffffffffffffffffffffffffffffffffffffffff1661199a6119fa565b73ffffffffffffffffffffffffffffffffffffffff16146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790614e04565b60405180910390fd5b6119f8612d0a565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a33906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5f906152eb565b8015611aac5780601f10611a8157610100808354040283529160200191611aac565b820191906000526020600020905b815481529060010190602001808311611a8f57829003601f168201915b5050505050905090565b611abe61259f565b73ffffffffffffffffffffffffffffffffffffffff16611adc6119fa565b73ffffffffffffffffffffffffffffffffffffffff1614611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990614e04565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb30836040518363ffffffff1660e01b8152600401611b6d929190614a2e565b602060405180830381600087803b158015611b8757600080fd5b505af1158015611b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbf9190614062565b505050565b611bcc61259f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190614c64565b60405180910390fd5b8060056000611c4761259f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cf461259f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d399190614ad9565b60405180910390a35050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6658d15e1762800081565b611d7e61259f565b73ffffffffffffffffffffffffffffffffffffffff16611d9c6119fa565b73ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990614e04565b60405180910390fd5b60001515601460009054906101000a900460ff16151514611e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3f90614cc4565b60405180910390fd5b80600e9080519060200190611e5e929190613c03565b5050565b611e73611e6d61259f565b8361267e565b611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990614ea4565b60405180910390fd5b611ebe84848484612dad565b50505050565b6060611ecf82612533565b611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0590614f04565b60405180910390fd5b6000600167ffffffffffffffff811115611f51577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611f7f5781602001602082028036833780820191505090505b509050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611fdf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050919050565b6000806060600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a876120579190615111565b868681818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905090509250925092509450945094915050565b60115481565b60606120c382612533565b612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990614e84565b60405180910390fd5b600061210c612e09565b9050600081511161212c5760405180602001604052806000815250612157565b8061213684612e9b565b604051602001612147929190614946565b6040516020818303038152906040525b915050919050565b61216761259f565b73ffffffffffffffffffffffffffffffffffffffff166121856119fa565b73ffffffffffffffffffffffffffffffffffffffff16146121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290614e04565b60405180910390fd5b6001601460006101000a81548160ff0219169083151502179055507fa8cab3d1893ed53071b052fafa843143492f25d1d6b0170d460789f7ab1954be60405160405180910390a1565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122c661259f565b73ffffffffffffffffffffffffffffffffffffffff166122e46119fa565b73ffffffffffffffffffffffffffffffffffffffff161461233a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233190614e04565b60405180910390fd5b81601281905550806013819055505050565b600f8054612359906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612385906152eb565b80156123d25780601f106123a7576101008083540402835291602001916123d2565b820191906000526020600020905b8154815290600101906020018083116123b557829003601f168201915b505050505081565b6123e261259f565b73ffffffffffffffffffffffffffffffffffffffff166124006119fa565b73ffffffffffffffffffffffffffffffffffffffff1614612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d90614e04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bd90614c04565b60405180910390fd5b6124cf81612c44565b50565b600063c155531d60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061252c575061252b8261304e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661261a8361138c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61267a8282604051806020016040528060008152506130af565b5050565b600061268982612533565b6126c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bf90614c84565b60405180910390fd5b60006126d38361138c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061274257508373ffffffffffffffffffffffffffffffffffffffff1661272a84610ac0565b73ffffffffffffffffffffffffffffffffffffffff16145b806127535750612752818561222a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661277c8261138c565b73ffffffffffffffffffffffffffffffffffffffff16146127d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c990614e24565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283990614c44565b60405180910390fd5b61284d83838361310a565b6128586000826125a7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a8919061519c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ff91906150bb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129c06112e7565b6129ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f690614ba4565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a4361259f565b604051612a5091906149ac565b60405180910390a1565b6000612a658261138c565b9050612a738160008461310a565b612a7e6000836125a7565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ace919061519c565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060405180602001604052806040518060400160405280601c81526020017f4c6f6720496e20546f20526164696f6163746976652050756e6b73210000000081525081525090506001612bbf8261311a565b86868660405160008152602001604052604051612bdf9493929190614b1d565b6020604051602081039080840390855afa158015612c01573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d126112e7565b15612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4990614ce4565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d9661259f565b604051612da391906149ac565b60405180910390a1565b612db884848461275c565b612dc4848484846131dc565b612e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfa90614be4565b60405180910390fd5b50505050565b6060600e8054612e18906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612e44906152eb565b8015612e915780601f10612e6657610100808354040283529160200191612e91565b820191906000526020600020905b815481529060010190602001808311612e7457829003601f168201915b5050505050905090565b60606000821415612ee3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613049565b600082905060005b60008214612f15578080612efe9061534e565b915050600a82612f0e9190615111565b9150612eeb565b60008167ffffffffffffffff811115612f57577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f895781602001600182028036833780820191505090505b50905060008290508593505b6000841461304157600a84612faa91906153a1565b6030612fb691906150bb565b60f81b8282612fc4906152c1565b92508281518110612ffe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8461303a9190615111565b9350612f95565b819450505050505b919050565b600063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806130a857506130a782613373565b5b9050919050565b6130b983836133ed565b6130c660008484846131dc565b613105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fc90614be4565b60405180910390fd5b505050565b6131158383836135bb565b505050565b60006015546040518060400160405280601281526020017f556e697428737472696e67206c6f67496e290000000000000000000000000000815250604051602001613165919061492f565b60405160208183030381529060405280519060200120836000015180519060200120604051602001613198929190614af4565b604051602081830303815290604052805190602001206040516020016131bf929190614975565b604051602081830303815290604052805190602001209050919050565b60006131fd8473ffffffffffffffffffffffffffffffffffffffff166136cf565b15613366578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261322661259f565b8786866040518563ffffffff1660e01b815260040161324894939291906149e2565b602060405180830381600087803b15801561326257600080fd5b505af192505050801561329357506040513d601f19601f8201168201806040525081019061329091906140b4565b60015b613316573d80600081146132c3576040519150601f19603f3d011682016040523d82523d6000602084013e6132c8565b606091505b5060008151141561330e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330590614be4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061336b565b600190505b949350505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133e657506133e5826136e2565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345490614dc4565b60405180910390fd5b61346681612533565b156134a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349d90614c24565b60405180910390fd5b6134b26000838361310a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461350291906150bb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6135c68383836137c4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613609576136048161381c565b613648565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613647576136468382613865565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561368b57613686816139d2565b6136ca565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146136c9576136c88282613b15565b5b5b505050565b600080823b905060008111915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806137ad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806137bd57506137bc82613b94565b5b9050919050565b6137cf838383613bfe565b6137d76112e7565b15613817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380e90614b84565b60405180910390fd5b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613872846117ae565b61387c919061519c565b9050600060086000848152602001908152602001600020549050818114613961576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506139e6919061519c565b90506000600a6000848152602001908152602001600020549050600060098381548110613a3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110613a84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613af9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613b20836117ae565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b828054613c0f906152eb565b90600052602060002090601f016020900481019282613c315760008555613c78565b82601f10613c4a57805160ff1916838001178555613c78565b82800160010185558215613c78579182015b82811115613c77578251825591602001919060010190613c5c565b5b509050613c859190613c89565b5090565b5b80821115613ca2576000816000905550600101613c8a565b5090565b6000613cb9613cb484614fa4565b614f7f565b905082815260208101848484011115613cd157600080fd5b613cdc84828561527f565b509392505050565b6000613cf7613cf284614fd5565b614f7f565b905082815260208101848484011115613d0f57600080fd5b613d1a84828561527f565b509392505050565b600081359050613d3181615c22565b92915050565b600081359050613d4681615c39565b92915050565b600081359050613d5b81615c50565b92915050565b600081519050613d7081615c50565b92915050565b600081359050613d8581615c67565b92915050565b600081359050613d9a81615c7e565b92915050565b600081519050613daf81615c7e565b92915050565b60008083601f840112613dc757600080fd5b8235905067ffffffffffffffff811115613de057600080fd5b602083019150836001820283011115613df857600080fd5b9250929050565b600082601f830112613e1057600080fd5b8135613e20848260208601613ca6565b91505092915050565b600081359050613e3881615c95565b92915050565b600082601f830112613e4f57600080fd5b8135613e5f848260208601613ce4565b91505092915050565b600081359050613e7781615cac565b92915050565b600081359050613e8c81615cc3565b92915050565b600060208284031215613ea457600080fd5b6000613eb284828501613d22565b91505092915050565b600060208284031215613ecd57600080fd5b6000613edb84828501613d37565b91505092915050565b60008060408385031215613ef757600080fd5b6000613f0585828601613d22565b9250506020613f1685828601613d22565b9150509250929050565b600080600060608486031215613f3557600080fd5b6000613f4386828701613d22565b9350506020613f5486828701613d22565b9250506040613f6586828701613e68565b9150509250925092565b60008060008060808587031215613f8557600080fd5b6000613f9387828801613d22565b9450506020613fa487828801613d22565b9350506040613fb587828801613e68565b925050606085013567ffffffffffffffff811115613fd257600080fd5b613fde87828801613dff565b91505092959194509250565b60008060408385031215613ffd57600080fd5b600061400b85828601613d22565b925050602061401c85828601613d4c565b9150509250929050565b6000806040838503121561403957600080fd5b600061404785828601613d22565b925050602061405885828601613e68565b9150509250929050565b60006020828403121561407457600080fd5b600061408284828501613d61565b91505092915050565b60006020828403121561409d57600080fd5b60006140ab84828501613d8b565b91505092915050565b6000602082840312156140c657600080fd5b60006140d484828501613da0565b91505092915050565b600080604083850312156140f057600080fd5b60006140fe85828601613e29565b925050602061410f85828601613e68565b9150509250929050565b60006020828403121561412b57600080fd5b600082013567ffffffffffffffff81111561414557600080fd5b61415184828501613e3e565b91505092915050565b60006020828403121561416c57600080fd5b600061417a84828501613e68565b91505092915050565b6000806040838503121561419657600080fd5b60006141a485828601613e68565b92505060206141b585828601613e68565b9150509250929050565b600080600080606085870312156141d557600080fd5b60006141e387828801613e68565b94505060206141f487828801613e68565b935050604085013567ffffffffffffffff81111561421157600080fd5b61421d87828801613db5565b925092505092959194509250565b6000806000806080858703121561424157600080fd5b600061424f87828801613e68565b945050602061426087828801613e7d565b935050604061427187828801613d76565b925050606061428287828801613d76565b91505092959194509250565b600061429a83836142be565b60208301905092915050565b60006142b28383614902565b60208301905092915050565b6142c7816151e2565b82525050565b6142d6816151e2565b82525050565b6142e5816151d0565b82525050565b60006142f682615026565b614300818561506c565b935061430b83615006565b8060005b8381101561433c578151614323888261428e565b975061432e83615052565b92505060018101905061430f565b5085935050505092915050565b600061435482615031565b61435e818561507d565b935061436983615016565b8060005b8381101561439a57815161438188826142a6565b975061438c8361505f565b92505060018101905061436d565b5085935050505092915050565b6143b0816151f4565b82525050565b6143bf81615200565b82525050565b6143d66143d182615200565b615397565b82525050565b60006143e78261503c565b6143f1818561508e565b935061440181856020860161528e565b61440a8161548e565b840191505092915050565b600061442082615047565b61442a818561509f565b935061443a81856020860161528e565b6144438161548e565b840191505092915050565b600061445982615047565b61446381856150b0565b935061447381856020860161528e565b80840191505092915050565b600061448c602b8361509f565b91506144978261549f565b604082019050919050565b60006144af60148361509f565b91506144ba826154ee565b602082019050919050565b60006144d2602b8361509f565b91506144dd82615517565b604082019050919050565b60006144f560328361509f565b915061450082615566565b604082019050919050565b600061451860268361509f565b9150614523826155b5565b604082019050919050565b600061453b601c8361509f565b915061454682615604565b602082019050919050565b600061455e6002836150b0565b91506145698261562d565b600282019050919050565b600061458160248361509f565b915061458c82615656565b604082019050919050565b60006145a460198361509f565b91506145af826156a5565b602082019050919050565b60006145c7602c8361509f565b91506145d2826156ce565b604082019050919050565b60006145ea600f8361509f565b91506145f58261571d565b602082019050919050565b600061460d60068361509f565b915061461882615746565b602082019050919050565b600061463060108361509f565b915061463b8261576f565b602082019050919050565b600061465360158361509f565b915061465e82615798565b602082019050919050565b600061467660388361509f565b9150614681826157c1565b604082019050919050565b600061469960118361509f565b91506146a482615810565b602082019050919050565b60006146bc602a8361509f565b91506146c782615839565b604082019050919050565b60006146df60298361509f565b91506146ea82615888565b604082019050919050565b600061470260128361509f565b915061470d826158d7565b602082019050919050565b600061472560208361509f565b915061473082615900565b602082019050919050565b6000614748602c8361509f565b915061475382615929565b604082019050919050565b600061476b6005836150b0565b915061477682615978565b600582019050919050565b600061478e60208361509f565b9150614799826159a1565b602082019050919050565b60006147b160298361509f565b91506147bc826159ca565b604082019050919050565b60006147d460158361509f565b91506147df82615a19565b602082019050919050565b60006147f760218361509f565b915061480282615a42565b604082019050919050565b600061481a60098361509f565b915061482582615a91565b602082019050919050565b600061483d60318361509f565b915061484882615aba565b604082019050919050565b6000614860602c8361509f565b915061486b82615b09565b604082019050919050565b600061488360308361509f565b915061488e82615b58565b604082019050919050565b60006148a660038361509f565b91506148b182615ba7565b602082019050919050565b60006148c9600c8361509f565b91506148d482615bd0565b602082019050919050565b60006148ec60158361509f565b91506148f782615bf9565b602082019050919050565b61490b81615268565b82525050565b61491a81615268565b82525050565b61492981615272565b82525050565b600061493b828461444e565b915081905092915050565b6000614952828561444e565b915061495e828461444e565b91506149698261475e565b91508190509392505050565b600061498082614551565b915061498c82856143c5565b60208201915061499c82846143c5565b6020820191508190509392505050565b60006020820190506149c160008301846142dc565b92915050565b60006020820190506149dc60008301846142cd565b92915050565b60006080820190506149f760008301876142dc565b614a0460208301866142dc565b614a116040830185614911565b8181036060830152614a2381846143dc565b905095945050505050565b6000604082019050614a4360008301856142dc565b614a506020830184614911565b9392505050565b6000606082019050614a6c60008301866142dc565b614a796020830185614911565b8181036040830152614a8b81846143dc565b9050949350505050565b60006020820190508181036000830152614aaf81846142eb565b905092915050565b60006020820190508181036000830152614ad18184614349565b905092915050565b6000602082019050614aee60008301846143a7565b92915050565b6000604082019050614b0960008301856143b6565b614b1660208301846143b6565b9392505050565b6000608082019050614b3260008301876143b6565b614b3f6020830186614920565b614b4c60408301856143b6565b614b5960608301846143b6565b95945050505050565b60006020820190508181036000830152614b7c8184614415565b905092915050565b60006020820190508181036000830152614b9d8161447f565b9050919050565b60006020820190508181036000830152614bbd816144a2565b9050919050565b60006020820190508181036000830152614bdd816144c5565b9050919050565b60006020820190508181036000830152614bfd816144e8565b9050919050565b60006020820190508181036000830152614c1d8161450b565b9050919050565b60006020820190508181036000830152614c3d8161452e565b9050919050565b60006020820190508181036000830152614c5d81614574565b9050919050565b60006020820190508181036000830152614c7d81614597565b9050919050565b60006020820190508181036000830152614c9d816145ba565b9050919050565b60006020820190508181036000830152614cbd816145dd565b9050919050565b60006020820190508181036000830152614cdd81614600565b9050919050565b60006020820190508181036000830152614cfd81614623565b9050919050565b60006020820190508181036000830152614d1d81614646565b9050919050565b60006020820190508181036000830152614d3d81614669565b9050919050565b60006020820190508181036000830152614d5d8161468c565b9050919050565b60006020820190508181036000830152614d7d816146af565b9050919050565b60006020820190508181036000830152614d9d816146d2565b9050919050565b60006020820190508181036000830152614dbd816146f5565b9050919050565b60006020820190508181036000830152614ddd81614718565b9050919050565b60006020820190508181036000830152614dfd8161473b565b9050919050565b60006020820190508181036000830152614e1d81614781565b9050919050565b60006020820190508181036000830152614e3d816147a4565b9050919050565b60006020820190508181036000830152614e5d816147c7565b9050919050565b60006020820190508181036000830152614e7d816147ea565b9050919050565b60006020820190508181036000830152614e9d8161480d565b9050919050565b60006020820190508181036000830152614ebd81614830565b9050919050565b60006020820190508181036000830152614edd81614853565b9050919050565b60006020820190508181036000830152614efd81614876565b9050919050565b60006020820190508181036000830152614f1d81614899565b9050919050565b60006020820190508181036000830152614f3d816148bc565b9050919050565b60006020820190508181036000830152614f5d816148df565b9050919050565b6000602082019050614f796000830184614911565b92915050565b6000614f89614f9a565b9050614f95828261531d565b919050565b6000604051905090565b600067ffffffffffffffff821115614fbf57614fbe61545f565b5b614fc88261548e565b9050602081019050919050565b600067ffffffffffffffff821115614ff057614fef61545f565b5b614ff98261548e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006150c682615268565b91506150d183615268565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615106576151056153d2565b5b828201905092915050565b600061511c82615268565b915061512783615268565b92508261513757615136615401565b5b828204905092915050565b600061514d82615268565b915061515883615268565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615191576151906153d2565b5b828202905092915050565b60006151a782615268565b91506151b283615268565b9250828210156151c5576151c46153d2565b5b828203905092915050565b60006151db82615248565b9050919050565b60006151ed82615248565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000615241826151d0565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156152ac578082015181840152602081019050615291565b838111156152bb576000848401525b50505050565b60006152cc82615268565b915060008214156152e0576152df6153d2565b5b600182039050919050565b6000600282049050600182168061530357607f821691505b6020821081141561531757615316615430565b5b50919050565b6153268261548e565b810181811067ffffffffffffffff821117156153455761534461545f565b5b80604052505050565b600061535982615268565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561538c5761538b6153d2565b5b600182019050919050565b6000819050919050565b60006153ac82615268565b91506153b783615268565b9250826153c7576153c6615401565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e73206d617820616d6f756e740000000000000000000000000000000000600082015250565b7f46726f7a656e0000000000000000000000000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45786365656473206d6178206d696e7420726174650000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752061726520746f6f206561726c79000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920313020666f722066697273742031306d0000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20444e450000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f444e450000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f206368656174657273210000000000000000000000000000000000000000600082015250565b7f45746865722076616c756520696e636f72726563740000000000000000000000600082015250565b615c2b816151d0565b8114615c3657600080fd5b50565b615c42816151e2565b8114615c4d57600080fd5b50565b615c59816151f4565b8114615c6457600080fd5b50565b615c7081615200565b8114615c7b57600080fd5b50565b615c878161520a565b8114615c9257600080fd5b50565b615c9e81615236565b8114615ca957600080fd5b50565b615cb581615268565b8114615cc057600080fd5b50565b615ccc81615272565b8114615cd757600080fd5b5056fea264697066735822122074671a2bf037e18ab7d2f7d2e9fa10ba8bce36ccf6264ff8128d0ebdde35bf5764736f6c63430008040033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429

Deployed Bytecode

0x6080604052600436106102675760003560e01c806370a0823111610144578063b88d4fde116100b6578063d111515d1161007a578063d111515d1461090d578063da4493f614610924578063e985e9c51461094f578063ebb310801461098c578063f0c9dc60146109b5578063f2fde38b146109e057610267565b8063b88d4fde14610800578063b9c4d9fb14610829578063c155531d14610866578063c5602f8c146108a5578063c87b56dd146108d057610267565b806395d89b411161010857806395d89b41146107045780639727151a1461072f578063a22cb46514610758578063a5f0292b14610781578063b3a9a258146107ac578063b49c2b49146107d757610267565b806370a0823114610645578063715018a6146106825780637c5486a2146106995780638456cb59146106c25780638da5cb5b146106d957610267565b80632f745c59116101dd5780634f6ccce7116101a15780634f6ccce7146105305780635c975abb1461056d57806363335bf9146105985780636352211e146105c35780636b29b79f146106005780636d9ad37a1461062957610267565b80632f745c59146104735780633ccfd60b146104b05780633f4ba83a146104c757806342842e0e146104de57806342966c681461050757610267565b80630ebd4c7f1161022f5780630ebd4c7f1461036557806310969523146103a257806313476b71146103cb57806318160ddd146103f4578063186601ca1461041f57806323b872dd1461044a57610267565b806301ffc9a71461026c578063054f7d9c146102a957806306fdde03146102d4578063081812fc146102ff578063095ea7b31461033c575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061408b565b610a09565b6040516102a09190614ad9565b60405180910390f35b3480156102b557600080fd5b506102be610a1b565b6040516102cb9190614ad9565b60405180910390f35b3480156102e057600080fd5b506102e9610a2e565b6040516102f69190614b62565b60405180910390f35b34801561030b57600080fd5b506103266004803603810190610321919061415a565b610ac0565b60405161033391906149ac565b60405180910390f35b34801561034857600080fd5b50610363600480360381019061035e9190614026565b610b45565b005b34801561037157600080fd5b5061038c6004803603810190610387919061415a565b610c5d565b6040516103999190614ab7565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190614119565b610d6d565b005b3480156103d757600080fd5b506103f260048036038101906103ed919061415a565b610e03565b005b34801561040057600080fd5b50610409610f42565b6040516104169190614f64565b60405180910390f35b34801561042b57600080fd5b50610434610f4f565b6040516104419190614ad9565b60405180910390f35b34801561045657600080fd5b50610471600480360381019061046c9190613f20565b610f5c565b005b34801561047f57600080fd5b5061049a60048036038101906104959190614026565b610fbc565b6040516104a79190614f64565b60405180910390f35b3480156104bc57600080fd5b506104c5611061565b005b3480156104d357600080fd5b506104dc61114e565b005b3480156104ea57600080fd5b5061050560048036038101906105009190613f20565b6111d4565b005b34801561051357600080fd5b5061052e6004803603810190610529919061415a565b6111f4565b005b34801561053c57600080fd5b506105576004803603810190610552919061415a565b611250565b6040516105649190614f64565b60405180910390f35b34801561057957600080fd5b506105826112e7565b60405161058f9190614ad9565b60405180910390f35b3480156105a457600080fd5b506105ad6112fe565b6040516105ba9190614b62565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e5919061415a565b61138c565b6040516105f791906149ac565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190613ebb565b61143e565b005b610643600480360381019061063e919061422b565b6114fe565b005b34801561065157600080fd5b5061066c60048036038101906106679190613e92565b6117ae565b6040516106799190614f64565b60405180910390f35b34801561068e57600080fd5b50610697611866565b005b3480156106a557600080fd5b506106c060048036038101906106bb919061415a565b6118ee565b005b3480156106ce57600080fd5b506106d7611974565b005b3480156106e557600080fd5b506106ee6119fa565b6040516106fb91906149ac565b60405180910390f35b34801561071057600080fd5b50610719611a24565b6040516107269190614b62565b60405180910390f35b34801561073b57600080fd5b50610756600480360381019061075191906140dd565b611ab6565b005b34801561076457600080fd5b5061077f600480360381019061077a9190613fea565b611bc4565b005b34801561078d57600080fd5b50610796611d45565b6040516107a391906149c7565b60405180910390f35b3480156107b857600080fd5b506107c1611d6b565b6040516107ce9190614f64565b60405180910390f35b3480156107e357600080fd5b506107fe60048036038101906107f99190614119565b611d76565b005b34801561080c57600080fd5b5061082760048036038101906108229190613f6f565b611e62565b005b34801561083557600080fd5b50610850600480360381019061084b919061415a565b611ec4565b60405161085d9190614a95565b60405180910390f35b34801561087257600080fd5b5061088d600480360381019061088891906141bf565b612022565b60405161089c93929190614a57565b60405180910390f35b3480156108b157600080fd5b506108ba6120b2565b6040516108c79190614f64565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f2919061415a565b6120b8565b6040516109049190614b62565b60405180910390f35b34801561091957600080fd5b5061092261215f565b005b34801561093057600080fd5b50610939612224565b6040516109469190614f64565b60405180910390f35b34801561095b57600080fd5b5061097660048036038101906109719190613ee4565b61222a565b6040516109839190614ad9565b60405180910390f35b34801561099857600080fd5b506109b360048036038101906109ae9190614183565b6122be565b005b3480156109c157600080fd5b506109ca61234c565b6040516109d79190614b62565b60405180910390f35b3480156109ec57600080fd5b50610a076004803603810190610a029190613e92565b6123da565b005b6000610a14826124d2565b9050919050565b601460009054906101000a900460ff1681565b606060008054610a3d906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610a69906152eb565b8015610ab65780601f10610a8b57610100808354040283529160200191610ab6565b820191906000526020600020905b815481529060010190602001808311610a9957829003601f168201915b5050505050905090565b6000610acb82612533565b610b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0190614de4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b508261138c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb890614e64565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be061259f565b73ffffffffffffffffffffffffffffffffffffffff161480610c0f5750610c0e81610c0961259f565b61222a565b5b610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590614d24565b60405180910390fd5b610c5883836125a7565b505050565b6060610c6882612533565b610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614f04565b60405180910390fd5b6000600167ffffffffffffffff811115610cea577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610d185781602001602082028036833780820191505090505b5090506103e881600081518110610d58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b610d7561259f565b73ffffffffffffffffffffffffffffffffffffffff16610d936119fa565b73ffffffffffffffffffffffffffffffffffffffff1614610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614e04565b60405180910390fd5b80600f9080519060200190610dff929190613c03565b5050565b610e0b61259f565b73ffffffffffffffffffffffffffffffffffffffff16610e296119fa565b73ffffffffffffffffffffffffffffffffffffffff1614610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7690614e04565b60405180910390fd5b601154811115610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90614da4565b60405180910390fd5b60005b81811015610f3e57600060115410610f2b576000601054601354601154601254610ef19190615142565b610efb91906150bb565b610f0591906153a1565b9050610f113382612660565b60116000815480929190610f24906152c1565b9190505550505b8080610f369061534e565b915050610ec7565b5050565b6000600980549050905090565b6000600c54421015905090565b610f6d610f6761259f565b8261267e565b610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390614ea4565b60405180910390fd5b610fb783838361275c565b505050565b6000610fc7836117ae565b8210611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90614bc4565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61106961259f565b73ffffffffffffffffffffffffffffffffffffffff166110876119fa565b73ffffffffffffffffffffffffffffffffffffffff16146110dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d490614e04565b60405180910390fd5b6000479050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561114a573d6000803e3d6000fd5b5050565b61115661259f565b73ffffffffffffffffffffffffffffffffffffffff166111746119fa565b73ffffffffffffffffffffffffffffffffffffffff16146111ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c190614e04565b60405180910390fd5b6111d26129b8565b565b6111ef83838360405180602001604052806000815250611e62565b505050565b6112056111ff61259f565b8261267e565b611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90614ee4565b60405180910390fd5b61124d81612a5a565b50565b600061125a610f42565b821061129b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129290614ec4565b60405180910390fd5b600982815481106112d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600660009054906101000a900460ff16905090565b600e805461130b906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611337906152eb565b80156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c90614d84565b60405180910390fd5b80915050919050565b61144661259f565b73ffffffffffffffffffffffffffffffffffffffff166114646119fa565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190614e04565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611506610f4f565b611545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153c90614d44565b60405180910390fd5b6005841115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090614d04565b60405180910390fd5b6011548411156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614da4565b60405180910390fd5b34846658d15e176280006115e29190615142565b14611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614f44565b60405180910390fd5b606461162d336117ae565b1061166d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166490614ca4565b60405180910390fd5b6001151561167d33858585612b6b565b1515146116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b690614f24565b60405180910390fd5b610258600c546116cf91906150bb565b421161172d57600a846116e1336117ae565b6116eb91906150bb565b111561172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390614e44565b60405180910390fd5b5b60005b848110156117a75760006011541061179457600060105460135460115460125461175a9190615142565b61176491906150bb565b61176e91906153a1565b905061177a3382612660565b6011600081548092919061178d906152c1565b9190505550505b808061179f9061534e565b915050611730565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690614d64565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61186e61259f565b73ffffffffffffffffffffffffffffffffffffffff1661188c6119fa565b73ffffffffffffffffffffffffffffffffffffffff16146118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d990614e04565b60405180910390fd5b6118ec6000612c44565b565b6118f661259f565b73ffffffffffffffffffffffffffffffffffffffff166119146119fa565b73ffffffffffffffffffffffffffffffffffffffff161461196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196190614e04565b60405180910390fd5b80600c8190555050565b61197c61259f565b73ffffffffffffffffffffffffffffffffffffffff1661199a6119fa565b73ffffffffffffffffffffffffffffffffffffffff16146119f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e790614e04565b60405180910390fd5b6119f8612d0a565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a33906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5f906152eb565b8015611aac5780601f10611a8157610100808354040283529160200191611aac565b820191906000526020600020905b815481529060010190602001808311611a8f57829003601f168201915b5050505050905090565b611abe61259f565b73ffffffffffffffffffffffffffffffffffffffff16611adc6119fa565b73ffffffffffffffffffffffffffffffffffffffff1614611b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2990614e04565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb30836040518363ffffffff1660e01b8152600401611b6d929190614a2e565b602060405180830381600087803b158015611b8757600080fd5b505af1158015611b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbf9190614062565b505050565b611bcc61259f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190614c64565b60405180910390fd5b8060056000611c4761259f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cf461259f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d399190614ad9565b60405180910390a35050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6658d15e1762800081565b611d7e61259f565b73ffffffffffffffffffffffffffffffffffffffff16611d9c6119fa565b73ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de990614e04565b60405180910390fd5b60001515601460009054906101000a900460ff16151514611e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3f90614cc4565b60405180910390fd5b80600e9080519060200190611e5e929190613c03565b5050565b611e73611e6d61259f565b8361267e565b611eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea990614ea4565b60405180910390fd5b611ebe84848484612dad565b50505050565b6060611ecf82612533565b611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0590614f04565b60405180910390fd5b6000600167ffffffffffffffff811115611f51577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611f7f5781602001602082028036833780820191505090505b509050600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600081518110611fdf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080915050919050565b6000806060600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a876120579190615111565b868681818080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905090509250925092509450945094915050565b60115481565b60606120c382612533565b612102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f990614e84565b60405180910390fd5b600061210c612e09565b9050600081511161212c5760405180602001604052806000815250612157565b8061213684612e9b565b604051602001612147929190614946565b6040516020818303038152906040525b915050919050565b61216761259f565b73ffffffffffffffffffffffffffffffffffffffff166121856119fa565b73ffffffffffffffffffffffffffffffffffffffff16146121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d290614e04565b60405180910390fd5b6001601460006101000a81548160ff0219169083151502179055507fa8cab3d1893ed53071b052fafa843143492f25d1d6b0170d460789f7ab1954be60405160405180910390a1565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122c661259f565b73ffffffffffffffffffffffffffffffffffffffff166122e46119fa565b73ffffffffffffffffffffffffffffffffffffffff161461233a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233190614e04565b60405180910390fd5b81601281905550806013819055505050565b600f8054612359906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612385906152eb565b80156123d25780601f106123a7576101008083540402835291602001916123d2565b820191906000526020600020905b8154815290600101906020018083116123b557829003601f168201915b505050505081565b6123e261259f565b73ffffffffffffffffffffffffffffffffffffffff166124006119fa565b73ffffffffffffffffffffffffffffffffffffffff1614612456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244d90614e04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bd90614c04565b60405180910390fd5b6124cf81612c44565b50565b600063c155531d60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061252c575061252b8261304e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661261a8361138c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61267a8282604051806020016040528060008152506130af565b5050565b600061268982612533565b6126c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bf90614c84565b60405180910390fd5b60006126d38361138c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061274257508373ffffffffffffffffffffffffffffffffffffffff1661272a84610ac0565b73ffffffffffffffffffffffffffffffffffffffff16145b806127535750612752818561222a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661277c8261138c565b73ffffffffffffffffffffffffffffffffffffffff16146127d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c990614e24565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283990614c44565b60405180910390fd5b61284d83838361310a565b6128586000826125a7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128a8919061519c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128ff91906150bb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6129c06112e7565b6129ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f690614ba4565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a4361259f565b604051612a5091906149ac565b60405180910390a1565b6000612a658261138c565b9050612a738160008461310a565b612a7e6000836125a7565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ace919061519c565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060405180602001604052806040518060400160405280601c81526020017f4c6f6720496e20546f20526164696f6163746976652050756e6b73210000000081525081525090506001612bbf8261311a565b86868660405160008152602001604052604051612bdf9493929190614b1d565b6020604051602081039080840390855afa158015612c01573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d126112e7565b15612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4990614ce4565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d9661259f565b604051612da391906149ac565b60405180910390a1565b612db884848461275c565b612dc4848484846131dc565b612e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfa90614be4565b60405180910390fd5b50505050565b6060600e8054612e18906152eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612e44906152eb565b8015612e915780601f10612e6657610100808354040283529160200191612e91565b820191906000526020600020905b815481529060010190602001808311612e7457829003601f168201915b5050505050905090565b60606000821415612ee3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613049565b600082905060005b60008214612f15578080612efe9061534e565b915050600a82612f0e9190615111565b9150612eeb565b60008167ffffffffffffffff811115612f57577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f895781602001600182028036833780820191505090505b50905060008290508593505b6000841461304157600a84612faa91906153a1565b6030612fb691906150bb565b60f81b8282612fc4906152c1565b92508281518110612ffe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8461303a9190615111565b9350612f95565b819450505050505b919050565b600063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806130a857506130a782613373565b5b9050919050565b6130b983836133ed565b6130c660008484846131dc565b613105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fc90614be4565b60405180910390fd5b505050565b6131158383836135bb565b505050565b60006015546040518060400160405280601281526020017f556e697428737472696e67206c6f67496e290000000000000000000000000000815250604051602001613165919061492f565b60405160208183030381529060405280519060200120836000015180519060200120604051602001613198929190614af4565b604051602081830303815290604052805190602001206040516020016131bf929190614975565b604051602081830303815290604052805190602001209050919050565b60006131fd8473ffffffffffffffffffffffffffffffffffffffff166136cf565b15613366578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261322661259f565b8786866040518563ffffffff1660e01b815260040161324894939291906149e2565b602060405180830381600087803b15801561326257600080fd5b505af192505050801561329357506040513d601f19601f8201168201806040525081019061329091906140b4565b60015b613316573d80600081146132c3576040519150601f19603f3d011682016040523d82523d6000602084013e6132c8565b606091505b5060008151141561330e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330590614be4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061336b565b600190505b949350505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133e657506133e5826136e2565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561345d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345490614dc4565b60405180910390fd5b61346681612533565b156134a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349d90614c24565b60405180910390fd5b6134b26000838361310a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461350291906150bb565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6135c68383836137c4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613609576136048161381c565b613648565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613647576136468382613865565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561368b57613686816139d2565b6136ca565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146136c9576136c88282613b15565b5b5b505050565b600080823b905060008111915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806137ad57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806137bd57506137bc82613b94565b5b9050919050565b6137cf838383613bfe565b6137d76112e7565b15613817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161380e90614b84565b60405180910390fd5b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613872846117ae565b61387c919061519c565b9050600060086000848152602001908152602001600020549050818114613961576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506139e6919061519c565b90506000600a6000848152602001908152602001600020549050600060098381548110613a3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110613a84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480613af9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613b20836117ae565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b828054613c0f906152eb565b90600052602060002090601f016020900481019282613c315760008555613c78565b82601f10613c4a57805160ff1916838001178555613c78565b82800160010185558215613c78579182015b82811115613c77578251825591602001919060010190613c5c565b5b509050613c859190613c89565b5090565b5b80821115613ca2576000816000905550600101613c8a565b5090565b6000613cb9613cb484614fa4565b614f7f565b905082815260208101848484011115613cd157600080fd5b613cdc84828561527f565b509392505050565b6000613cf7613cf284614fd5565b614f7f565b905082815260208101848484011115613d0f57600080fd5b613d1a84828561527f565b509392505050565b600081359050613d3181615c22565b92915050565b600081359050613d4681615c39565b92915050565b600081359050613d5b81615c50565b92915050565b600081519050613d7081615c50565b92915050565b600081359050613d8581615c67565b92915050565b600081359050613d9a81615c7e565b92915050565b600081519050613daf81615c7e565b92915050565b60008083601f840112613dc757600080fd5b8235905067ffffffffffffffff811115613de057600080fd5b602083019150836001820283011115613df857600080fd5b9250929050565b600082601f830112613e1057600080fd5b8135613e20848260208601613ca6565b91505092915050565b600081359050613e3881615c95565b92915050565b600082601f830112613e4f57600080fd5b8135613e5f848260208601613ce4565b91505092915050565b600081359050613e7781615cac565b92915050565b600081359050613e8c81615cc3565b92915050565b600060208284031215613ea457600080fd5b6000613eb284828501613d22565b91505092915050565b600060208284031215613ecd57600080fd5b6000613edb84828501613d37565b91505092915050565b60008060408385031215613ef757600080fd5b6000613f0585828601613d22565b9250506020613f1685828601613d22565b9150509250929050565b600080600060608486031215613f3557600080fd5b6000613f4386828701613d22565b9350506020613f5486828701613d22565b9250506040613f6586828701613e68565b9150509250925092565b60008060008060808587031215613f8557600080fd5b6000613f9387828801613d22565b9450506020613fa487828801613d22565b9350506040613fb587828801613e68565b925050606085013567ffffffffffffffff811115613fd257600080fd5b613fde87828801613dff565b91505092959194509250565b60008060408385031215613ffd57600080fd5b600061400b85828601613d22565b925050602061401c85828601613d4c565b9150509250929050565b6000806040838503121561403957600080fd5b600061404785828601613d22565b925050602061405885828601613e68565b9150509250929050565b60006020828403121561407457600080fd5b600061408284828501613d61565b91505092915050565b60006020828403121561409d57600080fd5b60006140ab84828501613d8b565b91505092915050565b6000602082840312156140c657600080fd5b60006140d484828501613da0565b91505092915050565b600080604083850312156140f057600080fd5b60006140fe85828601613e29565b925050602061410f85828601613e68565b9150509250929050565b60006020828403121561412b57600080fd5b600082013567ffffffffffffffff81111561414557600080fd5b61415184828501613e3e565b91505092915050565b60006020828403121561416c57600080fd5b600061417a84828501613e68565b91505092915050565b6000806040838503121561419657600080fd5b60006141a485828601613e68565b92505060206141b585828601613e68565b9150509250929050565b600080600080606085870312156141d557600080fd5b60006141e387828801613e68565b94505060206141f487828801613e68565b935050604085013567ffffffffffffffff81111561421157600080fd5b61421d87828801613db5565b925092505092959194509250565b6000806000806080858703121561424157600080fd5b600061424f87828801613e68565b945050602061426087828801613e7d565b935050604061427187828801613d76565b925050606061428287828801613d76565b91505092959194509250565b600061429a83836142be565b60208301905092915050565b60006142b28383614902565b60208301905092915050565b6142c7816151e2565b82525050565b6142d6816151e2565b82525050565b6142e5816151d0565b82525050565b60006142f682615026565b614300818561506c565b935061430b83615006565b8060005b8381101561433c578151614323888261428e565b975061432e83615052565b92505060018101905061430f565b5085935050505092915050565b600061435482615031565b61435e818561507d565b935061436983615016565b8060005b8381101561439a57815161438188826142a6565b975061438c8361505f565b92505060018101905061436d565b5085935050505092915050565b6143b0816151f4565b82525050565b6143bf81615200565b82525050565b6143d66143d182615200565b615397565b82525050565b60006143e78261503c565b6143f1818561508e565b935061440181856020860161528e565b61440a8161548e565b840191505092915050565b600061442082615047565b61442a818561509f565b935061443a81856020860161528e565b6144438161548e565b840191505092915050565b600061445982615047565b61446381856150b0565b935061447381856020860161528e565b80840191505092915050565b600061448c602b8361509f565b91506144978261549f565b604082019050919050565b60006144af60148361509f565b91506144ba826154ee565b602082019050919050565b60006144d2602b8361509f565b91506144dd82615517565b604082019050919050565b60006144f560328361509f565b915061450082615566565b604082019050919050565b600061451860268361509f565b9150614523826155b5565b604082019050919050565b600061453b601c8361509f565b915061454682615604565b602082019050919050565b600061455e6002836150b0565b91506145698261562d565b600282019050919050565b600061458160248361509f565b915061458c82615656565b604082019050919050565b60006145a460198361509f565b91506145af826156a5565b602082019050919050565b60006145c7602c8361509f565b91506145d2826156ce565b604082019050919050565b60006145ea600f8361509f565b91506145f58261571d565b602082019050919050565b600061460d60068361509f565b915061461882615746565b602082019050919050565b600061463060108361509f565b915061463b8261576f565b602082019050919050565b600061465360158361509f565b915061465e82615798565b602082019050919050565b600061467660388361509f565b9150614681826157c1565b604082019050919050565b600061469960118361509f565b91506146a482615810565b602082019050919050565b60006146bc602a8361509f565b91506146c782615839565b604082019050919050565b60006146df60298361509f565b91506146ea82615888565b604082019050919050565b600061470260128361509f565b915061470d826158d7565b602082019050919050565b600061472560208361509f565b915061473082615900565b602082019050919050565b6000614748602c8361509f565b915061475382615929565b604082019050919050565b600061476b6005836150b0565b915061477682615978565b600582019050919050565b600061478e60208361509f565b9150614799826159a1565b602082019050919050565b60006147b160298361509f565b91506147bc826159ca565b604082019050919050565b60006147d460158361509f565b91506147df82615a19565b602082019050919050565b60006147f760218361509f565b915061480282615a42565b604082019050919050565b600061481a60098361509f565b915061482582615a91565b602082019050919050565b600061483d60318361509f565b915061484882615aba565b604082019050919050565b6000614860602c8361509f565b915061486b82615b09565b604082019050919050565b600061488360308361509f565b915061488e82615b58565b604082019050919050565b60006148a660038361509f565b91506148b182615ba7565b602082019050919050565b60006148c9600c8361509f565b91506148d482615bd0565b602082019050919050565b60006148ec60158361509f565b91506148f782615bf9565b602082019050919050565b61490b81615268565b82525050565b61491a81615268565b82525050565b61492981615272565b82525050565b600061493b828461444e565b915081905092915050565b6000614952828561444e565b915061495e828461444e565b91506149698261475e565b91508190509392505050565b600061498082614551565b915061498c82856143c5565b60208201915061499c82846143c5565b6020820191508190509392505050565b60006020820190506149c160008301846142dc565b92915050565b60006020820190506149dc60008301846142cd565b92915050565b60006080820190506149f760008301876142dc565b614a0460208301866142dc565b614a116040830185614911565b8181036060830152614a2381846143dc565b905095945050505050565b6000604082019050614a4360008301856142dc565b614a506020830184614911565b9392505050565b6000606082019050614a6c60008301866142dc565b614a796020830185614911565b8181036040830152614a8b81846143dc565b9050949350505050565b60006020820190508181036000830152614aaf81846142eb565b905092915050565b60006020820190508181036000830152614ad18184614349565b905092915050565b6000602082019050614aee60008301846143a7565b92915050565b6000604082019050614b0960008301856143b6565b614b1660208301846143b6565b9392505050565b6000608082019050614b3260008301876143b6565b614b3f6020830186614920565b614b4c60408301856143b6565b614b5960608301846143b6565b95945050505050565b60006020820190508181036000830152614b7c8184614415565b905092915050565b60006020820190508181036000830152614b9d8161447f565b9050919050565b60006020820190508181036000830152614bbd816144a2565b9050919050565b60006020820190508181036000830152614bdd816144c5565b9050919050565b60006020820190508181036000830152614bfd816144e8565b9050919050565b60006020820190508181036000830152614c1d8161450b565b9050919050565b60006020820190508181036000830152614c3d8161452e565b9050919050565b60006020820190508181036000830152614c5d81614574565b9050919050565b60006020820190508181036000830152614c7d81614597565b9050919050565b60006020820190508181036000830152614c9d816145ba565b9050919050565b60006020820190508181036000830152614cbd816145dd565b9050919050565b60006020820190508181036000830152614cdd81614600565b9050919050565b60006020820190508181036000830152614cfd81614623565b9050919050565b60006020820190508181036000830152614d1d81614646565b9050919050565b60006020820190508181036000830152614d3d81614669565b9050919050565b60006020820190508181036000830152614d5d8161468c565b9050919050565b60006020820190508181036000830152614d7d816146af565b9050919050565b60006020820190508181036000830152614d9d816146d2565b9050919050565b60006020820190508181036000830152614dbd816146f5565b9050919050565b60006020820190508181036000830152614ddd81614718565b9050919050565b60006020820190508181036000830152614dfd8161473b565b9050919050565b60006020820190508181036000830152614e1d81614781565b9050919050565b60006020820190508181036000830152614e3d816147a4565b9050919050565b60006020820190508181036000830152614e5d816147c7565b9050919050565b60006020820190508181036000830152614e7d816147ea565b9050919050565b60006020820190508181036000830152614e9d8161480d565b9050919050565b60006020820190508181036000830152614ebd81614830565b9050919050565b60006020820190508181036000830152614edd81614853565b9050919050565b60006020820190508181036000830152614efd81614876565b9050919050565b60006020820190508181036000830152614f1d81614899565b9050919050565b60006020820190508181036000830152614f3d816148bc565b9050919050565b60006020820190508181036000830152614f5d816148df565b9050919050565b6000602082019050614f796000830184614911565b92915050565b6000614f89614f9a565b9050614f95828261531d565b919050565b6000604051905090565b600067ffffffffffffffff821115614fbf57614fbe61545f565b5b614fc88261548e565b9050602081019050919050565b600067ffffffffffffffff821115614ff057614fef61545f565b5b614ff98261548e565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006150c682615268565b91506150d183615268565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615106576151056153d2565b5b828201905092915050565b600061511c82615268565b915061512783615268565b92508261513757615136615401565b5b828204905092915050565b600061514d82615268565b915061515883615268565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615191576151906153d2565b5b828202905092915050565b60006151a782615268565b91506151b283615268565b9250828210156151c5576151c46153d2565b5b828203905092915050565b60006151db82615248565b9050919050565b60006151ed82615248565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000615241826151d0565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156152ac578082015181840152602081019050615291565b838111156152bb576000848401525b50505050565b60006152cc82615268565b915060008214156152e0576152df6153d2565b5b600182039050919050565b6000600282049050600182168061530357607f821691505b6020821081141561531757615316615430565b5b50919050565b6153268261548e565b810181811067ffffffffffffffff821117156153455761534461545f565b5b80604052505050565b600061535982615268565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561538c5761538b6153d2565b5b600182019050919050565b6000819050919050565b60006153ac82615268565b91506153b783615268565b9250826153c7576153c6615401565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e73206d617820616d6f756e740000000000000000000000000000000000600082015250565b7f46726f7a656e0000000000000000000000000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45786365656473206d6178206d696e7420726174650000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f596f752061726520746f6f206561726c79000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4f6e6c7920313020666f722066697273742031306d0000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e20444e450000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f444e450000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f206368656174657273210000000000000000000000000000000000000000600082015250565b7f45746865722076616c756520696e636f72726563740000000000000000000000600082015250565b615c2b816151d0565b8114615c3657600080fd5b50565b615c42816151e2565b8114615c4d57600080fd5b50565b615c59816151f4565b8114615c6457600080fd5b50565b615c7081615200565b8114615c7b57600080fd5b50565b615c878161520a565b8114615c9257600080fd5b50565b615c9e81615236565b8114615ca957600080fd5b50565b615cb581615268565b8114615cc057600080fd5b50565b615ccc81615272565b8114615cd757600080fd5b5056fea264697066735822122074671a2bf037e18ab7d2f7d2e9fa10ba8bce36ccf6264ff8128d0ebdde35bf5764736f6c63430008040033

Deployed Bytecode Sourcemap

57009:7690:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63355:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57731:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28571:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30130:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29653:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62837:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61656:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59973:461;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46144:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58697:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31020:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45812:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58438:130;;;;;;;;;;;;;:::i;:::-;;62148:60;;;;;;;;;;;;;:::i;:::-;;31430:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40206:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46334:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41528:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57388:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28265:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58574:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60533:982;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27995:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7452:94;;;;;;;;;;;;;:::i;:::-;;58804:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62085:57;;;;;;;;;;;;;:::i;:::-;;6801:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28740:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61953:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30423:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57270:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57472:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59308:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31686:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62520:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63098:251;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;57625:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59552:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59211:91;;;;;;;;;;;;;:::i;:::-;;57200:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30789:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58985:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57424:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7701:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63355:196;63489:4;63509:36;63533:11;63509:23;:36::i;:::-;63502:43;;63355:196;;;:::o;57731:26::-;;;;;;;;;;;;;:::o;28571:100::-;28625:13;28658:5;28651:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28571:100;:::o;30130:221::-;30206:7;30234:16;30242:7;30234;:16::i;:::-;30226:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30319:15;:24;30335:7;30319:24;;;;;;;;;;;;;;;;;;;;;30312:31;;30130:221;;;:::o;29653:411::-;29734:13;29750:23;29765:7;29750:14;:23::i;:::-;29734:39;;29798:5;29792:11;;:2;:11;;;;29784:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29892:5;29876:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29901:37;29918:5;29925:12;:10;:12::i;:::-;29901:16;:37::i;:::-;29876:62;29854:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30035:21;30044:2;30048:7;30035:8;:21::i;:::-;29653:411;;;:::o;62837:209::-;62898:13;62928:11;62936:2;62928:7;:11::i;:::-;62920:27;;;;;;;;;;;;:::i;:::-;;;;;;;;;62954:20;62988:1;62977:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62954:36;;63009:4;62997:6;63004:1;62997:9;;;;;;;;;;;;;;;;;;;;;:16;;;;;63034:6;63027:13;;;62837:209;;;:::o;61656:110::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61756:4:::1;61729:24;:31;;;;;;;;;;;;:::i;:::-;;61656:110:::0;:::o;59973:461::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60069:10:::1;;60051:14;:28;;60043:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60150:6;60146:283;60166:14;60162:1;:18;60146:283;;;60259:1;60245:10;;:15;60241:181;;60273:20;60331:9;;60320:7;;60306:10;;60298:5;;:18;;;;:::i;:::-;60297:30;;;;:::i;:::-;60296:44;;;;:::i;:::-;60273:67;;60351:38;60361:10;60373:15;60351:9;:38::i;:::-;60400:10;;:12;;;;;;;;;:::i;:::-;;;;;;60241:181;;60182:3;;;;;:::i;:::-;;;;60146:283;;;;59973:461:::0;:::o;46144:113::-;46205:7;46232:10;:17;;;;46225:24;;46144:113;:::o;58697:101::-;58739:4;58778:14;;58759:15;:33;;58752:40;;58697:101;:::o;31020:339::-;31215:41;31234:12;:10;:12::i;:::-;31248:7;31215:18;:41::i;:::-;31207:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31323:28;31333:4;31339:2;31343:7;31323:9;:28::i;:::-;31020:339;;;:::o;45812:256::-;45909:7;45945:23;45962:5;45945:16;:23::i;:::-;45937:5;:31;45929:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;46034:12;:19;46047:5;46034:19;;;;;;;;;;;;;;;:26;46054:5;46034:26;;;;;;;;;;;;46027:33;;45812:256;;;;:::o;58438:130::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58482:15:::1;58500:21;58482:39;;58528:16;;;;;;;;;;;:25;;:34;58554:7;58528:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7092:1;58438:130::o:0;62148:60::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62192:10:::1;:8;:10::i;:::-;62148:60::o:0;31430:185::-;31568:39;31585:4;31591:2;31595:7;31568:39;;;;;;;;;;;;:16;:39::i;:::-;31430:185;;;:::o;40206:245::-;40324:41;40343:12;:10;:12::i;:::-;40357:7;40324:18;:41::i;:::-;40316:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;40429:14;40435:7;40429:5;:14::i;:::-;40206:245;:::o;46334:233::-;46409:7;46445:30;:28;:30::i;:::-;46437:5;:38;46429:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46542:10;46553:5;46542:17;;;;;;;;;;;;;;;;;;;;;;;;46535:24;;46334:233;;;:::o;41528:86::-;41575:4;41599:7;;;;;;;;;;;41592:14;;41528:86;:::o;57388:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28265:239::-;28337:7;28357:13;28373:7;:16;28381:7;28373:16;;;;;;;;;;;;;;;;;;;;;28357:32;;28425:1;28408:19;;:5;:19;;;;28400:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28491:5;28484:12;;;28265:239;;;:::o;58574:117::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58675:10:::1;58656:16;;:29;;;;;;;;;;;;;;;;;;58574:117:::0;:::o;60533:982::-;60646:11;:9;:11::i;:::-;60638:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;57582:1;60694:14;:32;;60686:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60785:10;;60767:14;:28;;60759:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60863:9;60845:14;57508:17;60833:26;;;;:::i;:::-;:39;60825:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;60937:3;60913:21;60923:10;60913:9;:21::i;:::-;:27;60905:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;61015:4;60975:44;;:36;60982:10;60994:4;61000;61006;60975:6;:36::i;:::-;:44;;;60967:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;61085:3;61068:14;;:20;;;;:::i;:::-;61049:15;:39;61045:140;;61149:2;61131:14;61107:21;61117:10;61107:9;:21::i;:::-;:38;;;;:::i;:::-;:44;;61099:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;61045:140;61231:6;61227:283;61247:14;61243:1;:18;61227:283;;;61340:1;61326:10;;:15;61322:181;;61354:20;61412:9;;61401:7;;61387:10;;61379:5;;:18;;;;:::i;:::-;61378:30;;;;:::i;:::-;61377:44;;;;:::i;:::-;61354:67;;61432:38;61442:10;61454:15;61432:9;:38::i;:::-;61481:10;;:12;;;;;;;;;:::i;:::-;;;;;;61322:181;;61263:3;;;;;:::i;:::-;;;;61227:283;;;;60533:982;;;;:::o;27995:208::-;28067:7;28112:1;28095:19;;:5;:19;;;;28087:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28179:9;:16;28189:5;28179:16;;;;;;;;;;;;;;;;28172:23;;27995:208;;;:::o;7452:94::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7517:21:::1;7535:1;7517:9;:21::i;:::-;7452:94::o:0;58804:122::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58902:18:::1;58885:14;:35;;;;58804:122:::0;:::o;62085:57::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62128:8:::1;:6;:8::i;:::-;62085:57::o:0;6801:87::-;6847:7;6874:6;;;;;;;;;;;6867:13;;6801:87;:::o;28740:104::-;28796:13;28829:7;28822:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28740:104;:::o;61953:126::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62034:6:::1;:15;;;62058:4;62065:7;62034:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61953:126:::0;;:::o;30423:295::-;30538:12;:10;:12::i;:::-;30526:24;;:8;:24;;;;30518:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30638:8;30593:18;:32;30612:12;:10;:12::i;:::-;30593:32;;;;;;;;;;;;;;;:42;30626:8;30593:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30691:8;30662:48;;30677:12;:10;:12::i;:::-;30662:48;;;30701:8;30662:48;;;;;;:::i;:::-;;;;;;;;30423:295;;:::o;57270:94::-;;;;;;;;;;;;;:::o;57472:53::-;57508:17;57472:53;:::o;59308:133::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59394:5:::1;59384:15;;:6;;;;;;;;;;;:15;;;59376:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;59432:3;59417:12;:18;;;;;;;;;;;;:::i;:::-;;59308:133:::0;:::o;31686:328::-;31861:41;31880:12;:10;:12::i;:::-;31894:7;31861:18;:41::i;:::-;31853:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31967:39;31981:4;31987:2;31991:7;32000:5;31967:13;:39::i;:::-;31686:328;;;;:::o;62520:254::-;62588:24;62629:11;62637:2;62629:7;:11::i;:::-;62621:27;;;;;;;;;;;;:::i;:::-;;;;;;;;;62655:31;62711:1;62689:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62655:58;;62732:16;;;;;;;;;;;62720:6;62727:1;62720:9;;;;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;62762:6;62755:13;;;62520:254;;;:::o;63098:251::-;63207:17;63226:22;63250:32;63299:16;;;;;;;;;;;63326:2;63317:6;:11;;;;:::i;:::-;63330:5;;63291:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63098:251;;;;;;;;:::o;57625:32::-;;;;:::o;59552:304::-;59625:13;59655:16;59663:7;59655;:16::i;:::-;59647:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;59694:21;59718:10;:8;:10::i;:::-;59694:34;;59766:1;59748:7;59742:21;:25;:108;;;;;;;;;;;;;;;;;59801:7;59810:17;59819:7;59810:8;:17::i;:::-;59784:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59742:108;59735:115;;;59552:304;;;:::o;59211:91::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59272:4:::1;59263:6;;:13;;;;;;;;;;;;;;;;;;59288:8;;;;;;;;;;59211:91::o:0;57200:42::-;;;;:::o;30789:164::-;30886:4;30910:18;:25;30929:5;30910:25;;;;;;;;;;;;;;;:35;30936:8;30910:35;;;;;;;;;;;;;;;;;;;;;;;;;30903:42;;30789:164;;;;:::o;58985:146::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59084:11:::1;59076:5;:19;;;;59112:13;59102:7;:23;;;;58985:146:::0;;:::o;57424:43::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7701:192::-;7032:12;:10;:12::i;:::-;7021:23;;:7;:5;:7::i;:::-;:23;;;7013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7810:1:::1;7790:22;;:8;:22;;;;7782:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7866:19;7876:8;7866:9;:19::i;:::-;7701:192:::0;:::o;56781:194::-;56866:4;55801:10;56901:21;;56886:36;;;:11;:36;;;;:83;;;;56933:36;56957:11;56933:23;:36::i;:::-;56886:83;56879:90;;56781:194;;;:::o;33524:127::-;33589:4;33641:1;33613:30;;:7;:16;33621:7;33613:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33606:37;;33524:127;;;:::o;5593:98::-;5646:7;5673:10;5666:17;;5593:98;:::o;37506:174::-;37608:2;37581:15;:24;37597:7;37581:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37664:7;37660:2;37626:46;;37635:23;37650:7;37635:14;:23::i;:::-;37626:46;;;;;;;;;;;;37506:174;;:::o;34508:110::-;34584:26;34594:2;34598:7;34584:26;;;;;;;;;;;;:9;:26::i;:::-;34508:110;;:::o;33818:348::-;33911:4;33936:16;33944:7;33936;:16::i;:::-;33928:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34012:13;34028:23;34043:7;34028:14;:23::i;:::-;34012:39;;34081:5;34070:16;;:7;:16;;;:51;;;;34114:7;34090:31;;:20;34102:7;34090:11;:20::i;:::-;:31;;;34070:51;:87;;;;34125:32;34142:5;34149:7;34125:16;:32::i;:::-;34070:87;34062:96;;;33818:348;;;;:::o;36810:578::-;36969:4;36942:31;;:23;36957:7;36942:14;:23::i;:::-;:31;;;36934:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;37052:1;37038:16;;:2;:16;;;;37030:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37108:39;37129:4;37135:2;37139:7;37108:20;:39::i;:::-;37212:29;37229:1;37233:7;37212:8;:29::i;:::-;37273:1;37254:9;:15;37264:4;37254:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37302:1;37285:9;:13;37295:2;37285:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37333:2;37314:7;:16;37322:7;37314:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37372:7;37368:2;37353:27;;37362:4;37353:27;;;;;;;;;;;;36810:578;;;:::o;42587:120::-;42131:8;:6;:8::i;:::-;42123:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;42656:5:::1;42646:7;;:15;;;;;;;;;;;;;;;;;;42677:22;42686:12;:10;:12::i;:::-;42677:22;;;;;;:::i;:::-;;;;;;;;42587:120::o:0;36113:360::-;36173:13;36189:23;36204:7;36189:14;:23::i;:::-;36173:39;;36225:48;36246:5;36261:1;36265:7;36225:20;:48::i;:::-;36314:29;36331:1;36335:7;36314:8;:29::i;:::-;36376:1;36356:9;:16;36366:5;36356:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;36395:7;:16;36403:7;36395:16;;;;;;;;;;;;36388:23;;;;;;;;;;;36457:7;36453:1;36429:36;;36438:5;36429:36;;;;;;;;;;;;36113:360;;:::o;64433:263::-;64527:4;64540:18;64561:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;64540:81;;64645:45;64655:16;64664:6;64655:8;:16::i;:::-;64673:4;64679;64685;64645:45;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64635:55;;:6;:55;;;64628:62;;;64433:263;;;;;;:::o;7901:173::-;7957:16;7976:6;;;;;;;;;;;7957:25;;8002:8;7993:6;;:17;;;;;;;;;;;;;;;;;;8057:8;8026:40;;8047:8;8026:40;;;;;;;;;;;;7901:173;;:::o;42328:118::-;41854:8;:6;:8::i;:::-;41853:9;41845:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;42398:4:::1;42388:7;;:14;;;;;;;;;;;;;;;;;;42418:20;42425:12;:10;:12::i;:::-;42418:20;;;;;;:::i;:::-;;;;;;;;42328:118::o:0;32896:315::-;33053:28;33063:4;33069:2;33073:7;33053:9;:28::i;:::-;33100:48;33123:4;33129:2;33133:7;33142:5;33100:22;:48::i;:::-;33092:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32896:315;;;;:::o;59447:99::-;59499:13;59528:12;59521:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59447:99;:::o;63557:442::-;63610:17;63646:1;63640:2;:7;63636:45;;;63663:10;;;;;;;;;;;;;;;;;;;;;63636:45;63687:9;63699:2;63687:14;;63708;63729:61;63741:1;63736;:6;63729:61;;63758:8;;;;;:::i;:::-;;;;63780:2;63775:7;;;;;:::i;:::-;;;63729:61;;;63796:17;63826:6;63816:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63796:37;;63840:9;63852:6;63840:18;;63869:2;63865:6;;63878:91;63890:1;63885;:6;63878:91;;63941:2;63937:1;:6;;;;:::i;:::-;63932:2;:11;;;;:::i;:::-;63919:26;;63907:4;63912:3;;;;:::i;:::-;;;;63907:9;;;;;;;;;;;;;;;;;;;:38;;;;;;;;;;;63959:2;63954:7;;;;;:::i;:::-;;;63878:91;;;63988:4;63975:18;;63557:442;;;;;;;;:::o;55259:191::-;55344:4;55064:10;55379:18;;55364:33;;;:11;:33;;;;:80;;;;55408:36;55432:11;55408:23;:36::i;:::-;55364:80;55357:87;;55259:191;;;:::o;34845:321::-;34975:18;34981:2;34985:7;34975:5;:18::i;:::-;35026:54;35057:1;35061:2;35065:7;35074:5;35026:22;:54::i;:::-;35004:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34845:321;;;:::o;62266:191::-;62406:45;62433:4;62439:2;62443:7;62406:26;:45::i;:::-;62266:191;;;:::o;64095:289::-;64156:7;64237:16;;58120:9;;;;;;;;;;;;;;;;;58103:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;58093:38;;;;;;64343:7;:13;;;64327:31;;;;;;64274:95;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64264:106;;;;;;64189:188;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64179:199;;;;;;64172:206;;64095:289;;;:::o;38245:803::-;38400:4;38421:15;:2;:13;;;:15::i;:::-;38417:624;;;38473:2;38457:36;;;38494:12;:10;:12::i;:::-;38508:4;38514:7;38523:5;38457:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38453:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38720:1;38703:6;:13;:18;38699:272;;;38746:60;;;;;;;;;;:::i;:::-;;;;;;;;38699:272;38921:6;38915:13;38906:6;38902:2;38898:15;38891:38;38453:533;38590:45;;;38580:55;;;:6;:55;;;;38573:62;;;;;38417:624;39025:4;39018:11;;38245:803;;;;;;;:::o;45504:224::-;45606:4;45645:35;45630:50;;;:11;:50;;;;:90;;;;45684:36;45708:11;45684:23;:36::i;:::-;45630:90;45623:97;;45504:224;;;:::o;35502:382::-;35596:1;35582:16;;:2;:16;;;;35574:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35655:16;35663:7;35655;:16::i;:::-;35654:17;35646:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35717:45;35746:1;35750:2;35754:7;35717:20;:45::i;:::-;35792:1;35775:9;:13;35785:2;35775:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35823:2;35804:7;:16;35812:7;35804:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35868:7;35864:2;35843:33;;35860:1;35843:33;;;;;;;;;;;;35502:382;;:::o;47180:589::-;47324:45;47351:4;47357:2;47361:7;47324:26;:45::i;:::-;47402:1;47386:18;;:4;:18;;;47382:187;;;47421:40;47453:7;47421:31;:40::i;:::-;47382:187;;;47491:2;47483:10;;:4;:10;;;47479:90;;47510:47;47543:4;47549:7;47510:32;:47::i;:::-;47479:90;47382:187;47597:1;47583:16;;:2;:16;;;47579:183;;;47616:45;47653:7;47616:36;:45::i;:::-;47579:183;;;47689:4;47683:10;;:2;:10;;;47679:83;;47710:40;47738:2;47742:7;47710:27;:40::i;:::-;47679:83;47579:183;47180:589;;;:::o;16172:387::-;16232:4;16440:12;16507:7;16495:20;16487:28;;16550:1;16543:4;:8;16536:15;;;16172:387;;;:::o;27626:305::-;27728:4;27780:25;27765:40;;;:11;:40;;;;:105;;;;27837:33;27822:48;;;:11;:48;;;;27765:105;:158;;;;27887:36;27911:11;27887:23;:36::i;:::-;27765:158;27745:178;;27626:305;;;:::o;43309:275::-;43453:45;43480:4;43486:2;43490:7;43453:26;:45::i;:::-;43520:8;:6;:8::i;:::-;43519:9;43511:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43309:275;;;:::o;48492:164::-;48596:10;:17;;;;48569:15;:24;48585:7;48569:24;;;;;;;;;;;:44;;;;48624:10;48640:7;48624:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48492:164;:::o;49283:988::-;49549:22;49599:1;49574:22;49591:4;49574:16;:22::i;:::-;:26;;;;:::i;:::-;49549:51;;49611:18;49632:17;:26;49650:7;49632:26;;;;;;;;;;;;49611:47;;49779:14;49765:10;:28;49761:328;;49810:19;49832:12;:18;49845:4;49832:18;;;;;;;;;;;;;;;:34;49851:14;49832:34;;;;;;;;;;;;49810:56;;49916:11;49883:12;:18;49896:4;49883:18;;;;;;;;;;;;;;;:30;49902:10;49883:30;;;;;;;;;;;:44;;;;50033:10;50000:17;:30;50018:11;50000:30;;;;;;;;;;;:43;;;;49761:328;;50185:17;:26;50203:7;50185:26;;;;;;;;;;;50178:33;;;50229:12;:18;50242:4;50229:18;;;;;;;;;;;;;;;:34;50248:14;50229:34;;;;;;;;;;;50222:41;;;49283:988;;;;:::o;50566:1079::-;50819:22;50864:1;50844:10;:17;;;;:21;;;;:::i;:::-;50819:46;;50876:18;50897:15;:24;50913:7;50897:24;;;;;;;;;;;;50876:45;;51248:19;51270:10;51281:14;51270:26;;;;;;;;;;;;;;;;;;;;;;;;51248:48;;51334:11;51309:10;51320;51309:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;51445:10;51414:15;:28;51430:11;51414:28;;;;;;;;;;;:41;;;;51586:15;:24;51602:7;51586:24;;;;;;;;;;;51579:31;;;51621:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50566:1079;;;;:::o;48070:221::-;48155:14;48172:20;48189:2;48172:16;:20::i;:::-;48155:37;;48230:7;48203:12;:16;48216:2;48203:16;;;;;;;;;;;;;;;:24;48220:6;48203:24;;;;;;;;;;;:34;;;;48277:6;48248:17;:26;48266:7;48248:26;;;;;;;;;;;:35;;;;48070:221;;;:::o;26146:157::-;26231:4;26270:25;26255:40;;;:11;:40;;;;26248:47;;26146:157;;;:::o;39620:126::-;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:155::-;906:5;944:6;931:20;922:29;;960:41;995:5;960:41;:::i;:::-;912:95;;;;:::o;1013:133::-;1056:5;1094:6;1081:20;1072:29;;1110:30;1134:5;1110:30;:::i;:::-;1062:84;;;;:::o;1152:137::-;1206:5;1237:6;1231:13;1222:22;;1253:30;1277:5;1253:30;:::i;:::-;1212:77;;;;:::o;1295:139::-;1341:5;1379:6;1366:20;1357:29;;1395:33;1422:5;1395:33;:::i;:::-;1347:87;;;;:::o;1440:137::-;1485:5;1523:6;1510:20;1501:29;;1539:32;1565:5;1539:32;:::i;:::-;1491:86;;;;:::o;1583:141::-;1639:5;1670:6;1664:13;1655:22;;1686:32;1712:5;1686:32;:::i;:::-;1645:79;;;;:::o;1743:351::-;1800:8;1810:6;1860:3;1853:4;1845:6;1841:17;1837:27;1827:2;;1878:1;1875;1868:12;1827:2;1914:6;1901:20;1891:30;;1944:18;1936:6;1933:30;1930:2;;;1976:1;1973;1966:12;1930:2;2013:4;2005:6;2001:17;1989:29;;2067:3;2059:4;2051:6;2047:17;2037:8;2033:32;2030:41;2027:2;;;2084:1;2081;2074:12;2027:2;1817:277;;;;;:::o;2113:271::-;2168:5;2217:3;2210:4;2202:6;2198:17;2194:27;2184:2;;2235:1;2232;2225:12;2184:2;2275:6;2262:20;2300:78;2374:3;2366:6;2359:4;2351:6;2347:17;2300:78;:::i;:::-;2291:87;;2174:210;;;;;:::o;2390:169::-;2451:5;2489:6;2476:20;2467:29;;2505:48;2547:5;2505:48;:::i;:::-;2457:102;;;;:::o;2579:273::-;2635:5;2684:3;2677:4;2669:6;2665:17;2661:27;2651:2;;2702:1;2699;2692:12;2651:2;2742:6;2729:20;2767:79;2842:3;2834:6;2827:4;2819:6;2815:17;2767:79;:::i;:::-;2758:88;;2641:211;;;;;:::o;2858:139::-;2904:5;2942:6;2929:20;2920:29;;2958:33;2985:5;2958:33;:::i;:::-;2910:87;;;;:::o;3003:135::-;3047:5;3085:6;3072:20;3063:29;;3101:31;3126:5;3101:31;:::i;:::-;3053:85;;;;:::o;3144:262::-;3203:6;3252:2;3240:9;3231:7;3227:23;3223:32;3220:2;;;3268:1;3265;3258:12;3220:2;3311:1;3336:53;3381:7;3372:6;3361:9;3357:22;3336:53;:::i;:::-;3326:63;;3282:117;3210:196;;;;:::o;3412:278::-;3479:6;3528:2;3516:9;3507:7;3503:23;3499:32;3496:2;;;3544:1;3541;3534:12;3496:2;3587:1;3612:61;3665:7;3656:6;3645:9;3641:22;3612:61;:::i;:::-;3602:71;;3558:125;3486:204;;;;:::o;3696:407::-;3764:6;3772;3821:2;3809:9;3800:7;3796:23;3792:32;3789:2;;;3837:1;3834;3827:12;3789:2;3880:1;3905:53;3950:7;3941:6;3930:9;3926:22;3905:53;:::i;:::-;3895:63;;3851:117;4007:2;4033:53;4078:7;4069:6;4058:9;4054:22;4033:53;:::i;:::-;4023:63;;3978:118;3779:324;;;;;:::o;4109:552::-;4186:6;4194;4202;4251:2;4239:9;4230:7;4226:23;4222:32;4219:2;;;4267:1;4264;4257:12;4219:2;4310:1;4335:53;4380:7;4371:6;4360:9;4356:22;4335:53;:::i;:::-;4325:63;;4281:117;4437:2;4463:53;4508:7;4499:6;4488:9;4484:22;4463:53;:::i;:::-;4453:63;;4408:118;4565:2;4591:53;4636:7;4627:6;4616:9;4612:22;4591:53;:::i;:::-;4581:63;;4536:118;4209:452;;;;;:::o;4667:809::-;4762:6;4770;4778;4786;4835:3;4823:9;4814:7;4810:23;4806:33;4803:2;;;4852:1;4849;4842:12;4803:2;4895:1;4920:53;4965:7;4956:6;4945:9;4941:22;4920:53;:::i;:::-;4910:63;;4866:117;5022:2;5048:53;5093:7;5084:6;5073:9;5069:22;5048:53;:::i;:::-;5038:63;;4993:118;5150:2;5176:53;5221:7;5212:6;5201:9;5197:22;5176:53;:::i;:::-;5166:63;;5121:118;5306:2;5295:9;5291:18;5278:32;5337:18;5329:6;5326:30;5323:2;;;5369:1;5366;5359:12;5323:2;5397:62;5451:7;5442:6;5431:9;5427:22;5397:62;:::i;:::-;5387:72;;5249:220;4793:683;;;;;;;:::o;5482:401::-;5547:6;5555;5604:2;5592:9;5583:7;5579:23;5575:32;5572:2;;;5620:1;5617;5610:12;5572:2;5663:1;5688:53;5733:7;5724:6;5713:9;5709:22;5688:53;:::i;:::-;5678:63;;5634:117;5790:2;5816:50;5858:7;5849:6;5838:9;5834:22;5816:50;:::i;:::-;5806:60;;5761:115;5562:321;;;;;:::o;5889:407::-;5957:6;5965;6014:2;6002:9;5993:7;5989:23;5985:32;5982:2;;;6030:1;6027;6020:12;5982:2;6073:1;6098:53;6143:7;6134:6;6123:9;6119:22;6098:53;:::i;:::-;6088:63;;6044:117;6200:2;6226:53;6271:7;6262:6;6251:9;6247:22;6226:53;:::i;:::-;6216:63;;6171:118;5972:324;;;;;:::o;6302:278::-;6369:6;6418:2;6406:9;6397:7;6393:23;6389:32;6386:2;;;6434:1;6431;6424:12;6386:2;6477:1;6502:61;6555:7;6546:6;6535:9;6531:22;6502:61;:::i;:::-;6492:71;;6448:125;6376:204;;;;:::o;6586:260::-;6644:6;6693:2;6681:9;6672:7;6668:23;6664:32;6661:2;;;6709:1;6706;6699:12;6661:2;6752:1;6777:52;6821:7;6812:6;6801:9;6797:22;6777:52;:::i;:::-;6767:62;;6723:116;6651:195;;;;:::o;6852:282::-;6921:6;6970:2;6958:9;6949:7;6945:23;6941:32;6938:2;;;6986:1;6983;6976:12;6938:2;7029:1;7054:63;7109:7;7100:6;7089:9;7085:22;7054:63;:::i;:::-;7044:73;;7000:127;6928:206;;;;:::o;7140:437::-;7223:6;7231;7280:2;7268:9;7259:7;7255:23;7251:32;7248:2;;;7296:1;7293;7286:12;7248:2;7339:1;7364:68;7424:7;7415:6;7404:9;7400:22;7364:68;:::i;:::-;7354:78;;7310:132;7481:2;7507:53;7552:7;7543:6;7532:9;7528:22;7507:53;:::i;:::-;7497:63;;7452:118;7238:339;;;;;:::o;7583:375::-;7652:6;7701:2;7689:9;7680:7;7676:23;7672:32;7669:2;;;7717:1;7714;7707:12;7669:2;7788:1;7777:9;7773:17;7760:31;7818:18;7810:6;7807:30;7804:2;;;7850:1;7847;7840:12;7804:2;7878:63;7933:7;7924:6;7913:9;7909:22;7878:63;:::i;:::-;7868:73;;7731:220;7659:299;;;;:::o;7964:262::-;8023:6;8072:2;8060:9;8051:7;8047:23;8043:32;8040:2;;;8088:1;8085;8078:12;8040:2;8131:1;8156:53;8201:7;8192:6;8181:9;8177:22;8156:53;:::i;:::-;8146:63;;8102:117;8030:196;;;;:::o;8232:407::-;8300:6;8308;8357:2;8345:9;8336:7;8332:23;8328:32;8325:2;;;8373:1;8370;8363:12;8325:2;8416:1;8441:53;8486:7;8477:6;8466:9;8462:22;8441:53;:::i;:::-;8431:63;;8387:117;8543:2;8569:53;8614:7;8605:6;8594:9;8590:22;8569:53;:::i;:::-;8559:63;;8514:118;8315:324;;;;;:::o;8645:683::-;8733:6;8741;8749;8757;8806:2;8794:9;8785:7;8781:23;8777:32;8774:2;;;8822:1;8819;8812:12;8774:2;8865:1;8890:53;8935:7;8926:6;8915:9;8911:22;8890:53;:::i;:::-;8880:63;;8836:117;8992:2;9018:53;9063:7;9054:6;9043:9;9039:22;9018:53;:::i;:::-;9008:63;;8963:118;9148:2;9137:9;9133:18;9120:32;9179:18;9171:6;9168:30;9165:2;;;9211:1;9208;9201:12;9165:2;9247:64;9303:7;9294:6;9283:9;9279:22;9247:64;:::i;:::-;9229:82;;;;9091:230;8764:564;;;;;;;:::o;9334:694::-;9418:6;9426;9434;9442;9491:3;9479:9;9470:7;9466:23;9462:33;9459:2;;;9508:1;9505;9498:12;9459:2;9551:1;9576:53;9621:7;9612:6;9601:9;9597:22;9576:53;:::i;:::-;9566:63;;9522:117;9678:2;9704:51;9747:7;9738:6;9727:9;9723:22;9704:51;:::i;:::-;9694:61;;9649:116;9804:2;9830:53;9875:7;9866:6;9855:9;9851:22;9830:53;:::i;:::-;9820:63;;9775:118;9932:2;9958:53;10003:7;9994:6;9983:9;9979:22;9958:53;:::i;:::-;9948:63;;9903:118;9449:579;;;;;;;:::o;10034:211::-;10119:10;10140:62;10198:3;10190:6;10140:62;:::i;:::-;10234:4;10229:3;10225:14;10211:28;;10130:115;;;;:::o;10251:179::-;10320:10;10341:46;10383:3;10375:6;10341:46;:::i;:::-;10419:4;10414:3;10410:14;10396:28;;10331:99;;;;:::o;10436:132::-;10529:32;10555:5;10529:32;:::i;:::-;10524:3;10517:45;10507:61;;:::o;10574:142::-;10677:32;10703:5;10677:32;:::i;:::-;10672:3;10665:45;10655:61;;:::o;10722:118::-;10809:24;10827:5;10809:24;:::i;:::-;10804:3;10797:37;10787:53;;:::o;10892:796::-;11027:3;11056:62;11112:5;11056:62;:::i;:::-;11134:94;11221:6;11216:3;11134:94;:::i;:::-;11127:101;;11252:64;11310:5;11252:64;:::i;:::-;11339:7;11370:1;11355:308;11380:6;11377:1;11374:13;11355:308;;;11456:6;11450:13;11483:79;11558:3;11543:13;11483:79;:::i;:::-;11476:86;;11585:68;11646:6;11585:68;:::i;:::-;11575:78;;11415:248;11402:1;11399;11395:9;11390:14;;11355:308;;;11359:14;11679:3;11672:10;;11032:656;;;;;;;:::o;11724:732::-;11843:3;11872:54;11920:5;11872:54;:::i;:::-;11942:86;12021:6;12016:3;11942:86;:::i;:::-;11935:93;;12052:56;12102:5;12052:56;:::i;:::-;12131:7;12162:1;12147:284;12172:6;12169:1;12166:13;12147:284;;;12248:6;12242:13;12275:63;12334:3;12319:13;12275:63;:::i;:::-;12268:70;;12361:60;12414:6;12361:60;:::i;:::-;12351:70;;12207:224;12194:1;12191;12187:9;12182:14;;12147:284;;;12151:14;12447:3;12440:10;;11848:608;;;;;;;:::o;12462:109::-;12543:21;12558:5;12543:21;:::i;:::-;12538:3;12531:34;12521:50;;:::o;12577:118::-;12664:24;12682:5;12664:24;:::i;:::-;12659:3;12652:37;12642:53;;:::o;12701:157::-;12806:45;12826:24;12844:5;12826:24;:::i;:::-;12806:45;:::i;:::-;12801:3;12794:58;12784:74;;:::o;12864:360::-;12950:3;12978:38;13010:5;12978:38;:::i;:::-;13032:70;13095:6;13090:3;13032:70;:::i;:::-;13025:77;;13111:52;13156:6;13151:3;13144:4;13137:5;13133:16;13111:52;:::i;:::-;13188:29;13210:6;13188:29;:::i;:::-;13183:3;13179:39;13172:46;;12954:270;;;;;:::o;13230:364::-;13318:3;13346:39;13379:5;13346:39;:::i;:::-;13401:71;13465:6;13460:3;13401:71;:::i;:::-;13394:78;;13481:52;13526:6;13521:3;13514:4;13507:5;13503:16;13481:52;:::i;:::-;13558:29;13580:6;13558:29;:::i;:::-;13553:3;13549:39;13542:46;;13322:272;;;;;:::o;13600:377::-;13706:3;13734:39;13767:5;13734:39;:::i;:::-;13789:89;13871:6;13866:3;13789:89;:::i;:::-;13782:96;;13887:52;13932:6;13927:3;13920:4;13913:5;13909:16;13887:52;:::i;:::-;13964:6;13959:3;13955:16;13948:23;;13710:267;;;;;:::o;13983:366::-;14125:3;14146:67;14210:2;14205:3;14146:67;:::i;:::-;14139:74;;14222:93;14311:3;14222:93;:::i;:::-;14340:2;14335:3;14331:12;14324:19;;14129:220;;;:::o;14355:366::-;14497:3;14518:67;14582:2;14577:3;14518:67;:::i;:::-;14511:74;;14594:93;14683:3;14594:93;:::i;:::-;14712:2;14707:3;14703:12;14696:19;;14501:220;;;:::o;14727:366::-;14869:3;14890:67;14954:2;14949:3;14890:67;:::i;:::-;14883:74;;14966:93;15055:3;14966:93;:::i;:::-;15084:2;15079:3;15075:12;15068:19;;14873:220;;;:::o;15099:366::-;15241:3;15262:67;15326:2;15321:3;15262:67;:::i;:::-;15255:74;;15338:93;15427:3;15338:93;:::i;:::-;15456:2;15451:3;15447:12;15440:19;;15245:220;;;:::o;15471:366::-;15613:3;15634:67;15698:2;15693:3;15634:67;:::i;:::-;15627:74;;15710:93;15799:3;15710:93;:::i;:::-;15828:2;15823:3;15819:12;15812:19;;15617:220;;;:::o;15843:366::-;15985:3;16006:67;16070:2;16065:3;16006:67;:::i;:::-;15999:74;;16082:93;16171:3;16082:93;:::i;:::-;16200:2;16195:3;16191:12;16184:19;;15989:220;;;:::o;16215:400::-;16375:3;16396:84;16478:1;16473:3;16396:84;:::i;:::-;16389:91;;16489:93;16578:3;16489:93;:::i;:::-;16607:1;16602:3;16598:11;16591:18;;16379:236;;;:::o;16621:366::-;16763:3;16784:67;16848:2;16843:3;16784:67;:::i;:::-;16777:74;;16860:93;16949:3;16860:93;:::i;:::-;16978:2;16973:3;16969:12;16962:19;;16767:220;;;:::o;16993:366::-;17135:3;17156:67;17220:2;17215:3;17156:67;:::i;:::-;17149:74;;17232:93;17321:3;17232:93;:::i;:::-;17350:2;17345:3;17341:12;17334:19;;17139:220;;;:::o;17365:366::-;17507:3;17528:67;17592:2;17587:3;17528:67;:::i;:::-;17521:74;;17604:93;17693:3;17604:93;:::i;:::-;17722:2;17717:3;17713:12;17706:19;;17511:220;;;:::o;17737:366::-;17879:3;17900:67;17964:2;17959:3;17900:67;:::i;:::-;17893:74;;17976:93;18065:3;17976:93;:::i;:::-;18094:2;18089:3;18085:12;18078:19;;17883:220;;;:::o;18109:365::-;18251:3;18272:66;18336:1;18331:3;18272:66;:::i;:::-;18265:73;;18347:93;18436:3;18347:93;:::i;:::-;18465:2;18460:3;18456:12;18449:19;;18255:219;;;:::o;18480:366::-;18622:3;18643:67;18707:2;18702:3;18643:67;:::i;:::-;18636:74;;18719:93;18808:3;18719:93;:::i;:::-;18837:2;18832:3;18828:12;18821:19;;18626:220;;;:::o;18852:366::-;18994:3;19015:67;19079:2;19074:3;19015:67;:::i;:::-;19008:74;;19091:93;19180:3;19091:93;:::i;:::-;19209:2;19204:3;19200:12;19193:19;;18998:220;;;:::o;19224:366::-;19366:3;19387:67;19451:2;19446:3;19387:67;:::i;:::-;19380:74;;19463:93;19552:3;19463:93;:::i;:::-;19581:2;19576:3;19572:12;19565:19;;19370:220;;;:::o;19596:366::-;19738:3;19759:67;19823:2;19818:3;19759:67;:::i;:::-;19752:74;;19835:93;19924:3;19835:93;:::i;:::-;19953:2;19948:3;19944:12;19937:19;;19742:220;;;:::o;19968:366::-;20110:3;20131:67;20195:2;20190:3;20131:67;:::i;:::-;20124:74;;20207:93;20296:3;20207:93;:::i;:::-;20325:2;20320:3;20316:12;20309:19;;20114:220;;;:::o;20340:366::-;20482:3;20503:67;20567:2;20562:3;20503:67;:::i;:::-;20496:74;;20579:93;20668:3;20579:93;:::i;:::-;20697:2;20692:3;20688:12;20681:19;;20486:220;;;:::o;20712:366::-;20854:3;20875:67;20939:2;20934:3;20875:67;:::i;:::-;20868:74;;20951:93;21040:3;20951:93;:::i;:::-;21069:2;21064:3;21060:12;21053:19;;20858:220;;;:::o;21084:366::-;21226:3;21247:67;21311:2;21306:3;21247:67;:::i;:::-;21240:74;;21323:93;21412:3;21323:93;:::i;:::-;21441:2;21436:3;21432:12;21425:19;;21230:220;;;:::o;21456:366::-;21598:3;21619:67;21683:2;21678:3;21619:67;:::i;:::-;21612:74;;21695:93;21784:3;21695:93;:::i;:::-;21813:2;21808:3;21804:12;21797:19;;21602:220;;;:::o;21828:400::-;21988:3;22009:84;22091:1;22086:3;22009:84;:::i;:::-;22002:91;;22102:93;22191:3;22102:93;:::i;:::-;22220:1;22215:3;22211:11;22204:18;;21992:236;;;:::o;22234:366::-;22376:3;22397:67;22461:2;22456:3;22397:67;:::i;:::-;22390:74;;22473:93;22562:3;22473:93;:::i;:::-;22591:2;22586:3;22582:12;22575:19;;22380:220;;;:::o;22606:366::-;22748:3;22769:67;22833:2;22828:3;22769:67;:::i;:::-;22762:74;;22845:93;22934:3;22845:93;:::i;:::-;22963:2;22958:3;22954:12;22947:19;;22752:220;;;:::o;22978:366::-;23120:3;23141:67;23205:2;23200:3;23141:67;:::i;:::-;23134:74;;23217:93;23306:3;23217:93;:::i;:::-;23335:2;23330:3;23326:12;23319:19;;23124:220;;;:::o;23350:366::-;23492:3;23513:67;23577:2;23572:3;23513:67;:::i;:::-;23506:74;;23589:93;23678:3;23589:93;:::i;:::-;23707:2;23702:3;23698:12;23691:19;;23496:220;;;:::o;23722:365::-;23864:3;23885:66;23949:1;23944:3;23885:66;:::i;:::-;23878:73;;23960:93;24049:3;23960:93;:::i;:::-;24078:2;24073:3;24069:12;24062:19;;23868:219;;;:::o;24093:366::-;24235:3;24256:67;24320:2;24315:3;24256:67;:::i;:::-;24249:74;;24332:93;24421:3;24332:93;:::i;:::-;24450:2;24445:3;24441:12;24434:19;;24239:220;;;:::o;24465:366::-;24607:3;24628:67;24692:2;24687:3;24628:67;:::i;:::-;24621:74;;24704:93;24793:3;24704:93;:::i;:::-;24822:2;24817:3;24813:12;24806:19;;24611:220;;;:::o;24837:366::-;24979:3;25000:67;25064:2;25059:3;25000:67;:::i;:::-;24993:74;;25076:93;25165:3;25076:93;:::i;:::-;25194:2;25189:3;25185:12;25178:19;;24983:220;;;:::o;25209:365::-;25351:3;25372:66;25436:1;25431:3;25372:66;:::i;:::-;25365:73;;25447:93;25536:3;25447:93;:::i;:::-;25565:2;25560:3;25556:12;25549:19;;25355:219;;;:::o;25580:366::-;25722:3;25743:67;25807:2;25802:3;25743:67;:::i;:::-;25736:74;;25819:93;25908:3;25819:93;:::i;:::-;25937:2;25932:3;25928:12;25921:19;;25726:220;;;:::o;25952:366::-;26094:3;26115:67;26179:2;26174:3;26115:67;:::i;:::-;26108:74;;26191:93;26280:3;26191:93;:::i;:::-;26309:2;26304:3;26300:12;26293:19;;26098:220;;;:::o;26324:108::-;26401:24;26419:5;26401:24;:::i;:::-;26396:3;26389:37;26379:53;;:::o;26438:118::-;26525:24;26543:5;26525:24;:::i;:::-;26520:3;26513:37;26503:53;;:::o;26562:112::-;26645:22;26661:5;26645:22;:::i;:::-;26640:3;26633:35;26623:51;;:::o;26680:275::-;26812:3;26834:95;26925:3;26916:6;26834:95;:::i;:::-;26827:102;;26946:3;26939:10;;26816:139;;;;:::o;26961:701::-;27242:3;27264:95;27355:3;27346:6;27264:95;:::i;:::-;27257:102;;27376:95;27467:3;27458:6;27376:95;:::i;:::-;27369:102;;27488:148;27632:3;27488:148;:::i;:::-;27481:155;;27653:3;27646:10;;27246:416;;;;;:::o;27668:663::-;27909:3;27931:148;28075:3;27931:148;:::i;:::-;27924:155;;28089:75;28160:3;28151:6;28089:75;:::i;:::-;28189:2;28184:3;28180:12;28173:19;;28202:75;28273:3;28264:6;28202:75;:::i;:::-;28302:2;28297:3;28293:12;28286:19;;28322:3;28315:10;;27913:418;;;;;:::o;28337:222::-;28430:4;28468:2;28457:9;28453:18;28445:26;;28481:71;28549:1;28538:9;28534:17;28525:6;28481:71;:::i;:::-;28435:124;;;;:::o;28565:254::-;28674:4;28712:2;28701:9;28697:18;28689:26;;28725:87;28809:1;28798:9;28794:17;28785:6;28725:87;:::i;:::-;28679:140;;;;:::o;28825:640::-;29020:4;29058:3;29047:9;29043:19;29035:27;;29072:71;29140:1;29129:9;29125:17;29116:6;29072:71;:::i;:::-;29153:72;29221:2;29210:9;29206:18;29197:6;29153:72;:::i;:::-;29235;29303:2;29292:9;29288:18;29279:6;29235:72;:::i;:::-;29354:9;29348:4;29344:20;29339:2;29328:9;29324:18;29317:48;29382:76;29453:4;29444:6;29382:76;:::i;:::-;29374:84;;29025:440;;;;;;;:::o;29471:332::-;29592:4;29630:2;29619:9;29615:18;29607:26;;29643:71;29711:1;29700:9;29696:17;29687:6;29643:71;:::i;:::-;29724:72;29792:2;29781:9;29777:18;29768:6;29724:72;:::i;:::-;29597:206;;;;;:::o;29809:529::-;29976:4;30014:2;30003:9;29999:18;29991:26;;30027:71;30095:1;30084:9;30080:17;30071:6;30027:71;:::i;:::-;30108:72;30176:2;30165:9;30161:18;30152:6;30108:72;:::i;:::-;30227:9;30221:4;30217:20;30212:2;30201:9;30197:18;30190:48;30255:76;30326:4;30317:6;30255:76;:::i;:::-;30247:84;;29981:357;;;;;;:::o;30344:405::-;30503:4;30541:2;30530:9;30526:18;30518:26;;30590:9;30584:4;30580:20;30576:1;30565:9;30561:17;30554:47;30618:124;30737:4;30728:6;30618:124;:::i;:::-;30610:132;;30508:241;;;;:::o;30755:373::-;30898:4;30936:2;30925:9;30921:18;30913:26;;30985:9;30979:4;30975:20;30971:1;30960:9;30956:17;30949:47;31013:108;31116:4;31107:6;31013:108;:::i;:::-;31005:116;;30903:225;;;;:::o;31134:210::-;31221:4;31259:2;31248:9;31244:18;31236:26;;31272:65;31334:1;31323:9;31319:17;31310:6;31272:65;:::i;:::-;31226:118;;;;:::o;31350:332::-;31471:4;31509:2;31498:9;31494:18;31486:26;;31522:71;31590:1;31579:9;31575:17;31566:6;31522:71;:::i;:::-;31603:72;31671:2;31660:9;31656:18;31647:6;31603:72;:::i;:::-;31476:206;;;;;:::o;31688:545::-;31861:4;31899:3;31888:9;31884:19;31876:27;;31913:71;31981:1;31970:9;31966:17;31957:6;31913:71;:::i;:::-;31994:68;32058:2;32047:9;32043:18;32034:6;31994:68;:::i;:::-;32072:72;32140:2;32129:9;32125:18;32116:6;32072:72;:::i;:::-;32154;32222:2;32211:9;32207:18;32198:6;32154:72;:::i;:::-;31866:367;;;;;;;:::o;32239:313::-;32352:4;32390:2;32379:9;32375:18;32367:26;;32439:9;32433:4;32429:20;32425:1;32414:9;32410:17;32403:47;32467:78;32540:4;32531:6;32467:78;:::i;:::-;32459:86;;32357:195;;;;:::o;32558:419::-;32724:4;32762:2;32751:9;32747:18;32739:26;;32811:9;32805:4;32801:20;32797:1;32786:9;32782:17;32775:47;32839:131;32965:4;32839:131;:::i;:::-;32831:139;;32729:248;;;:::o;32983:419::-;33149:4;33187:2;33176:9;33172:18;33164:26;;33236:9;33230:4;33226:20;33222:1;33211:9;33207:17;33200:47;33264:131;33390:4;33264:131;:::i;:::-;33256:139;;33154:248;;;:::o;33408:419::-;33574:4;33612:2;33601:9;33597:18;33589:26;;33661:9;33655:4;33651:20;33647:1;33636:9;33632:17;33625:47;33689:131;33815:4;33689:131;:::i;:::-;33681:139;;33579:248;;;:::o;33833:419::-;33999:4;34037:2;34026:9;34022:18;34014:26;;34086:9;34080:4;34076:20;34072:1;34061:9;34057:17;34050:47;34114:131;34240:4;34114:131;:::i;:::-;34106:139;;34004:248;;;:::o;34258:419::-;34424:4;34462:2;34451:9;34447:18;34439:26;;34511:9;34505:4;34501:20;34497:1;34486:9;34482:17;34475:47;34539:131;34665:4;34539:131;:::i;:::-;34531:139;;34429:248;;;:::o;34683:419::-;34849:4;34887:2;34876:9;34872:18;34864:26;;34936:9;34930:4;34926:20;34922:1;34911:9;34907:17;34900:47;34964:131;35090:4;34964:131;:::i;:::-;34956:139;;34854:248;;;:::o;35108:419::-;35274:4;35312:2;35301:9;35297:18;35289:26;;35361:9;35355:4;35351:20;35347:1;35336:9;35332:17;35325:47;35389:131;35515:4;35389:131;:::i;:::-;35381:139;;35279:248;;;:::o;35533:419::-;35699:4;35737:2;35726:9;35722:18;35714:26;;35786:9;35780:4;35776:20;35772:1;35761:9;35757:17;35750:47;35814:131;35940:4;35814:131;:::i;:::-;35806:139;;35704:248;;;:::o;35958:419::-;36124:4;36162:2;36151:9;36147:18;36139:26;;36211:9;36205:4;36201:20;36197:1;36186:9;36182:17;36175:47;36239:131;36365:4;36239:131;:::i;:::-;36231:139;;36129:248;;;:::o;36383:419::-;36549:4;36587:2;36576:9;36572:18;36564:26;;36636:9;36630:4;36626:20;36622:1;36611:9;36607:17;36600:47;36664:131;36790:4;36664:131;:::i;:::-;36656:139;;36554:248;;;:::o;36808:419::-;36974:4;37012:2;37001:9;36997:18;36989:26;;37061:9;37055:4;37051:20;37047:1;37036:9;37032:17;37025:47;37089:131;37215:4;37089:131;:::i;:::-;37081:139;;36979:248;;;:::o;37233:419::-;37399:4;37437:2;37426:9;37422:18;37414:26;;37486:9;37480:4;37476:20;37472:1;37461:9;37457:17;37450:47;37514:131;37640:4;37514:131;:::i;:::-;37506:139;;37404:248;;;:::o;37658:419::-;37824:4;37862:2;37851:9;37847:18;37839:26;;37911:9;37905:4;37901:20;37897:1;37886:9;37882:17;37875:47;37939:131;38065:4;37939:131;:::i;:::-;37931:139;;37829:248;;;:::o;38083:419::-;38249:4;38287:2;38276:9;38272:18;38264:26;;38336:9;38330:4;38326:20;38322:1;38311:9;38307:17;38300:47;38364:131;38490:4;38364:131;:::i;:::-;38356:139;;38254:248;;;:::o;38508:419::-;38674:4;38712:2;38701:9;38697:18;38689:26;;38761:9;38755:4;38751:20;38747:1;38736:9;38732:17;38725:47;38789:131;38915:4;38789:131;:::i;:::-;38781:139;;38679:248;;;:::o;38933:419::-;39099:4;39137:2;39126:9;39122:18;39114:26;;39186:9;39180:4;39176:20;39172:1;39161:9;39157:17;39150:47;39214:131;39340:4;39214:131;:::i;:::-;39206:139;;39104:248;;;:::o;39358:419::-;39524:4;39562:2;39551:9;39547:18;39539:26;;39611:9;39605:4;39601:20;39597:1;39586:9;39582:17;39575:47;39639:131;39765:4;39639:131;:::i;:::-;39631:139;;39529:248;;;:::o;39783:419::-;39949:4;39987:2;39976:9;39972:18;39964:26;;40036:9;40030:4;40026:20;40022:1;40011:9;40007:17;40000:47;40064:131;40190:4;40064:131;:::i;:::-;40056:139;;39954:248;;;:::o;40208:419::-;40374:4;40412:2;40401:9;40397:18;40389:26;;40461:9;40455:4;40451:20;40447:1;40436:9;40432:17;40425:47;40489:131;40615:4;40489:131;:::i;:::-;40481:139;;40379:248;;;:::o;40633:419::-;40799:4;40837:2;40826:9;40822:18;40814:26;;40886:9;40880:4;40876:20;40872:1;40861:9;40857:17;40850:47;40914:131;41040:4;40914:131;:::i;:::-;40906:139;;40804:248;;;:::o;41058:419::-;41224:4;41262:2;41251:9;41247:18;41239:26;;41311:9;41305:4;41301:20;41297:1;41286:9;41282:17;41275:47;41339:131;41465:4;41339:131;:::i;:::-;41331:139;;41229:248;;;:::o;41483:419::-;41649:4;41687:2;41676:9;41672:18;41664:26;;41736:9;41730:4;41726:20;41722:1;41711:9;41707:17;41700:47;41764:131;41890:4;41764:131;:::i;:::-;41756:139;;41654:248;;;:::o;41908:419::-;42074:4;42112:2;42101:9;42097:18;42089:26;;42161:9;42155:4;42151:20;42147:1;42136:9;42132:17;42125:47;42189:131;42315:4;42189:131;:::i;:::-;42181:139;;42079:248;;;:::o;42333:419::-;42499:4;42537:2;42526:9;42522:18;42514:26;;42586:9;42580:4;42576:20;42572:1;42561:9;42557:17;42550:47;42614:131;42740:4;42614:131;:::i;:::-;42606:139;;42504:248;;;:::o;42758:419::-;42924:4;42962:2;42951:9;42947:18;42939:26;;43011:9;43005:4;43001:20;42997:1;42986:9;42982:17;42975:47;43039:131;43165:4;43039:131;:::i;:::-;43031:139;;42929:248;;;:::o;43183:419::-;43349:4;43387:2;43376:9;43372:18;43364:26;;43436:9;43430:4;43426:20;43422:1;43411:9;43407:17;43400:47;43464:131;43590:4;43464:131;:::i;:::-;43456:139;;43354:248;;;:::o;43608:419::-;43774:4;43812:2;43801:9;43797:18;43789:26;;43861:9;43855:4;43851:20;43847:1;43836:9;43832:17;43825:47;43889:131;44015:4;43889:131;:::i;:::-;43881:139;;43779:248;;;:::o;44033:419::-;44199:4;44237:2;44226:9;44222:18;44214:26;;44286:9;44280:4;44276:20;44272:1;44261:9;44257:17;44250:47;44314:131;44440:4;44314:131;:::i;:::-;44306:139;;44204:248;;;:::o;44458:419::-;44624:4;44662:2;44651:9;44647:18;44639:26;;44711:9;44705:4;44701:20;44697:1;44686:9;44682:17;44675:47;44739:131;44865:4;44739:131;:::i;:::-;44731:139;;44629:248;;;:::o;44883:419::-;45049:4;45087:2;45076:9;45072:18;45064:26;;45136:9;45130:4;45126:20;45122:1;45111:9;45107:17;45100:47;45164:131;45290:4;45164:131;:::i;:::-;45156:139;;45054:248;;;:::o;45308:419::-;45474:4;45512:2;45501:9;45497:18;45489:26;;45561:9;45555:4;45551:20;45547:1;45536:9;45532:17;45525:47;45589:131;45715:4;45589:131;:::i;:::-;45581:139;;45479:248;;;:::o;45733:222::-;45826:4;45864:2;45853:9;45849:18;45841:26;;45877:71;45945:1;45934:9;45930:17;45921:6;45877:71;:::i;:::-;45831:124;;;;:::o;45961:129::-;45995:6;46022:20;;:::i;:::-;46012:30;;46051:33;46079:4;46071:6;46051:33;:::i;:::-;46002:88;;;:::o;46096:75::-;46129:6;46162:2;46156:9;46146:19;;46136:35;:::o;46177:307::-;46238:4;46328:18;46320:6;46317:30;46314:2;;;46350:18;;:::i;:::-;46314:2;46388:29;46410:6;46388:29;:::i;:::-;46380:37;;46472:4;46466;46462:15;46454:23;;46243:241;;;:::o;46490:308::-;46552:4;46642:18;46634:6;46631:30;46628:2;;;46664:18;;:::i;:::-;46628:2;46702:29;46724:6;46702:29;:::i;:::-;46694:37;;46786:4;46780;46776:15;46768:23;;46557:241;;;:::o;46804:140::-;46879:4;46902:3;46894:11;;46932:4;46927:3;46923:14;46915:22;;46884:60;;;:::o;46950:132::-;47017:4;47040:3;47032:11;;47070:4;47065:3;47061:14;47053:22;;47022:60;;;:::o;47088:122::-;47163:6;47197:5;47191:12;47181:22;;47170:40;;;:::o;47216:114::-;47283:6;47317:5;47311:12;47301:22;;47290:40;;;:::o;47336:98::-;47387:6;47421:5;47415:12;47405:22;;47394:40;;;:::o;47440:99::-;47492:6;47526:5;47520:12;47510:22;;47499:40;;;:::o;47545:121::-;47623:4;47655;47650:3;47646:14;47638:22;;47628:38;;;:::o;47672:113::-;47742:4;47774;47769:3;47765:14;47757:22;;47747:38;;;:::o;47791:192::-;47898:11;47932:6;47927:3;47920:19;47972:4;47967:3;47963:14;47948:29;;47910:73;;;;:::o;47989:184::-;48088:11;48122:6;48117:3;48110:19;48162:4;48157:3;48153:14;48138:29;;48100:73;;;;:::o;48179:168::-;48262:11;48296:6;48291:3;48284:19;48336:4;48331:3;48327:14;48312:29;;48274:73;;;;:::o;48353:169::-;48437:11;48471:6;48466:3;48459:19;48511:4;48506:3;48502:14;48487:29;;48449:73;;;;:::o;48528:148::-;48630:11;48667:3;48652:18;;48642:34;;;;:::o;48682:305::-;48722:3;48741:20;48759:1;48741:20;:::i;:::-;48736:25;;48775:20;48793:1;48775:20;:::i;:::-;48770:25;;48929:1;48861:66;48857:74;48854:1;48851:81;48848:2;;;48935:18;;:::i;:::-;48848:2;48979:1;48976;48972:9;48965:16;;48726:261;;;;:::o;48993:185::-;49033:1;49050:20;49068:1;49050:20;:::i;:::-;49045:25;;49084:20;49102:1;49084:20;:::i;:::-;49079:25;;49123:1;49113:2;;49128:18;;:::i;:::-;49113:2;49170:1;49167;49163:9;49158:14;;49035:143;;;;:::o;49184:348::-;49224:7;49247:20;49265:1;49247:20;:::i;:::-;49242:25;;49281:20;49299:1;49281:20;:::i;:::-;49276:25;;49469:1;49401:66;49397:74;49394:1;49391:81;49386:1;49379:9;49372:17;49368:105;49365:2;;;49476:18;;:::i;:::-;49365:2;49524:1;49521;49517:9;49506:20;;49232:300;;;;:::o;49538:191::-;49578:4;49598:20;49616:1;49598:20;:::i;:::-;49593:25;;49632:20;49650:1;49632:20;:::i;:::-;49627:25;;49671:1;49668;49665:8;49662:2;;;49676:18;;:::i;:::-;49662:2;49721:1;49718;49714:9;49706:17;;49583:146;;;;:::o;49735:96::-;49772:7;49801:24;49819:5;49801:24;:::i;:::-;49790:35;;49780:51;;;:::o;49837:104::-;49882:7;49911:24;49929:5;49911:24;:::i;:::-;49900:35;;49890:51;;;:::o;49947:90::-;49981:7;50024:5;50017:13;50010:21;49999:32;;49989:48;;;:::o;50043:77::-;50080:7;50109:5;50098:16;;50088:32;;;:::o;50126:149::-;50162:7;50202:66;50195:5;50191:78;50180:89;;50170:105;;;:::o;50281:111::-;50333:7;50362:24;50380:5;50362:24;:::i;:::-;50351:35;;50341:51;;;:::o;50398:126::-;50435:7;50475:42;50468:5;50464:54;50453:65;;50443:81;;;:::o;50530:77::-;50567:7;50596:5;50585:16;;50575:32;;;:::o;50613:86::-;50648:7;50688:4;50681:5;50677:16;50666:27;;50656:43;;;:::o;50705:154::-;50789:6;50784:3;50779;50766:30;50851:1;50842:6;50837:3;50833:16;50826:27;50756:103;;;:::o;50865:307::-;50933:1;50943:113;50957:6;50954:1;50951:13;50943:113;;;51042:1;51037:3;51033:11;51027:18;51023:1;51018:3;51014:11;51007:39;50979:2;50976:1;50972:10;50967:15;;50943:113;;;51074:6;51071:1;51068:13;51065:2;;;51154:1;51145:6;51140:3;51136:16;51129:27;51065:2;50914:258;;;;:::o;51178:171::-;51217:3;51240:24;51258:5;51240:24;:::i;:::-;51231:33;;51286:4;51279:5;51276:15;51273:2;;;51294:18;;:::i;:::-;51273:2;51341:1;51334:5;51330:13;51323:20;;51221:128;;;:::o;51355:320::-;51399:6;51436:1;51430:4;51426:12;51416:22;;51483:1;51477:4;51473:12;51504:18;51494:2;;51560:4;51552:6;51548:17;51538:27;;51494:2;51622;51614:6;51611:14;51591:18;51588:38;51585:2;;;51641:18;;:::i;:::-;51585:2;51406:269;;;;:::o;51681:281::-;51764:27;51786:4;51764:27;:::i;:::-;51756:6;51752:40;51894:6;51882:10;51879:22;51858:18;51846:10;51843:34;51840:62;51837:2;;;51905:18;;:::i;:::-;51837:2;51945:10;51941:2;51934:22;51724:238;;;:::o;51968:233::-;52007:3;52030:24;52048:5;52030:24;:::i;:::-;52021:33;;52076:66;52069:5;52066:77;52063:2;;;52146:18;;:::i;:::-;52063:2;52193:1;52186:5;52182:13;52175:20;;52011:190;;;:::o;52207:79::-;52246:7;52275:5;52264:16;;52254:32;;;:::o;52292:176::-;52324:1;52341:20;52359:1;52341:20;:::i;:::-;52336:25;;52375:20;52393:1;52375:20;:::i;:::-;52370:25;;52414:1;52404:2;;52419:18;;:::i;:::-;52404:2;52460:1;52457;52453:9;52448:14;;52326:142;;;;:::o;52474:180::-;52522:77;52519:1;52512:88;52619:4;52616:1;52609:15;52643:4;52640:1;52633:15;52660:180;52708:77;52705:1;52698:88;52805:4;52802:1;52795:15;52829:4;52826:1;52819:15;52846:180;52894:77;52891:1;52884:88;52991:4;52988:1;52981:15;53015:4;53012:1;53005:15;53032:180;53080:77;53077:1;53070:88;53177:4;53174:1;53167:15;53201:4;53198:1;53191:15;53218:102;53259:6;53310:2;53306:7;53301:2;53294:5;53290:14;53286:28;53276:38;;53266:54;;;:::o;53326:230::-;53466:34;53462:1;53454:6;53450:14;53443:58;53535:13;53530:2;53522:6;53518:15;53511:38;53432:124;:::o;53562:170::-;53702:22;53698:1;53690:6;53686:14;53679:46;53668:64;:::o;53738:230::-;53878:34;53874:1;53866:6;53862:14;53855:58;53947:13;53942:2;53934:6;53930:15;53923:38;53844:124;:::o;53974:237::-;54114:34;54110:1;54102:6;54098:14;54091:58;54183:20;54178:2;54170:6;54166:15;54159:45;54080:131;:::o;54217:225::-;54357:34;54353:1;54345:6;54341:14;54334:58;54426:8;54421:2;54413:6;54409:15;54402:33;54323:119;:::o;54448:178::-;54588:30;54584:1;54576:6;54572:14;54565:54;54554:72;:::o;54632:214::-;54772:66;54768:1;54760:6;54756:14;54749:90;54738:108;:::o;54852:223::-;54992:34;54988:1;54980:6;54976:14;54969:58;55061:6;55056:2;55048:6;55044:15;55037:31;54958:117;:::o;55081:175::-;55221:27;55217:1;55209:6;55205:14;55198:51;55187:69;:::o;55262:231::-;55402:34;55398:1;55390:6;55386:14;55379:58;55471:14;55466:2;55458:6;55454:15;55447:39;55368:125;:::o;55499:165::-;55639:17;55635:1;55627:6;55623:14;55616:41;55605:59;:::o;55670:156::-;55810:8;55806:1;55798:6;55794:14;55787:32;55776:50;:::o;55832:166::-;55972:18;55968:1;55960:6;55956:14;55949:42;55938:60;:::o;56004:171::-;56144:23;56140:1;56132:6;56128:14;56121:47;56110:65;:::o;56181:243::-;56321:34;56317:1;56309:6;56305:14;56298:58;56390:26;56385:2;56377:6;56373:15;56366:51;56287:137;:::o;56430:167::-;56570:19;56566:1;56558:6;56554:14;56547:43;56536:61;:::o;56603:229::-;56743:34;56739:1;56731:6;56727:14;56720:58;56812:12;56807:2;56799:6;56795:15;56788:37;56709:123;:::o;56838:228::-;56978:34;56974:1;56966:6;56962:14;56955:58;57047:11;57042:2;57034:6;57030:15;57023:36;56944:122;:::o;57072:168::-;57212:20;57208:1;57200:6;57196:14;57189:44;57178:62;:::o;57246:182::-;57386:34;57382:1;57374:6;57370:14;57363:58;57352:76;:::o;57434:231::-;57574:34;57570:1;57562:6;57558:14;57551:58;57643:14;57638:2;57630:6;57626:15;57619:39;57540:125;:::o;57671:155::-;57811:7;57807:1;57799:6;57795:14;57788:31;57777:49;:::o;57832:182::-;57972:34;57968:1;57960:6;57956:14;57949:58;57938:76;:::o;58020:228::-;58160:34;58156:1;58148:6;58144:14;58137:58;58229:11;58224:2;58216:6;58212:15;58205:36;58126:122;:::o;58254:171::-;58394:23;58390:1;58382:6;58378:14;58371:47;58360:65;:::o;58431:220::-;58571:34;58567:1;58559:6;58555:14;58548:58;58640:3;58635:2;58627:6;58623:15;58616:28;58537:114;:::o;58657:159::-;58797:11;58793:1;58785:6;58781:14;58774:35;58763:53;:::o;58822:236::-;58962:34;58958:1;58950:6;58946:14;58939:58;59031:19;59026:2;59018:6;59014:15;59007:44;58928:130;:::o;59064:231::-;59204:34;59200:1;59192:6;59188:14;59181:58;59273:14;59268:2;59260:6;59256:15;59249:39;59170:125;:::o;59301:235::-;59441:34;59437:1;59429:6;59425:14;59418:58;59510:18;59505:2;59497:6;59493:15;59486:43;59407:129;:::o;59542:153::-;59682:5;59678:1;59670:6;59666:14;59659:29;59648:47;:::o;59701:162::-;59841:14;59837:1;59829:6;59825:14;59818:38;59807:56;:::o;59869:171::-;60009:23;60005:1;59997:6;59993:14;59986:47;59975:65;:::o;60046:122::-;60119:24;60137:5;60119:24;:::i;:::-;60112:5;60109:35;60099:2;;60158:1;60155;60148:12;60099:2;60089:79;:::o;60174:138::-;60255:32;60281:5;60255:32;:::i;:::-;60248:5;60245:43;60235:2;;60302:1;60299;60292:12;60235:2;60225:87;:::o;60318:116::-;60388:21;60403:5;60388:21;:::i;:::-;60381:5;60378:32;60368:2;;60424:1;60421;60414:12;60368:2;60358:76;:::o;60440:122::-;60513:24;60531:5;60513:24;:::i;:::-;60506:5;60503:35;60493:2;;60552:1;60549;60542:12;60493:2;60483:79;:::o;60568:120::-;60640:23;60657:5;60640:23;:::i;:::-;60633:5;60630:34;60620:2;;60678:1;60675;60668:12;60620:2;60610:78;:::o;60694:152::-;60782:39;60815:5;60782:39;:::i;:::-;60775:5;60772:50;60762:2;;60836:1;60833;60826:12;60762:2;60752:94;:::o;60852:122::-;60925:24;60943:5;60925:24;:::i;:::-;60918:5;60915:35;60905:2;;60964:1;60961;60954:12;60905:2;60895:79;:::o;60980:118::-;61051:22;61067:5;61051:22;:::i;:::-;61044:5;61041:33;61031:2;;61088:1;61085;61078:12;61031:2;61021:77;:::o

Swarm Source

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